vibe-coding-master 0.5.2 → 0.5.4
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/backend/gateway/gateway-service.js +2 -73
- package/dist/backend/services/claude-hook-service.js +69 -34
- package/dist/backend/services/claude-transcript-reply.js +107 -0
- package/dist/backend/services/round-service.js +139 -26
- package/dist/backend/services/session-service.js +54 -27
- package/dist/shared/constants.js +10 -0
- package/dist-frontend/assets/{index-BaDS9Ohj.js → index-C0CdYJxv.js} +3 -3
- package/dist-frontend/index.html +1 -1
- package/package.json +1 -1
|
@@ -90,7 +90,7 @@ WARNING: This link could potentially be dangerous`)){const v=window.open();if(v)
|
|
|
90
90
|
`))}function c(C,T,E,S){const v=E.enter("tableCell"),_=E.enter("phrasing"),y=E.containerPhrasing(C,{...S,before:m,after:m});return _(),v(),y}function h(C,T){return Ex(C,{align:T,alignDelimiters:l,padding:s,stringLength:d})}function p(C,T,E){const S=C.children;let v=-1;const _=[],y=T.enter("table");for(;++v<S.length;)_[v]=u(S[v],T,E);return y(),_}function u(C,T,E){const S=C.children;let v=-1;const _=[],y=T.enter("tableRow");for(;++v<S.length;)_[v]=c(S[v],C,T,E);return y(),_}function b(C,T,E){let S=nv.inlineCode(C,T,E);return E.stack.includes("tableCell")&&(S=S.replace(/\|/g,"\\$&")),S}}function fE(){return{exit:{taskListCheckValueChecked:jg,taskListCheckValueUnchecked:jg,paragraph:pE}}}function dE(){return{unsafe:[{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{listItem:mE}}}function jg(n){const r=this.stack[this.stack.length-2];r.type,r.checked=n.type==="taskListCheckValueChecked"}function pE(n){const r=this.stack[this.stack.length-2];if(r&&r.type==="listItem"&&typeof r.checked=="boolean"){const s=this.stack[this.stack.length-1];s.type;const l=s.children[0];if(l&&l.type==="text"){const d=r.children;let m=-1,f;for(;++m<d.length;){const o=d[m];if(o.type==="paragraph"){f=o;break}}f===s&&(l.value=l.value.slice(1),l.value.length===0?s.children.shift():s.position&&l.position&&typeof l.position.start.offset=="number"&&(l.position.start.column++,l.position.start.offset++,s.position.start=Object.assign({},l.position.start)))}}this.exit(n)}function mE(n,r,s,l){const d=n.children[0],m=typeof n.checked=="boolean"&&d&&d.type==="paragraph",f="["+(n.checked?"x":" ")+"] ",o=s.createTracker(l);m&&o.move(f);let c=nv.listItem(n,r,s,{...l,...o.current()});return m&&(c=c.replace(/^(?:[*+-]|\d+\.)([\r\n]| {1,3})/,h)),c;function h(p){return p+f}}function gE(){return[Kw(),mx(),yx(),sE(),fE()]}function _E(n){return{extensions:[Yw(),gx(n),Sx(),hE(n),dE()]}}const vE={tokenize:xE,partial:!0},iv={tokenize:EE,partial:!0},rv={tokenize:kE,partial:!0},sv={tokenize:AE,partial:!0},yE={tokenize:TE,partial:!0},av={name:"wwwAutolink",tokenize:CE,previous:ov},lv={name:"protocolAutolink",tokenize:wE,previous:cv},zi={name:"emailAutolink",tokenize:bE,previous:uv},fi={};function SE(){return{text:fi}}let jr=48;for(;jr<123;)fi[jr]=zi,jr++,jr===58?jr=65:jr===91&&(jr=97);fi[43]=zi;fi[45]=zi;fi[46]=zi;fi[95]=zi;fi[72]=[zi,lv];fi[104]=[zi,lv];fi[87]=[zi,av];fi[119]=[zi,av];function bE(n,r,s){const l=this;let d,m;return f;function f(u){return!kh(u)||!uv.call(l,l.previous)||Yh(l.events)?s(u):(n.enter("literalAutolink"),n.enter("literalAutolinkEmail"),o(u))}function o(u){return kh(u)?(n.consume(u),o):u===64?(n.consume(u),c):s(u)}function c(u){return u===46?n.check(yE,p,h)(u):u===45||u===95||Qt(u)?(m=!0,n.consume(u),c):p(u)}function h(u){return n.consume(u),d=!0,c}function p(u){return m&&d&&sn(l.previous)?(n.exit("literalAutolinkEmail"),n.exit("literalAutolink"),r(u)):s(u)}}function CE(n,r,s){const l=this;return d;function d(f){return f!==87&&f!==119||!ov.call(l,l.previous)||Yh(l.events)?s(f):(n.enter("literalAutolink"),n.enter("literalAutolinkWww"),n.check(vE,n.attempt(iv,n.attempt(rv,m),s),s)(f))}function m(f){return n.exit("literalAutolinkWww"),n.exit("literalAutolink"),r(f)}}function wE(n,r,s){const l=this;let d="",m=!1;return f;function f(u){return(u===72||u===104)&&cv.call(l,l.previous)&&!Yh(l.events)?(n.enter("literalAutolink"),n.enter("literalAutolinkHttp"),d+=String.fromCodePoint(u),n.consume(u),o):s(u)}function o(u){if(sn(u)&&d.length<5)return d+=String.fromCodePoint(u),n.consume(u),o;if(u===58){const b=d.toLowerCase();if(b==="http"||b==="https")return n.consume(u),c}return s(u)}function c(u){return u===47?(n.consume(u),m?h:(m=!0,c)):s(u)}function h(u){return u===null||Eo(u)||ot(u)||zr(u)||Bo(u)?s(u):n.attempt(iv,n.attempt(rv,p),s)(u)}function p(u){return n.exit("literalAutolinkHttp"),n.exit("literalAutolink"),r(u)}}function xE(n,r,s){let l=0;return d;function d(f){return(f===87||f===119)&&l<3?(l++,n.consume(f),d):f===46&&l===3?(n.consume(f),m):s(f)}function m(f){return f===null?s(f):r(f)}}function EE(n,r,s){let l,d,m;return f;function f(h){return h===46||h===95?n.check(sv,c,o)(h):h===null||ot(h)||zr(h)||h!==45&&Bo(h)?c(h):(m=!0,n.consume(h),f)}function o(h){return h===95?l=!0:(d=l,l=void 0),n.consume(h),f}function c(h){return d||l||!m?s(h):r(h)}}function kE(n,r){let s=0,l=0;return d;function d(f){return f===40?(s++,n.consume(f),d):f===41&&l<s?m(f):f===33||f===34||f===38||f===39||f===41||f===42||f===44||f===46||f===58||f===59||f===60||f===63||f===93||f===95||f===126?n.check(sv,r,m)(f):f===null||ot(f)||zr(f)?r(f):(n.consume(f),d)}function m(f){return f===41&&l++,n.consume(f),d}}function AE(n,r,s){return l;function l(o){return o===33||o===34||o===39||o===41||o===42||o===44||o===46||o===58||o===59||o===63||o===95||o===126?(n.consume(o),l):o===38?(n.consume(o),m):o===93?(n.consume(o),d):o===60||o===null||ot(o)||zr(o)?r(o):s(o)}function d(o){return o===null||o===40||o===91||ot(o)||zr(o)?r(o):l(o)}function m(o){return sn(o)?f(o):s(o)}function f(o){return o===59?(n.consume(o),l):sn(o)?(n.consume(o),f):s(o)}}function TE(n,r,s){return l;function l(m){return n.consume(m),d}function d(m){return Qt(m)?s(m):r(m)}}function ov(n){return n===null||n===40||n===42||n===95||n===91||n===93||n===126||ot(n)}function cv(n){return!sn(n)}function uv(n){return!(n===47||kh(n))}function kh(n){return n===43||n===45||n===46||n===95||Qt(n)}function Yh(n){let r=n.length,s=!1;for(;r--;){const l=n[r][1];if((l.type==="labelLink"||l.type==="labelImage")&&!l._balanced){s=!0;break}if(l._gfmAutolinkLiteralWalkedInto){s=!1;break}}return n.length>0&&!s&&(n[n.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),s}const RE={tokenize:HE,partial:!0};function DE(){return{document:{91:{name:"gfmFootnoteDefinition",tokenize:BE,continuation:{tokenize:jE},exit:NE}},text:{91:{name:"gfmFootnoteCall",tokenize:OE},93:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:ME,resolveTo:LE}}}}function ME(n,r,s){const l=this;let d=l.events.length;const m=l.parser.gfmFootnotes||(l.parser.gfmFootnotes=[]);let f;for(;d--;){const c=l.events[d][1];if(c.type==="labelImage"){f=c;break}if(c.type==="gfmFootnoteCall"||c.type==="labelLink"||c.type==="label"||c.type==="image"||c.type==="link")break}return o;function o(c){if(!f||!f._balanced)return s(c);const h=ni(l.sliceSerialize({start:f.end,end:l.now()}));return h.codePointAt(0)!==94||!m.includes(h.slice(1))?s(c):(n.enter("gfmFootnoteCallLabelMarker"),n.consume(c),n.exit("gfmFootnoteCallLabelMarker"),r(c))}}function LE(n,r){let s=n.length;for(;s--;)if(n[s][1].type==="labelImage"&&n[s][0]==="enter"){n[s][1];break}n[s+1][1].type="data",n[s+3][1].type="gfmFootnoteCallLabelMarker";const l={type:"gfmFootnoteCall",start:Object.assign({},n[s+3][1].start),end:Object.assign({},n[n.length-1][1].end)},d={type:"gfmFootnoteCallMarker",start:Object.assign({},n[s+3][1].end),end:Object.assign({},n[s+3][1].end)};d.end.column++,d.end.offset++,d.end._bufferIndex++;const m={type:"gfmFootnoteCallString",start:Object.assign({},d.end),end:Object.assign({},n[n.length-1][1].start)},f={type:"chunkString",contentType:"string",start:Object.assign({},m.start),end:Object.assign({},m.end)},o=[n[s+1],n[s+2],["enter",l,r],n[s+3],n[s+4],["enter",d,r],["exit",d,r],["enter",m,r],["enter",f,r],["exit",f,r],["exit",m,r],n[n.length-2],n[n.length-1],["exit",l,r]];return n.splice(s,n.length-s+1,...o),n}function OE(n,r,s){const l=this,d=l.parser.gfmFootnotes||(l.parser.gfmFootnotes=[]);let m=0,f;return o;function o(u){return n.enter("gfmFootnoteCall"),n.enter("gfmFootnoteCallLabelMarker"),n.consume(u),n.exit("gfmFootnoteCallLabelMarker"),c}function c(u){return u!==94?s(u):(n.enter("gfmFootnoteCallMarker"),n.consume(u),n.exit("gfmFootnoteCallMarker"),n.enter("gfmFootnoteCallString"),n.enter("chunkString").contentType="string",h)}function h(u){if(m>999||u===93&&!f||u===null||u===91||ot(u))return s(u);if(u===93){n.exit("chunkString");const b=n.exit("gfmFootnoteCallString");return d.includes(ni(l.sliceSerialize(b)))?(n.enter("gfmFootnoteCallLabelMarker"),n.consume(u),n.exit("gfmFootnoteCallLabelMarker"),n.exit("gfmFootnoteCall"),r):s(u)}return ot(u)||(f=!0),m++,n.consume(u),u===92?p:h}function p(u){return u===91||u===92||u===93?(n.consume(u),m++,h):h(u)}}function BE(n,r,s){const l=this,d=l.parser.gfmFootnotes||(l.parser.gfmFootnotes=[]);let m,f=0,o;return c;function c(T){return n.enter("gfmFootnoteDefinition")._container=!0,n.enter("gfmFootnoteDefinitionLabel"),n.enter("gfmFootnoteDefinitionLabelMarker"),n.consume(T),n.exit("gfmFootnoteDefinitionLabelMarker"),h}function h(T){return T===94?(n.enter("gfmFootnoteDefinitionMarker"),n.consume(T),n.exit("gfmFootnoteDefinitionMarker"),n.enter("gfmFootnoteDefinitionLabelString"),n.enter("chunkString").contentType="string",p):s(T)}function p(T){if(f>999||T===93&&!o||T===null||T===91||ot(T))return s(T);if(T===93){n.exit("chunkString");const E=n.exit("gfmFootnoteDefinitionLabelString");return m=ni(l.sliceSerialize(E)),n.enter("gfmFootnoteDefinitionLabelMarker"),n.consume(T),n.exit("gfmFootnoteDefinitionLabelMarker"),n.exit("gfmFootnoteDefinitionLabel"),b}return ot(T)||(o=!0),f++,n.consume(T),T===92?u:p}function u(T){return T===91||T===92||T===93?(n.consume(T),f++,p):p(T)}function b(T){return T===58?(n.enter("definitionMarker"),n.consume(T),n.exit("definitionMarker"),d.includes(m)||d.push(m),Xe(n,C,"gfmFootnoteDefinitionWhitespace")):s(T)}function C(T){return r(T)}}function jE(n,r,s){return n.check(Ja,r,n.attempt(RE,r,s))}function NE(n){n.exit("gfmFootnoteDefinition")}function HE(n,r,s){const l=this;return Xe(n,d,"gfmFootnoteDefinitionIndent",5);function d(m){const f=l.events[l.events.length-1];return f&&f[1].type==="gfmFootnoteDefinitionIndent"&&f[2].sliceSerialize(f[1],!0).length===4?r(m):s(m)}}function zE(n){let s=(n||{}).singleTilde;const l={name:"strikethrough",tokenize:m,resolveAll:d};return s==null&&(s=!0),{text:{126:l},insideSpan:{null:[l]},attentionMarkers:{null:[126]}};function d(f,o){let c=-1;for(;++c<f.length;)if(f[c][0]==="enter"&&f[c][1].type==="strikethroughSequenceTemporary"&&f[c][1]._close){let h=c;for(;h--;)if(f[h][0]==="exit"&&f[h][1].type==="strikethroughSequenceTemporary"&&f[h][1]._open&&f[c][1].end.offset-f[c][1].start.offset===f[h][1].end.offset-f[h][1].start.offset){f[c][1].type="strikethroughSequence",f[h][1].type="strikethroughSequence";const p={type:"strikethrough",start:Object.assign({},f[h][1].start),end:Object.assign({},f[c][1].end)},u={type:"strikethroughText",start:Object.assign({},f[h][1].end),end:Object.assign({},f[c][1].start)},b=[["enter",p,o],["enter",f[h][1],o],["exit",f[h][1],o],["enter",u,o]],C=o.parser.constructs.insideSpan.null;C&&On(b,b.length,0,jo(C,f.slice(h+1,c),o)),On(b,b.length,0,[["exit",u,o],["enter",f[c][1],o],["exit",f[c][1],o],["exit",p,o]]),On(f,h-1,c-h+3,b),c=h+b.length-2;break}}for(c=-1;++c<f.length;)f[c][1].type==="strikethroughSequenceTemporary"&&(f[c][1].type="data");return f}function m(f,o,c){const h=this.previous,p=this.events;let u=0;return b;function b(T){return h===126&&p[p.length-1][1].type!=="characterEscape"?c(T):(f.enter("strikethroughSequenceTemporary"),C(T))}function C(T){const E=Bs(h);if(T===126)return u>1?c(T):(f.consume(T),u++,C);if(u<2&&!s)return c(T);const S=f.exit("strikethroughSequenceTemporary"),v=Bs(T);return S._open=!v||v===2&&!!E,S._close=!E||E===2&&!!v,o(T)}}}class IE{constructor(){this.map=[]}add(r,s,l){UE(this,r,s,l)}consume(r){if(this.map.sort(function(m,f){return m[0]-f[0]}),this.map.length===0)return;let s=this.map.length;const l=[];for(;s>0;)s-=1,l.push(r.slice(this.map[s][0]+this.map[s][1]),this.map[s][2]),r.length=this.map[s][0];l.push(r.slice()),r.length=0;let d=l.pop();for(;d;){for(const m of d)r.push(m);d=l.pop()}this.map.length=0}}function UE(n,r,s,l){let d=0;if(!(s===0&&l.length===0)){for(;d<n.map.length;){if(n.map[d][0]===r){n.map[d][1]+=s,n.map[d][2].push(...l);return}d+=1}n.map.push([r,s,l])}}function PE(n,r){let s=!1;const l=[];for(;r<n.length;){const d=n[r];if(s){if(d[0]==="enter")d[1].type==="tableContent"&&l.push(n[r+1][1].type==="tableDelimiterMarker"?"left":"none");else if(d[1].type==="tableContent"){if(n[r-1][1].type==="tableDelimiterMarker"){const m=l.length-1;l[m]=l[m]==="left"?"center":"right"}}else if(d[1].type==="tableDelimiterRow")break}else d[0]==="enter"&&d[1].type==="tableDelimiterRow"&&(s=!0);r+=1}return l}function FE(){return{flow:{null:{name:"table",tokenize:qE,resolveAll:$E}}}}function qE(n,r,s){const l=this;let d=0,m=0,f;return o;function o(j){let H=l.events.length-1;for(;H>-1;){const K=l.events[H][1].type;if(K==="lineEnding"||K==="linePrefix")H--;else break}const U=H>-1?l.events[H][1].type:null,F=U==="tableHead"||U==="tableRow"?D:c;return F===D&&l.parser.lazy[l.now().line]?s(j):F(j)}function c(j){return n.enter("tableHead"),n.enter("tableRow"),h(j)}function h(j){return j===124||(f=!0,m+=1),p(j)}function p(j){return j===null?s(j):De(j)?m>1?(m=0,l.interrupt=!0,n.exit("tableRow"),n.enter("lineEnding"),n.consume(j),n.exit("lineEnding"),C):s(j):Ve(j)?Xe(n,p,"whitespace")(j):(m+=1,f&&(f=!1,d+=1),j===124?(n.enter("tableCellDivider"),n.consume(j),n.exit("tableCellDivider"),f=!0,p):(n.enter("data"),u(j)))}function u(j){return j===null||j===124||ot(j)?(n.exit("data"),p(j)):(n.consume(j),j===92?b:u)}function b(j){return j===92||j===124?(n.consume(j),u):u(j)}function C(j){return l.interrupt=!1,l.parser.lazy[l.now().line]?s(j):(n.enter("tableDelimiterRow"),f=!1,Ve(j)?Xe(n,T,"linePrefix",l.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(j):T(j))}function T(j){return j===45||j===58?S(j):j===124?(f=!0,n.enter("tableCellDivider"),n.consume(j),n.exit("tableCellDivider"),E):L(j)}function E(j){return Ve(j)?Xe(n,S,"whitespace")(j):S(j)}function S(j){return j===58?(m+=1,f=!0,n.enter("tableDelimiterMarker"),n.consume(j),n.exit("tableDelimiterMarker"),v):j===45?(m+=1,v(j)):j===null||De(j)?A(j):L(j)}function v(j){return j===45?(n.enter("tableDelimiterFiller"),_(j)):L(j)}function _(j){return j===45?(n.consume(j),_):j===58?(f=!0,n.exit("tableDelimiterFiller"),n.enter("tableDelimiterMarker"),n.consume(j),n.exit("tableDelimiterMarker"),y):(n.exit("tableDelimiterFiller"),y(j))}function y(j){return Ve(j)?Xe(n,A,"whitespace")(j):A(j)}function A(j){return j===124?T(j):j===null||De(j)?!f||d!==m?L(j):(n.exit("tableDelimiterRow"),n.exit("tableHead"),r(j)):L(j)}function L(j){return s(j)}function D(j){return n.enter("tableRow"),R(j)}function R(j){return j===124?(n.enter("tableCellDivider"),n.consume(j),n.exit("tableCellDivider"),R):j===null||De(j)?(n.exit("tableRow"),r(j)):Ve(j)?Xe(n,R,"whitespace")(j):(n.enter("data"),k(j))}function k(j){return j===null||j===124||ot(j)?(n.exit("data"),R(j)):(n.consume(j),j===92?M:k)}function M(j){return j===92||j===124?(n.consume(j),k):k(j)}}function $E(n,r){let s=-1,l=!0,d=0,m=[0,0,0,0],f=[0,0,0,0],o=!1,c=0,h,p,u;const b=new IE;for(;++s<n.length;){const C=n[s],T=C[1];C[0]==="enter"?T.type==="tableHead"?(o=!1,c!==0&&(Ng(b,r,c,h,p),p=void 0,c=0),h={type:"table",start:Object.assign({},T.start),end:Object.assign({},T.end)},b.add(s,0,[["enter",h,r]])):T.type==="tableRow"||T.type==="tableDelimiterRow"?(l=!0,u=void 0,m=[0,0,0,0],f=[0,s+1,0,0],o&&(o=!1,p={type:"tableBody",start:Object.assign({},T.start),end:Object.assign({},T.end)},b.add(s,0,[["enter",p,r]])),d=T.type==="tableDelimiterRow"?2:p?3:1):d&&(T.type==="data"||T.type==="tableDelimiterMarker"||T.type==="tableDelimiterFiller")?(l=!1,f[2]===0&&(m[1]!==0&&(f[0]=f[1],u=yo(b,r,m,d,void 0,u),m=[0,0,0,0]),f[2]=s)):T.type==="tableCellDivider"&&(l?l=!1:(m[1]!==0&&(f[0]=f[1],u=yo(b,r,m,d,void 0,u)),m=f,f=[m[1],s,0,0])):T.type==="tableHead"?(o=!0,c=s):T.type==="tableRow"||T.type==="tableDelimiterRow"?(c=s,m[1]!==0?(f[0]=f[1],u=yo(b,r,m,d,s,u)):f[1]!==0&&(u=yo(b,r,f,d,s,u)),d=0):d&&(T.type==="data"||T.type==="tableDelimiterMarker"||T.type==="tableDelimiterFiller")&&(f[3]=s)}for(c!==0&&Ng(b,r,c,h,p),b.consume(r.events),s=-1;++s<r.events.length;){const C=r.events[s];C[0]==="enter"&&C[1].type==="table"&&(C[1]._align=PE(r.events,s))}return n}function yo(n,r,s,l,d,m){const f=l===1?"tableHeader":l===2?"tableDelimiter":"tableData",o="tableContent";s[0]!==0&&(m.end=Object.assign({},Ms(r.events,s[0])),n.add(s[0],0,[["exit",m,r]]));const c=Ms(r.events,s[1]);if(m={type:f,start:Object.assign({},c),end:Object.assign({},c)},n.add(s[1],0,[["enter",m,r]]),s[2]!==0){const h=Ms(r.events,s[2]),p=Ms(r.events,s[3]),u={type:o,start:Object.assign({},h),end:Object.assign({},p)};if(n.add(s[2],0,[["enter",u,r]]),l!==2){const b=r.events[s[2]],C=r.events[s[3]];if(b[1].end=Object.assign({},C[1].end),b[1].type="chunkText",b[1].contentType="text",s[3]>s[2]+1){const T=s[2]+1,E=s[3]-s[2]-1;n.add(T,E,[])}}n.add(s[3]+1,0,[["exit",u,r]])}return d!==void 0&&(m.end=Object.assign({},Ms(r.events,d)),n.add(d,0,[["exit",m,r]]),m=void 0),m}function Ng(n,r,s,l,d){const m=[],f=Ms(r.events,s);d&&(d.end=Object.assign({},f),m.push(["exit",d,r])),l.end=Object.assign({},f),m.push(["exit",l,r]),n.add(s+1,0,m)}function Ms(n,r){const s=n[r],l=s[0]==="enter"?"start":"end";return s[1][l]}const GE={name:"tasklistCheck",tokenize:WE};function VE(){return{text:{91:GE}}}function WE(n,r,s){const l=this;return d;function d(c){return l.previous!==null||!l._gfmTasklistFirstContentOfListItem?s(c):(n.enter("taskListCheck"),n.enter("taskListCheckMarker"),n.consume(c),n.exit("taskListCheckMarker"),m)}function m(c){return ot(c)?(n.enter("taskListCheckValueUnchecked"),n.consume(c),n.exit("taskListCheckValueUnchecked"),f):c===88||c===120?(n.enter("taskListCheckValueChecked"),n.consume(c),n.exit("taskListCheckValueChecked"),f):s(c)}function f(c){return c===93?(n.enter("taskListCheckMarker"),n.consume(c),n.exit("taskListCheckMarker"),n.exit("taskListCheck"),o):s(c)}function o(c){return De(c)?r(c):Ve(c)?n.check({tokenize:KE},r,s)(c):s(c)}}function KE(n,r,s){return Xe(n,l,"whitespace");function l(d){return d===null?s(d):r(d)}}function YE(n){return S_([SE(),DE(),zE(n),FE(),VE()])}const XE={};function hv(n){const r=this,s=n||XE,l=r.data(),d=l.micromarkExtensions||(l.micromarkExtensions=[]),m=l.fromMarkdownExtensions||(l.fromMarkdownExtensions=[]),f=l.toMarkdownExtensions||(l.toMarkdownExtensions=[]);d.push(YE(s)),m.push(gE()),f.push(_E(s))}const fv=1e3,Ls=new Map;let Ga;function QE(n,r,s){const l=Symbol(n),d=Math.max(fv,s.intervalMs),m=Date.now();return Ls.set(n,{id:n,intervalMs:d,nextRunAt:s.runImmediately===!1?m+d:m,inFlight:!1,run:r,token:l}),JE(),dv(),()=>{const f=Ls.get(n);(f==null?void 0:f.token)===l&&(Ls.delete(n),Ls.size===0&&Ga!==void 0&&(window.clearInterval(Ga),Ga=void 0))}}function JE(){Ga!==void 0||typeof window>"u"||(Ga=window.setInterval(()=>{dv()},fv))}async function dv(){const n=Date.now();for(const r of Ls.values())r.inFlight||r.nextRunAt>n||ZE(r)}async function ZE(n){n.inFlight=!0;try{await n.run()}catch{}finally{const r=Ls.get(n.id);(r==null?void 0:r.token)===n.token&&(r.inFlight=!1,r.nextRunAt=Date.now()+r.intervalMs)}}function Xa(n,r,s){const l=te.useRef(r);te.useEffect(()=>{l.current=r},[r]),te.useEffect(()=>{if(!(!n||s.enabled===!1))return QE(n,()=>l.current(),{intervalMs:s.intervalMs,runImmediately:s.runImmediately})},[n,s.enabled,s.intervalMs,s.runImmediately])}const Ro=`
|
|
91
91
|
|
|
92
92
|
--- Translation ---
|
|
93
|
-
`;function e2({active:n=!0,autoSendEnabled:r,targetLanguage:s,taskSlug:l,role:d,sessionId:m,panelState:f,onClearSession:o,onEntry:c,onFailures:h}){const[p,u]=te.useState(""),[b,C]=te.useState(""),[T,E]=te.useState(!1),[S,v]=te.useState(Date.now()),[_,y]=te.useState(!1),[,A]=Hi(""),L=te.useRef(null),D=f.entries,R=f.failures,k=f.status;te.useEffect(()=>{if(!n)return;const O=L.current;if(!O)return;const N=window.requestAnimationFrame(()=>{O.scrollTop=O.scrollHeight});return()=>window.cancelAnimationFrame(N)},[n,D]);const M=o2(D);te.useEffect(()=>{if(!M)return;v(Date.now());const O=window.setInterval(()=>v(Date.now()),250);return()=>window.clearInterval(O)},[M]);async function j(O=!1){const N=p;y(!0),A(""),E(!1);try{const $=await Se.translateUserInput(l,d,{text:N,mode:O?"auto-send":"review-before-send",useContext:!1,send:O});$.sent?(u(""),E(!1)):(u(mv(N,$.englishPreview)),E(!0))}catch($){A(pt("Translate composer input",$))}finally{y(!1)}}async function H(){const O=b.trim();if(O){y(!0),A("");try{const N=await Se.translateManualOutput(l,d,{text:O});c(m,d,N),C("")}catch(N){A(pt("Translate pasted English output",N))}finally{y(!1)}}}async function U(){const O=T?zg(p):p;if(O.trim()){y(!0),A("");try{await Se.sendTranslatedInput(l,d,{englishText:O}),u(""),E(!1)}catch(N){A(pt("Send translated English input to role",N))}finally{y(!1)}}}function F(O){O.key!=="Enter"||O.shiftKey||O.nativeEvent.isComposing||(O.preventDefault(),!_&&p.trim()&&(T?U():j(r)))}async function K(){o(m,d),await Se.clearTranslationSession(m).catch(O=>A(pt("Clear conversation translation panel",O)))}async function Y(){y(!0),A("");try{const O=await Se.ignoreTranslationFailures(m);h(m,d,O.failures)}catch(O){A(pt("Ignore failed conversation translations",O))}finally{y(!1)}}async function G(O){y(!0),A("");try{const N=await Se.retryTranslation(m,O.translationId);c(m,d,N)}catch(N){A(pt("Retry latest failed conversation translation",N))}finally{y(!1)}}const W=c2(D,k,S),Z=R.length,z=n2(R);return x.jsxs("aside",{className:"translation-panel",children:[x.jsxs("header",{className:"translation-panel-header",children:[x.jsxs("div",{className:"translation-panel-titlebar",children:[x.jsx("h2",{children:"Translation"}),x.jsxs("div",{className:"translation-panel-actions",children:[Z>0?x.jsxs(x.Fragment,{children:[x.jsxs("button",{type:"button",disabled:_,onClick:()=>void Y(),children:["Ignore ",Z]}),z?x.jsx("button",{type:"button",disabled:_,onClick:()=>void G(z),children:"Retry latest"}):null]}):null,x.jsx("button",{type:"button",onClick:()=>void K(),children:"Clear"})]})]}),x.jsx("div",{className:"translation-status-row",children:x.jsxs("p",{children:["Claude Code · target ",t2(s)," · ",W]})})]}),x.jsxs("div",{className:"translation-entry-list",ref:L,children:[D.length===0?x.jsx("p",{className:"muted",children:"Translated Claude Code output will appear here."}):null,D.map(O=>x.jsx(a2,{entry:O},O.id))]}),x.jsxs("div",{className:"translation-composer",children:[x.jsxs("div",{className:"translation-composer-row translation-manual-row",children:[x.jsx("textarea",{value:b,onChange:O=>C(O.target.value),placeholder:"Paste English to translate on demand..."}),x.jsx("div",{className:"translation-composer-actions",children:x.jsx("button",{type:"button",disabled:_||!b.trim(),onClick:()=>void H(),children:"Translate"})})]}),x.jsxs("div",{className:"translation-composer-row",children:[x.jsx("textarea",{value:p,onChange:O=>{u(O.target.value),(!O.target.value.trim()||T&&!f2(O.target.value))&&E(!1)},onKeyDown:F,placeholder:"输入中文,先翻译成英文工程指令..."}),x.jsx("div",{className:"translation-composer-actions",children:x.jsx("button",{type:"button",disabled:_||!T||!zg(p).trim(),onClick:()=>void U(),children:"Send English"})})]})]})]})}function t2(n){var r;return((r=e_.find(s=>s.value===n))==null?void 0:r.label)??n}function n2(n){let r,s=Number.NEGATIVE_INFINITY;for(const l of n){const d=Date.parse(l.failedAt),m=Number.isFinite(d)?d:Number.NEGATIVE_INFINITY;(!r||m>=s)&&(r=l,s=m)}return r}function i2({open:n,taskSlug:r,targetLanguage:s,onClose:l}){const[d,m]=te.useState(!1),[,f]=Hi(""),[o,c]=te.useState(null),[h,p]=te.useState(""),[u,b]=te.useState(""),[C,T]=te.useState(""),[E,S]=te.useState(!1),[v,_]=te.useState(null),[y,A]=te.useState(""),[L,D]=te.useState(""),[R,k]=te.useState(""),[M,j]=te.useState(!1);Xa(n?`file-translation:${h||"none"}`:null,()=>H(!0),{intervalMs:2e3,runImmediately:!0});async function H(G=!1){try{const W=await Se.getTranslationState();c(W);const Z=h?W.fileIndex.jobs.some(z=>z.id===h):!1;if((!h||!Z)&&W.fileIndex.jobs[0])U(W.fileIndex.jobs[0].id);else if(!W.fileIndex.jobs[0])p(""),b(""),T("");else if(G&&h){const z=await Se.readFileTranslation(h);b(z.output),T(z.report)}}catch(W){f(pt("Load file translation list",W))}}async function U(G){p(G),b(""),T("");try{const W=await Se.readFileTranslation(G);b(W.output),T(W.report)}catch(W){f(pt(`Read translated file ${G}`,W))}}async function F(){S(!0),await K(y,L)}async function K(G="",W=""){j(!0),f("");try{const Z=await Se.browseTranslationSourceFiles({path:G,query:W,limit:250});_(Z),A(Z.currentPath),D(W)}catch(Z){f(pt("Browse translation source files",Z))}finally{j(!1)}}async function Y(G=R){const W=G.trim();if(W){m(!0),f("");try{if(!r)throw new Error("Create or select a task before translating files.");const Z=await Se.createFileTranslation({taskSlug:r,sourcePath:W,targetLanguage:s});S(!1),await H(),await U(Z.id)}catch(Z){f(pt(`Create file translation for ${W}`,Z))}finally{m(!1)}}}return n?x.jsxs(x.Fragment,{children:[x.jsx("div",{className:"modal-backdrop file-translation-backdrop",children:x.jsx(s2,{busy:d,state:o,selectedJobId:h,output:u,report:C,onClose:()=>{S(!1),l()},onRefresh:()=>void H(),onSelectJob:G=>void U(G),onTranslate:()=>void F()})}),E?x.jsx(r2,{busy:d||M,state:v,currentPath:y,query:L,selectedPath:R,onBrowse:(G,W)=>void K(G,W),onClose:()=>S(!1),onQueryChange:D,onSelectPath:k,onTranslate:()=>void Y()}):null]}):null}function r2({busy:n,state:r,currentPath:s,query:l,selectedPath:d,onBrowse:m,onClose:f,onQueryChange:o,onSelectPath:c,onTranslate:h}){const p=(r==null?void 0:r.entries)??[],u=p.filter(C=>C.type==="directory"),b=p.filter(C=>C.type==="file");return x.jsx("div",{className:"modal-backdrop translation-file-browser-backdrop",children:x.jsxs("section",{className:"translation-file-browser-modal",role:"dialog","aria-modal":"true","aria-label":"Select Source File",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Select Source File"}),x.jsx("p",{children:s||"."})]}),x.jsx("button",{type:"button",onClick:f,children:"Close"})]}),x.jsxs("div",{className:"translation-file-browser-controls",children:[x.jsxs("div",{className:"translation-file-browser-nav",children:[x.jsx("button",{type:"button",disabled:n||!s,onClick:()=>m((r==null?void 0:r.parentPath)??"",""),children:"Up"}),x.jsx("button",{type:"button",disabled:n||!s,onClick:()=>m("",""),children:"Root"})]}),x.jsxs("form",{className:"translation-file-browser-search",onSubmit:C=>{C.preventDefault(),m(s,l)},children:[x.jsx("input",{value:l,onChange:C=>o(C.target.value),placeholder:"Search files"}),x.jsx("button",{type:"submit",disabled:n,children:"Search"}),x.jsx("button",{type:"button",disabled:n||!l,onClick:()=>m(s,""),children:"Clear"})]})]}),x.jsxs("div",{className:"translation-file-browser-layout",children:[x.jsxs("div",{className:"translation-file-browser-list",children:[n&&!r?x.jsx("p",{className:"muted",children:"Loading files..."}):null,!n&&p.length===0?x.jsx("p",{className:"muted",children:"No source files found."}):null,u.length>0?x.jsxs("div",{className:"translation-file-browser-group",children:[x.jsx("h3",{children:"Folders"}),u.map(C=>x.jsx(Hg,{entry:C,selected:d===C.path,onBrowse:m,onSelectPath:c},C.path))]}):null,b.length>0?x.jsxs("div",{className:"translation-file-browser-group",children:[x.jsx("h3",{children:"Files"}),b.map(C=>x.jsx(Hg,{entry:C,selected:d===C.path,onBrowse:m,onSelectPath:c},C.path))]}):null,r!=null&&r.truncated?x.jsx("p",{className:"translation-entry-note",children:"Result limit reached."}):null]}),x.jsxs("aside",{className:"translation-file-browser-selection",children:[x.jsxs("label",{children:[x.jsx("span",{children:"Source path"}),x.jsx("input",{value:d,onChange:C=>c(C.target.value)})]}),x.jsx("button",{type:"button",disabled:n||!d.trim(),onClick:h,children:"Translate File"})]})]})]})})}function Hg({entry:n,selected:r,onBrowse:s,onSelectPath:l}){const d=n.type==="directory";return x.jsxs("button",{className:r?"translation-file-browser-entry is-selected":"translation-file-browser-entry",type:"button",onClick:()=>d?s(n.path,""):l(n.path),onDoubleClick:()=>d?s(n.path,""):void 0,children:[x.jsx("span",{children:d?"DIR":"FILE"}),x.jsx("strong",{children:n.name}),x.jsx("small",{children:n.path})]})}function s2({busy:n,state:r,selectedJobId:s,output:l,report:d,onClose:m,onRefresh:f,onSelectJob:o,onTranslate:c}){const h=(r==null?void 0:r.fileIndex.jobs)??[],p=h.find(u=>u.id===s);return x.jsxs("section",{className:"file-translation-modal",role:"dialog","aria-modal":"true","aria-label":"File Translation",children:[x.jsxs("header",{className:"file-translation-header",children:[x.jsxs("div",{children:[x.jsx("h2",{children:"File Translation"}),x.jsx("p",{children:"Claude Code · 中英互译"})]}),x.jsxs("div",{className:"file-translation-toolbar",children:[x.jsx("button",{type:"button",disabled:n,onClick:c,children:"Translate"}),x.jsx("button",{type:"button",disabled:n,onClick:f,children:"Refresh"}),x.jsx("button",{type:"button",onClick:m,children:"Close"})]})]}),r!=null&&r.memoryInitialized?null:x.jsx("p",{className:"translation-entry-note",children:"Translation memory is not initialized. Run Bootstrap from the sidebar before important file translations."}),x.jsxs("div",{className:"file-translation-layout",children:[x.jsxs("div",{className:"file-translation-list",children:[h.length===0?x.jsx("p",{className:"muted",children:"No translated files yet."}):null,h.map(u=>x.jsxs("button",{className:u.id===s?"file-translation-item is-active":"file-translation-item",type:"button",onClick:()=>o(u.id),children:[x.jsx("strong",{children:u.sourcePath}),x.jsxs("span",{children:[u.status," · ",u.targetLanguage]})]},u.id))]}),x.jsx("div",{className:"file-translation-preview",children:p?x.jsxs(x.Fragment,{children:[x.jsxs("header",{children:[x.jsx("strong",{children:p.sourcePath}),x.jsx("span",{children:p.status})]}),x.jsx("div",{className:"translation-markdown",children:x.jsx(P_,{remarkPlugins:[hv],children:l||d||"Translation output is not available yet."})})]}):x.jsx("p",{className:"muted",children:"Select a translated file to preview it."})})]})]})}function a2({entry:n}){if(n.sourceKind==="conversation-boundary")return x.jsx(l2,{entry:n});const r=h2(n),s=n.sourceKind==="tool-output",l=n.direction==="user-input-to-english",d=["translation-entry",`is-${n.sourceKind}`,l?"is-user-input":""].filter(Boolean).join(" ");return x.jsxs("article",{className:d,children:[s?x.jsx("pre",{children:r}):x.jsx("div",{className:"translation-markdown",children:x.jsx(P_,{remarkPlugins:[hv],children:r})}),n.warning?x.jsx("p",{className:"translation-entry-note",children:n.warning}):null,n.error?x.jsx("p",{className:"translation-entry-note is-error",children:n.error}):null]})}function l2({entry:n}){const r=n.boundaryKind==="end"?"结束":"开始",s=n.conversationTurn??0,l=p2(n.occurredAt??n.createdAt);return x.jsxs("div",{className:"translation-conversation-boundary","aria-label":`${r} 第 ${s} 轮 ${l}`,children:[x.jsx("span",{className:"translation-boundary-dash","aria-hidden":"true"}),x.jsx("span",{children:r}),x.jsxs("span",{children:["第 ",s," 轮"]}),x.jsx("time",{children:l}),x.jsx("span",{className:"translation-boundary-dash","aria-hidden":"true"})]})}function o2(n){const r=n.find(pv);return(r==null?void 0:r.translationStartedAt)??(r==null?void 0:r.createdAt)}function c2(n,r,s){const l=n.find(pv);if(l)return`translating ${d2(Math.max(0,s-u2(l)))}`;const d=n.at(-1);return(d==null?void 0:d.status)==="failed"||r==="failed"?"error":r}function pv(n){return n.status==="queued"||n.status==="translating"}function u2(n){const r=Date.parse(n.translationStartedAt??n.createdAt);return Number.isFinite(r)?r:Date.now()}function h2(n){return n.status==="queued"||n.status==="translating"?n.sourceText:n.status==="translated"?n.direction==="user-input-to-english"?mv(n.sourceText,n.translatedText):n.translatedText:n.translatedText||n.sourceText}function mv(n,r){return`${n.trimEnd()}${Ro}${r.trimStart()}`}function f2(n){return n.includes(Ro)}function zg(n){const r=n.indexOf(Ro);return r===-1?n:n.slice(r+Ro.length)}function d2(n){if(n<1e3)return`${Math.max(.1,n/1e3).toFixed(1)}s`;const r=n/1e3;if(r<60)return`${r.toFixed(1)}s`;const s=Math.floor(r/60),l=Math.floor(r%60).toString().padStart(2,"0");return`${s}:${l}`}function p2(n){const r=new Date(n);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString()}const m2=8;function g2(){const[n,r]=te.useState([]);return te.useEffect(()=>{const s=m=>{var c,h;const f=(h=(c=m.detail)==null?void 0:c.message)==null?void 0:h.trim();if(!f)return;const o=new Date().toISOString();r(p=>{const u=p.find(b=>b.message===f);return u?[{...u,count:u.count+1,updatedAt:o},...p.filter(b=>b.id!==u.id)]:[{id:`ui_error_${Date.now()}_${Math.random().toString(16).slice(2)}`,message:f,count:1,createdAt:o,updatedAt:o},...p].slice(0,m2)})},l=m=>{var o;const f=((o=m.detail)==null?void 0:o.actions)??[];f.length!==0&&r(c=>c.filter(h=>!f.some(p=>h.message.startsWith(`${p} failed.`))))},d=m=>{var o,c;const f=(c=(o=m.detail)==null?void 0:o.message)==null?void 0:c.trim();f&&r(h=>h.filter(p=>p.message!==f))};return window.addEventListener(uh,s),window.addEventListener(hh,l),window.addEventListener(fh,d),()=>{window.removeEventListener(uh,s),window.removeEventListener(hh,l),window.removeEventListener(fh,d)}},[]),n.length===0?null:x.jsxs("aside",{className:"ui-error-center",role:"alert","aria-live":"polite","aria-label":"Application errors",children:[x.jsxs("header",{className:"ui-error-center-header",children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Errors"}),x.jsxs("p",{children:[n.length," active"]})]}),x.jsx("button",{type:"button",onClick:()=>r([]),children:"Clear"})]}),x.jsx("ol",{className:"ui-error-list",children:n.map(s=>x.jsxs("li",{children:[x.jsxs("div",{children:[x.jsx("p",{children:s.message}),x.jsxs("span",{children:[_2(s.updatedAt),s.count>1?` · repeated ${s.count} times`:""]})]}),x.jsx("button",{type:"button","aria-label":"Dismiss error",onClick:()=>r(l=>l.filter(d=>d.id!==s.id)),children:"Close"})]},s.id))})]})}function _2(n){return new Date(n).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function v2(n,r){return n.find(s=>s.taskSlug===r)??n[0]??null}function y2(n){if(!(n.mode!=="auto"||n.status!=="running")&&!(!n.activeRole||n.activeRole===n.lastFollowedRole))return n.activeRole}function S2(n,r){var d;if(!((d=n.flowPause)!=null&&d.paused))return null;const s=n.activeRole??"role",l=n.roleRecovery;return n.flowPause.reason==="role-recovery-failed"&&l?r(l,s):`No new turn started after ${s} stopped.`}const b2=3,C2=3e4,wo=new Map;function gv(n,r){const s=pt(n,r);if(!w2(r))return wo.set(n,{consecutiveFailures:1,lastMessage:s,lastReportedAt:Date.now()}),s;const l=wo.get(n),d=((l==null?void 0:l.consecutiveFailures)??0)+1,m=Date.now(),f=d>=b2&&(!l||l.lastMessage!==s||m-l.lastReportedAt>=C2);return wo.set(n,{consecutiveFailures:d,lastMessage:s,lastReportedAt:f?m:(l==null?void 0:l.lastReportedAt)??0}),f?s:null}function Do(n){wo.delete(n),c1([n])}function w2(n){const r=Lo(n);return r.includes("could not reach the VCM backend")||r.includes("Failed to fetch")||r.includes("NetworkError")||r.includes("Load failed")||r.includes("ERR_CONNECTION")}const x2=["architecture-plan","validation-adequacy","final-diff"];function E2({events:n,maxEvents:r=8,showHeader:s=!0}){const l=r===null?n:n.slice(-r);return x.jsxs("section",{className:"event-log",children:[s?x.jsx("h2",{children:"Events"}):null,n.length===0?x.jsx("p",{className:"muted",children:"No terminal events yet."}):x.jsx("ol",{children:l.map((d,m)=>x.jsx("li",{children:d},`${d}-${m}`))})]})}function hi({checked:n,className:r,disabled:s,label:l,stateLabel:d,title:m,onChange:f}){const o=["switch-control",n?"is-on":"is-off",r].filter(Boolean).join(" "),c=d??(n?"on":"off");return x.jsxs("button",{type:"button",role:"switch","aria-checked":n,"aria-label":`${l}: ${c}`,className:o,disabled:s,title:m,onClick:()=>f(!n),children:[x.jsx("span",{className:"switch-control-label",children:l}),x.jsx("span",{className:"switch-control-track","aria-hidden":"true",children:x.jsx("span",{className:"switch-control-thumb"})})]})}function k2({status:n,bootstrapStatus:r,applyResult:s,hasActiveTask:l=!1,autoTaskHarnessReviewEnabled:d,busy:m=!1,onRefresh:f,onApply:o,onOpenStudio:c,onOpenRepositoryDiff:h,onAutoTaskHarnessReviewChange:p,onStartBootstrap:u,onRestartBootstrap:b,onStopBootstrap:C,onRunBootstrap:T}){const[E,S]=te.useState(!1),[v,_]=te.useState("bypassPermissions"),[y,A]=te.useState("default"),[L,D]=te.useState("default"),R=r==null?void 0:r.session,k=(r==null?void 0:r.status)==="running",M=(R==null?void 0:R.status)==="running",j=(r==null?void 0:r.status)!=="complete",H={permissionMode:v,model:y,effort:L};return l?n?x.jsxs("section",{className:"harness-panel",children:[x.jsxs("div",{className:"harness-stage",children:[x.jsxs("div",{className:"harness-panel-header",children:[x.jsxs("div",{children:[x.jsx("strong",{children:"Fixed install"}),x.jsx("p",{className:"muted",children:n.initialized?n.needsApply?`${n.plannedChanges.length} pending updates`:"Up to date":"Not initialized"})]}),x.jsx("div",{className:"harness-actions",children:n.initialized?x.jsxs(x.Fragment,{children:[x.jsx("button",{type:"button",disabled:m,onClick:()=>void f(),children:"Refresh"}),n.needsApply?x.jsx("button",{type:"button",disabled:m,onClick:()=>void o(),children:"Update"}):null]}):x.jsx("button",{type:"button",disabled:m,onClick:()=>void o(),children:"Initialize"})})]}),n.initialized&&n.needsApply?x.jsxs(x.Fragment,{children:[x.jsx("h3",{className:"harness-file-list-title",children:"Files to update"}),x.jsx("ol",{className:"harness-file-list",children:n.plannedChanges.map(U=>x.jsxs("li",{children:[x.jsx("span",{children:U.path}),x.jsx(Ni,{status:U.action})]},`${U.path}:${U.action}`))})]}):null]}),x.jsxs("div",{className:"harness-stage",children:[x.jsxs("div",{className:"harness-panel-header",children:[x.jsx("div",{children:x.jsx("strong",{children:"Harness Studio"})}),x.jsx("div",{className:"harness-actions",children:x.jsx("button",{type:"button",disabled:m,onClick:c,children:"Open Studio"})})]}),x.jsx("button",{className:"harness-review-diff-button",type:"button",disabled:m,onClick:h,children:"Review Diff"}),x.jsx(hi,{checked:d,className:"sidebar-switch",disabled:m,label:"Auto task harness review",title:"Automatically ask Harness Engineer to review task harness after final acceptance completes",onChange:p})]}),j?x.jsx("div",{className:"harness-stage",children:x.jsxs("div",{className:"harness-panel-header",children:[x.jsxs("div",{children:[x.jsx("strong",{children:"Bootstrap"}),x.jsx("p",{className:"muted",children:r?A2(r.status):"not loaded"})]}),x.jsx("div",{className:"harness-actions",children:x.jsx("button",{type:"button",disabled:m||!(r!=null&&r.canStart),onClick:()=>{S(!0)},children:"Open Bootstrap"})})]})}):null,s!=null&&s.changedFiles.length?x.jsx("div",{className:"harness-result",children:x.jsx("p",{className:"muted",children:s.message})}):null,n.warnings.length>0?x.jsx("ul",{className:"warnings",children:n.warnings.map(U=>x.jsx("li",{children:U},U))}):null,r!=null&&r.warnings.length?x.jsx("ul",{className:"warnings",children:r.warnings.map(U=>x.jsx("li",{children:U},U))}):null,j&&E?x.jsx("div",{className:"harness-bootstrap-modal",role:"dialog","aria-modal":"true","aria-label":"Harness Engineer bootstrap session",children:x.jsxs("div",{className:"harness-bootstrap-modal-surface",children:[x.jsxs("header",{className:"harness-bootstrap-modal-header",children:[x.jsxs("div",{children:[x.jsx("strong",{children:"Harness Engineer Bootstrap"}),x.jsx("p",{className:"muted",children:(R==null?void 0:R.command)??"Start Harness Engineer, then run bootstrap when ready."})]}),x.jsxs("div",{className:"harness-bootstrap-modal-actions",children:[R?x.jsx(Ni,{status:R.status}):null,x.jsx("button",{type:"button",onClick:()=>S(!1),children:"Close"})]})]}),x.jsxs("div",{className:"harness-bootstrap-controls",children:[x.jsxs("label",{children:[x.jsx("span",{children:"Permission"}),x.jsx("select",{value:v,disabled:m||k||M,onChange:U=>_(U.target.value),children:n_.map(U=>x.jsx("option",{value:U.value,children:U.label},U.value))})]}),x.jsxs("label",{children:[x.jsx("span",{children:"Model"}),x.jsx("select",{value:y,disabled:m||k||M,onChange:U=>A(U.target.value),children:i_.map(U=>x.jsx("option",{value:U.value,children:U.label},U.value))})]}),x.jsxs("label",{children:[x.jsx("span",{children:"Effort"}),x.jsx("select",{value:L,disabled:m||k||M,onChange:U=>D(U.target.value),children:r_.map(U=>x.jsx("option",{value:U.value,children:U.label},U.value))})]}),x.jsxs("div",{className:"harness-bootstrap-control-actions",children:[x.jsx("button",{type:"button",disabled:m||k||!(r!=null&&r.canStart),onClick:()=>void u(H),children:"Start"}),x.jsx("button",{type:"button",disabled:m||k||!(r!=null&&r.canStart),onClick:()=>void b(H),children:"Restart"}),x.jsx("button",{type:"button",disabled:m||!R,onClick:()=>void C(),children:"Stop"}),x.jsx("button",{type:"button",disabled:m||k||!M,onClick:()=>void T(),children:"Run bootstrap"})]})]}),x.jsx("div",{className:"harness-bootstrap-terminal",children:M?x.jsx(Oo,{sessionId:R.id,active:E}):x.jsxs("div",{className:"terminal-empty",children:[x.jsx("strong",{children:"Harness Bootstrap"}),x.jsx("span",{children:"Start Harness Engineer first. When it is ready, click Run bootstrap to send the prompt."})]})})]})}):null]}):null:x.jsx("section",{className:"harness-panel",children:x.jsxs("div",{className:"harness-result",children:[x.jsx("strong",{children:"Task required"}),x.jsx("p",{className:"muted",children:"Create or select a task before changing VCM Harness. Harness changes are committed in the active task worktree."})]})})}function A2(n){return n.replaceAll("_"," ")}function Xh(n){return{total:n.length,accepted:n.filter(r=>r.acceptedAt).length,delivered:n.filter(r=>r.deliveredAt).length}}function T2(n,r=6){const s=[...n].sort(M2).map((d,m)=>({message:d,sequence:m+1}));return[...r===null?s:s.slice(-r)].sort((d,m)=>m.sequence-d.sequence)}function R2({messages:n,orchestration:r,busy:s,maxMessages:l=6,showControls:d=!0,showHeader:m=!0,onModeChange:f,onMarkAllDone:o}){const[c,h]=te.useState(null),p=Xh(n),u=(r==null?void 0:r.mode)??"auto",b=T2(n,l);async function C(T){await L2(T.body),h(T.id),window.setTimeout(()=>h(E=>E===T.id?null:E),1200)}return x.jsxs("section",{className:"message-panel",children:[m?x.jsxs("div",{className:"message-panel-header",children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Messages"}),x.jsxs("p",{className:"muted",children:[p.total," total / ",p.accepted," accepted"]})]}),d&&f?x.jsx("div",{className:"message-controls",children:x.jsx(hi,{checked:u==="auto",className:"message-mode-toggle",disabled:s,label:"Auto orchestration",onChange:T=>f(T?"auto":"manual")})}):null,d&&o?x.jsx("button",{type:"button",disabled:s,onClick:o,children:"Mark All Done"}):null]}):null,n.length===0?x.jsx("p",{className:"muted",children:"No role messages yet."}):x.jsx("ol",{className:"message-list",children:b.map(({message:T,sequence:E})=>x.jsxs("li",{className:"message-item",children:[x.jsxs("div",{className:"message-item-main",children:[x.jsxs("div",{className:"message-meta",children:[x.jsxs("span",{className:"message-sequence",children:["#",E]}),x.jsx("time",{dateTime:Mo(T),children:D2(Mo(T))}),x.jsxs("strong",{children:[T.fromRole," ","->"," ",T.toRole]}),x.jsx("span",{children:T.type})]}),x.jsx("p",{children:T.body}),T.failureReason?x.jsx("span",{className:"message-reason",children:T.failureReason}):null,T.bodyPath?x.jsx("span",{className:"message-path",children:T.bodyPath}):null]}),x.jsx("div",{className:"message-actions",children:x.jsx("button",{type:"button",disabled:s,onClick:()=>void C(T),children:c===T.id?"Copied":"Copy"})})]},T.id))})]})}function D2(n){const r=new Date(n);return Number.isNaN(r.getTime())?n:r.toLocaleString(void 0,{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Mo(n){return n.acceptedAt??n.deliveredAt??n.dispatchingAt??n.createdAt}function M2(n,r){const s=Mo(n).localeCompare(Mo(r));if(s!==0)return s;const l=n.createdAt.localeCompare(r.createdAt);return l!==0?l:n.id.localeCompare(r.id)}async function L2(n){var s;if((s=navigator.clipboard)!=null&&s.writeText){await navigator.clipboard.writeText(n);return}const r=document.createElement("textarea");r.value=n,r.setAttribute("readonly","true"),r.style.position="fixed",r.style.left="-9999px",document.body.appendChild(r),r.select(),document.execCommand("copy"),r.remove()}function O2({defaultPath:n="",recentPaths:r=[],busy:s=!1,onConnect:l}){const[d,m]=te.useState(n);te.useEffect(()=>{n&&m(n)},[n]);async function f(o){o.preventDefault(),await l(d)}return x.jsx("form",{className:"repo-connect",onSubmit:f,children:x.jsxs("div",{className:r.length>0?"inline-form has-recent-paths":"inline-form",children:[x.jsx("input",{"aria-label":"Repository path",id:"repo-path",value:d,onChange:o=>m(o.target.value),placeholder:"/path/to/repo"}),r.length>0?x.jsxs("select",{"aria-label":"Recent repositories",className:"repo-recent-select",value:"",onChange:o=>{o.target.value&&m(o.target.value)},children:[x.jsx("option",{value:"",children:"Recent"}),r.map(o=>x.jsx("option",{value:o,children:o},o))]}):null,x.jsx("button",{type:"submit",disabled:s||!d.trim(),children:"Connect"})]})})}function B2({tasks:n,activeTaskSlug:r,onSelect:s}){return x.jsx("nav",{className:"task-nav","aria-label":"Tasks",children:n.map(l=>x.jsxs("button",{className:l.taskSlug===r?"task-nav-item is-active":"task-nav-item",type:"button",onClick:()=>s(l.taskSlug),children:[x.jsx("span",{children:l.title||l.taskSlug}),x.jsx(Ni,{status:l.status})]},l.taskSlug))})}function j2({project:n,recentRepositoryPaths:r,tasks:s,activeTaskSlug:l,messages:d,orchestration:m,events:f,roundState:o,gateReview:c,translationEnabled:h,translationAutoSendEnabled:p,translationTargetLanguage:u,translationOutputMode:b,translationMemoryInitialized:C,translatorSession:T,harnessStatus:E,harnessBootstrapStatus:S,harnessApplyResult:v,autoTaskHarnessReviewEnabled:_,gatewayStatus:y,gatewayQrLogin:A,gatewayQrCheck:L,gatewayLarkRegistration:D,gatewayLarkRegistrationCheck:R,busy:k,onConnect:M,onRefreshConnectedRepository:j,onPullConnectedRepository:H,onRefreshHarness:U,onApplyHarness:F,onStartHarnessBootstrap:K,onRestartHarnessBootstrap:Y,onStopHarnessBootstrap:G,onRunHarnessBootstrap:W,onOpenHarnessStudio:Z,onOpenRepositoryDiff:z,onAutoTaskHarnessReviewChange:O,onRefreshGateway:N,onGatewayEnabledChange:$,onGatewaySettingsChange:I,onGatewayTranslationChange:re,onStartGatewayQrLogin:ve,onStartGatewayLarkRegistration:pe,onResetGatewayBinding:Q,onGateReviewGateEnabledChange:q,onTranslationEnabledChange:ee,onTranslationAutoSendChange:ae,onTranslationTargetLanguageChange:de,onTranslationOutputModeChange:se,onOpenFileTranslation:we,onOpenTranslatorSession:je,onCreateTranslationBootstrap:He,onUpdateTranslationMemory:Pe,onCreateTask:xe,onCloseTask:xt,onSelectTask:yt,themeMode:Et,onAutoOrchestrationChange:an,onThemeModeChange:Cn,pauseAlertSound:St,onPauseAlertSoundChange:tt,roleRetryEnabled:Lt,onRoleRetryEnabledChange:he,permissionRequestMode:ye,onPermissionRequestModeChange:Ae,launchTemplate:Me,canSaveLaunchTemplate:Oe,canOneClickStart:ft,onSaveLaunchTemplate:Fe,onOneClickStart:gt,onMarkAllMessagesDone:mt,onDeleteMessageHistory:Ot}){const[Qe,Zt]=te.useState(""),[Bt,ln]=te.useState(!1),[Gn,Vn]=te.useState(!1),[zt,on]=te.useState(()=>l?null:"repository"),Wn=Xh(d),Vt=Qe.trim(),Is=I2(n,l,E),Wt=s.filter(ze=>ze.cleanupStatus!=="cleaned"),wn=Wt.find(ze=>ze.taskSlug===l)??null;te.useEffect(()=>{on(ze=>!l&&ze===null?n?"task":"repository":ze)},[l,n]);function It(ze,di){on(di?ze:null)}async function Ii(ze){ze.preventDefault(),await xe({taskSlug:Vt}),Zt("")}return x.jsxs("div",{className:"project-dashboard",children:[x.jsx("header",{className:"brand-header",children:x.jsx("strong",{children:"VibeCodingMaster"})}),x.jsx(Nr,{title:"Repository",open:zt==="repository",onOpenChange:ze=>{It("repository",ze),ze&&n&&j()},children:x.jsxs("div",{className:"repository-panel",children:[x.jsx(O2,{defaultPath:(n==null?void 0:n.repoRoot)??"",recentPaths:r,busy:k,onConnect:M}),n?x.jsx(q2,{busy:k,project:n,onPull:H}):null]})}),x.jsx(Nr,{title:"Settings",open:zt==="settings",onOpenChange:ze=>It("settings",ze),children:x.jsxs("div",{className:"sidebar-settings",children:[x.jsxs("button",{"aria-label":`Theme mode: ${Ug(Et)}`,className:"settings-toggle theme-mode-toggle",disabled:k,title:"Cycle theme: system, light, dark",type:"button",onClick:()=>Cn(K2(Et)),children:[x.jsx("span",{children:"Theme"}),x.jsx("span",{children:Ug(Et)})]}),x.jsx(hi,{checked:((m==null?void 0:m.mode)??"auto")==="auto",className:"sidebar-switch",disabled:k||!l,label:"Auto orchestration",title:l?"Automatically dispatch role messages during the active task":"Create or select a task first",onChange:an}),x.jsx(hi,{checked:St,className:"sidebar-switch",disabled:k,label:"Pause alert sound",title:"Play a sound when VCM shows the fixed flow pause dialog",onChange:ze=>tt(ze)}),x.jsx(hi,{checked:Lt,className:"sidebar-switch",disabled:k,label:"CC auto retry",title:"Retry temporary Claude Code turn failures before showing the flow pause alert",onChange:ze=>he(ze)}),x.jsxs("label",{className:"settings-select-row",children:[x.jsx("span",{children:"Permission requests"}),x.jsxs("select",{value:ye,disabled:k,onChange:ze=>Ae(ze.target.value),children:[x.jsx("option",{value:"off",children:"off"}),x.jsx("option",{value:"allowAll",children:"allow all"})]})]}),x.jsxs("button",{className:"settings-toggle",disabled:k||!Oe,title:"Save the current core role launch settings and optional Gate Reviewer settings",type:"button",onClick:Fe,children:[x.jsx("span",{children:"Save launch template"}),x.jsx("span",{children:Oe?"ready":"open task"})]}),ft?x.jsxs("button",{className:"settings-toggle is-active",disabled:k,title:N2(Me),type:"button",onClick:gt,children:[x.jsx("span",{children:"One-click start"}),x.jsx("span",{children:_v(Me)})]}):null,l?x.jsxs(x.Fragment,{children:[x.jsxs("button",{type:"button",onClick:()=>ln(!0),children:[x.jsx("span",{children:"Messages"}),x.jsxs("span",{className:"muted",children:[Wn.total," total"]})]}),x.jsxs("button",{type:"button",onClick:()=>Vn(!0),children:[x.jsx("span",{children:"Events"}),x.jsxs("span",{className:"muted",children:[f.length," total"]})]})]}):null]})}),x.jsx(Nr,{title:"Translation",open:zt==="translation",onOpenChange:ze=>It("translation",ze),children:x.jsx(H2,{busy:k,enabled:h,autoSendEnabled:p,targetLanguage:u,outputMode:b,memoryInitialized:C,baseUnavailableReason:Is,translatorSession:T,onAutoSendChange:ae,onCreateBootstrap:He,onEnabledChange:ee,onUpdateMemory:Pe,onTargetLanguageChange:de,onOutputModeChange:se,onOpenFileTranslation:we,onOpenTranslatorSession:je})}),n&&l?x.jsx(Nr,{title:"Gate Review Gates",open:zt==="gate-review-gates",onOpenChange:ze=>It("gate-review-gates",ze),children:x.jsx(U2,{busy:k,state:c,onGateEnabledChange:q})}):null,x.jsx(Nr,{title:"Gateway",open:zt==="gateway",onOpenChange:ze=>{It("gateway",ze),ze&&N()},children:x.jsx(F2,{busy:k,qrCheck:L,qrLogin:A,larkRegistration:D,larkRegistrationCheck:R,status:y,onEnabledChange:$,onSettingsChange:I,onResetBinding:Q,onStartLarkRegistration:pe,onStartQrLogin:ve,onTranslationChange:re})}),n?x.jsx(Nr,{title:"VCM Harness",open:zt==="vcm-harness",onOpenChange:ze=>It("vcm-harness",ze),children:x.jsx(k2,{status:E,bootstrapStatus:S,applyResult:v,hasActiveTask:!!wn,autoTaskHarnessReviewEnabled:_,busy:k,onRefresh:U,onApply:F,onOpenStudio:Z,onOpenRepositoryDiff:z,onAutoTaskHarnessReviewChange:O,onStartBootstrap:K,onRestartBootstrap:Y,onStopBootstrap:G,onRunBootstrap:W})}):null,n?x.jsx(Nr,{title:"Task",open:zt==="task",onOpenChange:ze=>It("task",ze),children:Wt.length>0?x.jsxs("div",{className:"task-panel",children:[x.jsx(B2,{tasks:Wt,activeTaskSlug:l,onSelect:yt}),wn?x.jsx("div",{className:"task-panel-actions",children:x.jsx("button",{className:"danger-button",disabled:k,type:"button",onClick:xt,children:"Close Task"})}):null]}):x.jsx("div",{className:"task-create",children:x.jsxs("form",{onSubmit:Ii,children:[x.jsx("input",{value:Qe,onChange:ze=>Zt(ze.target.value),placeholder:"task name"}),x.jsxs("div",{className:"task-create-preview",children:[x.jsxs("small",{children:["branch: ",Vt?`feature/${Vt}`:"feature/<task>"]}),x.jsxs("small",{children:["worktree: ",Vt?`.claude/worktrees/${Vt}`:".claude/worktrees/<task>"]})]}),x.jsx("button",{type:"submit",disabled:k||!Vt,children:"Create"})]})})}):null,n&&wn?x.jsx(V2,{task:wn,roundState:o}):null,Bt?x.jsx(X2,{busy:k,messages:d,orchestration:m,onClose:()=>ln(!1),onMarkAllDone:()=>{l&&mt(l)},onDeleteMessageHistory:()=>{l&&Ot(l)}}):null,Gn?x.jsx(Y2,{events:f,onClose:()=>Vn(!1)}):null]})}function _v(n){return[n.autoOrchestration?"auto":"manual"].join(" + ")}function N2(n){const r=Object.entries(n.roles).map(([s,l])=>`${s}: ${l.permissionMode} / ${l.model} / ${l.effort}`).join("; ");return`Launch template: ${_v(n)}; ${r}`}function H2({autoSendEnabled:n,baseUnavailableReason:r,busy:s,enabled:l,memoryInitialized:d,outputMode:m,targetLanguage:f,translatorSession:o,onAutoSendChange:c,onCreateBootstrap:h,onEnabledChange:p,onUpdateMemory:u,onOutputModeChange:b,onTargetLanguageChange:C,onOpenFileTranslation:T,onOpenTranslatorSession:E}){const S=!!(s||r),v=(o==null?void 0:o.status)==="running",_=!!(l&&!r&&v),y=r??(v?null:"Start Translator session first."),A=!!(s||y),D=r??"Open Translator session",R=y??"Translation tools are ready";return x.jsxs("div",{className:"sidebar-settings",children:[x.jsx(hi,{checked:_,className:"sidebar-switch",disabled:S||!v,label:"Conversation translation",title:R,onChange:p}),x.jsx(hi,{checked:n,className:"sidebar-switch",disabled:S,label:"Auto-send",onChange:c}),x.jsxs("label",{className:"settings-select-row",children:[x.jsx("span",{children:"Language"}),x.jsx("select",{value:f,disabled:S,onChange:k=>C(k.target.value),children:e_.map(k=>x.jsx("option",{value:k.value,children:k.label},k.value))})]}),x.jsxs("label",{className:"settings-select-row",children:[x.jsx("span",{children:"Reply scope"}),x.jsx("select",{value:m,disabled:S,onChange:k=>b(k.target.value),children:Z0.map(k=>x.jsx("option",{value:k.value,children:k.label},k.value))})]}),x.jsxs("button",{className:"settings-toggle",disabled:A,title:R,type:"button",onClick:T,children:[x.jsx("span",{children:"File translation"}),x.jsx("span",{children:"open"})]}),d?null:x.jsxs("button",{className:"settings-toggle",disabled:A,title:R,type:"button",onClick:h,children:[x.jsx("span",{children:"Bootstrap"}),x.jsx("span",{children:"run"})]}),x.jsxs("button",{className:"settings-toggle",disabled:A,title:R,type:"button",onClick:u,children:[x.jsx("span",{children:"Update memory"}),x.jsx("span",{children:"run"})]}),y?x.jsx("p",{className:"settings-help-text",children:y}):null,x.jsxs("div",{className:"settings-status-row",children:[x.jsx("span",{children:"Session status"}),x.jsx("strong",{children:z2(o)})]}),x.jsxs("button",{className:"settings-toggle",disabled:S,title:D,type:"button",onClick:E,children:[x.jsx("span",{children:"Open Session"}),x.jsx("span",{children:"open"})]})]})}function z2(n){return n?n.status==="running"?n.activityStatus??"idle":n.status:"not started"}function I2(n,r,s){return n?r?s?s.initialized?null:"Initialize VCM Harness first.":"Load VCM Harness status first.":"Create or select a task first.":"Connect a repository first."}function U2({busy:n,onGateEnabledChange:r,state:s}){return x.jsx("div",{className:"sidebar-settings",children:x2.map(l=>{const d=s==null?void 0:s.gates[l],m=!!(d!=null&&d.required);return x.jsx(hi,{checked:m,className:"sidebar-switch",disabled:n||!s,label:P2(l),title:d!=null&&d.status?`status: ${d.status}`:void 0,onChange:f=>r(l,f)},l)})})}function P2(n){switch(n){case"architecture-plan":return"Architecture plan";case"validation-adequacy":return"Validation adequacy";case"final-diff":return"Final diff"}return n}function F2({busy:n,larkRegistration:r,larkRegistrationCheck:s,onEnabledChange:l,onResetBinding:d,onSettingsChange:m,onStartLarkRegistration:f,onStartQrLogin:o,onTranslationChange:c,qrCheck:h,qrLogin:p,status:u}){const b=(u==null?void 0:u.channel)==="lark",C=(u==null?void 0:u.channel)==="lark"?!!(u.binding.appIdConfigured&&u.binding.appSecretConfigured):!!(u!=null&&u.binding.tokenConfigured),T=(u==null?void 0:u.channel)==="lark"?!!(u.binding.appIdConfigured&&u.binding.appSecretConfigured):!!(u!=null&&u.binding.tokenConfigured);return x.jsxs("div",{className:"gateway-panel",children:[x.jsxs("label",{className:"compact-field",children:[x.jsx("span",{children:"Channel"}),x.jsxs("select",{disabled:n||!u,value:(u==null?void 0:u.channel)??"weixin-ilink",onChange:E=>{m({channel:E.currentTarget.value==="lark"?"lark":"weixin-ilink"})},children:[x.jsx("option",{value:"weixin-ilink",children:"Weixin iLink"}),x.jsx("option",{value:"lark",children:"Lark"})]})]}),x.jsxs("div",{className:"gateway-actions",children:[x.jsx(hi,{checked:!!(u!=null&&u.enabled),className:"sidebar-switch",disabled:n||!u||!u.enabled&&!C,label:"Gateway",title:C?"Enable or disable PM messages and task-changing Gateway commands":"Configure the selected Gateway channel first",onChange:E=>l(E)}),x.jsx(hi,{checked:!!(u!=null&&u.translationEnabled),className:"sidebar-switch",disabled:n||!u,label:"Translation",onChange:E=>c(E)}),b?x.jsx("button",{type:"button",disabled:n,onClick:f,children:"Start QR Setup"}):T?x.jsx("button",{className:"danger-button",type:"button",disabled:n,onClick:d,children:"Reset Binding"}):x.jsx("button",{type:"button",disabled:n,onClick:o,children:"Start QR Login"})]}),b?x.jsxs("div",{className:"gateway-lark-settings",children:[x.jsx("p",{className:"muted",children:u!=null&&u.binding.appIdConfigured&&u.binding.appSecretConfigured?`Lark app configured${u.binding.larkBotName?` · ${u.binding.larkBotName}`:""}.`:"Use QR setup to create and configure the Lark bot automatically."}),r?x.jsxs("p",{className:"muted",children:["QR setup: ",(s==null?void 0:s.status)??r.status,s!=null&&s.message?` · ${s.message}`:""]}):null]}):p?x.jsx("p",{className:"muted",children:"QR login started. Use the login dialog to confirm binding."}):null,!b&&h?x.jsxs("p",{className:"muted",children:["QR status: ",h.status,h.message?` · ${h.message}`:""]}):null]})}function q2({busy:n,onPull:r,project:s}){const l=s.pullDisabledReason,d=!!s.canPull;return x.jsxs("div",{className:"project-summary",children:[x.jsxs("dl",{children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Base path"}),x.jsx("dd",{children:s.repoRoot})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Branch"}),x.jsx("dd",{children:$2(s)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Remote"}),x.jsx("dd",{children:s.upstreamBranch??"no upstream"})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Status"}),x.jsx("dd",{children:G2(s)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Commit"}),x.jsx("dd",{children:s.shortHeadCommit??s.headCommit??"unknown"})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Working tree"}),x.jsx("dd",{children:s.isDirty?"uncommitted changes":"clean"})]})]}),x.jsxs("div",{className:"connected-repo-actions",children:[x.jsx("button",{type:"button",disabled:n||!d,title:l??"Pull latest changes with git pull --ff-only",onClick:()=>void r(),children:"Pull"}),x.jsx("span",{className:"muted",children:s.checkedAt?`checked ${Ah(s.checkedAt)}`:"status not refreshed"})]}),l?x.jsx("p",{className:"muted",children:l}):null,s.warnings.length>0?x.jsx("ul",{className:"warnings",children:s.warnings.map(m=>x.jsx("li",{children:m},m))}):null]})}function $2(n){return n.branch||"unknown"}function G2(n){if(!n.upstreamBranch)return"no upstream";const r=n.ahead??0,s=n.behind??0;return r===0&&s===0?"up to date":r>0&&s>0?`ahead ${r}, behind ${s}`:r>0?`ahead ${r}`:`behind ${s}`}function V2({roundState:n,task:r}){var p;const[s,l]=te.useState(()=>Date.now()),d=!!(n!=null&&n.startedAt),m=vv(r.createdAt,s),f=Ig(n,(n==null?void 0:n.totalCcActiveMs)??0,s),o=d&&n?Ig(n,n.currentRoundCcActiveMs,s):0,c=d&&n?W2(n,s):0,h=((p=r.title)==null?void 0:p.trim())||r.taskSlug;return te.useEffect(()=>{const u=window.setInterval(()=>l(Date.now()),1e3);return()=>window.clearInterval(u)},[]),x.jsxs("section",{className:"task-status-dock","aria-label":"VCM Session status",children:[x.jsxs("div",{className:"task-status-dock-title",children:[x.jsx("strong",{title:h,children:h}),x.jsx("span",{className:`status-badge status-${r.status}`,children:r.status})]}),x.jsxs("dl",{className:"task-status-stats",children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Session start"}),x.jsx("dd",{children:Ah(r.createdAt)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Session total"}),x.jsx("dd",{children:So(m)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Rounds"}),x.jsx("dd",{children:(n==null?void 0:n.totalRoundCount)??0})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Role runtime"}),x.jsx("dd",{children:So(f)})]})]}),d&&n?x.jsxs("div",{className:"current-round-status",children:[x.jsxs("div",{className:"current-round-title",children:[x.jsx("span",{children:n.status==="running"?"Current Round":"Last Round"}),x.jsx("span",{className:`status-badge status-${n.status}`,children:n.status})]}),x.jsxs("dl",{className:"task-status-stats",children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Started"}),x.jsx("dd",{children:Ah(n.startedAt)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Total"}),x.jsx("dd",{children:So(c)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Role runtime"}),x.jsx("dd",{children:So(o)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Turn count"}),x.jsx("dd",{children:n.turnCount})]})]})]}):null]})}function Ig(n,r,s){if(!(n!=null&&n.activeTurnStartedAt)||n.status!=="running")return r;const l=Date.parse(n.updatedAt);return Number.isFinite(l)?r+Math.max(0,s-l):r}function W2(n,r){const s=n.status==="running"?r:Date.parse(n.stoppedAt??n.lastTurnEndedAt??"");return vv(n.startedAt??"",Number.isFinite(s)?s:r)}function vv(n,r){const s=Date.parse(n);return Number.isFinite(s)?Math.max(0,r-s):0}function Ah(n){if(!n)return"-";const r=new Date(n);return Number.isNaN(r.getTime())?"-":new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit"}).format(r)}function So(n){const r=Math.max(0,Math.floor(n/1e3)),s=Math.floor(r/3600),l=Math.floor(r%3600/60),d=r%60;return s>0?l>0?`${s}h ${l}m`:`${s}h`:l>0?d>0?`${l}m ${d}s`:`${l}m`:`${d}s`}function K2(n){return n==="system"?"light":n==="light"?"dark":"system"}function Ug(n){return n==="system"?"System":n==="light"?"Light":"Dark"}function Y2({events:n,onClose:r}){return x.jsx("div",{className:"modal-backdrop",children:x.jsxs("section",{className:"event-modal",role:"dialog","aria-modal":"true","aria-label":"Events",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Events"}),x.jsxs("p",{className:"muted",children:[n.length," total"]})]}),x.jsx("button",{type:"button",onClick:r,children:"Close"})]}),x.jsx(E2,{events:n,maxEvents:null,showHeader:!1})]})})}function X2({busy:n,messages:r,orchestration:s,onClose:l,onMarkAllDone:d,onDeleteMessageHistory:m}){const f=Xh(r);function o(){window.confirm(["Clear all pending route-file messages?","","Use this only after you manually copied or handled stuck route-file messages.","VCM will clear non-empty handoff message files so Stop-hook orchestration can continue."].join(`
|
|
93
|
+
`;function e2({active:n=!0,autoSendEnabled:r,targetLanguage:s,taskSlug:l,role:d,sessionId:m,panelState:f,onClearSession:o,onEntry:c,onFailures:h}){const[p,u]=te.useState(""),[b,C]=te.useState(""),[T,E]=te.useState(!1),[S,v]=te.useState(Date.now()),[_,y]=te.useState(!1),[,A]=Hi(""),L=te.useRef(null),D=f.entries,R=f.failures,k=f.status;te.useEffect(()=>{if(!n)return;const O=L.current;if(!O)return;const N=window.requestAnimationFrame(()=>{O.scrollTop=O.scrollHeight});return()=>window.cancelAnimationFrame(N)},[n,D]);const M=o2(D);te.useEffect(()=>{if(!M)return;v(Date.now());const O=window.setInterval(()=>v(Date.now()),250);return()=>window.clearInterval(O)},[M]);async function j(O=!1){const N=p;y(!0),A(""),E(!1);try{const $=await Se.translateUserInput(l,d,{text:N,mode:O?"auto-send":"review-before-send",useContext:!1,send:O});$.sent?(u(""),E(!1)):(u(mv(N,$.englishPreview)),E(!0))}catch($){A(pt("Translate composer input",$))}finally{y(!1)}}async function H(){const O=b.trim();if(O){y(!0),A("");try{const N=await Se.translateManualOutput(l,d,{text:O});c(m,d,N),C("")}catch(N){A(pt("Translate pasted English output",N))}finally{y(!1)}}}async function U(){const O=T?zg(p):p;if(O.trim()){y(!0),A("");try{await Se.sendTranslatedInput(l,d,{englishText:O}),u(""),E(!1)}catch(N){A(pt("Send translated English input to role",N))}finally{y(!1)}}}function F(O){O.key!=="Enter"||O.shiftKey||O.nativeEvent.isComposing||(O.preventDefault(),!_&&p.trim()&&(T?U():j(r)))}async function K(){o(m,d),await Se.clearTranslationSession(m).catch(O=>A(pt("Clear conversation translation panel",O)))}async function Y(){y(!0),A("");try{const O=await Se.ignoreTranslationFailures(m);h(m,d,O.failures)}catch(O){A(pt("Ignore failed conversation translations",O))}finally{y(!1)}}async function G(O){y(!0),A("");try{const N=await Se.retryTranslation(m,O.translationId);c(m,d,N)}catch(N){A(pt("Retry latest failed conversation translation",N))}finally{y(!1)}}const W=c2(D,k,S),Z=R.length,z=n2(R);return x.jsxs("aside",{className:"translation-panel",children:[x.jsxs("header",{className:"translation-panel-header",children:[x.jsxs("div",{className:"translation-panel-titlebar",children:[x.jsx("h2",{children:"Translation"}),x.jsxs("div",{className:"translation-panel-actions",children:[Z>0?x.jsxs(x.Fragment,{children:[x.jsxs("button",{type:"button",disabled:_,onClick:()=>void Y(),children:["Ignore ",Z]}),z?x.jsx("button",{type:"button",disabled:_,onClick:()=>void G(z),children:"Retry latest"}):null]}):null,x.jsx("button",{type:"button",onClick:()=>void K(),children:"Clear"})]})]}),x.jsx("div",{className:"translation-status-row",children:x.jsxs("p",{children:["Claude Code · target ",t2(s)," · ",W]})})]}),x.jsxs("div",{className:"translation-entry-list",ref:L,children:[D.length===0?x.jsx("p",{className:"muted",children:"Translated Claude Code output will appear here."}):null,D.map(O=>x.jsx(a2,{entry:O},O.id))]}),x.jsxs("div",{className:"translation-composer",children:[x.jsxs("div",{className:"translation-composer-row translation-manual-row",children:[x.jsx("textarea",{value:b,onChange:O=>C(O.target.value),placeholder:"Paste English to translate on demand..."}),x.jsx("div",{className:"translation-composer-actions",children:x.jsx("button",{type:"button",disabled:_||!b.trim(),onClick:()=>void H(),children:"Translate"})})]}),x.jsxs("div",{className:"translation-composer-row",children:[x.jsx("textarea",{value:p,onChange:O=>{u(O.target.value),(!O.target.value.trim()||T&&!f2(O.target.value))&&E(!1)},onKeyDown:F,placeholder:"输入中文,先翻译成英文工程指令..."}),x.jsx("div",{className:"translation-composer-actions",children:x.jsx("button",{type:"button",disabled:_||!T||!zg(p).trim(),onClick:()=>void U(),children:"Send English"})})]})]})]})}function t2(n){var r;return((r=e_.find(s=>s.value===n))==null?void 0:r.label)??n}function n2(n){let r,s=Number.NEGATIVE_INFINITY;for(const l of n){const d=Date.parse(l.failedAt),m=Number.isFinite(d)?d:Number.NEGATIVE_INFINITY;(!r||m>=s)&&(r=l,s=m)}return r}function i2({open:n,taskSlug:r,targetLanguage:s,onClose:l}){const[d,m]=te.useState(!1),[,f]=Hi(""),[o,c]=te.useState(null),[h,p]=te.useState(""),[u,b]=te.useState(""),[C,T]=te.useState(""),[E,S]=te.useState(!1),[v,_]=te.useState(null),[y,A]=te.useState(""),[L,D]=te.useState(""),[R,k]=te.useState(""),[M,j]=te.useState(!1);Xa(n?`file-translation:${h||"none"}`:null,()=>H(!0),{intervalMs:2e3,runImmediately:!0});async function H(G=!1){try{const W=await Se.getTranslationState();c(W);const Z=h?W.fileIndex.jobs.some(z=>z.id===h):!1;if((!h||!Z)&&W.fileIndex.jobs[0])U(W.fileIndex.jobs[0].id);else if(!W.fileIndex.jobs[0])p(""),b(""),T("");else if(G&&h){const z=await Se.readFileTranslation(h);b(z.output),T(z.report)}}catch(W){f(pt("Load file translation list",W))}}async function U(G){p(G),b(""),T("");try{const W=await Se.readFileTranslation(G);b(W.output),T(W.report)}catch(W){f(pt(`Read translated file ${G}`,W))}}async function F(){S(!0),await K(y,L)}async function K(G="",W=""){j(!0),f("");try{const Z=await Se.browseTranslationSourceFiles({path:G,query:W,limit:250});_(Z),A(Z.currentPath),D(W)}catch(Z){f(pt("Browse translation source files",Z))}finally{j(!1)}}async function Y(G=R){const W=G.trim();if(W){m(!0),f("");try{if(!r)throw new Error("Create or select a task before translating files.");const Z=await Se.createFileTranslation({taskSlug:r,sourcePath:W,targetLanguage:s});S(!1),await H(),await U(Z.id)}catch(Z){f(pt(`Create file translation for ${W}`,Z))}finally{m(!1)}}}return n?x.jsxs(x.Fragment,{children:[x.jsx("div",{className:"modal-backdrop file-translation-backdrop",children:x.jsx(s2,{busy:d,state:o,selectedJobId:h,output:u,report:C,onClose:()=>{S(!1),l()},onRefresh:()=>void H(),onSelectJob:G=>void U(G),onTranslate:()=>void F()})}),E?x.jsx(r2,{busy:d||M,state:v,currentPath:y,query:L,selectedPath:R,onBrowse:(G,W)=>void K(G,W),onClose:()=>S(!1),onQueryChange:D,onSelectPath:k,onTranslate:()=>void Y()}):null]}):null}function r2({busy:n,state:r,currentPath:s,query:l,selectedPath:d,onBrowse:m,onClose:f,onQueryChange:o,onSelectPath:c,onTranslate:h}){const p=(r==null?void 0:r.entries)??[],u=p.filter(C=>C.type==="directory"),b=p.filter(C=>C.type==="file");return x.jsx("div",{className:"modal-backdrop translation-file-browser-backdrop",children:x.jsxs("section",{className:"translation-file-browser-modal",role:"dialog","aria-modal":"true","aria-label":"Select Source File",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Select Source File"}),x.jsx("p",{children:s||"."})]}),x.jsx("button",{type:"button",onClick:f,children:"Close"})]}),x.jsxs("div",{className:"translation-file-browser-controls",children:[x.jsxs("div",{className:"translation-file-browser-nav",children:[x.jsx("button",{type:"button",disabled:n||!s,onClick:()=>m((r==null?void 0:r.parentPath)??"",""),children:"Up"}),x.jsx("button",{type:"button",disabled:n||!s,onClick:()=>m("",""),children:"Root"})]}),x.jsxs("form",{className:"translation-file-browser-search",onSubmit:C=>{C.preventDefault(),m(s,l)},children:[x.jsx("input",{value:l,onChange:C=>o(C.target.value),placeholder:"Search files"}),x.jsx("button",{type:"submit",disabled:n,children:"Search"}),x.jsx("button",{type:"button",disabled:n||!l,onClick:()=>m(s,""),children:"Clear"})]})]}),x.jsxs("div",{className:"translation-file-browser-layout",children:[x.jsxs("div",{className:"translation-file-browser-list",children:[n&&!r?x.jsx("p",{className:"muted",children:"Loading files..."}):null,!n&&p.length===0?x.jsx("p",{className:"muted",children:"No source files found."}):null,u.length>0?x.jsxs("div",{className:"translation-file-browser-group",children:[x.jsx("h3",{children:"Folders"}),u.map(C=>x.jsx(Hg,{entry:C,selected:d===C.path,onBrowse:m,onSelectPath:c},C.path))]}):null,b.length>0?x.jsxs("div",{className:"translation-file-browser-group",children:[x.jsx("h3",{children:"Files"}),b.map(C=>x.jsx(Hg,{entry:C,selected:d===C.path,onBrowse:m,onSelectPath:c},C.path))]}):null,r!=null&&r.truncated?x.jsx("p",{className:"translation-entry-note",children:"Result limit reached."}):null]}),x.jsxs("aside",{className:"translation-file-browser-selection",children:[x.jsxs("label",{children:[x.jsx("span",{children:"Source path"}),x.jsx("input",{value:d,onChange:C=>c(C.target.value)})]}),x.jsx("button",{type:"button",disabled:n||!d.trim(),onClick:h,children:"Translate File"})]})]})]})})}function Hg({entry:n,selected:r,onBrowse:s,onSelectPath:l}){const d=n.type==="directory";return x.jsxs("button",{className:r?"translation-file-browser-entry is-selected":"translation-file-browser-entry",type:"button",onClick:()=>d?s(n.path,""):l(n.path),onDoubleClick:()=>d?s(n.path,""):void 0,children:[x.jsx("span",{children:d?"DIR":"FILE"}),x.jsx("strong",{children:n.name}),x.jsx("small",{children:n.path})]})}function s2({busy:n,state:r,selectedJobId:s,output:l,report:d,onClose:m,onRefresh:f,onSelectJob:o,onTranslate:c}){const h=(r==null?void 0:r.fileIndex.jobs)??[],p=h.find(u=>u.id===s);return x.jsxs("section",{className:"file-translation-modal",role:"dialog","aria-modal":"true","aria-label":"File Translation",children:[x.jsxs("header",{className:"file-translation-header",children:[x.jsxs("div",{children:[x.jsx("h2",{children:"File Translation"}),x.jsx("p",{children:"Claude Code · 中英互译"})]}),x.jsxs("div",{className:"file-translation-toolbar",children:[x.jsx("button",{type:"button",disabled:n,onClick:c,children:"Translate"}),x.jsx("button",{type:"button",disabled:n,onClick:f,children:"Refresh"}),x.jsx("button",{type:"button",onClick:m,children:"Close"})]})]}),r!=null&&r.memoryInitialized?null:x.jsx("p",{className:"translation-entry-note",children:"Translation memory is not initialized. Run Bootstrap from the sidebar before important file translations."}),x.jsxs("div",{className:"file-translation-layout",children:[x.jsxs("div",{className:"file-translation-list",children:[h.length===0?x.jsx("p",{className:"muted",children:"No translated files yet."}):null,h.map(u=>x.jsxs("button",{className:u.id===s?"file-translation-item is-active":"file-translation-item",type:"button",onClick:()=>o(u.id),children:[x.jsx("strong",{children:u.sourcePath}),x.jsxs("span",{children:[u.status," · ",u.targetLanguage]})]},u.id))]}),x.jsx("div",{className:"file-translation-preview",children:p?x.jsxs(x.Fragment,{children:[x.jsxs("header",{children:[x.jsx("strong",{children:p.sourcePath}),x.jsx("span",{children:p.status})]}),x.jsx("div",{className:"translation-markdown",children:x.jsx(P_,{remarkPlugins:[hv],children:l||d||"Translation output is not available yet."})})]}):x.jsx("p",{className:"muted",children:"Select a translated file to preview it."})})]})]})}function a2({entry:n}){if(n.sourceKind==="conversation-boundary")return x.jsx(l2,{entry:n});const r=h2(n),s=n.sourceKind==="tool-output",l=n.direction==="user-input-to-english",d=["translation-entry",`is-${n.sourceKind}`,l?"is-user-input":""].filter(Boolean).join(" ");return x.jsxs("article",{className:d,children:[s?x.jsx("pre",{children:r}):x.jsx("div",{className:"translation-markdown",children:x.jsx(P_,{remarkPlugins:[hv],children:r})}),n.warning?x.jsx("p",{className:"translation-entry-note",children:n.warning}):null,n.error?x.jsx("p",{className:"translation-entry-note is-error",children:n.error}):null]})}function l2({entry:n}){const r=n.boundaryKind==="end"?"结束":"开始",s=n.conversationTurn??0,l=p2(n.occurredAt??n.createdAt);return x.jsxs("div",{className:"translation-conversation-boundary","aria-label":`${r} 第 ${s} 轮 ${l}`,children:[x.jsx("span",{className:"translation-boundary-dash","aria-hidden":"true"}),x.jsx("span",{children:r}),x.jsxs("span",{children:["第 ",s," 轮"]}),x.jsx("time",{children:l}),x.jsx("span",{className:"translation-boundary-dash","aria-hidden":"true"})]})}function o2(n){const r=n.find(pv);return(r==null?void 0:r.translationStartedAt)??(r==null?void 0:r.createdAt)}function c2(n,r,s){const l=n.find(pv);if(l)return`translating ${d2(Math.max(0,s-u2(l)))}`;const d=n.at(-1);return(d==null?void 0:d.status)==="failed"||r==="failed"?"error":r}function pv(n){return n.status==="queued"||n.status==="translating"}function u2(n){const r=Date.parse(n.translationStartedAt??n.createdAt);return Number.isFinite(r)?r:Date.now()}function h2(n){return n.status==="queued"||n.status==="translating"?n.sourceText:n.status==="translated"?n.direction==="user-input-to-english"?mv(n.sourceText,n.translatedText):n.translatedText:n.translatedText||n.sourceText}function mv(n,r){return`${n.trimEnd()}${Ro}${r.trimStart()}`}function f2(n){return n.includes(Ro)}function zg(n){const r=n.indexOf(Ro);return r===-1?n:n.slice(r+Ro.length)}function d2(n){if(n<1e3)return`${Math.max(.1,n/1e3).toFixed(1)}s`;const r=n/1e3;if(r<60)return`${r.toFixed(1)}s`;const s=Math.floor(r/60),l=Math.floor(r%60).toString().padStart(2,"0");return`${s}:${l}`}function p2(n){const r=new Date(n);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString()}const m2=8;function g2(){const[n,r]=te.useState([]);return te.useEffect(()=>{const s=m=>{var c,h;const f=(h=(c=m.detail)==null?void 0:c.message)==null?void 0:h.trim();if(!f)return;const o=new Date().toISOString();r(p=>{const u=p.find(b=>b.message===f);return u?[{...u,count:u.count+1,updatedAt:o},...p.filter(b=>b.id!==u.id)]:[{id:`ui_error_${Date.now()}_${Math.random().toString(16).slice(2)}`,message:f,count:1,createdAt:o,updatedAt:o},...p].slice(0,m2)})},l=m=>{var o;const f=((o=m.detail)==null?void 0:o.actions)??[];f.length!==0&&r(c=>c.filter(h=>!f.some(p=>h.message.startsWith(`${p} failed.`))))},d=m=>{var o,c;const f=(c=(o=m.detail)==null?void 0:o.message)==null?void 0:c.trim();f&&r(h=>h.filter(p=>p.message!==f))};return window.addEventListener(uh,s),window.addEventListener(hh,l),window.addEventListener(fh,d),()=>{window.removeEventListener(uh,s),window.removeEventListener(hh,l),window.removeEventListener(fh,d)}},[]),n.length===0?null:x.jsxs("aside",{className:"ui-error-center",role:"alert","aria-live":"polite","aria-label":"Application errors",children:[x.jsxs("header",{className:"ui-error-center-header",children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Errors"}),x.jsxs("p",{children:[n.length," active"]})]}),x.jsx("button",{type:"button",onClick:()=>r([]),children:"Clear"})]}),x.jsx("ol",{className:"ui-error-list",children:n.map(s=>x.jsxs("li",{children:[x.jsxs("div",{children:[x.jsx("p",{children:s.message}),x.jsxs("span",{children:[_2(s.updatedAt),s.count>1?` · repeated ${s.count} times`:""]})]}),x.jsx("button",{type:"button","aria-label":"Dismiss error",onClick:()=>r(l=>l.filter(d=>d.id!==s.id)),children:"Close"})]},s.id))})]})}function _2(n){return new Date(n).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function v2(n,r){return n.find(s=>s.taskSlug===r)??n[0]??null}function y2(n){if(!(n.mode!=="auto"||n.status!=="running")&&!(!n.activeRole||n.activeRole===n.lastFollowedRole))return n.activeRole}function S2(n,r){var d;if(!((d=n.flowPause)!=null&&d.paused))return null;const s=n.flowPause.role??n.activeRole??"role",l=n.roleRecovery;return n.flowPause.reason==="role-recovery-failed"&&l?r(l,s):`No new turn started after ${s} stopped.`}function b2(n){const r=n.flowPause;if((r==null?void 0:r.reason)==="awaiting-user")return`awaiting-user:${r.since??n.taskSlug}`;const s=n.roundId??n.startedAt??n.taskSlug,l=n.stoppedAt??n.lastTurnEndedAt??"stopped";return`${s}:${l}`}const C2=3,w2=3e4,wo=new Map;function gv(n,r){const s=pt(n,r);if(!x2(r))return wo.set(n,{consecutiveFailures:1,lastMessage:s,lastReportedAt:Date.now()}),s;const l=wo.get(n),d=((l==null?void 0:l.consecutiveFailures)??0)+1,m=Date.now(),f=d>=C2&&(!l||l.lastMessage!==s||m-l.lastReportedAt>=w2);return wo.set(n,{consecutiveFailures:d,lastMessage:s,lastReportedAt:f?m:(l==null?void 0:l.lastReportedAt)??0}),f?s:null}function Do(n){wo.delete(n),c1([n])}function x2(n){const r=Lo(n);return r.includes("could not reach the VCM backend")||r.includes("Failed to fetch")||r.includes("NetworkError")||r.includes("Load failed")||r.includes("ERR_CONNECTION")}const E2=["architecture-plan","validation-adequacy","final-diff"];function k2({events:n,maxEvents:r=8,showHeader:s=!0}){const l=r===null?n:n.slice(-r);return x.jsxs("section",{className:"event-log",children:[s?x.jsx("h2",{children:"Events"}):null,n.length===0?x.jsx("p",{className:"muted",children:"No terminal events yet."}):x.jsx("ol",{children:l.map((d,m)=>x.jsx("li",{children:d},`${d}-${m}`))})]})}function hi({checked:n,className:r,disabled:s,label:l,stateLabel:d,title:m,onChange:f}){const o=["switch-control",n?"is-on":"is-off",r].filter(Boolean).join(" "),c=d??(n?"on":"off");return x.jsxs("button",{type:"button",role:"switch","aria-checked":n,"aria-label":`${l}: ${c}`,className:o,disabled:s,title:m,onClick:()=>f(!n),children:[x.jsx("span",{className:"switch-control-label",children:l}),x.jsx("span",{className:"switch-control-track","aria-hidden":"true",children:x.jsx("span",{className:"switch-control-thumb"})})]})}function A2({status:n,bootstrapStatus:r,applyResult:s,hasActiveTask:l=!1,autoTaskHarnessReviewEnabled:d,busy:m=!1,onRefresh:f,onApply:o,onOpenStudio:c,onOpenRepositoryDiff:h,onAutoTaskHarnessReviewChange:p,onStartBootstrap:u,onRestartBootstrap:b,onStopBootstrap:C,onRunBootstrap:T}){const[E,S]=te.useState(!1),[v,_]=te.useState("bypassPermissions"),[y,A]=te.useState("default"),[L,D]=te.useState("default"),R=r==null?void 0:r.session,k=(r==null?void 0:r.status)==="running",M=(R==null?void 0:R.status)==="running",j=(r==null?void 0:r.status)!=="complete",H={permissionMode:v,model:y,effort:L};return l?n?x.jsxs("section",{className:"harness-panel",children:[x.jsxs("div",{className:"harness-stage",children:[x.jsxs("div",{className:"harness-panel-header",children:[x.jsxs("div",{children:[x.jsx("strong",{children:"Fixed install"}),x.jsx("p",{className:"muted",children:n.initialized?n.needsApply?`${n.plannedChanges.length} pending updates`:"Up to date":"Not initialized"})]}),x.jsx("div",{className:"harness-actions",children:n.initialized?x.jsxs(x.Fragment,{children:[x.jsx("button",{type:"button",disabled:m,onClick:()=>void f(),children:"Refresh"}),n.needsApply?x.jsx("button",{type:"button",disabled:m,onClick:()=>void o(),children:"Update"}):null]}):x.jsx("button",{type:"button",disabled:m,onClick:()=>void o(),children:"Initialize"})})]}),n.initialized&&n.needsApply?x.jsxs(x.Fragment,{children:[x.jsx("h3",{className:"harness-file-list-title",children:"Files to update"}),x.jsx("ol",{className:"harness-file-list",children:n.plannedChanges.map(U=>x.jsxs("li",{children:[x.jsx("span",{children:U.path}),x.jsx(Ni,{status:U.action})]},`${U.path}:${U.action}`))})]}):null]}),x.jsxs("div",{className:"harness-stage",children:[x.jsxs("div",{className:"harness-panel-header",children:[x.jsx("div",{children:x.jsx("strong",{children:"Harness Studio"})}),x.jsx("div",{className:"harness-actions",children:x.jsx("button",{type:"button",disabled:m,onClick:c,children:"Open Studio"})})]}),x.jsx("button",{className:"harness-review-diff-button",type:"button",disabled:m,onClick:h,children:"Review Diff"}),x.jsx(hi,{checked:d,className:"sidebar-switch",disabled:m,label:"Auto task harness review",title:"Automatically ask Harness Engineer to review task harness after final acceptance completes",onChange:p})]}),j?x.jsx("div",{className:"harness-stage",children:x.jsxs("div",{className:"harness-panel-header",children:[x.jsxs("div",{children:[x.jsx("strong",{children:"Bootstrap"}),x.jsx("p",{className:"muted",children:r?T2(r.status):"not loaded"})]}),x.jsx("div",{className:"harness-actions",children:x.jsx("button",{type:"button",disabled:m||!(r!=null&&r.canStart),onClick:()=>{S(!0)},children:"Open Bootstrap"})})]})}):null,s!=null&&s.changedFiles.length?x.jsx("div",{className:"harness-result",children:x.jsx("p",{className:"muted",children:s.message})}):null,n.warnings.length>0?x.jsx("ul",{className:"warnings",children:n.warnings.map(U=>x.jsx("li",{children:U},U))}):null,r!=null&&r.warnings.length?x.jsx("ul",{className:"warnings",children:r.warnings.map(U=>x.jsx("li",{children:U},U))}):null,j&&E?x.jsx("div",{className:"harness-bootstrap-modal",role:"dialog","aria-modal":"true","aria-label":"Harness Engineer bootstrap session",children:x.jsxs("div",{className:"harness-bootstrap-modal-surface",children:[x.jsxs("header",{className:"harness-bootstrap-modal-header",children:[x.jsxs("div",{children:[x.jsx("strong",{children:"Harness Engineer Bootstrap"}),x.jsx("p",{className:"muted",children:(R==null?void 0:R.command)??"Start Harness Engineer, then run bootstrap when ready."})]}),x.jsxs("div",{className:"harness-bootstrap-modal-actions",children:[R?x.jsx(Ni,{status:R.status}):null,x.jsx("button",{type:"button",onClick:()=>S(!1),children:"Close"})]})]}),x.jsxs("div",{className:"harness-bootstrap-controls",children:[x.jsxs("label",{children:[x.jsx("span",{children:"Permission"}),x.jsx("select",{value:v,disabled:m||k||M,onChange:U=>_(U.target.value),children:n_.map(U=>x.jsx("option",{value:U.value,children:U.label},U.value))})]}),x.jsxs("label",{children:[x.jsx("span",{children:"Model"}),x.jsx("select",{value:y,disabled:m||k||M,onChange:U=>A(U.target.value),children:i_.map(U=>x.jsx("option",{value:U.value,children:U.label},U.value))})]}),x.jsxs("label",{children:[x.jsx("span",{children:"Effort"}),x.jsx("select",{value:L,disabled:m||k||M,onChange:U=>D(U.target.value),children:r_.map(U=>x.jsx("option",{value:U.value,children:U.label},U.value))})]}),x.jsxs("div",{className:"harness-bootstrap-control-actions",children:[x.jsx("button",{type:"button",disabled:m||k||!(r!=null&&r.canStart),onClick:()=>void u(H),children:"Start"}),x.jsx("button",{type:"button",disabled:m||k||!(r!=null&&r.canStart),onClick:()=>void b(H),children:"Restart"}),x.jsx("button",{type:"button",disabled:m||!R,onClick:()=>void C(),children:"Stop"}),x.jsx("button",{type:"button",disabled:m||k||!M,onClick:()=>void T(),children:"Run bootstrap"})]})]}),x.jsx("div",{className:"harness-bootstrap-terminal",children:M?x.jsx(Oo,{sessionId:R.id,active:E}):x.jsxs("div",{className:"terminal-empty",children:[x.jsx("strong",{children:"Harness Bootstrap"}),x.jsx("span",{children:"Start Harness Engineer first. When it is ready, click Run bootstrap to send the prompt."})]})})]})}):null]}):null:x.jsx("section",{className:"harness-panel",children:x.jsxs("div",{className:"harness-result",children:[x.jsx("strong",{children:"Task required"}),x.jsx("p",{className:"muted",children:"Create or select a task before changing VCM Harness. Harness changes are committed in the active task worktree."})]})})}function T2(n){return n.replaceAll("_"," ")}function Xh(n){return{total:n.length,accepted:n.filter(r=>r.acceptedAt).length,delivered:n.filter(r=>r.deliveredAt).length}}function R2(n,r=6){const s=[...n].sort(L2).map((d,m)=>({message:d,sequence:m+1}));return[...r===null?s:s.slice(-r)].sort((d,m)=>m.sequence-d.sequence)}function D2({messages:n,orchestration:r,busy:s,maxMessages:l=6,showControls:d=!0,showHeader:m=!0,onModeChange:f,onMarkAllDone:o}){const[c,h]=te.useState(null),p=Xh(n),u=(r==null?void 0:r.mode)??"auto",b=R2(n,l);async function C(T){await O2(T.body),h(T.id),window.setTimeout(()=>h(E=>E===T.id?null:E),1200)}return x.jsxs("section",{className:"message-panel",children:[m?x.jsxs("div",{className:"message-panel-header",children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Messages"}),x.jsxs("p",{className:"muted",children:[p.total," total / ",p.accepted," accepted"]})]}),d&&f?x.jsx("div",{className:"message-controls",children:x.jsx(hi,{checked:u==="auto",className:"message-mode-toggle",disabled:s,label:"Auto orchestration",onChange:T=>f(T?"auto":"manual")})}):null,d&&o?x.jsx("button",{type:"button",disabled:s,onClick:o,children:"Mark All Done"}):null]}):null,n.length===0?x.jsx("p",{className:"muted",children:"No role messages yet."}):x.jsx("ol",{className:"message-list",children:b.map(({message:T,sequence:E})=>x.jsxs("li",{className:"message-item",children:[x.jsxs("div",{className:"message-item-main",children:[x.jsxs("div",{className:"message-meta",children:[x.jsxs("span",{className:"message-sequence",children:["#",E]}),x.jsx("time",{dateTime:Mo(T),children:M2(Mo(T))}),x.jsxs("strong",{children:[T.fromRole," ","->"," ",T.toRole]}),x.jsx("span",{children:T.type})]}),x.jsx("p",{children:T.body}),T.failureReason?x.jsx("span",{className:"message-reason",children:T.failureReason}):null,T.bodyPath?x.jsx("span",{className:"message-path",children:T.bodyPath}):null]}),x.jsx("div",{className:"message-actions",children:x.jsx("button",{type:"button",disabled:s,onClick:()=>void C(T),children:c===T.id?"Copied":"Copy"})})]},T.id))})]})}function M2(n){const r=new Date(n);return Number.isNaN(r.getTime())?n:r.toLocaleString(void 0,{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Mo(n){return n.acceptedAt??n.deliveredAt??n.dispatchingAt??n.createdAt}function L2(n,r){const s=Mo(n).localeCompare(Mo(r));if(s!==0)return s;const l=n.createdAt.localeCompare(r.createdAt);return l!==0?l:n.id.localeCompare(r.id)}async function O2(n){var s;if((s=navigator.clipboard)!=null&&s.writeText){await navigator.clipboard.writeText(n);return}const r=document.createElement("textarea");r.value=n,r.setAttribute("readonly","true"),r.style.position="fixed",r.style.left="-9999px",document.body.appendChild(r),r.select(),document.execCommand("copy"),r.remove()}function B2({defaultPath:n="",recentPaths:r=[],busy:s=!1,onConnect:l}){const[d,m]=te.useState(n);te.useEffect(()=>{n&&m(n)},[n]);async function f(o){o.preventDefault(),await l(d)}return x.jsx("form",{className:"repo-connect",onSubmit:f,children:x.jsxs("div",{className:r.length>0?"inline-form has-recent-paths":"inline-form",children:[x.jsx("input",{"aria-label":"Repository path",id:"repo-path",value:d,onChange:o=>m(o.target.value),placeholder:"/path/to/repo"}),r.length>0?x.jsxs("select",{"aria-label":"Recent repositories",className:"repo-recent-select",value:"",onChange:o=>{o.target.value&&m(o.target.value)},children:[x.jsx("option",{value:"",children:"Recent"}),r.map(o=>x.jsx("option",{value:o,children:o},o))]}):null,x.jsx("button",{type:"submit",disabled:s||!d.trim(),children:"Connect"})]})})}function j2({tasks:n,activeTaskSlug:r,onSelect:s}){return x.jsx("nav",{className:"task-nav","aria-label":"Tasks",children:n.map(l=>x.jsxs("button",{className:l.taskSlug===r?"task-nav-item is-active":"task-nav-item",type:"button",onClick:()=>s(l.taskSlug),children:[x.jsx("span",{children:l.title||l.taskSlug}),x.jsx(Ni,{status:l.status})]},l.taskSlug))})}function N2({project:n,recentRepositoryPaths:r,tasks:s,activeTaskSlug:l,messages:d,orchestration:m,events:f,roundState:o,gateReview:c,translationEnabled:h,translationAutoSendEnabled:p,translationTargetLanguage:u,translationOutputMode:b,translationMemoryInitialized:C,translatorSession:T,harnessStatus:E,harnessBootstrapStatus:S,harnessApplyResult:v,autoTaskHarnessReviewEnabled:_,gatewayStatus:y,gatewayQrLogin:A,gatewayQrCheck:L,gatewayLarkRegistration:D,gatewayLarkRegistrationCheck:R,busy:k,onConnect:M,onRefreshConnectedRepository:j,onPullConnectedRepository:H,onRefreshHarness:U,onApplyHarness:F,onStartHarnessBootstrap:K,onRestartHarnessBootstrap:Y,onStopHarnessBootstrap:G,onRunHarnessBootstrap:W,onOpenHarnessStudio:Z,onOpenRepositoryDiff:z,onAutoTaskHarnessReviewChange:O,onRefreshGateway:N,onGatewayEnabledChange:$,onGatewaySettingsChange:I,onGatewayTranslationChange:re,onStartGatewayQrLogin:ve,onStartGatewayLarkRegistration:pe,onResetGatewayBinding:Q,onGateReviewGateEnabledChange:q,onTranslationEnabledChange:ee,onTranslationAutoSendChange:ae,onTranslationTargetLanguageChange:de,onTranslationOutputModeChange:se,onOpenFileTranslation:we,onOpenTranslatorSession:je,onCreateTranslationBootstrap:He,onUpdateTranslationMemory:Pe,onCreateTask:xe,onCloseTask:xt,onSelectTask:yt,themeMode:Et,onAutoOrchestrationChange:an,onThemeModeChange:Cn,pauseAlertSound:St,onPauseAlertSoundChange:tt,roleRetryEnabled:Lt,onRoleRetryEnabledChange:he,permissionRequestMode:ye,onPermissionRequestModeChange:Ae,launchTemplate:Me,canSaveLaunchTemplate:Oe,canOneClickStart:ft,onSaveLaunchTemplate:Fe,onOneClickStart:gt,onMarkAllMessagesDone:mt,onDeleteMessageHistory:Ot}){const[Qe,Zt]=te.useState(""),[Bt,ln]=te.useState(!1),[Gn,Vn]=te.useState(!1),[zt,on]=te.useState(()=>l?null:"repository"),Wn=Xh(d),Vt=Qe.trim(),Is=U2(n,l,E),Wt=s.filter(ze=>ze.cleanupStatus!=="cleaned"),wn=Wt.find(ze=>ze.taskSlug===l)??null;te.useEffect(()=>{on(ze=>!l&&ze===null?n?"task":"repository":ze)},[l,n]);function It(ze,di){on(di?ze:null)}async function Ii(ze){ze.preventDefault(),await xe({taskSlug:Vt}),Zt("")}return x.jsxs("div",{className:"project-dashboard",children:[x.jsx("header",{className:"brand-header",children:x.jsx("strong",{children:"VibeCodingMaster"})}),x.jsx(Nr,{title:"Repository",open:zt==="repository",onOpenChange:ze=>{It("repository",ze),ze&&n&&j()},children:x.jsxs("div",{className:"repository-panel",children:[x.jsx(B2,{defaultPath:(n==null?void 0:n.repoRoot)??"",recentPaths:r,busy:k,onConnect:M}),n?x.jsx($2,{busy:k,project:n,onPull:H}):null]})}),x.jsx(Nr,{title:"Settings",open:zt==="settings",onOpenChange:ze=>It("settings",ze),children:x.jsxs("div",{className:"sidebar-settings",children:[x.jsxs("button",{"aria-label":`Theme mode: ${Ug(Et)}`,className:"settings-toggle theme-mode-toggle",disabled:k,title:"Cycle theme: system, light, dark",type:"button",onClick:()=>Cn(Y2(Et)),children:[x.jsx("span",{children:"Theme"}),x.jsx("span",{children:Ug(Et)})]}),x.jsx(hi,{checked:((m==null?void 0:m.mode)??"auto")==="auto",className:"sidebar-switch",disabled:k||!l,label:"Auto orchestration",title:l?"Automatically dispatch role messages during the active task":"Create or select a task first",onChange:an}),x.jsx(hi,{checked:St,className:"sidebar-switch",disabled:k,label:"Pause alert sound",title:"Play a sound when VCM shows the fixed flow pause dialog",onChange:ze=>tt(ze)}),x.jsx(hi,{checked:Lt,className:"sidebar-switch",disabled:k,label:"CC auto retry",title:"Retry temporary Claude Code turn failures before showing the flow pause alert",onChange:ze=>he(ze)}),x.jsxs("label",{className:"settings-select-row",children:[x.jsx("span",{children:"Permission requests"}),x.jsxs("select",{value:ye,disabled:k,onChange:ze=>Ae(ze.target.value),children:[x.jsx("option",{value:"off",children:"off"}),x.jsx("option",{value:"allowAll",children:"allow all"})]})]}),x.jsxs("button",{className:"settings-toggle",disabled:k||!Oe,title:"Save the current core role launch settings and optional Gate Reviewer settings",type:"button",onClick:Fe,children:[x.jsx("span",{children:"Save launch template"}),x.jsx("span",{children:Oe?"ready":"open task"})]}),ft?x.jsxs("button",{className:"settings-toggle is-active",disabled:k,title:H2(Me),type:"button",onClick:gt,children:[x.jsx("span",{children:"One-click start"}),x.jsx("span",{children:_v(Me)})]}):null,l?x.jsxs(x.Fragment,{children:[x.jsxs("button",{type:"button",onClick:()=>ln(!0),children:[x.jsx("span",{children:"Messages"}),x.jsxs("span",{className:"muted",children:[Wn.total," total"]})]}),x.jsxs("button",{type:"button",onClick:()=>Vn(!0),children:[x.jsx("span",{children:"Events"}),x.jsxs("span",{className:"muted",children:[f.length," total"]})]})]}):null]})}),x.jsx(Nr,{title:"Translation",open:zt==="translation",onOpenChange:ze=>It("translation",ze),children:x.jsx(z2,{busy:k,enabled:h,autoSendEnabled:p,targetLanguage:u,outputMode:b,memoryInitialized:C,baseUnavailableReason:Is,translatorSession:T,onAutoSendChange:ae,onCreateBootstrap:He,onEnabledChange:ee,onUpdateMemory:Pe,onTargetLanguageChange:de,onOutputModeChange:se,onOpenFileTranslation:we,onOpenTranslatorSession:je})}),n&&l?x.jsx(Nr,{title:"Gate Review Gates",open:zt==="gate-review-gates",onOpenChange:ze=>It("gate-review-gates",ze),children:x.jsx(P2,{busy:k,state:c,onGateEnabledChange:q})}):null,x.jsx(Nr,{title:"Gateway",open:zt==="gateway",onOpenChange:ze=>{It("gateway",ze),ze&&N()},children:x.jsx(q2,{busy:k,qrCheck:L,qrLogin:A,larkRegistration:D,larkRegistrationCheck:R,status:y,onEnabledChange:$,onSettingsChange:I,onResetBinding:Q,onStartLarkRegistration:pe,onStartQrLogin:ve,onTranslationChange:re})}),n?x.jsx(Nr,{title:"VCM Harness",open:zt==="vcm-harness",onOpenChange:ze=>It("vcm-harness",ze),children:x.jsx(A2,{status:E,bootstrapStatus:S,applyResult:v,hasActiveTask:!!wn,autoTaskHarnessReviewEnabled:_,busy:k,onRefresh:U,onApply:F,onOpenStudio:Z,onOpenRepositoryDiff:z,onAutoTaskHarnessReviewChange:O,onStartBootstrap:K,onRestartBootstrap:Y,onStopBootstrap:G,onRunBootstrap:W})}):null,n?x.jsx(Nr,{title:"Task",open:zt==="task",onOpenChange:ze=>It("task",ze),children:Wt.length>0?x.jsxs("div",{className:"task-panel",children:[x.jsx(j2,{tasks:Wt,activeTaskSlug:l,onSelect:yt}),wn?x.jsx("div",{className:"task-panel-actions",children:x.jsx("button",{className:"danger-button",disabled:k,type:"button",onClick:xt,children:"Close Task"})}):null]}):x.jsx("div",{className:"task-create",children:x.jsxs("form",{onSubmit:Ii,children:[x.jsx("input",{value:Qe,onChange:ze=>Zt(ze.target.value),placeholder:"task name"}),x.jsxs("div",{className:"task-create-preview",children:[x.jsxs("small",{children:["branch: ",Vt?`feature/${Vt}`:"feature/<task>"]}),x.jsxs("small",{children:["worktree: ",Vt?`.claude/worktrees/${Vt}`:".claude/worktrees/<task>"]})]}),x.jsx("button",{type:"submit",disabled:k||!Vt,children:"Create"})]})})}):null,n&&wn?x.jsx(W2,{task:wn,roundState:o}):null,Bt?x.jsx(Q2,{busy:k,messages:d,orchestration:m,onClose:()=>ln(!1),onMarkAllDone:()=>{l&&mt(l)},onDeleteMessageHistory:()=>{l&&Ot(l)}}):null,Gn?x.jsx(X2,{events:f,onClose:()=>Vn(!1)}):null]})}function _v(n){return[n.autoOrchestration?"auto":"manual"].join(" + ")}function H2(n){const r=Object.entries(n.roles).map(([s,l])=>`${s}: ${l.permissionMode} / ${l.model} / ${l.effort}`).join("; ");return`Launch template: ${_v(n)}; ${r}`}function z2({autoSendEnabled:n,baseUnavailableReason:r,busy:s,enabled:l,memoryInitialized:d,outputMode:m,targetLanguage:f,translatorSession:o,onAutoSendChange:c,onCreateBootstrap:h,onEnabledChange:p,onUpdateMemory:u,onOutputModeChange:b,onTargetLanguageChange:C,onOpenFileTranslation:T,onOpenTranslatorSession:E}){const S=!!(s||r),v=(o==null?void 0:o.status)==="running",_=!!(l&&!r&&v),y=r??(v?null:"Start Translator session first."),A=!!(s||y),D=r??"Open Translator session",R=y??"Translation tools are ready";return x.jsxs("div",{className:"sidebar-settings",children:[x.jsx(hi,{checked:_,className:"sidebar-switch",disabled:S||!v,label:"Conversation translation",title:R,onChange:p}),x.jsx(hi,{checked:n,className:"sidebar-switch",disabled:S,label:"Auto-send",onChange:c}),x.jsxs("label",{className:"settings-select-row",children:[x.jsx("span",{children:"Language"}),x.jsx("select",{value:f,disabled:S,onChange:k=>C(k.target.value),children:e_.map(k=>x.jsx("option",{value:k.value,children:k.label},k.value))})]}),x.jsxs("label",{className:"settings-select-row",children:[x.jsx("span",{children:"Reply scope"}),x.jsx("select",{value:m,disabled:S,onChange:k=>b(k.target.value),children:Z0.map(k=>x.jsx("option",{value:k.value,children:k.label},k.value))})]}),x.jsxs("button",{className:"settings-toggle",disabled:A,title:R,type:"button",onClick:T,children:[x.jsx("span",{children:"File translation"}),x.jsx("span",{children:"open"})]}),d?null:x.jsxs("button",{className:"settings-toggle",disabled:A,title:R,type:"button",onClick:h,children:[x.jsx("span",{children:"Bootstrap"}),x.jsx("span",{children:"run"})]}),x.jsxs("button",{className:"settings-toggle",disabled:A,title:R,type:"button",onClick:u,children:[x.jsx("span",{children:"Update memory"}),x.jsx("span",{children:"run"})]}),y?x.jsx("p",{className:"settings-help-text",children:y}):null,x.jsxs("div",{className:"settings-status-row",children:[x.jsx("span",{children:"Session status"}),x.jsx("strong",{children:I2(o)})]}),x.jsxs("button",{className:"settings-toggle",disabled:S,title:D,type:"button",onClick:E,children:[x.jsx("span",{children:"Open Session"}),x.jsx("span",{children:"open"})]})]})}function I2(n){return n?n.status==="running"?n.activityStatus??"idle":n.status:"not started"}function U2(n,r,s){return n?r?s?s.initialized?null:"Initialize VCM Harness first.":"Load VCM Harness status first.":"Create or select a task first.":"Connect a repository first."}function P2({busy:n,onGateEnabledChange:r,state:s}){return x.jsx("div",{className:"sidebar-settings",children:E2.map(l=>{const d=s==null?void 0:s.gates[l],m=!!(d!=null&&d.required);return x.jsx(hi,{checked:m,className:"sidebar-switch",disabled:n||!s,label:F2(l),title:d!=null&&d.status?`status: ${d.status}`:void 0,onChange:f=>r(l,f)},l)})})}function F2(n){switch(n){case"architecture-plan":return"Architecture plan";case"validation-adequacy":return"Validation adequacy";case"final-diff":return"Final diff"}return n}function q2({busy:n,larkRegistration:r,larkRegistrationCheck:s,onEnabledChange:l,onResetBinding:d,onSettingsChange:m,onStartLarkRegistration:f,onStartQrLogin:o,onTranslationChange:c,qrCheck:h,qrLogin:p,status:u}){const b=(u==null?void 0:u.channel)==="lark",C=(u==null?void 0:u.channel)==="lark"?!!(u.binding.appIdConfigured&&u.binding.appSecretConfigured):!!(u!=null&&u.binding.tokenConfigured),T=(u==null?void 0:u.channel)==="lark"?!!(u.binding.appIdConfigured&&u.binding.appSecretConfigured):!!(u!=null&&u.binding.tokenConfigured);return x.jsxs("div",{className:"gateway-panel",children:[x.jsxs("label",{className:"compact-field",children:[x.jsx("span",{children:"Channel"}),x.jsxs("select",{disabled:n||!u,value:(u==null?void 0:u.channel)??"weixin-ilink",onChange:E=>{m({channel:E.currentTarget.value==="lark"?"lark":"weixin-ilink"})},children:[x.jsx("option",{value:"weixin-ilink",children:"Weixin iLink"}),x.jsx("option",{value:"lark",children:"Lark"})]})]}),x.jsxs("div",{className:"gateway-actions",children:[x.jsx(hi,{checked:!!(u!=null&&u.enabled),className:"sidebar-switch",disabled:n||!u||!u.enabled&&!C,label:"Gateway",title:C?"Enable or disable PM messages and task-changing Gateway commands":"Configure the selected Gateway channel first",onChange:E=>l(E)}),x.jsx(hi,{checked:!!(u!=null&&u.translationEnabled),className:"sidebar-switch",disabled:n||!u,label:"Translation",onChange:E=>c(E)}),b?x.jsx("button",{type:"button",disabled:n,onClick:f,children:"Start QR Setup"}):T?x.jsx("button",{className:"danger-button",type:"button",disabled:n,onClick:d,children:"Reset Binding"}):x.jsx("button",{type:"button",disabled:n,onClick:o,children:"Start QR Login"})]}),b?x.jsxs("div",{className:"gateway-lark-settings",children:[x.jsx("p",{className:"muted",children:u!=null&&u.binding.appIdConfigured&&u.binding.appSecretConfigured?`Lark app configured${u.binding.larkBotName?` · ${u.binding.larkBotName}`:""}.`:"Use QR setup to create and configure the Lark bot automatically."}),r?x.jsxs("p",{className:"muted",children:["QR setup: ",(s==null?void 0:s.status)??r.status,s!=null&&s.message?` · ${s.message}`:""]}):null]}):p?x.jsx("p",{className:"muted",children:"QR login started. Use the login dialog to confirm binding."}):null,!b&&h?x.jsxs("p",{className:"muted",children:["QR status: ",h.status,h.message?` · ${h.message}`:""]}):null]})}function $2({busy:n,onPull:r,project:s}){const l=s.pullDisabledReason,d=!!s.canPull;return x.jsxs("div",{className:"project-summary",children:[x.jsxs("dl",{children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Base path"}),x.jsx("dd",{children:s.repoRoot})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Branch"}),x.jsx("dd",{children:G2(s)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Remote"}),x.jsx("dd",{children:s.upstreamBranch??"no upstream"})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Status"}),x.jsx("dd",{children:V2(s)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Commit"}),x.jsx("dd",{children:s.shortHeadCommit??s.headCommit??"unknown"})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Working tree"}),x.jsx("dd",{children:s.isDirty?"uncommitted changes":"clean"})]})]}),x.jsxs("div",{className:"connected-repo-actions",children:[x.jsx("button",{type:"button",disabled:n||!d,title:l??"Pull latest changes with git pull --ff-only",onClick:()=>void r(),children:"Pull"}),x.jsx("span",{className:"muted",children:s.checkedAt?`checked ${Ah(s.checkedAt)}`:"status not refreshed"})]}),l?x.jsx("p",{className:"muted",children:l}):null,s.warnings.length>0?x.jsx("ul",{className:"warnings",children:s.warnings.map(m=>x.jsx("li",{children:m},m))}):null]})}function G2(n){return n.branch||"unknown"}function V2(n){if(!n.upstreamBranch)return"no upstream";const r=n.ahead??0,s=n.behind??0;return r===0&&s===0?"up to date":r>0&&s>0?`ahead ${r}, behind ${s}`:r>0?`ahead ${r}`:`behind ${s}`}function W2({roundState:n,task:r}){var p;const[s,l]=te.useState(()=>Date.now()),d=!!(n!=null&&n.startedAt),m=vv(r.createdAt,s),f=Ig(n,(n==null?void 0:n.totalCcActiveMs)??0,s),o=d&&n?Ig(n,n.currentRoundCcActiveMs,s):0,c=d&&n?K2(n,s):0,h=((p=r.title)==null?void 0:p.trim())||r.taskSlug;return te.useEffect(()=>{const u=window.setInterval(()=>l(Date.now()),1e3);return()=>window.clearInterval(u)},[]),x.jsxs("section",{className:"task-status-dock","aria-label":"VCM Session status",children:[x.jsxs("div",{className:"task-status-dock-title",children:[x.jsx("strong",{title:h,children:h}),x.jsx("span",{className:`status-badge status-${r.status}`,children:r.status})]}),x.jsxs("dl",{className:"task-status-stats",children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Session start"}),x.jsx("dd",{children:Ah(r.createdAt)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Session total"}),x.jsx("dd",{children:So(m)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Rounds"}),x.jsx("dd",{children:(n==null?void 0:n.totalRoundCount)??0})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Role runtime"}),x.jsx("dd",{children:So(f)})]})]}),d&&n?x.jsxs("div",{className:"current-round-status",children:[x.jsxs("div",{className:"current-round-title",children:[x.jsx("span",{children:n.status==="running"?"Current Round":"Last Round"}),x.jsx("span",{className:`status-badge status-${n.status}`,children:n.status})]}),x.jsxs("dl",{className:"task-status-stats",children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Started"}),x.jsx("dd",{children:Ah(n.startedAt)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Total"}),x.jsx("dd",{children:So(c)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Role runtime"}),x.jsx("dd",{children:So(o)})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Turn count"}),x.jsx("dd",{children:n.turnCount})]})]})]}):null]})}function Ig(n,r,s){if(!(n!=null&&n.activeTurnStartedAt)||n.status!=="running")return r;const l=Date.parse(n.updatedAt);return Number.isFinite(l)?r+Math.max(0,s-l):r}function K2(n,r){const s=n.status==="running"?r:Date.parse(n.stoppedAt??n.lastTurnEndedAt??"");return vv(n.startedAt??"",Number.isFinite(s)?s:r)}function vv(n,r){const s=Date.parse(n);return Number.isFinite(s)?Math.max(0,r-s):0}function Ah(n){if(!n)return"-";const r=new Date(n);return Number.isNaN(r.getTime())?"-":new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit"}).format(r)}function So(n){const r=Math.max(0,Math.floor(n/1e3)),s=Math.floor(r/3600),l=Math.floor(r%3600/60),d=r%60;return s>0?l>0?`${s}h ${l}m`:`${s}h`:l>0?d>0?`${l}m ${d}s`:`${l}m`:`${d}s`}function Y2(n){return n==="system"?"light":n==="light"?"dark":"system"}function Ug(n){return n==="system"?"System":n==="light"?"Light":"Dark"}function X2({events:n,onClose:r}){return x.jsx("div",{className:"modal-backdrop",children:x.jsxs("section",{className:"event-modal",role:"dialog","aria-modal":"true","aria-label":"Events",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Events"}),x.jsxs("p",{className:"muted",children:[n.length," total"]})]}),x.jsx("button",{type:"button",onClick:r,children:"Close"})]}),x.jsx(k2,{events:n,maxEvents:null,showHeader:!1})]})})}function Q2({busy:n,messages:r,orchestration:s,onClose:l,onMarkAllDone:d,onDeleteMessageHistory:m}){const f=Xh(r);function o(){window.confirm(["Clear all pending route-file messages?","","Use this only after you manually copied or handled stuck route-file messages.","VCM will clear non-empty handoff message files so Stop-hook orchestration can continue."].join(`
|
|
94
94
|
`))&&d()}function c(){window.confirm([`Delete ${f.total} message histor${f.total===1?"y item":"y items"}?`,"","This removes message history from the Messages panel.","Pending route-file messages are not touched."].join(`
|
|
95
|
-
`))&&m()}return x.jsx("div",{className:"modal-backdrop",children:x.jsxs("section",{className:"message-modal",role:"dialog","aria-modal":"true","aria-label":"Messages",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Messages"}),x.jsxs("p",{className:"muted",children:[f.total," total / ",f.accepted," accepted",s?` · ${s.mode}`:""]})]}),x.jsxs("div",{className:"modal-actions",children:[x.jsx("button",{type:"button",disabled:n,onClick:o,children:"Mark All Done"}),x.jsx("button",{type:"button",disabled:n||f.total===0,onClick:c,children:"Delete All"}),x.jsx("button",{type:"button",onClick:l,children:"Close"})]})]}),x.jsx(R2,{busy:n,maxMessages:null,messages:r,orchestration:s,showControls:!1,showHeader:!1})]})})}function Nr({children:n,onOpenChange:r,open:s,title:l}){return x.jsxs("section",{className:"sidebar-section",children:[x.jsxs("button",{"aria-expanded":s,className:"sidebar-section-toggle",type:"button",onClick:()=>{r==null||r(!s)},children:[x.jsx("span",{children:l}),x.jsx("span",{"aria-hidden":"true",className:"sidebar-section-chevron"})]}),s?x.jsx("div",{className:"sidebar-section-content",children:n}):null]})}function yv(n,r){return n.find(s=>s.role===r)}function Q2({activeRole:n,roles:r=Dh,sessions:s,onSelect:l}){return x.jsx("div",{className:"role-tabs",role:"tablist","aria-label":"Role sessions",children:r.map(d=>{const m=yv(s,d.name),f=(m==null?void 0:m.status)==="running"?m.activityStatus??"idle":(m==null?void 0:m.status)??"not_started";return x.jsxs("button",{className:d.name===n?"role-tab is-active":"role-tab",type:"button",role:"tab","aria-selected":d.name===n,onClick:()=>l(d.name),children:[x.jsx("span",{children:d.label}),x.jsx(Ni,{status:f})]},d.name)})})}function J2({role:n,session:r,permissionMode:s,model:l,effort:d,active:m=!0,busy:f,translationEnabled:o,translationAutoSendEnabled:c,translationTargetLanguage:h,translationPanelState:p,onClearTranslationSession:u,onTranslationEntry:b,onTranslationFailures:C,onPermissionModeChange:T,onModelChange:E,onEffortChange:S,onStart:v,onResume:_,onStop:y,onRestart:A,onNotifyHarnessUpdated:L,onTerminalEvent:D}){const R=m&&X0(n)&&o&&(r==null?void 0:r.status)==="running";return x.jsx("section",{className:"session-console",children:x.jsxs("div",{className:R?"session-console-body has-translation":"session-console-body",children:[x.jsxs("div",{className:"terminal-pane",children:[x.jsx(Mh,{role:n,session:r,permissionMode:s,model:l,effort:d,busy:f,onPermissionModeChange:T,onModelChange:E,onEffortChange:S,onStart:v,onResume:_,onStop:y,onRestart:A,onNotifyHarnessUpdated:L}),(r==null?void 0:r.status)==="running"?x.jsx(Oo,{sessionId:r.id,active:m,onEvent:D},r.id):x.jsxs("div",{className:"terminal-empty",children:[x.jsx("strong",{children:n}),x.jsx("span",{children:r!=null&&r.claudeSessionId?"Resume this role to reconnect its Claude Code conversation.":"Start this role to open an embedded Claude Code terminal."})]})]}),R?x.jsx("div",{className:"translation-pane",children:x.jsx(e2,{active:m,autoSendEnabled:c,targetLanguage:h,taskSlug:r.taskSlug,role:n,sessionId:r.id,panelState:p??{role:n,status:"ready",entries:[],failures:[]},onClearSession:u??(()=>{}),onEntry:b??(()=>{}),onFailures:C??(()=>{})},`${n}:${r.id}`)}):null]})})}const ch=500;function Th(n){return{taskSlug:n,cursor:1,sessions:{}}}function Z2(n,r,s){return n.sessions[r]??js(s)}function ek(n,r){const l={...rk(n,r.taskSlug).sessions};for(const d of r.sessions)l[d.sessionId]={...js(d.role),...l[d.sessionId],role:d.role,status:d.status};for(const d of r.events){const m=l[d.sessionId]??js(d.role);if(d.event.type==="status")l[d.sessionId]={...m,role:d.role,status:d.event.status};else if(d.event.type==="failures")l[d.sessionId]={...m,role:d.role,failures:d.event.failures};else if(d.event.type==="entry"){const f=bv(Sv(m.entries,d.event.entry));l[d.sessionId]={...m,role:d.role,entries:f.entries,failures:f.removedIds.size>0?m.failures.filter(o=>!f.removedIds.has(o.translationId)):m.failures}}}return{taskSlug:r.taskSlug,cursor:r.nextCursor,sessions:l}}function tk(n,r,s){return{...n,sessions:{...n.sessions,[r]:js(s)}}}function nk(n,r,s,l){const d=n.sessions[r]??js(s),m=bv(Sv(d.entries,l));return{...n,sessions:{...n.sessions,[r]:{...d,role:s,entries:m.entries,failures:m.removedIds.size>0?d.failures.filter(f=>!m.removedIds.has(f.translationId)):d.failures}}}}function ik(n,r,s,l){const d=n.sessions[r]??js(s);return{...n,sessions:{...n.sessions,[r]:{...d,role:s,failures:l}}}}function rk(n,r){return n.taskSlug===r?n:Th(r)}function js(n){return{role:n,status:"ready",entries:[],failures:[]}}function Sv(n,r){return n.findIndex(l=>l.id===r.id)===-1?[...n,r]:n.map(l=>l.id===r.id?r:l)}function bv(n){if(n.length<=ch)return{entries:n,removedIds:new Set};const r=n.slice(0,n.length-ch);return{entries:n.slice(-ch),removedIds:new Set(r.map(s=>s.id))}}const sk={"project-manager":"bypassPermissions",architect:"bypassPermissions",coder:"bypassPermissions",reviewer:"bypassPermissions","gate-reviewer":"bypassPermissions",translator:"bypassPermissions","harness-engineer":"bypassPermissions"},ak={"project-manager":"default",architect:"default",coder:"default",reviewer:"default","gate-reviewer":"default",translator:"default","harness-engineer":"default"},lk={"project-manager":"default",architect:"default",coder:"default",reviewer:"default","gate-reviewer":"default",translator:"medium","harness-engineer":"medium"};function ok({task:n,activeRole:r,gateReviewerEnabled:s,translationEnabled:l,translationAutoSendEnabled:d,translationTargetLanguage:m,launchTemplate:f,refreshNonce:o=0,onTaskChanged:c,onActiveRoleChange:h,onMessagesChanged:p,onOrchestrationChanged:u,onRoundStateChanged:b,onEventsChanged:C,onLaunchStateChanged:T}){const[E,S]=te.useState(null),[v,_]=te.useState(()=>Fg(f)),[y,A]=te.useState(()=>qg(f)),[L,D]=te.useState(()=>$g(f)),[R,k]=te.useState(!1),[,M]=Hi(""),[j,H]=te.useState([]),[U,F]=te.useState(null),[K,Y]=te.useState(()=>Th(n.taskSlug)),G=te.useRef(""),W=te.useRef(1),Z=te.useMemo(()=>JSON.stringify(f),[f]),z=!!(E!=null&&E.sessions.some(de=>de.role==="gate-reviewer")),O=s||z,N=[...Wa,...O?[Qg]:[]],$=te.useCallback((de,se)=>{F(se),p==null||p(de),u==null||u(se)},[p,u]),I=te.useCallback((de,se,we,je)=>{S(de),$(se,we),b==null||b(je)},[$,b]),re=te.useCallback(async()=>{const de=await Se.getTaskWorkspaceState(n.taskSlug);I(de.taskStatus,de.messages,de.orchestration,de.roundState),Do("Poll task workspace state"),M(se=>xo(se,["Load task workspace state","Poll task workspace state"]))},[I,n.taskSlug]),ve=te.useCallback((de,se)=>{const we=gv(de,se);we&&M(we)},[]);Xa(`task-workspace:${n.taskSlug}:${o}`,()=>re().catch(de=>{ve("Poll task workspace state",de)}),{intervalMs:3e3,runImmediately:!0}),Xa(l?`task-translation-feed:${n.taskSlug}`:null,async()=>{try{const de=await Se.pollTranslationTaskFeed(n.taskSlug,W.current);W.current=de.nextCursor,Y(se=>ek(se,de)),Do("Poll task translation feed"),M(se=>xo(se,["Poll task translation feed"]))}catch(de){ve("Poll task translation feed",de)}},{intervalMs:1e3,runImmediately:!0}),te.useEffect(()=>{H([]),C==null||C([])},[C,n.taskSlug]),te.useEffect(()=>{W.current=1,Y(Th(n.taskSlug))},[n.taskSlug]),te.useEffect(()=>{_(Fg(f)),A(qg(f)),D($g(f))},[Z,n.taskSlug]),te.useEffect(()=>{E&&!O&&r==="gate-reviewer"&&h("project-manager"),E&&r==="translator"&&h("project-manager")},[r,O,h,E]),te.useEffect(()=>{const de=E==null?void 0:E.task;if(!de||de.taskSlug!==n.taskSlug)return;const se=Pg(de);if(se===Pg(n)){G.current="";return}G.current!==se&&(G.current=se,c().catch(we=>{G.current="",M(pt("Refresh task list after task status changed",we))}))},[c,E==null?void 0:E.task,n]),te.useEffect(()=>{const de=(E==null?void 0:E.sessions)??[],se=de.filter(Pe=>ck(Pe.role)),we=new Set(se.map(Pe=>Pe.role)),je=de.some(Pe=>Pe.role==="gate-reviewer"),He={};for(const Pe of Ns)He[Pe.name]={permissionMode:v[Pe.name],model:y[Pe.name],effort:L[Pe.name]};T==null||T({taskSlug:n.taskSlug,roles:He,autoOrchestration:((U==null?void 0:U.mode)??"auto")==="auto",statusLoaded:!!E,sessionCount:se.length,hasAnySession:se.length>0,hasGateReviewerSession:je,allRolesHaveSession:Wa.every(Pe=>we.has(Pe.name))})},[y,L,T,U==null?void 0:U.mode,v,E,n.taskSlug]);async function pe(de,se="Run role session action"){k(!0),M("");try{await de(),await re(),await c()}catch(we){M(pt(se,we))}finally{k(!1)}}function Q(de){H(se=>{const we=[...se,`${new Date().toLocaleTimeString()} ${de}`];return C==null||C(we),we})}function q(de,se){_(we=>({...we,[de]:se}))}function ee(de,se){A(we=>({...we,[de]:se}))}function ae(de,se){D(we=>({...we,[de]:se}))}return x.jsxs("div",{className:"task-workspace",children:[x.jsxs("header",{className:"workspace-header",children:[x.jsx("div",{className:"workspace-title-line",children:x.jsx("h1",{children:n.title||n.taskSlug})}),x.jsx(Q2,{activeRole:r,roles:N,sessions:(E==null?void 0:E.sessions)??[],onSelect:h})]}),x.jsx("div",{className:"workspace-grid",children:x.jsx("div",{className:"workspace-main",children:x.jsx("div",{className:"role-console-stack",children:N.map(de=>{const se=de.name,we=se===r,je=(E==null?void 0:E.sessions)??[],He=yv(je,se),Pe=He?Z2(K,He.id,se):void 0;return x.jsx("div",{className:we?"role-console-panel is-active":"role-console-panel","aria-hidden":!we,children:x.jsx(J2,{role:se,session:He,permissionMode:v[se],model:y[se],effort:L[se],active:we,busy:R,translationEnabled:l,translationAutoSendEnabled:d,translationTargetLanguage:m,translationPanelState:Pe,onClearTranslationSession:(xe,xt)=>{Y(yt=>tk(yt,xe,xt))},onTranslationEntry:(xe,xt,yt)=>{Y(Et=>nk(Et,xe,xt,yt))},onTranslationFailures:(xe,xt,yt)=>{Y(Et=>ik(Et,xe,xt,yt))},onPermissionModeChange:xe=>q(se,xe),onModelChange:xe=>ee(se,xe),onEffortChange:xe=>ae(se,xe),onStart:()=>void pe(async()=>{await Se.startRoleSession(n.taskSlug,se,{cols:100,rows:28,permissionMode:v[se],model:y[se],effort:L[se]}),Q(`started ${se} with ${v[se]} / ${y[se]} / ${L[se]}`)},`Start ${se} session`),onResume:()=>void pe(async()=>{await Se.resumeRoleSession(n.taskSlug,se,{cols:100,rows:28,permissionMode:v[se],model:y[se],effort:L[se]}),Q(`resumed ${se} with ${v[se]} / ${y[se]} / ${L[se]}`)},`Resume ${se} session`),onStop:()=>void pe(async()=>{await Se.stopRoleSession(n.taskSlug,se),Q(`stopped ${se}`)},`Stop ${se} session`),onRestart:()=>void pe(async()=>{await Se.restartRoleSession(n.taskSlug,se,{cols:100,rows:28,permissionMode:v[se],model:y[se],effort:L[se]}),Q(`restarted ${se} with ${v[se]} / ${y[se]} / ${L[se]}`)},`Restart ${se} session`),onNotifyHarnessUpdated:()=>void pe(async()=>{await Se.notifyRoleHarnessUpdated(n.taskSlug,se),Q(`notified ${se} to reload latest harness`)},`Notify ${se} to reload harness`),onTerminalEvent:xe=>Q(`${de.label}: ${xe}`)})},se)})})})})]})}function ck(n){return Wa.some(r=>r.name===n)}function Pg(n){return[n.status,n.updatedAt,n.cleanupStatus??"",n.cleanedAt??""].join(":")}function Fg(n){var s;const r={...sk};for(const l of Ns)r[l.name]=((s=n.roles[l.name])==null?void 0:s.permissionMode)??r[l.name];return r}function qg(n){var s;const r={...ak};for(const l of Ns)r[l.name]=((s=n.roles[l.name])==null?void 0:s.model)??r[l.name];return r}function $g(n){var s;const r={...lk};for(const l of Ns)r[l.name]=((s=n.roles[l.name])==null?void 0:s.effort)??r[l.name];return r}const uk=120*1e3,Gg=1400,hk=3;function fk(n){return!!(n!=null&&n.initialized)}function dk(){const[n,r]=te.useState(null),[s,l]=te.useState([]),[d,m]=te.useState(null),[f,o]=te.useState(null),[c,h]=te.useState(null),[p,u]=te.useState(null),[b,C]=te.useState(null),[T,E]=te.useState(null),[S,v]=te.useState(null),[_,y]=te.useState(null),[A,L]=te.useState(null),[D,R]=te.useState(!1),[k,M]=te.useState(null),[j,H]=te.useState(null),[U,F]=te.useState(!1),[K,Y]=te.useState([]),[G,W]=te.useState(null),[Z,z]=te.useState(null),[O,N]=te.useState(null),[$,I]=te.useState(null),[re,ve]=te.useState(null),[pe,Q]=te.useState(null),[q,ee]=te.useState("project-manager"),[ae,de]=te.useState("system"),[se,we]=te.useState(!0),[je,He]=te.useState(!0),[Pe,xe]=te.useState("off"),[xt,yt]=te.useState(!1),[Et,an]=te.useState(!1),[Cn,St]=te.useState(!1),[tt,Lt]=te.useState(Q0),[he,ye]=te.useState(J0),[Ae,Me]=te.useState(!1),[Oe,ft]=te.useState(!1),[Fe,gt]=te.useState(!1),[mt,Ot]=te.useState(!1),[Qe,Zt]=te.useState(!1),[Bt,ln]=te.useState(null),[Gn,Vn]=te.useState("bypassPermissions"),[zt,on]=te.useState("default"),[Wn,Vt]=te.useState("medium"),[Is,Wt]=te.useState(null),[wn,It]=te.useState("bypassPermissions"),[Ii,ze]=te.useState("default"),[di,Pr]=te.useState("medium"),[Fr,Us]=te.useState(()=>e1()),[Kn,el]=te.useState(null),[ii,kt]=te.useState(0),[Ut,Yn]=te.useState(null),[Ps,Io]=te.useState(null),[tl,nl]=te.useState(!1),[Bn,qr]=te.useState(!1),[,cn]=Hi(""),pi=te.useRef({}),mi=te.useRef({}),gi=te.useRef({}),bt=te.useRef({}),Fs=te.useRef({}),Xn=te.useRef(null),Qn=te.useRef(""),ie=te.useMemo(()=>v2(K,G),[K,G]),un=(Kn==null?void 0:Kn.taskSlug)===(ie==null?void 0:ie.taskSlug)?Kn:null,$r=c===(ie==null?void 0:ie.taskSlug)?d:null,qs=p===(ie==null?void 0:ie.taskSlug)?f:null,Uo=!!(n&&ie&&fk($r)),Gr=(Bt==null?void 0:Bt.status)==="running",_i=!!(S!=null&&S.running),jn=!!(Et&&Uo&&Gr),hn=!!(un!=null&&un.statusLoaded),il=!!(ie&&(un!=null&&un.statusLoaded)&&!un.hasAnySession),en=te.useCallback(V=>{de(V.themeMode),we(V.flowPauseAlerts),He(V.roleRetryEnabled),xe(V.permissionRequestMode),yt(V.autoTaskHarnessReviewEnabled),an(V.translationEnabled),St(V.translationAutoSendEnabled),Lt(V.translationTargetLanguage),ye(V.translationOutputMode),Us(V.launchTemplate)},[]),Nt=te.useCallback(()=>{Xn.current!==null&&(window.clearInterval(Xn.current),Xn.current=null)},[]),$s=te.useCallback(()=>{Nt(),bo(),Xn.current=window.setInterval(()=>{bo()},Gg)},[Nt]),mr=te.useCallback(()=>{Nt();let V=1;bo(),Xn.current=window.setInterval(()=>{V+=1,bo(),V>=hk&&Xn.current!==null&&(window.clearInterval(Xn.current),Xn.current=null)},Gg)},[Nt]),rl=te.useCallback((V,me=`manual-${Date.now()}`,qe={})=>{Yn({id:me,text:V}),qe.sound==="strong"?$s():qe.sound==="weak"?mr():Nt()},[mr,$s,Nt]),fn=te.useCallback(()=>{Nt(),Yn(null)},[Nt]);te.useEffect(()=>{ie!=null&&ie.taskSlug&&(Fs.current[ie.taskSlug]=Date.now())},[ie==null?void 0:ie.taskSlug]);const Gs=te.useCallback(V=>{ie!=null&&ie.taskSlug&&z({taskSlug:ie.taskSlug,messages:V})},[ie==null?void 0:ie.taskSlug]),sl=te.useCallback(V=>{gi.current[V.taskSlug]=V.mode,ie!=null&&ie.taskSlug&&N({taskSlug:ie.taskSlug,orchestration:V})},[ie==null?void 0:ie.taskSlug]),Vs=te.useCallback(V=>{ie!=null&&ie.taskSlug&&I({taskSlug:ie.taskSlug,events:V})},[ie==null?void 0:ie.taskSlug]),Ui=te.useCallback(V=>{if(!(ie!=null&&ie.taskSlug)||V.taskSlug!==ie.taskSlug)return;ve({taskSlug:V.taskSlug,roundState:V});const me=y2({mode:gi.current[V.taskSlug],status:V.status,activeRole:V.activeRole,lastFollowedRole:bt.current[V.taskSlug]});me&&(bt.current[V.taskSlug]=me,ee(me));const qe=S2(V,bk);if(qe===null){mi.current[V.taskSlug]={status:V.status};return}const pn=vk(V),yr=pi.current[V.taskSlug],Jr=mi.current[V.taskSlug];if(mi.current[V.taskSlug]={status:V.status},yr===pn||(pi.current[V.taskSlug]=pn,!_k(V,Jr,Fs.current[V.taskSlug])))return;if(_i){Nt(),Yn(null);return}const hl=se?gk(V)>=uk?"strong":"weak":"none";rl(qe,pn,{sound:hl})},[ie==null?void 0:ie.taskSlug,_i,se,rl,Nt]),al=te.useCallback(V=>{el(me=>(me==null?void 0:me.taskSlug)===V.taskSlug&&me.statusLoaded===V.statusLoaded&&me.sessionCount===V.sessionCount&&me.hasAnySession===V.hasAnySession&&me.hasGateReviewerSession===V.hasGateReviewerSession&&me.allRolesHaveSession===V.allRolesHaveSession&&me.autoOrchestration===V.autoOrchestration&&JSON.stringify(me.roles)===JSON.stringify(V.roles)?me:V)},[]);async function vi(){const V=await Se.listTasks();return Y(V),W(me=>{var qe;return me&&V.some(pn=>pn.taskSlug===me)?me:((qe=V[0])==null?void 0:qe.taskSlug)??null}),V}async function ri(V=ie==null?void 0:ie.taskSlug){if(!V)return m(null),h(null),null;const me=await Se.getHarnessStatus(V);return m(me),h(V),me}async function Ws(V=ie==null?void 0:ie.taskSlug){if(!V)return o(null),u(null),null;const me=await Se.getHarnessBootstrapStatus(V);return o(me),u(V),me}async function yi(){const V=await Se.getGatewayStatus();return v(V),V}async function ll(){const V=await Se.getRecentRepositoryPaths();return l(V),V}async function Vr(){if(!n)return Me(!1),!1;const V=await Se.getTranslationState();return Me(V.memoryInitialized),V.memoryInitialized}async function Ks(V){const[me,qe]=await Promise.all([Se.listMessages(V),Se.getOrchestrationState(V)]);z({taskSlug:V,messages:me}),N({taskSlug:V,orchestration:qe})}async function ol(V){const me=await Se.getGateReviewState(V);return Q({taskSlug:V,state:me}),Do("Poll Gate Review state"),cn(qe=>xo(qe,["Refresh Gate Review state","Poll Gate Review state"])),me}function gr(V,me){const qe=gv(V,me);qe&&cn(qe)}function Kt(V){V&&(Vn(V.permissionMode),V.model&&on(V.model),V.effort&&Vt(V.effort))}async function Wr(V={}){const me=await Se.getTranslatorSession();return ln(me),V.syncLaunchOptions&&Kt(me),me}function si(V){V&&(It(V.permissionMode),V.model&&ze(V.model),V.effort&&Pr(V.effort))}async function tn(V={}){const me=await Se.getHarnessEngineerSession();return Wt(me),V.syncLaunchOptions&&si(me),me}function Pi(V,me,qe={}){var pn;ln(V.translatorSession),Me(!!((pn=V.translationState)!=null&&pn.memoryInitialized)),Wt(V.harnessEngineerSession),E(V.harnessFeedbackState),v(V.gatewayStatus),me&&V.harnessStatus?(m(V.harnessStatus),h(me)):(m(null),h(null)),me&&V.harnessBootstrapStatus?(o(V.harnessBootstrapStatus),u(me)):(o(null),u(null)),qe.syncLaunchOptions&&(Kt(V.translatorSession),si(V.harnessEngineerSession))}async function cl(V={}){if(!n)return ln(null),Me(!1),Wt(null),m(null),o(null),h(null),u(null),E(null),null;const me=(ie==null?void 0:ie.taskSlug)??null,qe=await Se.getProjectRuntimeState(me);return Pi(qe,me,V),qe}function Ys(){const V=["Poll project runtime state","Load project runtime state","Refresh Harness feedback state","Poll Harness feedback state","Load Translator session","Poll Translator session","Poll translation memory status","Load Harness Engineer session","Poll Harness Engineer session","Load VCM Harness status","Poll VCM Harness status"];for(const me of V)Do(me);cn(me=>xo(me,V))}te.useEffect(()=>{Promise.all([Se.getCurrentProject(),Se.getRecentRepositoryPaths(),Se.getAppPreferences(),Se.getGatewayStatus()]).then(async([V,me,qe,pn])=>{r(V),l(me),v(pn),en(qe),V&&await vi()}).catch(V=>cn(pt("Load initial app data",V)))},[en]),te.useEffect(()=>{const V=window.matchMedia("(prefers-color-scheme: dark)"),me=()=>nl(V.matches);return me(),V.addEventListener("change",me),()=>V.removeEventListener("change",me)},[]),te.useEffect(()=>()=>Nt(),[Nt]),te.useEffect(()=>{_i&&(Nt(),Yn(null))},[_i,Nt]),te.useEffect(()=>{const V=ae==="system"?tl?"dark":"light":ae;document.documentElement.dataset.theme=V,document.documentElement.dataset.themeMode=ae},[tl,ae]),te.useEffect(()=>{if(!(ie!=null&&ie.taskSlug)){Q(null);return}ol(ie.taskSlug).catch(V=>cn(pt("Refresh Gate Review state",V)))},[ie==null?void 0:ie.taskSlug]),te.useEffect(()=>{Qn.current="",ln(null),Vn("bypassPermissions"),on("default"),Vt("medium"),Me(!1),Wt(null),It("bypassPermissions"),ze("default"),Pr("medium"),m(null),o(null),h(null),u(null),E(null)},[n==null?void 0:n.repoRoot]),Xa(n?`project-runtime:${n.repoRoot}:${(ie==null?void 0:ie.taskSlug)??"no-task"}`:null,async()=>{try{const V=(n==null?void 0:n.repoRoot)??"",me=!!(n&&Qn.current!==V);await cl({syncLaunchOptions:me}),me&&(Qn.current=V),Ys()}catch(V){gr("Poll project runtime state",V)}},{intervalMs:3e3,runImmediately:!0});const dn=(ie==null?void 0:ie.taskSlug)??null,Si=dn&&(pe==null?void 0:pe.taskSlug)===dn?pe.state:null,xn=dn&&(re==null?void 0:re.taskSlug)===dn?re.roundState:null,_r=dn&&(Kn==null?void 0:Kn.taskSlug)===dn?Kn:null,vr=!!(dn&&(Si!=null&&Si.activeGate||(xn==null?void 0:xn.activeRole)==="gate-reviewer"||_r!=null&&_r.hasGateReviewerSession));Xa(vr&&dn?`gate-review:${dn}`:null,async()=>{if(dn)try{await ol(dn)}catch(V){gr("Poll Gate Review state",V)}},{intervalMs:3e3,runImmediately:!1});async function ke(V,me="Run UI action"){qr(!0),cn("");try{await V()}catch(qe){cn(pt(me,qe))}finally{qr(!1)}}async function Xs(){if(!ie)throw new Error("Create or select a task before closing it.");const V=[`Close task "${ie.taskSlug}"?`,"","This is destructive:","- stops VCM-managed running role sessions for this task","- moves project-scoped Translator and Harness Engineer sessions to the base repository cwd",`- deletes the task worktree: ${ie.worktreePath}`,`- deletes the Git branch: ${ie.branch}`,"- deletes VCM task/session/message/orchestration state","","VCM will not check running sessions or uncommitted changes before closing."].join(`
|
|
96
|
-
`);window.confirm(V)&&(await Se.cleanupTask(ie.taskSlug,{force:!0,forceDeleteBranch:!0}),W(null),z(null),N(null),I(null),ve(null),Q(null),kt(qe=>qe+1),await vi())}const Kr=Z&&Z.taskSlug===(ie==null?void 0:ie.taskSlug)?Z.messages:[],ul=O&&O.taskSlug===(ie==null?void 0:ie.taskSlug)?O.orchestration:null,Yr=$&&$.taskSlug===(ie==null?void 0:ie.taskSlug)?$.events:[],nn=re&&re.taskSlug===(ie==null?void 0:ie.taskSlug)?re.roundState:null,Xr=ie!=null&&ie.taskSlug&&(nn!=null&&nn.roleRecovery)?yk(ie.taskSlug,nn.roleRecovery):null,Pt=nn!=null&&nn.roleRecovery&&nn.roleRecovery.status!=="failed"&&Xr!==Ps?Sk(nn.roleRecovery):null,Jn=pe&&pe.taskSlug===(ie==null?void 0:ie.taskSlug)?pe.state:null,Qr=!!(Jn&&Object.values(Jn.gates).some(V=>V.required));return x.jsxs(t1,{sidebar:x.jsx(j2,{project:n,recentRepositoryPaths:s,tasks:K,activeTaskSlug:(ie==null?void 0:ie.taskSlug)??null,messages:Kr,orchestration:ul,events:Yr,roundState:nn,gateReview:Jn,translationEnabled:jn,translationAutoSendEnabled:Cn,translationTargetLanguage:tt,translationOutputMode:he,translationMemoryInitialized:Ae,translatorSession:Bt,harnessStatus:$r,harnessBootstrapStatus:qs,harnessApplyResult:b,autoTaskHarnessReviewEnabled:xt,gatewayStatus:S,gatewayQrLogin:_,gatewayQrCheck:A,gatewayLarkRegistration:k,gatewayLarkRegistrationCheck:j,busy:Bn,onConnect:V=>ke(async()=>{const me=await Se.connectProject({repoPath:V});r(me),C(null),await Promise.all([vi(),ll()])},"Connect repository"),onRefreshConnectedRepository:()=>ke(async()=>{const V=await Se.getCurrentProject();r(V)},"Refresh connected repository"),onPullConnectedRepository:()=>ke(async()=>{const V=await Se.pullCurrentProject();r(V)},"Pull connected repository"),onRefreshHarness:()=>ke(async()=>{if(!ie)throw new Error("Create or select a task before refreshing VCM Harness.");C(null),await Promise.all([ri(ie.taskSlug),Ws(ie.taskSlug)])},"Refresh VCM Harness"),onApplyHarness:()=>ke(async()=>{if(!ie)throw new Error("Create or select a task before applying VCM Harness.");const V=await Se.applyHarness({taskSlug:ie.taskSlug});C(V),await Promise.all([ri(ie.taskSlug),Ws(ie.taskSlug)])},"Apply VCM Harness"),onStartHarnessBootstrap:V=>ke(async()=>{if(!ie)throw new Error("Create or select a task before starting Harness Bootstrap.");const me=await Se.startHarnessBootstrap({taskSlug:ie.taskSlug,cols:120,rows:32,...V});o(me.status),u(ie.taskSlug),await tn({syncLaunchOptions:!0})},"Start Harness Bootstrap"),onRestartHarnessBootstrap:V=>ke(async()=>{if(!ie)throw new Error("Create or select a task before restarting Harness Bootstrap.");const me=await Se.restartHarnessBootstrap({taskSlug:ie.taskSlug,cols:120,rows:32,...V});o(me.status),u(ie.taskSlug),await tn({syncLaunchOptions:!0})},"Restart Harness Bootstrap"),onStopHarnessBootstrap:()=>ke(async()=>{const V=await Se.stopHarnessBootstrap();o(V),u((ie==null?void 0:ie.taskSlug)??null),await tn()},"Stop Harness Bootstrap"),onRunHarnessBootstrap:()=>ke(async()=>{if(!ie)throw new Error("Create or select a task before running Harness Bootstrap.");const V=await Se.runHarnessBootstrap({taskSlug:ie.taskSlug});o(V.status),u(ie.taskSlug),await tn()},"Run Harness Bootstrap"),onOpenHarnessStudio:()=>Ot(!0),onOpenRepositoryDiff:()=>Zt(!0),onAutoTaskHarnessReviewChange:V=>{yt(V),ke(async()=>{const me=await Se.updateAppPreferences({autoTaskHarnessReviewEnabled:V});en(me)},"Update auto task harness review setting")},onRefreshGateway:()=>ke(async()=>{await yi()},"Refresh Gateway status"),onGatewayEnabledChange:V=>{ke(async()=>{const me=await Se.updateGatewaySettings({enabled:V,...V&&n?{currentProjectId:n.repoRoot,currentTaskSlug:(ie==null?void 0:ie.taskSlug)??null}:{}});v(me),V&&en(await Se.getAppPreferences())},"Update Gateway enabled setting")},onGatewaySettingsChange:V=>ke(async()=>{const me=await Se.updateGatewaySettings(V);v(me)},"Update Gateway settings"),onGatewayTranslationChange:V=>{ke(async()=>{const me=await Se.updateGatewaySettings({translationEnabled:V});v(me)},"Update Gateway translation setting")},onStartGatewayQrLogin:()=>{ke(async()=>{const V=await Se.startGatewayQrLogin();y(V),L(null),R(!0),await yi()},"Start Gateway QR login")},onStartGatewayLarkRegistration:()=>{ke(async()=>{const V=await Se.startGatewayLarkRegistration();M(V),H(null),F(!0),await yi()},"Start Lark Gateway QR setup")},onResetGatewayBinding:()=>{ke(async()=>{const V=await Se.resetGatewayBinding();v(V),y(null),L(null),R(!1),M(null),H(null),F(!1)},"Reset Gateway binding")},onGateReviewGateEnabledChange:(V,me)=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before changing Gate Review Gates.");const qe=await Se.updateGateReviewSettings(ie.taskSlug,{gates:{[V]:me}});Q({taskSlug:ie.taskSlug,state:qe})},`Update ${V} Gate Review setting`)},onTranslationEnabledChange:V=>{an(V),ke(async()=>{const me=await Se.updateAppPreferences({translationEnabled:V});en(me)},"Update conversation translation setting")},onTranslationAutoSendChange:V=>{St(V),ke(async()=>{const me=await Se.updateAppPreferences({translationAutoSendEnabled:V});en(me)},"Update translation auto-send setting")},onTranslationTargetLanguageChange:V=>{Lt(V),ke(async()=>{const me=await Se.updateAppPreferences({translationTargetLanguage:V});en(me)},"Update translation target language")},onTranslationOutputModeChange:V=>{ye(V),ke(async()=>{const me=await Se.updateAppPreferences({translationOutputMode:V});en(me)},"Update translation output mode")},onOpenFileTranslation:()=>ft(!0),onOpenTranslatorSession:()=>gt(!0),onCreateTranslationBootstrap:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before running Translation Bootstrap.");await Se.createTranslationBootstrap({taskSlug:ie.taskSlug,targetLanguage:tt}),await Vr(),await Wr()},"Create Translation Bootstrap task")},onUpdateTranslationMemory:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before updating translation memory.");await Se.createTranslationMemoryUpdate({taskSlug:ie.taskSlug,targetLanguage:tt}),await Vr(),await Wr()},"Create translation memory update task")},onCreateTask:V=>ke(async()=>{const me=await Se.createTask(V);await vi(),W(me.taskSlug)},"Create task"),onCloseTask:()=>{ke(Xs,"Close task")},onSelectTask:W,themeMode:ae,onAutoOrchestrationChange:V=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before changing auto orchestration.");const me=await Se.updateOrchestrationState(ie.taskSlug,{mode:V?"auto":"manual"});N({taskSlug:ie.taskSlug,orchestration:me})},"Update auto orchestration mode")},onThemeModeChange:V=>{de(V),ke(async()=>{const me=await Se.updateAppPreferences({themeMode:V});en(me)},"Update theme setting")},pauseAlertSound:se,onPauseAlertSoundChange:V=>{we(V),V&&Ek(),ke(async()=>{const me=await Se.updateAppPreferences({flowPauseAlerts:V});en(me)},"Update pause alert sound setting")},roleRetryEnabled:je,onRoleRetryEnabledChange:V=>{He(V),ke(async()=>{const me=await Se.updateAppPreferences({roleRetryEnabled:V});en(me)},"Update CC retry setting")},permissionRequestMode:Pe,onPermissionRequestModeChange:V=>{xe(V),ke(async()=>{const me=await Se.updateAppPreferences({permissionRequestMode:V});en(me)},"Update permission request setting")},launchTemplate:Fr,canSaveLaunchTemplate:hn,canOneClickStart:il,onSaveLaunchTemplate:()=>{ke(async()=>{if(!(un!=null&&un.statusLoaded))throw new Error("Open a task workspace before saving a launch template.");const V=await Se.updateAppPreferences({launchTemplate:{version:1,roles:un.roles,autoOrchestration:un.autoOrchestration}});en(V)},"Save launch template")},onOneClickStart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before one-click start.");const V=await Se.oneClickStart(ie.taskSlug);N({taskSlug:ie.taskSlug,orchestration:V.orchestration}),ee("project-manager"),await Ks(ie.taskSlug),await vi(),kt(me=>me+1)},"One-click start role sessions")},onMarkAllMessagesDone:V=>{ke(async()=>{const me=await Se.markAllMessagesDone(V);z({taskSlug:V,messages:me.messages}),await Ks(V)},"Mark all role messages done")},onDeleteMessageHistory:V=>{ke(async()=>{const me=await Se.deleteMessageHistory(V);z({taskSlug:V,messages:me.messages}),await Ks(V)},"Delete role message history")}}),children:[x.jsx(g2,{}),Ut?x.jsx("div",{className:"flow-pause-alert-backdrop",children:x.jsxs("section",{"aria-describedby":"flow-pause-alert-body flow-pause-alert-hint","aria-labelledby":"flow-pause-alert-title","aria-modal":"true",className:"flow-pause-alert",role:"alertdialog",children:[x.jsx("p",{className:"flow-pause-alert-kicker",children:"VCM needs attention"}),x.jsx("h2",{id:"flow-pause-alert-title",children:"Flow needs attention"}),x.jsx("p",{id:"flow-pause-alert-body",children:Ut.text}),x.jsx("p",{id:"flow-pause-alert-hint",className:"flow-pause-alert-hint",children:"The task may be complete, waiting for your decision, or blocked by a workflow issue."}),x.jsx("button",{type:"button",autoFocus:!0,onClick:fn,children:"Confirm"})]})}):null,Pt&&Xr?x.jsxs("div",{className:"role-recovery-toast",role:"status",children:[x.jsx("span",{children:Pt}),x.jsx("button",{type:"button",onClick:()=>Io(Xr),children:"Close"})]}):null,D&&_?x.jsx(pk,{busy:Bn,qrCheck:A,qrLogin:_,onCheck:()=>{ke(async()=>{const V=await Se.checkGatewayQrLogin();L(V),(V.status==="confirmed"||V.status==="binded_redirect")&&R(!1),await yi()})},onClose:()=>R(!1)}):null,U&&k?x.jsx(mk,{busy:Bn,registration:k,registrationCheck:j,onCheck:()=>{ke(async()=>{const V=await Se.checkGatewayLarkRegistration();H(V),V.gatewayStatus&&v(V.gatewayStatus),V.status==="confirmed"&&(F(!1),await yi())},"Check Lark Gateway QR setup")},onManualBind:(V,me)=>{ke(async()=>{const qe=await Se.bindGatewayLarkApp({appId:V,appSecret:me,larkDomain:"lark"});H(qe),qe.gatewayStatus&&v(qe.gatewayStatus),qe.status==="confirmed"&&(F(!1),await yi())},"Bind Lark Gateway app")},onClose:()=>F(!1)}):null,n&&ie?x.jsx(ok,{task:ie,activeRole:q,gateReviewerEnabled:Qr,translationEnabled:jn,translationAutoSendEnabled:Cn,translationTargetLanguage:tt,launchTemplate:Fr,refreshNonce:ii,onTaskChanged:async()=>{await vi()},onActiveRoleChange:ee,onMessagesChanged:Gs,onOrchestrationChanged:sl,onRoundStateChanged:Ui,onEventsChanged:Vs,onLaunchStateChanged:al}):x.jsxs("section",{className:"empty-workspace",children:[x.jsx("h1",{children:n?"Create a task to open the workspace":"Connect a repository to begin"}),x.jsx("p",{children:n?"Tasks create local role commands and handoff artifacts for the selected repository.":"VibeCodingMaster will create a local task workspace, role sessions, and handoff artifacts."})]}),x.jsx(i2,{open:Oe,taskSlug:(ie==null?void 0:ie.taskSlug)??null,targetLanguage:tt,onClose:()=>ft(!1)}),x.jsx(y1,{open:mt,busy:Bn,status:$r,bootstrapStatus:qs,engineerSession:Is,permissionMode:wn,model:Ii,effort:di,taskSlug:(ie==null?void 0:ie.taskSlug)??null,onClose:()=>Ot(!1),onRefresh:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before refreshing Harness Studio.");await Promise.all([ri(ie.taskSlug),Ws(ie.taskSlug),tn()])},"Refresh Harness Studio")},onPermissionModeChange:It,onModelChange:ze,onEffortChange:Pr,onEngineerStart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before starting Harness Engineer.");const V=await Se.startHarnessEngineerSession({taskSlug:ie.taskSlug,cols:120,rows:32,permissionMode:wn,model:Ii,effort:di});Wt(V),si(V)},"Start Harness Engineer")},onEngineerResume:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before resuming Harness Engineer.");const V=await Se.resumeHarnessEngineerSession({taskSlug:ie.taskSlug,cols:120,rows:32,permissionMode:wn,model:Ii,effort:di});Wt(V),si(V)},"Resume Harness Engineer")},onEngineerRestart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before restarting Harness Engineer.");const V=await Se.restartHarnessEngineerSession({taskSlug:ie.taskSlug,cols:120,rows:32,permissionMode:wn,model:Ii,effort:di});Wt(V),si(V)},"Restart Harness Engineer")},onEngineerStop:()=>{ke(async()=>{const V=await Se.stopHarnessEngineerSession();Wt(V)},"Stop Harness Engineer")},onEngineerNotifyHarnessUpdated:()=>{ke(async()=>{const V=await Se.notifyHarnessEngineerHarnessUpdated();Wt(V),si(V)},"Notify Harness Engineer to reload harness")},onOpenRepositoryDiff:()=>Zt(!0),onReviewTaskHarness:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before reviewing task harness.");const V=await Se.startTaskHarnessRetrospective({taskSlug:ie.taskSlug,trigger:"manual"});E(V),await tn({syncLaunchOptions:!0})},"Review task harness")}}),x.jsx(b1,{open:Qe,taskSlug:(ie==null?void 0:ie.taskSlug)??null,onClose:()=>Zt(!1)}),x.jsx(k1,{open:Fe,busy:Bn,session:Bt,permissionMode:Gn,model:zt,effort:Wn,onClose:()=>gt(!1),onPermissionModeChange:Vn,onModelChange:on,onEffortChange:Vt,onStart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before starting Translator.");const V=await Se.startTranslatorSession({taskSlug:ie.taskSlug,cols:100,rows:28,permissionMode:Gn,model:zt,effort:Wn});ln(V),Kt(V)},"Start Translator session")},onResume:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before resuming Translator.");const V=await Se.resumeTranslatorSession({taskSlug:ie.taskSlug,cols:100,rows:28,permissionMode:Gn,model:zt,effort:Wn});ln(V),Kt(V)},"Resume Translator session")},onRestart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before restarting Translator.");const V=await Se.restartTranslatorSession({taskSlug:ie.taskSlug,cols:100,rows:28,permissionMode:Gn,model:zt,effort:Wn});ln(V),Kt(V)},"Restart Translator session")},onStop:()=>{ke(async()=>{const V=await Se.stopTranslatorSession();ln(V)},"Stop Translator session")},onNotifyHarnessUpdated:()=>{ke(async()=>{const V=await Se.notifyTranslatorHarnessUpdated();ln(V),Kt(V)},"Notify Translator to reload harness")}}),x.jsx(n1,{busy:Bn,state:T,onCancel:V=>{ke(async()=>{const me=await Se.decideHarnessFeedback({action:"cancel",taskSlug:ie==null?void 0:ie.taskSlug,comment:V});E(me)},"Cancel Harness feedback")},onApprove:V=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before approving Harness feedback.");const me=await Se.decideHarnessFeedback({action:"approve",taskSlug:ie.taskSlug,comment:V});E(me),await tn()},"Approve Harness feedback")},onComment:V=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before sending Harness feedback comments.");const me=await Se.decideHarnessFeedback({action:"comment",taskSlug:ie.taskSlug,comment:V});E(me),await tn()},"Send Harness feedback comment")},onReject:V=>{ke(async()=>{const me=await Se.decideHarnessFeedback({action:"reject",taskSlug:ie==null?void 0:ie.taskSlug,comment:V});E(me)},"Reject Harness feedback")}})]})}function pk({busy:n,onCheck:r,onClose:s,qrCheck:l,qrLogin:d}){const[m,f]=te.useState(""),[o,c]=Hi("");return te.useEffect(()=>{let h=!1;if(c(""),f(""),d.qrcodeUrl.startsWith("data:image/")){f(d.qrcodeUrl);return}try{const p=Ir(0,"M");p.addData(d.qrcodeUrl),p.make(),h||f(p.createDataURL(8,2))}catch(p){h||c(pt("Render Gateway QR login code",p))}return()=>{h=!0}},[d.qrcodeUrl]),x.jsx("div",{className:"modal-backdrop",children:x.jsxs("section",{"aria-labelledby":"gateway-qr-title","aria-modal":"true",className:"gateway-qr-modal",role:"dialog",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{id:"gateway-qr-title",children:"Weixin Gateway Login"}),x.jsx("p",{className:"muted",children:"Scan with Weixin, confirm on the phone, then click Confirm."})]}),x.jsx("button",{type:"button",onClick:s,children:"Close"})]}),x.jsxs("div",{className:"gateway-qr-modal-body",children:[x.jsx("div",{className:"gateway-qr-code-frame",children:m?x.jsx("img",{alt:"Weixin Gateway QR login",src:m}):x.jsx("div",{className:"gateway-qr-placeholder",children:o?"QR code could not be rendered.":"Rendering QR code..."})}),x.jsxs("dl",{className:"gateway-qr-meta",children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Status"}),x.jsx("dd",{children:(l==null?void 0:l.status)??d.status})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Expires"}),x.jsx("dd",{children:Cv(d.expiresAt)})]}),l!=null&&l.message?x.jsxs("div",{children:[x.jsx("dt",{children:"Message"}),x.jsx("dd",{children:l.message})]}):null]})]}),x.jsx("footer",{children:x.jsx("button",{type:"button",disabled:n,onClick:r,children:"Confirm"})})]})})}function mk({busy:n,onCheck:r,onClose:s,onManualBind:l,registration:d,registrationCheck:m}){const[f,o]=te.useState(""),[c,h]=Hi(""),[p,u]=te.useState(""),[b,C]=te.useState(""),[T,E]=Hi("");return te.useEffect(()=>{let S=!1;h(""),o("");try{const v=Ir(0,"M");v.addData(d.qrUrl),v.make(),S||o(v.createDataURL(8,2))}catch(v){S||h(pt("Render Lark Gateway setup QR code",v))}return()=>{S=!0}},[d.qrUrl]),x.jsx("div",{className:"modal-backdrop",children:x.jsxs("section",{"aria-labelledby":"gateway-lark-registration-title","aria-modal":"true",className:"gateway-qr-modal",role:"dialog",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{id:"gateway-lark-registration-title",children:"Lark Gateway Setup"}),x.jsx("p",{className:"muted",children:"Scan with Lark, approve bot creation, then click Confirm."})]}),x.jsx("button",{type:"button",onClick:s,children:"Close"})]}),x.jsxs("div",{className:"gateway-qr-modal-body",children:[x.jsx("div",{className:"gateway-qr-code-frame",children:f?x.jsx("img",{alt:"Lark Gateway setup QR code",src:f}):x.jsx("div",{className:"gateway-qr-placeholder",children:c?"QR code could not be rendered.":"Rendering QR code..."})}),x.jsx("div",{className:"gateway-qr-actions",children:x.jsx("button",{type:"button",disabled:n,onClick:r,children:"Confirm"})}),x.jsxs("dl",{className:"gateway-qr-meta",children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Status"}),x.jsx("dd",{children:(m==null?void 0:m.status)??d.status})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Expires"}),x.jsx("dd",{children:Cv(d.expiresAt)})]}),d.userCode?x.jsxs("div",{children:[x.jsx("dt",{children:"User Code"}),x.jsx("dd",{children:d.userCode})]}):null,m!=null&&m.larkBotName?x.jsxs("div",{children:[x.jsx("dt",{children:"Bot"}),x.jsx("dd",{children:m.larkBotName})]}):null,m!=null&&m.message?x.jsxs("div",{children:[x.jsx("dt",{children:"Message"}),x.jsx("dd",{children:m.message})]}):null]}),x.jsxs("form",{className:"gateway-manual-bind",onSubmit:S=>{S.preventDefault();const v=p.trim(),_=b.trim();if(!v||!_){E("Enter both App ID and App Secret.");return}E(""),C(""),l(v,_)},children:[x.jsxs("div",{children:[x.jsx("label",{htmlFor:"gateway-lark-app-id",children:"App ID"}),x.jsx("input",{id:"gateway-lark-app-id",autoComplete:"off",disabled:n,value:p,onChange:S=>u(S.currentTarget.value),placeholder:"cli_xxx"})]}),x.jsxs("div",{children:[x.jsx("label",{htmlFor:"gateway-lark-app-secret",children:"App Secret"}),x.jsx("input",{id:"gateway-lark-app-secret",autoComplete:"off",disabled:n,type:"password",value:b,onChange:S=>C(S.currentTarget.value),placeholder:"Enter App Secret"})]}),T?x.jsx("p",{className:"form-error",children:T}):null,x.jsx("button",{type:"submit",disabled:n,children:"Bind manually"})]})]})]})})}function Cv(n){const r=new Date(n);return Number.isNaN(r.getTime())?"-":new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(r)}let Hr=null;function gk(n){const r=Date.parse(n.startedAt??""),s=Date.parse(n.stoppedAt??n.lastTurnEndedAt??"");return!Number.isFinite(r)||!Number.isFinite(s)?0:Math.max(0,s-r)}function _k(n,r,s){if((r==null?void 0:r.status)==="running")return!0;const l=Date.parse(n.stoppedAt??n.lastTurnEndedAt??"");return!!(s&&Number.isFinite(l)&&l>s)}function vk(n){const r=n.roundId??n.startedAt??n.taskSlug,s=n.stoppedAt??n.lastTurnEndedAt??"stopped";return`${r}:${s}`}function yk(n,r){return`${n}:${r.role}:${r.lastFailureAt}`}function Sk(n){const r=wk(n.role),s=wv(n);return n.status==="retrying"?`CC 出错,正在重试 ${r}${s} · 第 ${n.attempt}/${n.maxAttempts} 次`:`CC 出错,重试中 ${r}${s} · 第 ${n.attempt}/${n.maxAttempts} 次 · ${xk(n.nextRetryAt)}`}function bk(n,r){const s=wv(n);return n.retryable===!1?`CC stopped for ${r}: ${Ck(n)} cannot be fixed by retrying.`:`CC retry failed after ${n.maxAttempts} attempts for ${r}${s}.`}function wv(n){return!n.error||n.error==="unknown"?"":` · ${n.error}`}function Ck(n){return n.error&&n.error!=="unknown"?n.error:"this error"}function wk(n){return n.split("-").filter(Boolean).map(r=>`${r.slice(0,1).toUpperCase()}${r.slice(1)}`).join(" ")}function xk(n){if(!n)return"即将重试";const r=Date.parse(n)-Date.now();return!Number.isFinite(r)||r<=0?"即将重试":`${Math.ceil(r/6e4)} 分钟后`}async function Ek(){const n=xv();return n?Ev(n):!1}async function bo(){const n=xv();if(!n||!await Ev(n))return!1;try{const s=n.createGain(),l=n.currentTime+.025;return s.gain.setValueAtTime(.85,n.currentTime),s.connect(n.destination),Kg(n,s,{frequency:587.33,startAt:l,duration:.18,peakGain:.045}),Kg(n,s,{frequency:783.99,startAt:l+.11,duration:.28,peakGain:.055}),window.setTimeout(()=>{s.disconnect()},800),!0}catch{return!1}}function xv(){const n=window.AudioContext??window.webkitAudioContext;if(!n)return null;try{return(!Hr||Hr.state==="closed")&&(Hr=new n),Hr}catch{return null}}function Vg(n){Hr=null,n&&n.state!=="closed"&&n.close().catch(()=>{})}async function Ev(n){if(Wg(n))return!0;try{await n.resume();const r=Wg(n);return!r&&n===Hr&&Vg(n),r}catch{return n===Hr&&Vg(n),!1}}function Wg(n){return n.state==="running"}function Kg(n,r,s){const l=n.createGain(),d=n.createOscillator(),m=n.createOscillator(),f=s.startAt+s.duration;l.gain.setValueAtTime(1e-4,s.startAt),l.gain.exponentialRampToValueAtTime(s.peakGain,s.startAt+.018),l.gain.exponentialRampToValueAtTime(1e-4,f),d.type="sine",d.frequency.setValueAtTime(s.frequency,s.startAt),m.type="triangle",m.frequency.setValueAtTime(s.frequency*2.01,s.startAt),d.connect(l),m.connect(l),l.connect(r),d.start(s.startAt),m.start(s.startAt),d.stop(f+.02),m.stop(f+.02)}const kv=document.getElementById("root");if(!kv)throw new Error("Missing #root element.");I0.createRoot(kv).render(x.jsx(te.StrictMode,{children:x.jsx(dk,{})}));
|
|
95
|
+
`))&&m()}return x.jsx("div",{className:"modal-backdrop",children:x.jsxs("section",{className:"message-modal",role:"dialog","aria-modal":"true","aria-label":"Messages",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{children:"Messages"}),x.jsxs("p",{className:"muted",children:[f.total," total / ",f.accepted," accepted",s?` · ${s.mode}`:""]})]}),x.jsxs("div",{className:"modal-actions",children:[x.jsx("button",{type:"button",disabled:n,onClick:o,children:"Mark All Done"}),x.jsx("button",{type:"button",disabled:n||f.total===0,onClick:c,children:"Delete All"}),x.jsx("button",{type:"button",onClick:l,children:"Close"})]})]}),x.jsx(D2,{busy:n,maxMessages:null,messages:r,orchestration:s,showControls:!1,showHeader:!1})]})})}function Nr({children:n,onOpenChange:r,open:s,title:l}){return x.jsxs("section",{className:"sidebar-section",children:[x.jsxs("button",{"aria-expanded":s,className:"sidebar-section-toggle",type:"button",onClick:()=>{r==null||r(!s)},children:[x.jsx("span",{children:l}),x.jsx("span",{"aria-hidden":"true",className:"sidebar-section-chevron"})]}),s?x.jsx("div",{className:"sidebar-section-content",children:n}):null]})}function yv(n,r){return n.find(s=>s.role===r)}function J2({activeRole:n,roles:r=Dh,sessions:s,onSelect:l}){return x.jsx("div",{className:"role-tabs",role:"tablist","aria-label":"Role sessions",children:r.map(d=>{const m=yv(s,d.name),f=(m==null?void 0:m.status)==="running"?m.activityStatus??"idle":(m==null?void 0:m.status)??"not_started";return x.jsxs("button",{className:d.name===n?"role-tab is-active":"role-tab",type:"button",role:"tab","aria-selected":d.name===n,onClick:()=>l(d.name),children:[x.jsx("span",{children:d.label}),x.jsx(Ni,{status:f})]},d.name)})})}function Z2({role:n,session:r,permissionMode:s,model:l,effort:d,active:m=!0,busy:f,translationEnabled:o,translationAutoSendEnabled:c,translationTargetLanguage:h,translationPanelState:p,onClearTranslationSession:u,onTranslationEntry:b,onTranslationFailures:C,onPermissionModeChange:T,onModelChange:E,onEffortChange:S,onStart:v,onResume:_,onStop:y,onRestart:A,onNotifyHarnessUpdated:L,onTerminalEvent:D}){const R=m&&X0(n)&&o&&(r==null?void 0:r.status)==="running";return x.jsx("section",{className:"session-console",children:x.jsxs("div",{className:R?"session-console-body has-translation":"session-console-body",children:[x.jsxs("div",{className:"terminal-pane",children:[x.jsx(Mh,{role:n,session:r,permissionMode:s,model:l,effort:d,busy:f,onPermissionModeChange:T,onModelChange:E,onEffortChange:S,onStart:v,onResume:_,onStop:y,onRestart:A,onNotifyHarnessUpdated:L}),(r==null?void 0:r.status)==="running"?x.jsx(Oo,{sessionId:r.id,active:m,onEvent:D},r.id):x.jsxs("div",{className:"terminal-empty",children:[x.jsx("strong",{children:n}),x.jsx("span",{children:r!=null&&r.claudeSessionId?"Resume this role to reconnect its Claude Code conversation.":"Start this role to open an embedded Claude Code terminal."})]})]}),R?x.jsx("div",{className:"translation-pane",children:x.jsx(e2,{active:m,autoSendEnabled:c,targetLanguage:h,taskSlug:r.taskSlug,role:n,sessionId:r.id,panelState:p??{role:n,status:"ready",entries:[],failures:[]},onClearSession:u??(()=>{}),onEntry:b??(()=>{}),onFailures:C??(()=>{})},`${n}:${r.id}`)}):null]})})}const ch=500;function Th(n){return{taskSlug:n,cursor:1,sessions:{}}}function ek(n,r,s){return n.sessions[r]??js(s)}function tk(n,r){const l={...sk(n,r.taskSlug).sessions};for(const d of r.sessions)l[d.sessionId]={...js(d.role),...l[d.sessionId],role:d.role,status:d.status};for(const d of r.events){const m=l[d.sessionId]??js(d.role);if(d.event.type==="status")l[d.sessionId]={...m,role:d.role,status:d.event.status};else if(d.event.type==="failures")l[d.sessionId]={...m,role:d.role,failures:d.event.failures};else if(d.event.type==="entry"){const f=bv(Sv(m.entries,d.event.entry));l[d.sessionId]={...m,role:d.role,entries:f.entries,failures:f.removedIds.size>0?m.failures.filter(o=>!f.removedIds.has(o.translationId)):m.failures}}}return{taskSlug:r.taskSlug,cursor:r.nextCursor,sessions:l}}function nk(n,r,s){return{...n,sessions:{...n.sessions,[r]:js(s)}}}function ik(n,r,s,l){const d=n.sessions[r]??js(s),m=bv(Sv(d.entries,l));return{...n,sessions:{...n.sessions,[r]:{...d,role:s,entries:m.entries,failures:m.removedIds.size>0?d.failures.filter(f=>!m.removedIds.has(f.translationId)):d.failures}}}}function rk(n,r,s,l){const d=n.sessions[r]??js(s);return{...n,sessions:{...n.sessions,[r]:{...d,role:s,failures:l}}}}function sk(n,r){return n.taskSlug===r?n:Th(r)}function js(n){return{role:n,status:"ready",entries:[],failures:[]}}function Sv(n,r){return n.findIndex(l=>l.id===r.id)===-1?[...n,r]:n.map(l=>l.id===r.id?r:l)}function bv(n){if(n.length<=ch)return{entries:n,removedIds:new Set};const r=n.slice(0,n.length-ch);return{entries:n.slice(-ch),removedIds:new Set(r.map(s=>s.id))}}const ak={"project-manager":"bypassPermissions",architect:"bypassPermissions",coder:"bypassPermissions",reviewer:"bypassPermissions","gate-reviewer":"bypassPermissions",translator:"bypassPermissions","harness-engineer":"bypassPermissions"},lk={"project-manager":"default",architect:"default",coder:"default",reviewer:"default","gate-reviewer":"default",translator:"default","harness-engineer":"default"},ok={"project-manager":"default",architect:"default",coder:"default",reviewer:"default","gate-reviewer":"default",translator:"medium","harness-engineer":"medium"};function ck({task:n,activeRole:r,gateReviewerEnabled:s,translationEnabled:l,translationAutoSendEnabled:d,translationTargetLanguage:m,launchTemplate:f,refreshNonce:o=0,onTaskChanged:c,onActiveRoleChange:h,onMessagesChanged:p,onOrchestrationChanged:u,onRoundStateChanged:b,onEventsChanged:C,onLaunchStateChanged:T}){const[E,S]=te.useState(null),[v,_]=te.useState(()=>Fg(f)),[y,A]=te.useState(()=>qg(f)),[L,D]=te.useState(()=>$g(f)),[R,k]=te.useState(!1),[,M]=Hi(""),[j,H]=te.useState([]),[U,F]=te.useState(null),[K,Y]=te.useState(()=>Th(n.taskSlug)),G=te.useRef(""),W=te.useRef(1),Z=te.useMemo(()=>JSON.stringify(f),[f]),z=!!(E!=null&&E.sessions.some(de=>de.role==="gate-reviewer")),O=s||z,N=[...Wa,...O?[Qg]:[]],$=te.useCallback((de,se)=>{F(se),p==null||p(de),u==null||u(se)},[p,u]),I=te.useCallback((de,se,we,je)=>{S(de),$(se,we),b==null||b(je)},[$,b]),re=te.useCallback(async()=>{const de=await Se.getTaskWorkspaceState(n.taskSlug);I(de.taskStatus,de.messages,de.orchestration,de.roundState),Do("Poll task workspace state"),M(se=>xo(se,["Load task workspace state","Poll task workspace state"]))},[I,n.taskSlug]),ve=te.useCallback((de,se)=>{const we=gv(de,se);we&&M(we)},[]);Xa(`task-workspace:${n.taskSlug}:${o}`,()=>re().catch(de=>{ve("Poll task workspace state",de)}),{intervalMs:3e3,runImmediately:!0}),Xa(l?`task-translation-feed:${n.taskSlug}`:null,async()=>{try{const de=await Se.pollTranslationTaskFeed(n.taskSlug,W.current);W.current=de.nextCursor,Y(se=>tk(se,de)),Do("Poll task translation feed"),M(se=>xo(se,["Poll task translation feed"]))}catch(de){ve("Poll task translation feed",de)}},{intervalMs:1e3,runImmediately:!0}),te.useEffect(()=>{H([]),C==null||C([])},[C,n.taskSlug]),te.useEffect(()=>{W.current=1,Y(Th(n.taskSlug))},[n.taskSlug]),te.useEffect(()=>{_(Fg(f)),A(qg(f)),D($g(f))},[Z,n.taskSlug]),te.useEffect(()=>{E&&!O&&r==="gate-reviewer"&&h("project-manager"),E&&r==="translator"&&h("project-manager")},[r,O,h,E]),te.useEffect(()=>{const de=E==null?void 0:E.task;if(!de||de.taskSlug!==n.taskSlug)return;const se=Pg(de);if(se===Pg(n)){G.current="";return}G.current!==se&&(G.current=se,c().catch(we=>{G.current="",M(pt("Refresh task list after task status changed",we))}))},[c,E==null?void 0:E.task,n]),te.useEffect(()=>{const de=(E==null?void 0:E.sessions)??[],se=de.filter(Pe=>uk(Pe.role)),we=new Set(se.map(Pe=>Pe.role)),je=de.some(Pe=>Pe.role==="gate-reviewer"),He={};for(const Pe of Ns)He[Pe.name]={permissionMode:v[Pe.name],model:y[Pe.name],effort:L[Pe.name]};T==null||T({taskSlug:n.taskSlug,roles:He,autoOrchestration:((U==null?void 0:U.mode)??"auto")==="auto",statusLoaded:!!E,sessionCount:se.length,hasAnySession:se.length>0,hasGateReviewerSession:je,allRolesHaveSession:Wa.every(Pe=>we.has(Pe.name))})},[y,L,T,U==null?void 0:U.mode,v,E,n.taskSlug]);async function pe(de,se="Run role session action"){k(!0),M("");try{await de(),await re(),await c()}catch(we){M(pt(se,we))}finally{k(!1)}}function Q(de){H(se=>{const we=[...se,`${new Date().toLocaleTimeString()} ${de}`];return C==null||C(we),we})}function q(de,se){_(we=>({...we,[de]:se}))}function ee(de,se){A(we=>({...we,[de]:se}))}function ae(de,se){D(we=>({...we,[de]:se}))}return x.jsxs("div",{className:"task-workspace",children:[x.jsxs("header",{className:"workspace-header",children:[x.jsx("div",{className:"workspace-title-line",children:x.jsx("h1",{children:n.title||n.taskSlug})}),x.jsx(J2,{activeRole:r,roles:N,sessions:(E==null?void 0:E.sessions)??[],onSelect:h})]}),x.jsx("div",{className:"workspace-grid",children:x.jsx("div",{className:"workspace-main",children:x.jsx("div",{className:"role-console-stack",children:N.map(de=>{const se=de.name,we=se===r,je=(E==null?void 0:E.sessions)??[],He=yv(je,se),Pe=He?ek(K,He.id,se):void 0;return x.jsx("div",{className:we?"role-console-panel is-active":"role-console-panel","aria-hidden":!we,children:x.jsx(Z2,{role:se,session:He,permissionMode:v[se],model:y[se],effort:L[se],active:we,busy:R,translationEnabled:l,translationAutoSendEnabled:d,translationTargetLanguage:m,translationPanelState:Pe,onClearTranslationSession:(xe,xt)=>{Y(yt=>nk(yt,xe,xt))},onTranslationEntry:(xe,xt,yt)=>{Y(Et=>ik(Et,xe,xt,yt))},onTranslationFailures:(xe,xt,yt)=>{Y(Et=>rk(Et,xe,xt,yt))},onPermissionModeChange:xe=>q(se,xe),onModelChange:xe=>ee(se,xe),onEffortChange:xe=>ae(se,xe),onStart:()=>void pe(async()=>{await Se.startRoleSession(n.taskSlug,se,{cols:100,rows:28,permissionMode:v[se],model:y[se],effort:L[se]}),Q(`started ${se} with ${v[se]} / ${y[se]} / ${L[se]}`)},`Start ${se} session`),onResume:()=>void pe(async()=>{await Se.resumeRoleSession(n.taskSlug,se,{cols:100,rows:28,permissionMode:v[se],model:y[se],effort:L[se]}),Q(`resumed ${se} with ${v[se]} / ${y[se]} / ${L[se]}`)},`Resume ${se} session`),onStop:()=>void pe(async()=>{await Se.stopRoleSession(n.taskSlug,se),Q(`stopped ${se}`)},`Stop ${se} session`),onRestart:()=>void pe(async()=>{await Se.restartRoleSession(n.taskSlug,se,{cols:100,rows:28,permissionMode:v[se],model:y[se],effort:L[se]}),Q(`restarted ${se} with ${v[se]} / ${y[se]} / ${L[se]}`)},`Restart ${se} session`),onNotifyHarnessUpdated:()=>void pe(async()=>{await Se.notifyRoleHarnessUpdated(n.taskSlug,se),Q(`notified ${se} to reload latest harness`)},`Notify ${se} to reload harness`),onTerminalEvent:xe=>Q(`${de.label}: ${xe}`)})},se)})})})})]})}function uk(n){return Wa.some(r=>r.name===n)}function Pg(n){return[n.status,n.updatedAt,n.cleanupStatus??"",n.cleanedAt??""].join(":")}function Fg(n){var s;const r={...ak};for(const l of Ns)r[l.name]=((s=n.roles[l.name])==null?void 0:s.permissionMode)??r[l.name];return r}function qg(n){var s;const r={...lk};for(const l of Ns)r[l.name]=((s=n.roles[l.name])==null?void 0:s.model)??r[l.name];return r}function $g(n){var s;const r={...ok};for(const l of Ns)r[l.name]=((s=n.roles[l.name])==null?void 0:s.effort)??r[l.name];return r}const hk=120*1e3,Gg=1400,fk=3;function dk(n){return!!(n!=null&&n.initialized)}function pk(){const[n,r]=te.useState(null),[s,l]=te.useState([]),[d,m]=te.useState(null),[f,o]=te.useState(null),[c,h]=te.useState(null),[p,u]=te.useState(null),[b,C]=te.useState(null),[T,E]=te.useState(null),[S,v]=te.useState(null),[_,y]=te.useState(null),[A,L]=te.useState(null),[D,R]=te.useState(!1),[k,M]=te.useState(null),[j,H]=te.useState(null),[U,F]=te.useState(!1),[K,Y]=te.useState([]),[G,W]=te.useState(null),[Z,z]=te.useState(null),[O,N]=te.useState(null),[$,I]=te.useState(null),[re,ve]=te.useState(null),[pe,Q]=te.useState(null),[q,ee]=te.useState("project-manager"),[ae,de]=te.useState("system"),[se,we]=te.useState(!0),[je,He]=te.useState(!0),[Pe,xe]=te.useState("off"),[xt,yt]=te.useState(!1),[Et,an]=te.useState(!1),[Cn,St]=te.useState(!1),[tt,Lt]=te.useState(Q0),[he,ye]=te.useState(J0),[Ae,Me]=te.useState(!1),[Oe,ft]=te.useState(!1),[Fe,gt]=te.useState(!1),[mt,Ot]=te.useState(!1),[Qe,Zt]=te.useState(!1),[Bt,ln]=te.useState(null),[Gn,Vn]=te.useState("bypassPermissions"),[zt,on]=te.useState("default"),[Wn,Vt]=te.useState("medium"),[Is,Wt]=te.useState(null),[wn,It]=te.useState("bypassPermissions"),[Ii,ze]=te.useState("default"),[di,Pr]=te.useState("medium"),[Fr,Us]=te.useState(()=>e1()),[Kn,el]=te.useState(null),[ii,kt]=te.useState(0),[Ut,Yn]=te.useState(null),[Ps,Io]=te.useState(null),[tl,nl]=te.useState(!1),[Bn,qr]=te.useState(!1),[,cn]=Hi(""),pi=te.useRef({}),mi=te.useRef({}),gi=te.useRef({}),bt=te.useRef({}),Fs=te.useRef({}),Xn=te.useRef(null),Qn=te.useRef(""),ie=te.useMemo(()=>v2(K,G),[K,G]),un=(Kn==null?void 0:Kn.taskSlug)===(ie==null?void 0:ie.taskSlug)?Kn:null,$r=c===(ie==null?void 0:ie.taskSlug)?d:null,qs=p===(ie==null?void 0:ie.taskSlug)?f:null,Uo=!!(n&&ie&&dk($r)),Gr=(Bt==null?void 0:Bt.status)==="running",_i=!!(S!=null&&S.running),jn=!!(Et&&Uo&&Gr),hn=!!(un!=null&&un.statusLoaded),il=!!(ie&&(un!=null&&un.statusLoaded)&&!un.hasAnySession),en=te.useCallback(V=>{de(V.themeMode),we(V.flowPauseAlerts),He(V.roleRetryEnabled),xe(V.permissionRequestMode),yt(V.autoTaskHarnessReviewEnabled),an(V.translationEnabled),St(V.translationAutoSendEnabled),Lt(V.translationTargetLanguage),ye(V.translationOutputMode),Us(V.launchTemplate)},[]),Nt=te.useCallback(()=>{Xn.current!==null&&(window.clearInterval(Xn.current),Xn.current=null)},[]),$s=te.useCallback(()=>{Nt(),bo(),Xn.current=window.setInterval(()=>{bo()},Gg)},[Nt]),mr=te.useCallback(()=>{Nt();let V=1;bo(),Xn.current=window.setInterval(()=>{V+=1,bo(),V>=fk&&Xn.current!==null&&(window.clearInterval(Xn.current),Xn.current=null)},Gg)},[Nt]),rl=te.useCallback((V,me=`manual-${Date.now()}`,qe={})=>{Yn({id:me,text:V}),qe.sound==="strong"?$s():qe.sound==="weak"?mr():Nt()},[mr,$s,Nt]),fn=te.useCallback(()=>{Nt(),Yn(null)},[Nt]);te.useEffect(()=>{ie!=null&&ie.taskSlug&&(Fs.current[ie.taskSlug]=Date.now())},[ie==null?void 0:ie.taskSlug]);const Gs=te.useCallback(V=>{ie!=null&&ie.taskSlug&&z({taskSlug:ie.taskSlug,messages:V})},[ie==null?void 0:ie.taskSlug]),sl=te.useCallback(V=>{gi.current[V.taskSlug]=V.mode,ie!=null&&ie.taskSlug&&N({taskSlug:ie.taskSlug,orchestration:V})},[ie==null?void 0:ie.taskSlug]),Vs=te.useCallback(V=>{ie!=null&&ie.taskSlug&&I({taskSlug:ie.taskSlug,events:V})},[ie==null?void 0:ie.taskSlug]),Ui=te.useCallback(V=>{if(!(ie!=null&&ie.taskSlug)||V.taskSlug!==ie.taskSlug)return;ve({taskSlug:V.taskSlug,roundState:V});const me=y2({mode:gi.current[V.taskSlug],status:V.status,activeRole:V.activeRole,lastFollowedRole:bt.current[V.taskSlug]});me&&(bt.current[V.taskSlug]=me,ee(me));const qe=S2(V,bk);if(qe===null){mi.current[V.taskSlug]={status:V.status};return}const pn=b2(V),yr=pi.current[V.taskSlug],Jr=mi.current[V.taskSlug];if(mi.current[V.taskSlug]={status:V.status},yr===pn||(pi.current[V.taskSlug]=pn,!vk(V,Jr,Fs.current[V.taskSlug])))return;if(_i){Nt(),Yn(null);return}const hl=se?_k(V)>=hk?"strong":"weak":"none";rl(qe,pn,{sound:hl})},[ie==null?void 0:ie.taskSlug,_i,se,rl,Nt]),al=te.useCallback(V=>{el(me=>(me==null?void 0:me.taskSlug)===V.taskSlug&&me.statusLoaded===V.statusLoaded&&me.sessionCount===V.sessionCount&&me.hasAnySession===V.hasAnySession&&me.hasGateReviewerSession===V.hasGateReviewerSession&&me.allRolesHaveSession===V.allRolesHaveSession&&me.autoOrchestration===V.autoOrchestration&&JSON.stringify(me.roles)===JSON.stringify(V.roles)?me:V)},[]);async function vi(){const V=await Se.listTasks();return Y(V),W(me=>{var qe;return me&&V.some(pn=>pn.taskSlug===me)?me:((qe=V[0])==null?void 0:qe.taskSlug)??null}),V}async function ri(V=ie==null?void 0:ie.taskSlug){if(!V)return m(null),h(null),null;const me=await Se.getHarnessStatus(V);return m(me),h(V),me}async function Ws(V=ie==null?void 0:ie.taskSlug){if(!V)return o(null),u(null),null;const me=await Se.getHarnessBootstrapStatus(V);return o(me),u(V),me}async function yi(){const V=await Se.getGatewayStatus();return v(V),V}async function ll(){const V=await Se.getRecentRepositoryPaths();return l(V),V}async function Vr(){if(!n)return Me(!1),!1;const V=await Se.getTranslationState();return Me(V.memoryInitialized),V.memoryInitialized}async function Ks(V){const[me,qe]=await Promise.all([Se.listMessages(V),Se.getOrchestrationState(V)]);z({taskSlug:V,messages:me}),N({taskSlug:V,orchestration:qe})}async function ol(V){const me=await Se.getGateReviewState(V);return Q({taskSlug:V,state:me}),Do("Poll Gate Review state"),cn(qe=>xo(qe,["Refresh Gate Review state","Poll Gate Review state"])),me}function gr(V,me){const qe=gv(V,me);qe&&cn(qe)}function Kt(V){V&&(Vn(V.permissionMode),V.model&&on(V.model),V.effort&&Vt(V.effort))}async function Wr(V={}){const me=await Se.getTranslatorSession();return ln(me),V.syncLaunchOptions&&Kt(me),me}function si(V){V&&(It(V.permissionMode),V.model&&ze(V.model),V.effort&&Pr(V.effort))}async function tn(V={}){const me=await Se.getHarnessEngineerSession();return Wt(me),V.syncLaunchOptions&&si(me),me}function Pi(V,me,qe={}){var pn;ln(V.translatorSession),Me(!!((pn=V.translationState)!=null&&pn.memoryInitialized)),Wt(V.harnessEngineerSession),E(V.harnessFeedbackState),v(V.gatewayStatus),me&&V.harnessStatus?(m(V.harnessStatus),h(me)):(m(null),h(null)),me&&V.harnessBootstrapStatus?(o(V.harnessBootstrapStatus),u(me)):(o(null),u(null)),qe.syncLaunchOptions&&(Kt(V.translatorSession),si(V.harnessEngineerSession))}async function cl(V={}){if(!n)return ln(null),Me(!1),Wt(null),m(null),o(null),h(null),u(null),E(null),null;const me=(ie==null?void 0:ie.taskSlug)??null,qe=await Se.getProjectRuntimeState(me);return Pi(qe,me,V),qe}function Ys(){const V=["Poll project runtime state","Load project runtime state","Refresh Harness feedback state","Poll Harness feedback state","Load Translator session","Poll Translator session","Poll translation memory status","Load Harness Engineer session","Poll Harness Engineer session","Load VCM Harness status","Poll VCM Harness status"];for(const me of V)Do(me);cn(me=>xo(me,V))}te.useEffect(()=>{Promise.all([Se.getCurrentProject(),Se.getRecentRepositoryPaths(),Se.getAppPreferences(),Se.getGatewayStatus()]).then(async([V,me,qe,pn])=>{r(V),l(me),v(pn),en(qe),V&&await vi()}).catch(V=>cn(pt("Load initial app data",V)))},[en]),te.useEffect(()=>{const V=window.matchMedia("(prefers-color-scheme: dark)"),me=()=>nl(V.matches);return me(),V.addEventListener("change",me),()=>V.removeEventListener("change",me)},[]),te.useEffect(()=>()=>Nt(),[Nt]),te.useEffect(()=>{_i&&(Nt(),Yn(null))},[_i,Nt]),te.useEffect(()=>{const V=ae==="system"?tl?"dark":"light":ae;document.documentElement.dataset.theme=V,document.documentElement.dataset.themeMode=ae},[tl,ae]),te.useEffect(()=>{if(!(ie!=null&&ie.taskSlug)){Q(null);return}ol(ie.taskSlug).catch(V=>cn(pt("Refresh Gate Review state",V)))},[ie==null?void 0:ie.taskSlug]),te.useEffect(()=>{Qn.current="",ln(null),Vn("bypassPermissions"),on("default"),Vt("medium"),Me(!1),Wt(null),It("bypassPermissions"),ze("default"),Pr("medium"),m(null),o(null),h(null),u(null),E(null)},[n==null?void 0:n.repoRoot]),Xa(n?`project-runtime:${n.repoRoot}:${(ie==null?void 0:ie.taskSlug)??"no-task"}`:null,async()=>{try{const V=(n==null?void 0:n.repoRoot)??"",me=!!(n&&Qn.current!==V);await cl({syncLaunchOptions:me}),me&&(Qn.current=V),Ys()}catch(V){gr("Poll project runtime state",V)}},{intervalMs:3e3,runImmediately:!0});const dn=(ie==null?void 0:ie.taskSlug)??null,Si=dn&&(pe==null?void 0:pe.taskSlug)===dn?pe.state:null,xn=dn&&(re==null?void 0:re.taskSlug)===dn?re.roundState:null,_r=dn&&(Kn==null?void 0:Kn.taskSlug)===dn?Kn:null,vr=!!(dn&&(Si!=null&&Si.activeGate||(xn==null?void 0:xn.activeRole)==="gate-reviewer"||_r!=null&&_r.hasGateReviewerSession));Xa(vr&&dn?`gate-review:${dn}`:null,async()=>{if(dn)try{await ol(dn)}catch(V){gr("Poll Gate Review state",V)}},{intervalMs:3e3,runImmediately:!1});async function ke(V,me="Run UI action"){qr(!0),cn("");try{await V()}catch(qe){cn(pt(me,qe))}finally{qr(!1)}}async function Xs(){if(!ie)throw new Error("Create or select a task before closing it.");const V=[`Close task "${ie.taskSlug}"?`,"","This is destructive:","- stops VCM-managed running role sessions for this task","- moves project-scoped Translator and Harness Engineer sessions to the base repository cwd",`- deletes the task worktree: ${ie.worktreePath}`,`- deletes the Git branch: ${ie.branch}`,"- deletes VCM task/session/message/orchestration state","","VCM will not check running sessions or uncommitted changes before closing."].join(`
|
|
96
|
+
`);window.confirm(V)&&(await Se.cleanupTask(ie.taskSlug,{force:!0,forceDeleteBranch:!0}),W(null),z(null),N(null),I(null),ve(null),Q(null),kt(qe=>qe+1),await vi())}const Kr=Z&&Z.taskSlug===(ie==null?void 0:ie.taskSlug)?Z.messages:[],ul=O&&O.taskSlug===(ie==null?void 0:ie.taskSlug)?O.orchestration:null,Yr=$&&$.taskSlug===(ie==null?void 0:ie.taskSlug)?$.events:[],nn=re&&re.taskSlug===(ie==null?void 0:ie.taskSlug)?re.roundState:null,Xr=ie!=null&&ie.taskSlug&&(nn!=null&&nn.roleRecovery)?yk(ie.taskSlug,nn.roleRecovery):null,Pt=nn!=null&&nn.roleRecovery&&nn.roleRecovery.status!=="failed"&&Xr!==Ps?Sk(nn.roleRecovery):null,Jn=pe&&pe.taskSlug===(ie==null?void 0:ie.taskSlug)?pe.state:null,Qr=!!(Jn&&Object.values(Jn.gates).some(V=>V.required));return x.jsxs(t1,{sidebar:x.jsx(N2,{project:n,recentRepositoryPaths:s,tasks:K,activeTaskSlug:(ie==null?void 0:ie.taskSlug)??null,messages:Kr,orchestration:ul,events:Yr,roundState:nn,gateReview:Jn,translationEnabled:jn,translationAutoSendEnabled:Cn,translationTargetLanguage:tt,translationOutputMode:he,translationMemoryInitialized:Ae,translatorSession:Bt,harnessStatus:$r,harnessBootstrapStatus:qs,harnessApplyResult:b,autoTaskHarnessReviewEnabled:xt,gatewayStatus:S,gatewayQrLogin:_,gatewayQrCheck:A,gatewayLarkRegistration:k,gatewayLarkRegistrationCheck:j,busy:Bn,onConnect:V=>ke(async()=>{const me=await Se.connectProject({repoPath:V});r(me),C(null),await Promise.all([vi(),ll()])},"Connect repository"),onRefreshConnectedRepository:()=>ke(async()=>{const V=await Se.getCurrentProject();r(V)},"Refresh connected repository"),onPullConnectedRepository:()=>ke(async()=>{const V=await Se.pullCurrentProject();r(V)},"Pull connected repository"),onRefreshHarness:()=>ke(async()=>{if(!ie)throw new Error("Create or select a task before refreshing VCM Harness.");C(null),await Promise.all([ri(ie.taskSlug),Ws(ie.taskSlug)])},"Refresh VCM Harness"),onApplyHarness:()=>ke(async()=>{if(!ie)throw new Error("Create or select a task before applying VCM Harness.");const V=await Se.applyHarness({taskSlug:ie.taskSlug});C(V),await Promise.all([ri(ie.taskSlug),Ws(ie.taskSlug)])},"Apply VCM Harness"),onStartHarnessBootstrap:V=>ke(async()=>{if(!ie)throw new Error("Create or select a task before starting Harness Bootstrap.");const me=await Se.startHarnessBootstrap({taskSlug:ie.taskSlug,cols:120,rows:32,...V});o(me.status),u(ie.taskSlug),await tn({syncLaunchOptions:!0})},"Start Harness Bootstrap"),onRestartHarnessBootstrap:V=>ke(async()=>{if(!ie)throw new Error("Create or select a task before restarting Harness Bootstrap.");const me=await Se.restartHarnessBootstrap({taskSlug:ie.taskSlug,cols:120,rows:32,...V});o(me.status),u(ie.taskSlug),await tn({syncLaunchOptions:!0})},"Restart Harness Bootstrap"),onStopHarnessBootstrap:()=>ke(async()=>{const V=await Se.stopHarnessBootstrap();o(V),u((ie==null?void 0:ie.taskSlug)??null),await tn()},"Stop Harness Bootstrap"),onRunHarnessBootstrap:()=>ke(async()=>{if(!ie)throw new Error("Create or select a task before running Harness Bootstrap.");const V=await Se.runHarnessBootstrap({taskSlug:ie.taskSlug});o(V.status),u(ie.taskSlug),await tn()},"Run Harness Bootstrap"),onOpenHarnessStudio:()=>Ot(!0),onOpenRepositoryDiff:()=>Zt(!0),onAutoTaskHarnessReviewChange:V=>{yt(V),ke(async()=>{const me=await Se.updateAppPreferences({autoTaskHarnessReviewEnabled:V});en(me)},"Update auto task harness review setting")},onRefreshGateway:()=>ke(async()=>{await yi()},"Refresh Gateway status"),onGatewayEnabledChange:V=>{ke(async()=>{const me=await Se.updateGatewaySettings({enabled:V,...V&&n?{currentProjectId:n.repoRoot,currentTaskSlug:(ie==null?void 0:ie.taskSlug)??null}:{}});v(me),V&&en(await Se.getAppPreferences())},"Update Gateway enabled setting")},onGatewaySettingsChange:V=>ke(async()=>{const me=await Se.updateGatewaySettings(V);v(me)},"Update Gateway settings"),onGatewayTranslationChange:V=>{ke(async()=>{const me=await Se.updateGatewaySettings({translationEnabled:V});v(me)},"Update Gateway translation setting")},onStartGatewayQrLogin:()=>{ke(async()=>{const V=await Se.startGatewayQrLogin();y(V),L(null),R(!0),await yi()},"Start Gateway QR login")},onStartGatewayLarkRegistration:()=>{ke(async()=>{const V=await Se.startGatewayLarkRegistration();M(V),H(null),F(!0),await yi()},"Start Lark Gateway QR setup")},onResetGatewayBinding:()=>{ke(async()=>{const V=await Se.resetGatewayBinding();v(V),y(null),L(null),R(!1),M(null),H(null),F(!1)},"Reset Gateway binding")},onGateReviewGateEnabledChange:(V,me)=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before changing Gate Review Gates.");const qe=await Se.updateGateReviewSettings(ie.taskSlug,{gates:{[V]:me}});Q({taskSlug:ie.taskSlug,state:qe})},`Update ${V} Gate Review setting`)},onTranslationEnabledChange:V=>{an(V),ke(async()=>{const me=await Se.updateAppPreferences({translationEnabled:V});en(me)},"Update conversation translation setting")},onTranslationAutoSendChange:V=>{St(V),ke(async()=>{const me=await Se.updateAppPreferences({translationAutoSendEnabled:V});en(me)},"Update translation auto-send setting")},onTranslationTargetLanguageChange:V=>{Lt(V),ke(async()=>{const me=await Se.updateAppPreferences({translationTargetLanguage:V});en(me)},"Update translation target language")},onTranslationOutputModeChange:V=>{ye(V),ke(async()=>{const me=await Se.updateAppPreferences({translationOutputMode:V});en(me)},"Update translation output mode")},onOpenFileTranslation:()=>ft(!0),onOpenTranslatorSession:()=>gt(!0),onCreateTranslationBootstrap:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before running Translation Bootstrap.");await Se.createTranslationBootstrap({taskSlug:ie.taskSlug,targetLanguage:tt}),await Vr(),await Wr()},"Create Translation Bootstrap task")},onUpdateTranslationMemory:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before updating translation memory.");await Se.createTranslationMemoryUpdate({taskSlug:ie.taskSlug,targetLanguage:tt}),await Vr(),await Wr()},"Create translation memory update task")},onCreateTask:V=>ke(async()=>{const me=await Se.createTask(V);await vi(),W(me.taskSlug)},"Create task"),onCloseTask:()=>{ke(Xs,"Close task")},onSelectTask:W,themeMode:ae,onAutoOrchestrationChange:V=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before changing auto orchestration.");const me=await Se.updateOrchestrationState(ie.taskSlug,{mode:V?"auto":"manual"});N({taskSlug:ie.taskSlug,orchestration:me})},"Update auto orchestration mode")},onThemeModeChange:V=>{de(V),ke(async()=>{const me=await Se.updateAppPreferences({themeMode:V});en(me)},"Update theme setting")},pauseAlertSound:se,onPauseAlertSoundChange:V=>{we(V),V&&Ek(),ke(async()=>{const me=await Se.updateAppPreferences({flowPauseAlerts:V});en(me)},"Update pause alert sound setting")},roleRetryEnabled:je,onRoleRetryEnabledChange:V=>{He(V),ke(async()=>{const me=await Se.updateAppPreferences({roleRetryEnabled:V});en(me)},"Update CC retry setting")},permissionRequestMode:Pe,onPermissionRequestModeChange:V=>{xe(V),ke(async()=>{const me=await Se.updateAppPreferences({permissionRequestMode:V});en(me)},"Update permission request setting")},launchTemplate:Fr,canSaveLaunchTemplate:hn,canOneClickStart:il,onSaveLaunchTemplate:()=>{ke(async()=>{if(!(un!=null&&un.statusLoaded))throw new Error("Open a task workspace before saving a launch template.");const V=await Se.updateAppPreferences({launchTemplate:{version:1,roles:un.roles,autoOrchestration:un.autoOrchestration}});en(V)},"Save launch template")},onOneClickStart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before one-click start.");const V=await Se.oneClickStart(ie.taskSlug);N({taskSlug:ie.taskSlug,orchestration:V.orchestration}),ee("project-manager"),await Ks(ie.taskSlug),await vi(),kt(me=>me+1)},"One-click start role sessions")},onMarkAllMessagesDone:V=>{ke(async()=>{const me=await Se.markAllMessagesDone(V);z({taskSlug:V,messages:me.messages}),await Ks(V)},"Mark all role messages done")},onDeleteMessageHistory:V=>{ke(async()=>{const me=await Se.deleteMessageHistory(V);z({taskSlug:V,messages:me.messages}),await Ks(V)},"Delete role message history")}}),children:[x.jsx(g2,{}),Ut?x.jsx("div",{className:"flow-pause-alert-backdrop",children:x.jsxs("section",{"aria-describedby":"flow-pause-alert-body flow-pause-alert-hint","aria-labelledby":"flow-pause-alert-title","aria-modal":"true",className:"flow-pause-alert",role:"alertdialog",children:[x.jsx("p",{className:"flow-pause-alert-kicker",children:"VCM needs attention"}),x.jsx("h2",{id:"flow-pause-alert-title",children:"Flow needs attention"}),x.jsx("p",{id:"flow-pause-alert-body",children:Ut.text}),x.jsx("p",{id:"flow-pause-alert-hint",className:"flow-pause-alert-hint",children:"The task may be complete, waiting for your decision, or blocked by a workflow issue."}),x.jsx("button",{type:"button",autoFocus:!0,onClick:fn,children:"Confirm"})]})}):null,Pt&&Xr?x.jsxs("div",{className:"role-recovery-toast",role:"status",children:[x.jsx("span",{children:Pt}),x.jsx("button",{type:"button",onClick:()=>Io(Xr),children:"Close"})]}):null,D&&_?x.jsx(mk,{busy:Bn,qrCheck:A,qrLogin:_,onCheck:()=>{ke(async()=>{const V=await Se.checkGatewayQrLogin();L(V),(V.status==="confirmed"||V.status==="binded_redirect")&&R(!1),await yi()})},onClose:()=>R(!1)}):null,U&&k?x.jsx(gk,{busy:Bn,registration:k,registrationCheck:j,onCheck:()=>{ke(async()=>{const V=await Se.checkGatewayLarkRegistration();H(V),V.gatewayStatus&&v(V.gatewayStatus),V.status==="confirmed"&&(F(!1),await yi())},"Check Lark Gateway QR setup")},onManualBind:(V,me)=>{ke(async()=>{const qe=await Se.bindGatewayLarkApp({appId:V,appSecret:me,larkDomain:"lark"});H(qe),qe.gatewayStatus&&v(qe.gatewayStatus),qe.status==="confirmed"&&(F(!1),await yi())},"Bind Lark Gateway app")},onClose:()=>F(!1)}):null,n&&ie?x.jsx(ck,{task:ie,activeRole:q,gateReviewerEnabled:Qr,translationEnabled:jn,translationAutoSendEnabled:Cn,translationTargetLanguage:tt,launchTemplate:Fr,refreshNonce:ii,onTaskChanged:async()=>{await vi()},onActiveRoleChange:ee,onMessagesChanged:Gs,onOrchestrationChanged:sl,onRoundStateChanged:Ui,onEventsChanged:Vs,onLaunchStateChanged:al}):x.jsxs("section",{className:"empty-workspace",children:[x.jsx("h1",{children:n?"Create a task to open the workspace":"Connect a repository to begin"}),x.jsx("p",{children:n?"Tasks create local role commands and handoff artifacts for the selected repository.":"VibeCodingMaster will create a local task workspace, role sessions, and handoff artifacts."})]}),x.jsx(i2,{open:Oe,taskSlug:(ie==null?void 0:ie.taskSlug)??null,targetLanguage:tt,onClose:()=>ft(!1)}),x.jsx(y1,{open:mt,busy:Bn,status:$r,bootstrapStatus:qs,engineerSession:Is,permissionMode:wn,model:Ii,effort:di,taskSlug:(ie==null?void 0:ie.taskSlug)??null,onClose:()=>Ot(!1),onRefresh:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before refreshing Harness Studio.");await Promise.all([ri(ie.taskSlug),Ws(ie.taskSlug),tn()])},"Refresh Harness Studio")},onPermissionModeChange:It,onModelChange:ze,onEffortChange:Pr,onEngineerStart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before starting Harness Engineer.");const V=await Se.startHarnessEngineerSession({taskSlug:ie.taskSlug,cols:120,rows:32,permissionMode:wn,model:Ii,effort:di});Wt(V),si(V)},"Start Harness Engineer")},onEngineerResume:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before resuming Harness Engineer.");const V=await Se.resumeHarnessEngineerSession({taskSlug:ie.taskSlug,cols:120,rows:32,permissionMode:wn,model:Ii,effort:di});Wt(V),si(V)},"Resume Harness Engineer")},onEngineerRestart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before restarting Harness Engineer.");const V=await Se.restartHarnessEngineerSession({taskSlug:ie.taskSlug,cols:120,rows:32,permissionMode:wn,model:Ii,effort:di});Wt(V),si(V)},"Restart Harness Engineer")},onEngineerStop:()=>{ke(async()=>{const V=await Se.stopHarnessEngineerSession();Wt(V)},"Stop Harness Engineer")},onEngineerNotifyHarnessUpdated:()=>{ke(async()=>{const V=await Se.notifyHarnessEngineerHarnessUpdated();Wt(V),si(V)},"Notify Harness Engineer to reload harness")},onOpenRepositoryDiff:()=>Zt(!0),onReviewTaskHarness:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before reviewing task harness.");const V=await Se.startTaskHarnessRetrospective({taskSlug:ie.taskSlug,trigger:"manual"});E(V),await tn({syncLaunchOptions:!0})},"Review task harness")}}),x.jsx(b1,{open:Qe,taskSlug:(ie==null?void 0:ie.taskSlug)??null,onClose:()=>Zt(!1)}),x.jsx(k1,{open:Fe,busy:Bn,session:Bt,permissionMode:Gn,model:zt,effort:Wn,onClose:()=>gt(!1),onPermissionModeChange:Vn,onModelChange:on,onEffortChange:Vt,onStart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before starting Translator.");const V=await Se.startTranslatorSession({taskSlug:ie.taskSlug,cols:100,rows:28,permissionMode:Gn,model:zt,effort:Wn});ln(V),Kt(V)},"Start Translator session")},onResume:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before resuming Translator.");const V=await Se.resumeTranslatorSession({taskSlug:ie.taskSlug,cols:100,rows:28,permissionMode:Gn,model:zt,effort:Wn});ln(V),Kt(V)},"Resume Translator session")},onRestart:()=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before restarting Translator.");const V=await Se.restartTranslatorSession({taskSlug:ie.taskSlug,cols:100,rows:28,permissionMode:Gn,model:zt,effort:Wn});ln(V),Kt(V)},"Restart Translator session")},onStop:()=>{ke(async()=>{const V=await Se.stopTranslatorSession();ln(V)},"Stop Translator session")},onNotifyHarnessUpdated:()=>{ke(async()=>{const V=await Se.notifyTranslatorHarnessUpdated();ln(V),Kt(V)},"Notify Translator to reload harness")}}),x.jsx(n1,{busy:Bn,state:T,onCancel:V=>{ke(async()=>{const me=await Se.decideHarnessFeedback({action:"cancel",taskSlug:ie==null?void 0:ie.taskSlug,comment:V});E(me)},"Cancel Harness feedback")},onApprove:V=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before approving Harness feedback.");const me=await Se.decideHarnessFeedback({action:"approve",taskSlug:ie.taskSlug,comment:V});E(me),await tn()},"Approve Harness feedback")},onComment:V=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before sending Harness feedback comments.");const me=await Se.decideHarnessFeedback({action:"comment",taskSlug:ie.taskSlug,comment:V});E(me),await tn()},"Send Harness feedback comment")},onReject:V=>{ke(async()=>{const me=await Se.decideHarnessFeedback({action:"reject",taskSlug:ie==null?void 0:ie.taskSlug,comment:V});E(me)},"Reject Harness feedback")}})]})}function mk({busy:n,onCheck:r,onClose:s,qrCheck:l,qrLogin:d}){const[m,f]=te.useState(""),[o,c]=Hi("");return te.useEffect(()=>{let h=!1;if(c(""),f(""),d.qrcodeUrl.startsWith("data:image/")){f(d.qrcodeUrl);return}try{const p=Ir(0,"M");p.addData(d.qrcodeUrl),p.make(),h||f(p.createDataURL(8,2))}catch(p){h||c(pt("Render Gateway QR login code",p))}return()=>{h=!0}},[d.qrcodeUrl]),x.jsx("div",{className:"modal-backdrop",children:x.jsxs("section",{"aria-labelledby":"gateway-qr-title","aria-modal":"true",className:"gateway-qr-modal",role:"dialog",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{id:"gateway-qr-title",children:"Weixin Gateway Login"}),x.jsx("p",{className:"muted",children:"Scan with Weixin, confirm on the phone, then click Confirm."})]}),x.jsx("button",{type:"button",onClick:s,children:"Close"})]}),x.jsxs("div",{className:"gateway-qr-modal-body",children:[x.jsx("div",{className:"gateway-qr-code-frame",children:m?x.jsx("img",{alt:"Weixin Gateway QR login",src:m}):x.jsx("div",{className:"gateway-qr-placeholder",children:o?"QR code could not be rendered.":"Rendering QR code..."})}),x.jsxs("dl",{className:"gateway-qr-meta",children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Status"}),x.jsx("dd",{children:(l==null?void 0:l.status)??d.status})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Expires"}),x.jsx("dd",{children:Cv(d.expiresAt)})]}),l!=null&&l.message?x.jsxs("div",{children:[x.jsx("dt",{children:"Message"}),x.jsx("dd",{children:l.message})]}):null]})]}),x.jsx("footer",{children:x.jsx("button",{type:"button",disabled:n,onClick:r,children:"Confirm"})})]})})}function gk({busy:n,onCheck:r,onClose:s,onManualBind:l,registration:d,registrationCheck:m}){const[f,o]=te.useState(""),[c,h]=Hi(""),[p,u]=te.useState(""),[b,C]=te.useState(""),[T,E]=Hi("");return te.useEffect(()=>{let S=!1;h(""),o("");try{const v=Ir(0,"M");v.addData(d.qrUrl),v.make(),S||o(v.createDataURL(8,2))}catch(v){S||h(pt("Render Lark Gateway setup QR code",v))}return()=>{S=!0}},[d.qrUrl]),x.jsx("div",{className:"modal-backdrop",children:x.jsxs("section",{"aria-labelledby":"gateway-lark-registration-title","aria-modal":"true",className:"gateway-qr-modal",role:"dialog",children:[x.jsxs("header",{children:[x.jsxs("div",{children:[x.jsx("h2",{id:"gateway-lark-registration-title",children:"Lark Gateway Setup"}),x.jsx("p",{className:"muted",children:"Scan with Lark, approve bot creation, then click Confirm."})]}),x.jsx("button",{type:"button",onClick:s,children:"Close"})]}),x.jsxs("div",{className:"gateway-qr-modal-body",children:[x.jsx("div",{className:"gateway-qr-code-frame",children:f?x.jsx("img",{alt:"Lark Gateway setup QR code",src:f}):x.jsx("div",{className:"gateway-qr-placeholder",children:c?"QR code could not be rendered.":"Rendering QR code..."})}),x.jsx("div",{className:"gateway-qr-actions",children:x.jsx("button",{type:"button",disabled:n,onClick:r,children:"Confirm"})}),x.jsxs("dl",{className:"gateway-qr-meta",children:[x.jsxs("div",{children:[x.jsx("dt",{children:"Status"}),x.jsx("dd",{children:(m==null?void 0:m.status)??d.status})]}),x.jsxs("div",{children:[x.jsx("dt",{children:"Expires"}),x.jsx("dd",{children:Cv(d.expiresAt)})]}),d.userCode?x.jsxs("div",{children:[x.jsx("dt",{children:"User Code"}),x.jsx("dd",{children:d.userCode})]}):null,m!=null&&m.larkBotName?x.jsxs("div",{children:[x.jsx("dt",{children:"Bot"}),x.jsx("dd",{children:m.larkBotName})]}):null,m!=null&&m.message?x.jsxs("div",{children:[x.jsx("dt",{children:"Message"}),x.jsx("dd",{children:m.message})]}):null]}),x.jsxs("form",{className:"gateway-manual-bind",onSubmit:S=>{S.preventDefault();const v=p.trim(),_=b.trim();if(!v||!_){E("Enter both App ID and App Secret.");return}E(""),C(""),l(v,_)},children:[x.jsxs("div",{children:[x.jsx("label",{htmlFor:"gateway-lark-app-id",children:"App ID"}),x.jsx("input",{id:"gateway-lark-app-id",autoComplete:"off",disabled:n,value:p,onChange:S=>u(S.currentTarget.value),placeholder:"cli_xxx"})]}),x.jsxs("div",{children:[x.jsx("label",{htmlFor:"gateway-lark-app-secret",children:"App Secret"}),x.jsx("input",{id:"gateway-lark-app-secret",autoComplete:"off",disabled:n,type:"password",value:b,onChange:S=>C(S.currentTarget.value),placeholder:"Enter App Secret"})]}),T?x.jsx("p",{className:"form-error",children:T}):null,x.jsx("button",{type:"submit",disabled:n,children:"Bind manually"})]})]})]})})}function Cv(n){const r=new Date(n);return Number.isNaN(r.getTime())?"-":new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(r)}let Hr=null;function _k(n){const r=Date.parse(n.startedAt??""),s=Date.parse(n.stoppedAt??n.lastTurnEndedAt??"");return!Number.isFinite(r)||!Number.isFinite(s)?0:Math.max(0,s-r)}function vk(n,r,s){if((r==null?void 0:r.status)==="running")return!0;const l=Date.parse(n.stoppedAt??n.lastTurnEndedAt??"");return!!(s&&Number.isFinite(l)&&l>s)}function yk(n,r){return`${n}:${r.role}:${r.lastFailureAt}`}function Sk(n){const r=wk(n.role),s=wv(n);return n.status==="retrying"?`CC 出错,正在重试 ${r}${s} · 第 ${n.attempt}/${n.maxAttempts} 次`:`CC 出错,重试中 ${r}${s} · 第 ${n.attempt}/${n.maxAttempts} 次 · ${xk(n.nextRetryAt)}`}function bk(n,r){const s=wv(n);return n.retryable===!1?`CC stopped for ${r}: ${Ck(n)} cannot be fixed by retrying.`:`CC retry failed after ${n.maxAttempts} attempts for ${r}${s}.`}function wv(n){return!n.error||n.error==="unknown"?"":` · ${n.error}`}function Ck(n){return n.error&&n.error!=="unknown"?n.error:"this error"}function wk(n){return n.split("-").filter(Boolean).map(r=>`${r.slice(0,1).toUpperCase()}${r.slice(1)}`).join(" ")}function xk(n){if(!n)return"即将重试";const r=Date.parse(n)-Date.now();return!Number.isFinite(r)||r<=0?"即将重试":`${Math.ceil(r/6e4)} 分钟后`}async function Ek(){const n=xv();return n?Ev(n):!1}async function bo(){const n=xv();if(!n||!await Ev(n))return!1;try{const s=n.createGain(),l=n.currentTime+.025;return s.gain.setValueAtTime(.85,n.currentTime),s.connect(n.destination),Kg(n,s,{frequency:587.33,startAt:l,duration:.18,peakGain:.045}),Kg(n,s,{frequency:783.99,startAt:l+.11,duration:.28,peakGain:.055}),window.setTimeout(()=>{s.disconnect()},800),!0}catch{return!1}}function xv(){const n=window.AudioContext??window.webkitAudioContext;if(!n)return null;try{return(!Hr||Hr.state==="closed")&&(Hr=new n),Hr}catch{return null}}function Vg(n){Hr=null,n&&n.state!=="closed"&&n.close().catch(()=>{})}async function Ev(n){if(Wg(n))return!0;try{await n.resume();const r=Wg(n);return!r&&n===Hr&&Vg(n),r}catch{return n===Hr&&Vg(n),!1}}function Wg(n){return n.state==="running"}function Kg(n,r,s){const l=n.createGain(),d=n.createOscillator(),m=n.createOscillator(),f=s.startAt+s.duration;l.gain.setValueAtTime(1e-4,s.startAt),l.gain.exponentialRampToValueAtTime(s.peakGain,s.startAt+.018),l.gain.exponentialRampToValueAtTime(1e-4,f),d.type="sine",d.frequency.setValueAtTime(s.frequency,s.startAt),m.type="triangle",m.frequency.setValueAtTime(s.frequency*2.01,s.startAt),d.connect(l),m.connect(l),l.connect(r),d.start(s.startAt),m.start(s.startAt),d.stop(f+.02),m.stop(f+.02)}const kv=document.getElementById("root");if(!kv)throw new Error("Missing #root element.");I0.createRoot(kv).render(x.jsx(te.StrictMode,{children:x.jsx(pk,{})}));
|
package/dist-frontend/index.html
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>VibeCodingMaster</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-C0CdYJxv.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-BM6nSKae.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|