vibe-coding-master 0.5.5 → 0.5.6

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.
@@ -92,5 +92,5 @@ WARNING: This link could potentially be dangerous`)){const v=window.open();if(v)
92
92
  --- Translation ---
93
93
  `;function t2({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=c2(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(gv(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=u2(D,k,S),Z=R.length,z=i2(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 ",n2(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(l2,{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&&!d2(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 n2(n){var r;return((r=t_.find(s=>s.value===n))==null?void 0:r.label)??n}function i2(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 r2({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(a2,{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(s2,{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 s2({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 a2({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(F_,{remarkPlugins:[fv],children:l||d||"Translation output is not available yet."})})]}):x.jsx("p",{className:"muted",children:"Select a translated file to preview it."})})]})]})}function l2({entry:n}){if(n.sourceKind==="conversation-boundary")return x.jsx(o2,{entry:n});const r=f2(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(F_,{remarkPlugins:[fv],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 o2({entry:n}){const r=n.boundaryKind==="end"?"结束":"开始",s=n.conversationTurn??0,l=m2(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 c2(n){const r=n.find(mv);return(r==null?void 0:r.translationStartedAt)??(r==null?void 0:r.createdAt)}function u2(n,r,s){const l=n.find(mv);if(l)return`translating ${p2(Math.max(0,s-h2(l)))}`;const d=n.at(-1);return(d==null?void 0:d.status)==="failed"||r==="failed"?"error":r}function mv(n){return n.status==="queued"||n.status==="translating"}function h2(n){const r=Date.parse(n.translationStartedAt??n.createdAt);return Number.isFinite(r)?r:Date.now()}function f2(n){return n.status==="queued"||n.status==="translating"?n.sourceText:n.status==="translated"?n.direction==="user-input-to-english"?gv(n.sourceText,n.translatedText):n.translatedText:n.translatedText||n.sourceText}function gv(n,r){return`${n.trimEnd()}${Ro}${r.trimStart()}`}function d2(n){return n.includes(Ro)}function zg(n){const r=n.indexOf(Ro);return r===-1?n:n.slice(r+Ro.length)}function p2(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 m2(n){const r=new Date(n);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString()}const g2=8;function _2(){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,g2)})},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:[v2(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 v2(n){return new Date(n).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function y2(n,r){return n.find(s=>s.taskSlug===r)??n[0]??null}function S2(n){if(!(n.mode!=="auto"||n.status!=="running")&&!(!n.activeRole||n.activeRole===n.lastFollowedRole))return n.activeRole}function b2(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 C2(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 w2=3,x2=3e4,wo=new Map;function _v(n,r){const s=pt(n,r);if(!E2(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>=w2&&(!l||l.lastMessage!==s||m-l.lastReportedAt>=x2);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),u1([n])}function E2(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 k2=["architecture-plan","validation-adequacy","final-diff"];function A2({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 T2({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?R2(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:i_.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:r_.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:s_.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 R2(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 D2(n,r=6){const s=[...n].sort(O2).map((d,m)=>({message:d,sequence:m+1}));return[...r===null?s:s.slice(-r)].sort((d,m)=>m.sequence-d.sequence)}function M2({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=D2(n,l);async function C(T){await B2(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:L2(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 L2(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 O2(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 B2(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 j2({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 N2({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 H2({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:me,onResetGatewayBinding:Q,onGateReviewGateEnabledChange:q,onTranslationEnabledChange:ee,onTranslationAutoSendChange:ae,onTranslationTargetLanguageChange:pe,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=P2(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(j2,{defaultPath:(n==null?void 0:n.repoRoot)??"",recentPaths:r,busy:k,onConnect:M}),n?x.jsx(G2,{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(X2(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:z2(Me),type:"button",onClick:gt,children:[x.jsx("span",{children:"One-click start"}),x.jsx("span",{children:vv(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(I2,{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:pe,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(F2,{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($2,{busy:k,qrCheck:L,qrLogin:A,larkRegistration:D,larkRegistrationCheck:R,status:y,onEnabledChange:$,onSettingsChange:I,onResetBinding:Q,onStartLarkRegistration:me,onStartQrLogin:ve,onTranslationChange:re})}),n?x.jsx(Nr,{title:"VCM Harness",open:zt==="vcm-harness",onOpenChange:ze=>It("vcm-harness",ze),children:x.jsx(T2,{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(N2,{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(K2,{task:wn,roundState:o}):null,Bt?x.jsx(J2,{busy:k,messages:d,orchestration:m,onClose:()=>ln(!1),onMarkAllDone:()=>{l&&mt(l)},onDeleteMessageHistory:()=>{l&&Ot(l)}}):null,Gn?x.jsx(Q2,{events:f,onClose:()=>Vn(!1)}):null]})}function vv(n){return[n.autoOrchestration?"auto":"manual"].join(" + ")}function z2(n){const r=Object.entries(n.roles).map(([s,l])=>`${s}: ${l.permissionMode} / ${l.model} / ${l.effort}`).join("; ");return`Launch template: ${vv(n)}; ${r}`}function I2({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:t_.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:e1.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:U2(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 U2(n){return n?n.status==="running"?n.activityStatus??"idle":n.status:"not started"}function P2(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 F2({busy:n,onGateEnabledChange:r,state:s}){return x.jsx("div",{className:"sidebar-settings",children:k2.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:q2(l),title:d!=null&&d.status?`status: ${d.status}`:void 0,onChange:f=>r(l,f)},l)})})}function q2(n){switch(n){case"architecture-plan":return"Architecture plan";case"validation-adequacy":return"Validation adequacy";case"final-diff":return"Final diff"}return n}function $2({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 G2({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:V2(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:W2(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 V2(n){return n.branch||"unknown"}function W2(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 K2({roundState:n,task:r}){var p;const[s,l]=te.useState(()=>Date.now()),d=!!(n!=null&&n.startedAt),m=yv(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?Y2(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 Y2(n,r){const s=n.status==="running"?r:Date.parse(n.stoppedAt??n.lastTurnEndedAt??"");return yv(n.startedAt??"",Number.isFinite(s)?s:r)}function yv(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 X2(n){return n==="system"?"light":n==="light"?"dark":"system"}function Ug(n){return n==="system"?"System":n==="light"?"Light":"Dark"}function Q2({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(A2,{events:n,maxEvents:null,showHeader:!1})]})})}function J2({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(M2,{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 Sv(n,r){return n.find(s=>s.role===r)}function Z2({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=Sv(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 ek({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&&Q0(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(t2,{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 tk(n,r,s){return n.sessions[r]??js(s)}function nk(n,r){const l={...ak(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=Cv(bv(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 ik(n,r,s){return{...n,sessions:{...n.sessions,[r]:js(s)}}}function rk(n,r,s,l){const d=n.sessions[r]??js(s),m=Cv(bv(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 sk(n,r,s,l){const d=n.sessions[r]??js(s);return{...n,sessions:{...n.sessions,[r]:{...d,role:s,failures:l}}}}function ak(n,r){return n.taskSlug===r?n:Th(r)}function js(n){return{role:n,status:"ready",entries:[],failures:[]}}function bv(n,r){return n.findIndex(l=>l.id===r.id)===-1?[...n,r]:n.map(l=>l.id===r.id?r:l)}function Cv(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 lk={"project-manager":"bypassPermissions",architect:"bypassPermissions",coder:"bypassPermissions",reviewer:"bypassPermissions","gate-reviewer":"bypassPermissions",translator:"bypassPermissions","harness-engineer":"bypassPermissions"},ok={"project-manager":"default",architect:"default",coder:"default",reviewer:"default","gate-reviewer":"default",translator:"default","harness-engineer":"default"},ck={"project-manager":"default",architect:"default",coder:"default",reviewer:"default","gate-reviewer":"default",translator:"medium","harness-engineer":"medium"};function uk({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(pe=>pe.role==="gate-reviewer")),O=s||z,N=[...Wa,...O?[Jg]:[]],$=te.useCallback((pe,se)=>{F(se),p==null||p(pe),u==null||u(se)},[p,u]),I=te.useCallback((pe,se,we,je)=>{S(pe),$(se,we),b==null||b(je)},[$,b]),re=te.useCallback(async()=>{const pe=await Se.getTaskWorkspaceState(n.taskSlug);I(pe.taskStatus,pe.messages,pe.orchestration,pe.roundState),Do("Poll task workspace state"),M(se=>xo(se,["Load task workspace state","Poll task workspace state"]))},[I,n.taskSlug]),ve=te.useCallback((pe,se)=>{const we=_v(pe,se);we&&M(we)},[]);Xa(`task-workspace:${n.taskSlug}:${o}`,()=>re().catch(pe=>{ve("Poll task workspace state",pe)}),{intervalMs:3e3,runImmediately:!0}),Xa(l?`task-translation-feed:${n.taskSlug}`:null,async()=>{try{const pe=await Se.pollTranslationTaskFeed(n.taskSlug,W.current);W.current=pe.nextCursor,Y(se=>nk(se,pe)),Do("Poll task translation feed"),M(se=>xo(se,["Poll task translation feed"]))}catch(pe){ve("Poll task translation feed",pe)}},{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 pe=E==null?void 0:E.task;if(!pe||pe.taskSlug!==n.taskSlug)return;const se=Pg(pe);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 pe=(E==null?void 0:E.sessions)??[],se=pe.filter(Pe=>hk(Pe.role)),we=new Set(se.map(Pe=>Pe.role)),je=pe.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 me(pe,se="Run role session action"){k(!0),M("");try{await pe(),await re(),await c()}catch(we){M(pt(se,we))}finally{k(!1)}}function Q(pe){H(se=>{const we=[...se,`${new Date().toLocaleTimeString()} ${pe}`];return C==null||C(we),we})}function q(pe,se){_(we=>({...we,[pe]:se}))}function ee(pe,se){A(we=>({...we,[pe]:se}))}function ae(pe,se){D(we=>({...we,[pe]: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(Z2,{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(pe=>{const se=pe.name,we=se===r,je=(E==null?void 0:E.sessions)??[],He=Sv(je,se),Pe=He?tk(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(ek,{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=>ik(yt,xe,xt))},onTranslationEntry:(xe,xt,yt)=>{Y(Et=>rk(Et,xe,xt,yt))},onTranslationFailures:(xe,xt,yt)=>{Y(Et=>sk(Et,xe,xt,yt))},onPermissionModeChange:xe=>q(se,xe),onModelChange:xe=>ee(se,xe),onEffortChange:xe=>ae(se,xe),onStart:()=>void me(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 me(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 me(async()=>{await Se.stopRoleSession(n.taskSlug,se),Q(`stopped ${se}`)},`Stop ${se} session`),onRestart:()=>void me(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 me(async()=>{await Se.notifyRoleHarnessUpdated(n.taskSlug,se),Q(`notified ${se} to reload latest harness`)},`Notify ${se} to reload harness`),onTerminalEvent:xe=>Q(`${pe.label}: ${xe}`)})},se)})})})})]})}function hk(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={...lk};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={...ok};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={...ck};for(const l of Ns)r[l.name]=((s=n.roles[l.name])==null?void 0:s.effort)??r[l.name];return r}const fk=120*1e3,Gg=1400,dk=3;function pk(n){return!!(n!=null&&n.initialized)}function mk(){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),[me,Q]=te.useState(null),[q,ee]=te.useState("project-manager"),[ae,pe]=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(J0),[he,ye]=te.useState(Z0),[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(()=>t1()),[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(()=>y2(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&&pk($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=>{pe(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)},[]);te.useEffect(()=>{if(!se)return;let V=!1;const fe=()=>{V||(V=!0,Vg(),window.removeEventListener("pointerdown",fe),window.removeEventListener("keydown",fe))};return window.addEventListener("pointerdown",fe),window.addEventListener("keydown",fe),()=>{window.removeEventListener("pointerdown",fe),window.removeEventListener("keydown",fe)}},[se]);const 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>=dk&&Xn.current!==null&&(window.clearInterval(Xn.current),Xn.current=null)},Gg)},[Nt]),rl=te.useCallback((V,fe=`manual-${Date.now()}`,qe={})=>{Yn({id:fe,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 fe=S2({mode:gi.current[V.taskSlug],status:V.status,activeRole:V.activeRole,lastFollowedRole:bt.current[V.taskSlug]});fe&&(bt.current[V.taskSlug]=fe,ee(fe));const qe=b2(V,Ck);if(qe===null){mi.current[V.taskSlug]={status:V.status};return}const pn=C2(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,!yk(V,Jr,Fs.current[V.taskSlug])))return;if(_i){Nt(),Yn(null);return}const hl=se?vk(V)>=fk?"strong":"weak":"none";rl(qe,pn,{sound:hl})},[ie==null?void 0:ie.taskSlug,_i,se,rl,Nt]),al=te.useCallback(V=>{el(fe=>(fe==null?void 0:fe.taskSlug)===V.taskSlug&&fe.statusLoaded===V.statusLoaded&&fe.sessionCount===V.sessionCount&&fe.hasAnySession===V.hasAnySession&&fe.hasGateReviewerSession===V.hasGateReviewerSession&&fe.allRolesHaveSession===V.allRolesHaveSession&&fe.autoOrchestration===V.autoOrchestration&&JSON.stringify(fe.roles)===JSON.stringify(V.roles)?fe:V)},[]);async function vi(){const V=await Se.listTasks();return Y(V),W(fe=>{var qe;return fe&&V.some(pn=>pn.taskSlug===fe)?fe:((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 fe=await Se.getHarnessStatus(V);return m(fe),h(V),fe}async function Ws(V=ie==null?void 0:ie.taskSlug){if(!V)return o(null),u(null),null;const fe=await Se.getHarnessBootstrapStatus(V);return o(fe),u(V),fe}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[fe,qe]=await Promise.all([Se.listMessages(V),Se.getOrchestrationState(V)]);z({taskSlug:V,messages:fe}),N({taskSlug:V,orchestration:qe})}async function ol(V){const fe=await Se.getGateReviewState(V);return Q({taskSlug:V,state:fe}),Do("Poll Gate Review state"),cn(qe=>xo(qe,["Refresh Gate Review state","Poll Gate Review state"])),fe}function gr(V,fe){const qe=_v(V,fe);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 fe=await Se.getTranslatorSession();return ln(fe),V.syncLaunchOptions&&Kt(fe),fe}function si(V){V&&(It(V.permissionMode),V.model&&ze(V.model),V.effort&&Pr(V.effort))}async function tn(V={}){const fe=await Se.getHarnessEngineerSession();return Wt(fe),V.syncLaunchOptions&&si(fe),fe}function Pi(V,fe,qe={}){var pn;ln(V.translatorSession),Me(!!((pn=V.translationState)!=null&&pn.memoryInitialized)),Wt(V.harnessEngineerSession),E(V.harnessFeedbackState),v(V.gatewayStatus),fe&&V.harnessStatus?(m(V.harnessStatus),h(fe)):(m(null),h(null)),fe&&V.harnessBootstrapStatus?(o(V.harnessBootstrapStatus),u(fe)):(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 fe=(ie==null?void 0:ie.taskSlug)??null,qe=await Se.getProjectRuntimeState(fe);return Pi(qe,fe,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 fe of V)Do(fe);cn(fe=>xo(fe,V))}te.useEffect(()=>{Promise.all([Se.getCurrentProject(),Se.getRecentRepositoryPaths(),Se.getAppPreferences(),Se.getGatewayStatus()]).then(async([V,fe,qe,pn])=>{r(V),l(fe),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)"),fe=()=>nl(V.matches);return fe(),V.addEventListener("change",fe),()=>V.removeEventListener("change",fe)},[]),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)??"",fe=!!(n&&Qn.current!==V);await cl({syncLaunchOptions:fe}),fe&&(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&&(me==null?void 0:me.taskSlug)===dn?me.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,fe="Run UI action"){qr(!0),cn("");try{await V()}catch(qe){cn(pt(fe,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(`
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(M2,{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 Sv(n,r){return n.find(s=>s.role===r)}function Z2({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=Sv(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 ek({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&&Q0(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(t2,{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 tk(n,r,s){return n.sessions[r]??js(s)}function nk(n,r){const l={...ak(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=Cv(bv(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 ik(n,r,s){return{...n,sessions:{...n.sessions,[r]:js(s)}}}function rk(n,r,s,l){const d=n.sessions[r]??js(s),m=Cv(bv(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 sk(n,r,s,l){const d=n.sessions[r]??js(s);return{...n,sessions:{...n.sessions,[r]:{...d,role:s,failures:l}}}}function ak(n,r){return n.taskSlug===r?n:Th(r)}function js(n){return{role:n,status:"ready",entries:[],failures:[]}}function bv(n,r){return n.findIndex(l=>l.id===r.id)===-1?[...n,r]:n.map(l=>l.id===r.id?r:l)}function Cv(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 lk={"project-manager":"bypassPermissions",architect:"bypassPermissions",coder:"bypassPermissions",reviewer:"bypassPermissions","gate-reviewer":"bypassPermissions",translator:"bypassPermissions","harness-engineer":"bypassPermissions"},ok={"project-manager":"default",architect:"default",coder:"default",reviewer:"default","gate-reviewer":"default",translator:"default","harness-engineer":"default"},ck={"project-manager":"default",architect:"default",coder:"default",reviewer:"default","gate-reviewer":"default",translator:"medium","harness-engineer":"medium"};function uk({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(pe=>pe.role==="gate-reviewer")),O=s||z,N=[...Wa,...O?[Jg]:[]],$=te.useCallback((pe,se)=>{F(se),p==null||p(pe),u==null||u(se)},[p,u]),I=te.useCallback((pe,se,we,je)=>{S(pe),$(se,we),b==null||b(je)},[$,b]),re=te.useCallback(async()=>{const pe=await Se.getTaskWorkspaceState(n.taskSlug);I(pe.taskStatus,pe.messages,pe.orchestration,pe.roundState),Do("Poll task workspace state"),M(se=>xo(se,["Load task workspace state","Poll task workspace state"]))},[I,n.taskSlug]),ve=te.useCallback((pe,se)=>{const we=_v(pe,se);we&&M(we)},[]);Xa(`task-workspace:${n.taskSlug}:${o}`,()=>re().catch(pe=>{ve("Poll task workspace state",pe)}),{intervalMs:3e3,runImmediately:!0}),Xa(l?`task-translation-feed:${n.taskSlug}`:null,async()=>{try{const pe=await Se.pollTranslationTaskFeed(n.taskSlug,W.current);W.current=pe.nextCursor,Y(se=>nk(se,pe)),Do("Poll task translation feed"),M(se=>xo(se,["Poll task translation feed"]))}catch(pe){ve("Poll task translation feed",pe)}},{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 pe=E==null?void 0:E.task;if(!pe||pe.taskSlug!==n.taskSlug)return;const se=Pg(pe);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 pe=(E==null?void 0:E.sessions)??[],se=pe.filter(Pe=>hk(Pe.role)),we=new Set(se.map(Pe=>Pe.role)),je=pe.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 me(pe,se="Run role session action"){k(!0),M("");try{await pe(),await re(),await c()}catch(we){M(pt(se,we))}finally{k(!1)}}function Q(pe){H(se=>{const we=[...se,`${new Date().toLocaleTimeString()} ${pe}`];return C==null||C(we),we})}function q(pe,se){_(we=>({...we,[pe]:se}))}function ee(pe,se){A(we=>({...we,[pe]:se}))}function ae(pe,se){D(we=>({...we,[pe]: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(Z2,{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(pe=>{const se=pe.name,we=se===r,je=(E==null?void 0:E.sessions)??[],He=Sv(je,se),Pe=He?tk(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(ek,{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=>ik(yt,xe,xt))},onTranslationEntry:(xe,xt,yt)=>{Y(Et=>rk(Et,xe,xt,yt))},onTranslationFailures:(xe,xt,yt)=>{Y(Et=>sk(Et,xe,xt,yt))},onPermissionModeChange:xe=>q(se,xe),onModelChange:xe=>ee(se,xe),onEffortChange:xe=>ae(se,xe),onStart:()=>void me(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 me(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 me(async()=>{await Se.stopRoleSession(n.taskSlug,se),Q(`stopped ${se}`)},`Stop ${se} session`),onRestart:()=>void me(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 me(async()=>{await Se.notifyRoleHarnessUpdated(n.taskSlug,se),Q(`notified ${se} to reload latest harness`)},`Notify ${se} to reload harness`),onTerminalEvent:xe=>Q(`${pe.label}: ${xe}`)})},se)})})})})]})}function hk(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={...lk};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={...ok};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={...ck};for(const l of Ns)r[l.name]=((s=n.roles[l.name])==null?void 0:s.effort)??r[l.name];return r}const fk=120*1e3,Gg=1400,dk=3;function pk(n){return!!(n!=null&&n.initialized)}function mk(){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),[me,Q]=te.useState(null),[q,ee]=te.useState("project-manager"),[ae,pe]=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(J0),[he,ye]=te.useState(Z0),[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(()=>t1()),[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(()=>y2(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&&pk($r)),Gr=(Bt==null?void 0:Bt.status)==="running",_i=!!(S!=null&&S.enabled),jn=!!(Et&&Uo&&Gr),hn=!!(un!=null&&un.statusLoaded),il=!!(ie&&(un!=null&&un.statusLoaded)&&!un.hasAnySession),en=te.useCallback(V=>{pe(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)},[]);te.useEffect(()=>{if(!se)return;let V=!1;const fe=()=>{V||(V=!0,Vg(),window.removeEventListener("pointerdown",fe),window.removeEventListener("keydown",fe))};return window.addEventListener("pointerdown",fe),window.addEventListener("keydown",fe),()=>{window.removeEventListener("pointerdown",fe),window.removeEventListener("keydown",fe)}},[se]);const 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>=dk&&Xn.current!==null&&(window.clearInterval(Xn.current),Xn.current=null)},Gg)},[Nt]),rl=te.useCallback((V,fe=`manual-${Date.now()}`,qe={})=>{Yn({id:fe,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 fe=S2({mode:gi.current[V.taskSlug],status:V.status,activeRole:V.activeRole,lastFollowedRole:bt.current[V.taskSlug]});fe&&(bt.current[V.taskSlug]=fe,ee(fe));const qe=b2(V,Ck);if(qe===null){mi.current[V.taskSlug]={status:V.status};return}const pn=C2(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,!yk(V,Jr,Fs.current[V.taskSlug])))return;if(_i){Nt(),Yn(null);return}const hl=se?vk(V)>=fk?"strong":"weak":"none";rl(qe,pn,{sound:hl})},[ie==null?void 0:ie.taskSlug,_i,se,rl,Nt]),al=te.useCallback(V=>{el(fe=>(fe==null?void 0:fe.taskSlug)===V.taskSlug&&fe.statusLoaded===V.statusLoaded&&fe.sessionCount===V.sessionCount&&fe.hasAnySession===V.hasAnySession&&fe.hasGateReviewerSession===V.hasGateReviewerSession&&fe.allRolesHaveSession===V.allRolesHaveSession&&fe.autoOrchestration===V.autoOrchestration&&JSON.stringify(fe.roles)===JSON.stringify(V.roles)?fe:V)},[]);async function vi(){const V=await Se.listTasks();return Y(V),W(fe=>{var qe;return fe&&V.some(pn=>pn.taskSlug===fe)?fe:((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 fe=await Se.getHarnessStatus(V);return m(fe),h(V),fe}async function Ws(V=ie==null?void 0:ie.taskSlug){if(!V)return o(null),u(null),null;const fe=await Se.getHarnessBootstrapStatus(V);return o(fe),u(V),fe}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[fe,qe]=await Promise.all([Se.listMessages(V),Se.getOrchestrationState(V)]);z({taskSlug:V,messages:fe}),N({taskSlug:V,orchestration:qe})}async function ol(V){const fe=await Se.getGateReviewState(V);return Q({taskSlug:V,state:fe}),Do("Poll Gate Review state"),cn(qe=>xo(qe,["Refresh Gate Review state","Poll Gate Review state"])),fe}function gr(V,fe){const qe=_v(V,fe);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 fe=await Se.getTranslatorSession();return ln(fe),V.syncLaunchOptions&&Kt(fe),fe}function si(V){V&&(It(V.permissionMode),V.model&&ze(V.model),V.effort&&Pr(V.effort))}async function tn(V={}){const fe=await Se.getHarnessEngineerSession();return Wt(fe),V.syncLaunchOptions&&si(fe),fe}function Pi(V,fe,qe={}){var pn;ln(V.translatorSession),Me(!!((pn=V.translationState)!=null&&pn.memoryInitialized)),Wt(V.harnessEngineerSession),E(V.harnessFeedbackState),v(V.gatewayStatus),fe&&V.harnessStatus?(m(V.harnessStatus),h(fe)):(m(null),h(null)),fe&&V.harnessBootstrapStatus?(o(V.harnessBootstrapStatus),u(fe)):(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 fe=(ie==null?void 0:ie.taskSlug)??null,qe=await Se.getProjectRuntimeState(fe);return Pi(qe,fe,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 fe of V)Do(fe);cn(fe=>xo(fe,V))}te.useEffect(()=>{Promise.all([Se.getCurrentProject(),Se.getRecentRepositoryPaths(),Se.getAppPreferences(),Se.getGatewayStatus()]).then(async([V,fe,qe,pn])=>{r(V),l(fe),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)"),fe=()=>nl(V.matches);return fe(),V.addEventListener("change",fe),()=>V.removeEventListener("change",fe)},[]),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)??"",fe=!!(n&&Qn.current!==V);await cl({syncLaunchOptions:fe}),fe&&(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&&(me==null?void 0:me.taskSlug)===dn?me.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,fe="Run UI action"){qr(!0),cn("");try{await V()}catch(qe){cn(pt(fe,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
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)?Sk(ie.taskSlug,nn.roleRecovery):null,Pt=nn!=null&&nn.roleRecovery&&nn.roleRecovery.status!=="failed"&&Xr!==Ps?bk(nn.roleRecovery):null,Jn=me&&me.taskSlug===(ie==null?void 0:ie.taskSlug)?me.state:null,Qr=!!(Jn&&Object.values(Jn.gates).some(V=>V.required));return x.jsxs(n1,{sidebar:x.jsx(H2,{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 fe=await Se.connectProject({repoPath:V});r(fe),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 fe=await Se.startHarnessBootstrap({taskSlug:ie.taskSlug,cols:120,rows:32,...V});o(fe.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 fe=await Se.restartHarnessBootstrap({taskSlug:ie.taskSlug,cols:120,rows:32,...V});o(fe.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 fe=await Se.updateAppPreferences({autoTaskHarnessReviewEnabled:V});en(fe)},"Update auto task harness review setting")},onRefreshGateway:()=>ke(async()=>{await yi()},"Refresh Gateway status"),onGatewayEnabledChange:V=>{ke(async()=>{const fe=await Se.updateGatewaySettings({enabled:V,...V&&n?{currentProjectId:n.repoRoot,currentTaskSlug:(ie==null?void 0:ie.taskSlug)??null}:{}});v(fe),V&&en(await Se.getAppPreferences())},"Update Gateway enabled setting")},onGatewaySettingsChange:V=>ke(async()=>{const fe=await Se.updateGatewaySettings(V);v(fe)},"Update Gateway settings"),onGatewayTranslationChange:V=>{ke(async()=>{const fe=await Se.updateGatewaySettings({translationEnabled:V});v(fe)},"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,fe)=>{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]:fe}});Q({taskSlug:ie.taskSlug,state:qe})},`Update ${V} Gate Review setting`)},onTranslationEnabledChange:V=>{an(V),ke(async()=>{const fe=await Se.updateAppPreferences({translationEnabled:V});en(fe)},"Update conversation translation setting")},onTranslationAutoSendChange:V=>{St(V),ke(async()=>{const fe=await Se.updateAppPreferences({translationAutoSendEnabled:V});en(fe)},"Update translation auto-send setting")},onTranslationTargetLanguageChange:V=>{Lt(V),ke(async()=>{const fe=await Se.updateAppPreferences({translationTargetLanguage:V});en(fe)},"Update translation target language")},onTranslationOutputModeChange:V=>{ye(V),ke(async()=>{const fe=await Se.updateAppPreferences({translationOutputMode:V});en(fe)},"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 fe=await Se.createTask(V);await vi(),W(fe.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 fe=await Se.updateOrchestrationState(ie.taskSlug,{mode:V?"auto":"manual"});N({taskSlug:ie.taskSlug,orchestration:fe})},"Update auto orchestration mode")},onThemeModeChange:V=>{pe(V),ke(async()=>{const fe=await Se.updateAppPreferences({themeMode:V});en(fe)},"Update theme setting")},pauseAlertSound:se,onPauseAlertSoundChange:V=>{we(V),V&&Vg(),ke(async()=>{const fe=await Se.updateAppPreferences({flowPauseAlerts:V});en(fe)},"Update pause alert sound setting")},roleRetryEnabled:je,onRoleRetryEnabledChange:V=>{He(V),ke(async()=>{const fe=await Se.updateAppPreferences({roleRetryEnabled:V});en(fe)},"Update CC retry setting")},permissionRequestMode:Pe,onPermissionRequestModeChange:V=>{xe(V),ke(async()=>{const fe=await Se.updateAppPreferences({permissionRequestMode:V});en(fe)},"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(fe=>fe+1)},"One-click start role sessions")},onMarkAllMessagesDone:V=>{ke(async()=>{const fe=await Se.markAllMessagesDone(V);z({taskSlug:V,messages:fe.messages}),await Ks(V)},"Mark all role messages done")},onDeleteMessageHistory:V=>{ke(async()=>{const fe=await Se.deleteMessageHistory(V);z({taskSlug:V,messages:fe.messages}),await Ks(V)},"Delete role message history")}}),children:[x.jsx(_2,{}),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(gk,{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(_k,{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,fe)=>{ke(async()=>{const qe=await Se.bindGatewayLarkApp({appId:V,appSecret:fe,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(uk,{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(r2,{open:Oe,taskSlug:(ie==null?void 0:ie.taskSlug)??null,targetLanguage:tt,onClose:()=>ft(!1)}),x.jsx(S1,{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(C1,{open:Qe,taskSlug:(ie==null?void 0:ie.taskSlug)??null,onClose:()=>Zt(!1)}),x.jsx(A1,{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(i1,{busy:Bn,state:T,onCancel:V=>{ke(async()=>{const fe=await Se.decideHarnessFeedback({action:"cancel",taskSlug:ie==null?void 0:ie.taskSlug,comment:V});E(fe)},"Cancel Harness feedback")},onApprove:V=>{ke(async()=>{if(!ie)throw new Error("Create or select a task before approving Harness feedback.");const fe=await Se.decideHarnessFeedback({action:"approve",taskSlug:ie.taskSlug,comment:V});E(fe),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 fe=await Se.decideHarnessFeedback({action:"comment",taskSlug:ie.taskSlug,comment:V});E(fe),await tn()},"Send Harness feedback comment")},onReject:V=>{ke(async()=>{const fe=await Se.decideHarnessFeedback({action:"reject",taskSlug:ie==null?void 0:ie.taskSlug,comment:V});E(fe)},"Reject Harness feedback")}})]})}function gk({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:wv(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 _k({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:wv(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 wv(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 vk(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 yk(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 Sk(n,r){return`${n}:${r.role}:${r.lastFailureAt}`}function bk(n){const r=xk(n.role),s=xv(n);return n.status==="retrying"?`CC 出错,正在重试 ${r}${s} · 第 ${n.attempt}/${n.maxAttempts} 次`:`CC 出错,重试中 ${r}${s} · 第 ${n.attempt}/${n.maxAttempts} 次 · ${Ek(n.nextRetryAt)}`}function Ck(n,r){const s=xv(n);return n.retryable===!1?`CC stopped for ${r}: ${wk(n)} cannot be fixed by retrying.`:`CC retry failed after ${n.maxAttempts} attempts for ${r}${s}.`}function xv(n){return!n.error||n.error==="unknown"?"":` · ${n.error}`}function wk(n){return n.error&&n.error!=="unknown"?n.error:"this error"}function xk(n){return n.split("-").filter(Boolean).map(r=>`${r.slice(0,1).toUpperCase()}${r.slice(1)}`).join(" ")}function Ek(n){if(!n)return"即将重试";const r=Date.parse(n)-Date.now();return!Number.isFinite(r)||r<=0?"即将重试":`${Math.ceil(r/6e4)} 分钟后`}async function Vg(){const n=Ev();return n?kv(n):!1}async function bo(){const n=Ev();if(!n||!await kv(n))return!1;try{const s=n.createGain(),l=n.currentTime+.025;return s.gain.setValueAtTime(.85,n.currentTime),s.connect(n.destination),Yg(n,s,{frequency:587.33,startAt:l,duration:.18,peakGain:.045}),Yg(n,s,{frequency:783.99,startAt:l+.11,duration:.28,peakGain:.055}),window.setTimeout(()=>{s.disconnect()},800),!0}catch{return!1}}function Ev(){const n=window.AudioContext??window.webkitAudioContext;if(!n)return null;try{return(!Hr||Hr.state==="closed")&&(Hr=new n),Hr}catch{return null}}function Wg(n){Hr=null,n&&n.state!=="closed"&&n.close().catch(()=>{})}async function kv(n){if(Kg(n))return!0;try{await n.resume();const r=Kg(n);return!r&&n===Hr&&Wg(n),r}catch{return n===Hr&&Wg(n),!1}}function Kg(n){return n.state==="running"}function Yg(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 Av=document.getElementById("root");if(!Av)throw new Error("Missing #root element.");U0.createRoot(Av).render(x.jsx(te.StrictMode,{children:x.jsx(mk,{})}));
@@ -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-DjF_GKuE.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-BL1E27kN.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-BM6nSKae.css">
9
9
  </head>
10
10
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-coding-master",
3
- "version": "0.5.5",
3
+ "version": "0.5.6",
4
4
  "description": "Local GUI session cockpit for Claude Code role sessions.",
5
5
  "type": "module",
6
6
  "files": [