hammoc 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/client/dist/assets/{index-D8ezrT4P.js → index-RJTIkL2R.js} +3 -3
- package/packages/client/dist/assets/{index-CFWfpySn.js → index-cwHQKX3r.js} +1 -1
- package/packages/client/dist/index.html +1 -1
- package/packages/client/dist/sw.js +1 -1
- package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
- package/packages/server/dist/controllers/sessionController.js +2 -1
- package/packages/server/dist/controllers/sessionController.js.map +1 -1
- package/packages/server/dist/handlers/websocket.d.ts +2 -0
- package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
- package/packages/server/dist/handlers/websocket.js +5 -0
- package/packages/server/dist/handlers/websocket.js.map +1 -1
- package/packages/server/dist/services/sessionService.d.ts.map +1 -1
- package/packages/server/dist/services/sessionService.js +23 -2
- package/packages/server/dist/services/sessionService.js.map +1 -1
- package/packages/shared/dist/types/history.d.ts +4 -0
- package/packages/shared/dist/types/history.d.ts.map +1 -1
|
@@ -853,7 +853,7 @@ Please change the parent <Route path="${x}"> to <Route path="${x==="/"?"*":`${x}
|
|
|
853
853
|
\${}
|
|
854
854
|
} else {
|
|
855
855
|
\${}
|
|
856
|
-
}`,{label:"if",detail:"/ else block",type:"keyword"}),Dt('import ${name} "${module}"\n${}',{label:"import",detail:"declaration",type:"keyword"})],l2=new Lg,s3=new Set(["SourceFile","Block","FunctionDecl","MethodDecl","FunctionLiteral","ForStatement","SwitchStatement","TypeSwitchStatement","IfStatement"]);function Ec(t,e){return(r,n)=>{e:for(let i=r.node.firstChild,s=0,a=null;;){for(;!i;){if(!s)break e;s--,i=a.nextSibling,a=a.parent}e&&i.name==e||i.name=="SpecList"?(s++,a=i,i=i.firstChild):(i.name=="DefName"&&n(i,t),i=i.nextSibling)}return!0}}const Upe={FunctionDecl:Ec("function"),VarDecl:Ec("var","VarSpec"),ConstDecl:Ec("constant","ConstSpec"),TypeDecl:Ec("type","TypeSpec"),ImportDecl:Ec("constant","ImportSpec"),Parameter:Ec("var"),__proto__:null};function a3(t,e){let r=l2.get(e);if(r)return r;let n=[],i=!0;function s(a,o){let l=t.sliceString(a.from,a.to);n.push({label:l,type:o})}return e.cursor(er.IncludeAnonymous).iterate(a=>{if(i)i=!1;else if(a.name){let o=Upe[a.name];if(o&&o(a,s)||s3.has(a.name))return!1}else if(a.to-a.from>8192){for(let o of a3(t,a.node))n.push(o);return!1}}),l2.set(e,n),n}const c2=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,o3=["String","LineComment","BlockComment","DefName","LabelName","FieldName",".","?."],Vpe=t=>{let e=gr(t.state).resolveInner(t.pos,-1);if(o3.indexOf(e.name)>-1)return null;let r=e.name=="VariableName"||e.to-e.from<20&&c2.test(t.state.sliceDoc(e.from,e.to));if(!r&&!t.explicit)return null;let n=[];for(let i=e;i;i=i.parent)s3.has(i.name)&&(n=n.concat(a3(t.state.doc,i)));return{options:n,from:r?e.from:t.pos,validFor:c2}},cy=Xi.define({name:"go",parser:zpe.configure({props:[fs.add({IfStatement:Cn({except:/^\s*({|else\b)/}),LabeledStatement:Fg,"SwitchBlock SelectBlock":t=>{let e=t.textAfter,r=/^\s*\}/.test(e),n=/^\s*(case|default)\b/.test(e);return t.baseIndent+(r||n?0:t.unit)},Block:Ua({closing:"}"}),BlockComment:()=>null,Statement:Cn({except:/^{/})}),Li.add({"Block SwitchBlock SelectBlock LiteralValue InterfaceType StructType SpecList":to,BlockComment(t){return{from:t.from+2,to:t.to-2}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case\b|default\b|\})$/}});let Ype=t=>({label:t,type:"keyword"});const Wpe="interface struct chan map package go return break continue goto fallthrough else defer range true false nil".split(" ").map(Ype);function Zpe(){let t=qpe.concat(Wpe);return new cs(cy,[cy.data.of({autocomplete:T1(o3,Hg(t))}),cy.data.of({autocomplete:Vpe})])}const Bpe={".ts":()=>Hu({typescript:!0}),".tsx":()=>Hu({typescript:!0,jsx:!0}),".js":()=>Hu(),".jsx":()=>Hu({jsx:!0}),".json":()=>Ode(),".md":()=>_he(),".html":()=>A4(),".css":()=>_4(),".py":()=>Wfe(),".go":()=>Zpe(),".rs":()=>fOe(),".java":()=>bOe(),".c":()=>oy(),".cpp":()=>oy(),".h":()=>oy(),".yaml":()=>a2(),".yml":()=>a2()};function l3(t){const e=t.lastIndexOf(".");if(e===-1)return null;const r=t.slice(e).toLowerCase(),n=Bpe[r];return n?n():null}function c3(t){return t.toLowerCase().endsWith(".md")}const Fpe=new Set([".png",".jpg",".jpeg",".gif",".svg",".webp",".bmp",".ico"]);function qo(t){const e=t.lastIndexOf(".");return e===-1?!1:Fpe.has(t.slice(e).toLowerCase())}const d2={openFile:null,content:"",originalContent:"",isDirty:!1,isLoading:!1,isSaving:!1,isTruncated:!1,isMarkdownPreview:!1,error:null,pendingNavigation:null,targetLine:null,recentFiles:{}},mn=Wn((t,e)=>({...d2,openFileInEditor:async(r,n,i)=>{const s=c3(n)&&Kt.getState().preferences.markdownDefaultMode==="preview";t({openFile:{projectSlug:r,path:n},isLoading:!0,error:null,isTruncated:!1,isMarkdownPreview:s,content:"",originalContent:"",isDirty:!1,targetLine:i??null});try{const a=await ri.readFile(r,n);if(a.isBinary){t({error:we.t("notification:file.binaryNotEditable"),isLoading:!1});return}const o=a.content??"";t({content:o,originalContent:o,isLoading:!1,isTruncated:a.isTruncated})}catch(a){t({error:a.message,isLoading:!1})}},saveFile:async()=>{const{openFile:r,content:n}=e();if(!r)return!1;t({isSaving:!0});try{return await ri.writeFile(r.projectSlug,r.path,n),t({originalContent:n,isDirty:!1,isSaving:!1}),!0}catch{return t({isSaving:!1}),!1}},requestFileNavigation:(r,n,i)=>{e().isDirty?t({pendingNavigation:{projectSlug:r,path:n,targetLine:i}}):e().openFileInEditor(r,n,i)},confirmPendingNavigation:()=>{const{pendingNavigation:r}=e();r&&(t({pendingNavigation:null}),e().openFileInEditor(r.projectSlug,r.path,r.targetLine))},cancelPendingNavigation:()=>{t({pendingNavigation:null})},closeEditor:()=>{const{recentFiles:r}=e();t({...d2,recentFiles:r})},setContent:r=>{t({content:r,isDirty:r!==e().originalContent})},resetError:()=>t({error:null}),toggleMarkdownPreview:()=>{t({isMarkdownPreview:!e().isMarkdownPreview})},addRecentFile:(r,n)=>{const s=(e().recentFiles[r]??[]).filter(o=>o!==n),a=[n,...s].slice(0,5);t({recentFiles:{...e().recentFiles,[r]:a}})}})),Gpe={stories:"document.stories",qa:"document.qa"};function u2(t,e){const r=Gpe[t];return r?e(r):t}const Op={brainstorming:"/BMad:agents:analyst","market-research":"/BMad:agents:analyst","competitor-analysis":"/BMad:agents:analyst",brief:"/BMad:agents:analyst",prd:"/BMad:agents:pm","front-end-spec":"/BMad:agents:ux-expert",architecture:"/BMad:agents:architect","ui-architecture":"/BMad:agents:architect"},Hpe=new Set(["brainstorming","brief"]),Kpe=new Set(["prd","architecture"]);function Jpe(t){const e=new Map;for(const s of t.supplementary??[])e.set(s.key,s);const r=["brainstorming","market-research","competitor-analysis","brief"],n=["front-end-spec","ui-architecture"],i=[];for(const s of r){const a=e.get(s);a&&i.push({key:a.key,label:a.label,exists:a.exists,path:a.path,optional:!0,agentCommand:Op[a.key],recommended:!t.prd.exists&&Hpe.has(a.key)})}i.push({key:"prd",label:"PRD",exists:t.prd.exists,path:t.prd.path,agentCommand:Op.prd,sharded:t.prd.sharded,shardedPath:t.prd.shardedPath,shardedFiles:t.prd.shardedFiles});for(const s of n){const a=e.get(s);a&&i.push({key:a.key,label:a.label,exists:a.exists,path:a.path,optional:!0,agentCommand:Op[a.key]})}return i.push({key:"architecture",label:"Architecture",exists:t.architecture.exists,path:t.architecture.path,agentCommand:Op.architecture,sharded:t.architecture.sharded,shardedPath:t.architecture.shardedPath,shardedFiles:t.architecture.shardedFiles}),i}function ek({entries:t,basePath:e,onOpenFile:r,expandedDocs:n,toggleDoc:i,keyPrefix:s}){return d.jsx("div",{className:"space-y-0.5",children:t.map(a=>{const o=`${s}/${a.name}`;if(a.isDir&&a.children){const l=n.has(o);return d.jsxs("div",{children:[d.jsxs("button",{onClick:()=>i(o),className:"text-xs text-gray-600 dark:text-gray-300 hover:underline cursor-pointer inline-flex items-center gap-1",children:[a.name,"/",d.jsxs("span",{className:"text-gray-500 dark:text-gray-400",children:[a.children.length,"개"]}),d.jsx(En,{className:`w-3 h-3 text-gray-500 dark:text-gray-400 transition-transform ${l?"rotate-180":""}`})]}),l&&d.jsx("div",{className:"mt-0.5 ml-4",children:d.jsx(ek,{entries:a.children,basePath:e?`${e}/${a.name}`:a.name,onOpenFile:r,expandedDocs:n,toggleDoc:i,keyPrefix:o})})]},a.name)}return d.jsx("button",{onClick:()=>r(e?`${e}/${a.name}`:a.name),className:"block text-xs text-gray-600 dark:text-gray-300 hover:underline cursor-pointer",children:a.name},a.name)})})}function eme({doc:t,isDocExpanded:e,toggleDoc:r,handleOpenDoc:n,handleCreateDoc:i,expandedDocs:s,t:a}){const o=t.sharded&&t.shardedFiles&&t.shardedFiles.length>0,l=Kpe.has(t.key);return d.jsxs("div",{children:[d.jsxs("div",{className:`flex items-center gap-2 py-1 px-2 -mx-2 rounded-md transition-colors ${l?"bg-gray-100/50 dark:bg-[#253040]/30":""}`,children:[t.exists?d.jsx(Xs,{className:`w-4 h-4 flex-shrink-0 ${t.optional?"text-green-400 dark:text-green-600":"text-green-600 dark:text-green-400"}`}):t.optional?d.jsx(rj,{className:"w-4 h-4 text-gray-400 dark:text-gray-500 flex-shrink-0"}):d.jsx(Ao,{className:"w-4 h-4 text-red-600 dark:text-red-400 flex-shrink-0"}),t.exists&&o?d.jsxs("button",{onClick:()=>r(t.key),className:"font-semibold text-gray-900 dark:text-white hover:underline cursor-pointer inline-flex items-center gap-1",children:[t.label,d.jsx(En,{className:`w-3 h-3 text-gray-500 dark:text-gray-400 transition-transform ${e?"rotate-180":""}`})]}):d.jsx("span",{className:t.exists?t.optional?"text-gray-700 dark:text-gray-200":"font-semibold text-gray-900 dark:text-white":t.optional?"text-gray-500 dark:text-gray-400":"font-semibold text-gray-900 dark:text-gray-100",children:t.label}),o&&d.jsx("span",{className:"text-xs px-1.5 py-0.5 bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 rounded",children:a("document.sharded")}),d.jsx("span",{className:"flex-1"}),!o&&t.exists&&d.jsx("button",{onClick:()=>n(t.path),className:"text-xs text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:underline cursor-pointer truncate max-w-[50%]",children:t.path}),!t.exists&&!t.optional&&d.jsx("span",{className:"text-xs px-2 py-0.5 bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300 rounded-full",children:a("document.writeRequired")}),!t.exists&&t.recommended&&d.jsx("span",{className:"text-xs px-2 py-0.5 bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300 rounded-full",children:a("document.writeRecommended")}),!t.exists&&t.agentCommand&&d.jsx("button",{onClick:()=>i(t.agentCommand),className:`p-0.5 rounded transition-colors cursor-pointer ${!t.optional||t.recommended?"bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400 hover:bg-blue-200 dark:hover:bg-blue-900/50":"bg-gray-100 dark:bg-[#253040]/50 text-gray-400 dark:text-gray-500 hover:bg-gray-200 dark:hover:bg-[#253040] hover:text-gray-500 dark:hover:text-gray-400"}`,title:a("document.writeGo"),children:d.jsx(Iee,{className:"w-3.5 h-3.5"})})]}),e&&o&&d.jsxs("div",{className:"mt-1 ml-6 space-y-1",children:[d.jsx("button",{onClick:()=>n(t.path),className:"block text-xs text-gray-600 dark:text-gray-300 hover:underline cursor-pointer",children:t.path}),d.jsx(ek,{entries:[{name:`${t.shardedPath}`,isDir:!0,children:t.shardedFiles}],basePath:"",onOpenFile:n,expandedDocs:s,toggleDoc:r,keyPrefix:t.key})]})]})}function tme({documents:t,auxiliaryDocuments:e,projectSlug:r}){const{t:n}=_e("common"),i=Tn(),s=mn(b=>b.requestFileNavigation),[a,o]=k.useState(new Set),l=b=>{o(y=>{const g=new Set(y);return g.has(b)?g.delete(b):g.add(b),g})},c=b=>{i(`/project/${r}/session/${sn()}?agent=${encodeURIComponent(b)}`)},h=b=>{s(r,b)},u=Jpe(t),O=u.filter(b=>!b.optional).length,p=u.filter(b=>!b.optional&&b.exists).length;return d.jsxs("div",{role:"region","aria-label":n("document.statusTitle"),className:"bg-gray-50 dark:bg-[#263240] rounded-xl border border-gray-200 dark:border-[#253040] p-5",children:[d.jsxs("div",{className:"flex items-center justify-between mb-4",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx(Ba,{className:"w-5 h-5 text-gray-600 dark:text-gray-300"}),d.jsx("h2",{className:"font-semibold text-gray-900 dark:text-white",children:n("document.statusTitle")})]}),O>0&&d.jsx("span",{className:"text-xs px-2 py-0.5 rounded-full bg-gray-100 dark:bg-[#253040] text-gray-500 dark:text-gray-300",children:n("document.requiredCount",{done:p,total:O})})]}),d.jsxs("div",{className:"space-y-1 text-sm",children:[u.map(b=>d.jsx(eme,{doc:b,isDocExpanded:a.has(b.key),toggleDoc:l,handleOpenDoc:h,handleCreateDoc:c,expandedDocs:a,t:n},b.key)),e.length>0&&d.jsxs("div",{className:"border-t border-gray-200 dark:border-[#253040] mt-2 pt-2 space-y-1",children:[d.jsx("p",{className:"text-[11px] uppercase tracking-wider font-medium text-gray-500 dark:text-gray-400 mb-1",children:n("document.deliverables")}),e.map(b=>{const y=b.files&&b.files.length>0,g=a.has(`aux-${b.type}`);return d.jsxs("div",{children:[d.jsxs("div",{className:"flex items-center gap-2 py-1 px-2 -mx-2 rounded-md",children:[d.jsx(As,{className:"w-4 h-4 text-gray-500 dark:text-gray-400 flex-shrink-0"}),y?d.jsxs("button",{onClick:()=>l(`aux-${b.type}`),className:"text-gray-700 dark:text-gray-200 hover:underline cursor-pointer inline-flex items-center gap-1",children:[u2(b.type,n),d.jsx(En,{className:`w-3 h-3 text-gray-500 dark:text-gray-400 transition-transform ${g?"rotate-180":""}`})]}):d.jsx("span",{className:"text-gray-700 dark:text-gray-200",children:u2(b.type,n)}),d.jsx("span",{className:"text-xs text-gray-500 dark:text-gray-400",children:n("document.count",{count:b.fileCount})})]}),g&&y&&d.jsx("div",{className:"mt-1 ml-6",children:d.jsx(ek,{entries:b.files,basePath:b.path,onOpenFile:h,expandedDocs:a,toggleDoc:l,keyPrefix:`aux-${b.type}`})})]},b.type)})]})]})]})}const rme={Done:"bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300",Draft:"bg-gray-100 dark:bg-[#253040] text-gray-600 dark:text-gray-200",Approved:"bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300","In Progress":"bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300",Blocked:"bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300"};function nme(t){return t>=100?"bg-green-500 dark:bg-green-400":t>=50?"bg-blue-500 dark:bg-blue-400":t>0?"bg-amber-500 dark:bg-amber-400":"bg-gray-300 dark:bg-gray-600"}function ime(t){return rme[t]??"bg-gray-100 dark:bg-[#253040] text-gray-600 dark:text-gray-200"}function sme({epics:t,projectSlug:e,storyBasePath:r}){const{t:n}=_e("common"),[i,s]=k.useState(new Set),a=mn(c=>c.requestFileNavigation),o=c=>{!e||!r||a(e,`${r}/${c}`)},l=c=>{s(h=>{const u=new Set(h);return u.has(c)?u.delete(c):u.add(c),u})};return d.jsxs("div",{role:"region","aria-label":n("epic.progressTitle"),className:"bg-gray-50 dark:bg-[#263240] rounded-xl border border-gray-200 dark:border-[#253040] p-5",children:[d.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[d.jsx(Hee,{className:"w-5 h-5 text-gray-600 dark:text-gray-300"}),d.jsx("h2",{className:"font-semibold text-gray-900 dark:text-white",children:n("epic.progressTitle")})]}),d.jsxs("div",{className:"space-y-3 text-sm",children:[t.map(c=>{const h=c.stories.filter(x=>x.status==="Done").length,u=c.stories.length,O=c.plannedStories??u,p=Math.max(O,u),b=p>0?h/p*100:0,y=i.has(c.number),g=u>0||O>0;return d.jsxs("div",{className:"group",children:[g?d.jsxs("div",{onClick:()=>l(c.number),className:"flex items-center justify-between hover:bg-gray-100 dark:hover:bg-[#253040]/50 rounded-md transition-colors cursor-pointer px-2 py-1.5 -mx-2",children:[d.jsxs("span",{className:"text-gray-700 dark:text-gray-200 truncate mr-2",children:[c.number,". ",c.name]}),d.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[d.jsxs("span",{className:`text-xs font-medium ${b>=100?"text-green-600 dark:text-green-400":"text-gray-500 dark:text-gray-300"}`,children:[h,"/",O]}),d.jsx(En,{className:`w-4 h-4 text-gray-500 dark:text-gray-400 transition-transform ${y?"rotate-180":""}`})]})]}):d.jsxs("div",{className:"flex items-center justify-between px-2 py-1.5 -mx-2",children:[d.jsxs("span",{className:"text-gray-700 dark:text-gray-200 truncate mr-2",children:[c.number,". ",c.name]}),d.jsx("span",{className:"text-xs text-gray-500 dark:text-gray-400",children:n("epic.storiesUndefined")})]}),p>0&&d.jsx("div",{className:"h-2 bg-gray-200 dark:bg-[#253040] rounded-full overflow-hidden mt-1 mx-0",children:d.jsx("div",{className:`h-full rounded-full transition-all ${nme(b)}`,style:{width:`${b}%`}})}),y&&g&&d.jsxs("div",{className:"mt-2 ml-4 space-y-1",children:[u>0?c.stories.map(x=>{var Q;const v=(Q=x.file.match(/^(\d+\.\d+)/))==null?void 0:Q[1],w=x.title?`${v}. ${x.title}`:x.file;return d.jsxs("div",{className:"flex items-center justify-between gap-2",children:[d.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[d.jsx("span",{className:"text-xs text-gray-600 dark:text-gray-300 truncate",children:w}),e&&r&&d.jsx("button",{onClick:()=>o(x.file),className:"flex-shrink-0 text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 cursor-pointer",title:x.file,children:d.jsx(Ba,{className:"w-3.5 h-3.5"})})]}),d.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${ime(x.status)}`,children:x.status})]},x.file)}):d.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:n("epic.plannedStoriesNoFiles",{count:O})}),u>0&&O>u&&d.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 mt-1",children:n("epic.unwrittenStories",{count:O-u})})]})]},c.number)}),t.length===0&&d.jsx("p",{className:"text-gray-500 dark:text-gray-300",children:n("epic.noEpics")})]})]})}function ame(t,e){return t.find(r=>r.key===e)}function Ku(t,e){var r;return((r=ame(t,e))==null?void 0:r.exists)??!1}function t0(t){return t.epics.flatMap(e=>e.stories)}function dy(t,...e){for(const r of t.epics){const n=r.stories.find(i=>e.includes(i.status));if(n)return n}}function d3(t,e){return t.epics.reduce((r,n)=>r+n.stories.filter(i=>i.status===e).length,0)}function fl(t){var e;return((e=t.match(/^(\d+\.\d+)/))==null?void 0:e[1])??t}function ome(t){const e=t0(t);if(e.length===0){const i=t.epics[0];return i?`${i.number}.1`:"1.1"}let r=0,n=0;for(const i of e){const s=i.file.match(/^(\d+)\.(\d+)/);if(s){const a=parseInt(s[1],10),o=parseInt(s[2],10);(a>r||a===r&&o>n)&&(r=a,n=o)}}return`${r}.${n+1}`}function lme(t){if(!t.documents.prd.exists)return{phase:"pre-prd",label:we.t("common:phase.prePrd")};if(!t.documents.architecture.exists)return{phase:"pre-architecture",label:we.t("common:phase.preArchitecture")};const e=t0(t),r=t.epics.reduce((i,s)=>i+(s.plannedStories??s.stories.length),0),n=e.filter(i=>i.status!=="Done");return e.length>0&&n.length===0&&r<=e.length?{phase:"completed",label:we.t("common:phase.completed")}:{phase:"implementation",label:we.t("common:phase.implementation")}}function cme(t){const e=t.documents.supplementary,r=[];return r.push({id:"create-prd",title:we.t("common:rec.createPrd"),description:we.t("common:rec.createPrdDesc"),agentCommand:"/BMad:agents:pm",taskCommand:"*create-prd",variant:"primary",iconKey:"file-text"}),Ku(e,"brainstorming")||r.push({id:"brainstorming",title:we.t("common:rec.brainstorming"),description:we.t("common:rec.brainstormingDesc"),agentCommand:"/BMad:agents:analyst",taskCommand:"*brainstorm",variant:"secondary",iconKey:"lightbulb"}),Ku(e,"market-research")||r.push({id:"market-research",title:we.t("common:rec.marketResearch"),description:we.t("common:rec.marketResearchDesc"),agentCommand:"/BMad:agents:analyst",taskCommand:"*perform-market-research",variant:"secondary",iconKey:"search"}),Ku(e,"competitor-analysis")||r.push({id:"competitor-analysis",title:we.t("common:rec.competitorAnalysis"),description:we.t("common:rec.competitorAnalysisDesc"),agentCommand:"/BMad:agents:analyst",taskCommand:"*create-competitor-analysis",variant:"secondary",iconKey:"users"}),Ku(e,"brief")||r.push({id:"brief",title:we.t("common:rec.projectBrief"),description:we.t("common:rec.projectBriefDesc"),agentCommand:"/BMad:agents:analyst",taskCommand:"*create-project-brief",variant:"secondary",iconKey:"clipboard"}),r}function dme(t){const e=t.documents.supplementary,r=[],n=Ku(e,"front-end-spec");return r.push({id:"create-backend-arch",title:we.t("common:rec.backendArch"),description:we.t("common:rec.backendArchDesc"),agentCommand:"/BMad:agents:architect",taskCommand:"*create-backend-architecture",variant:"primary",iconKey:"blocks"}),n&&r.push({id:"create-frontend-arch",title:we.t("common:rec.feArch"),description:we.t("common:rec.feArchDesc"),agentCommand:"/BMad:agents:architect",taskCommand:"*create-front-end-architecture",variant:"primary",iconKey:"layout"}),r.push({id:"create-fullstack-arch",title:we.t("common:rec.fullstackArch"),description:we.t("common:rec.fullstackArchDesc"),agentCommand:"/BMad:agents:architect",taskCommand:"*create-full-stack-architecture",variant:"primary",iconKey:"blocks"}),n||r.push({id:"fe-spec",title:we.t("common:rec.feSpec"),description:we.t("common:rec.feSpecDesc"),agentCommand:"/BMad:agents:ux-expert",taskCommand:"*create-front-end-spec",variant:"secondary",iconKey:"palette"}),r}function pp(t,...e){const r=["Review","Ready for Review","Ready for Done"];for(const n of t.epics){const i=n.stories.find(s=>r.includes(s.status)&&e.includes(s.gateResult));if(i)return i}}function ume(t){const e=[],r=pp(t,"PASS","WAIVED"),n=pp(t,"FIXED"),i=pp(t,"FAIL","CONCERNS"),s=pp(t,void 0),a=dy(t,"In Progress","InProgress"),o=dy(t,"Approved"),l=dy(t,"Draft"),c=t0(t),h=t.epics.reduce((y,g)=>y+(g.plannedStories??g.stories.length),0),u=d3(t,"Done"),O=c.filter(y=>y.status!=="Done");if(r){const y=fl(r.file),g=r.title?`${y}. ${r.title}`:r.file;e.push({id:"mark-done",title:we.t("common:rec.markDone"),description:we.t("common:rec.markDoneDesc"),agentCommand:"/BMad:agents:dev",taskCommand:`Update story ${y} status to Done. The QA gate has passed.`,variant:"primary",iconKey:"check-circle",storyFile:r.file}),e.push({id:"request-qa-review",title:we.t("common:rec.requestQAReview"),description:g,agentCommand:"/BMad:agents:qa",taskCommand:`*review ${y}`,variant:"secondary",iconKey:"rotate-ccw",storyFile:r.file})}if(n){const y=fl(n.file),g=n.title?`${y}. ${n.title}`:n.file,x=e.length>0;e.push({id:"review-fixed",title:we.t("common:rec.qaReview"),description:we.t("common:rec.qaReviewDesc",{label:g}),agentCommand:"/BMad:agents:qa",taskCommand:`*review ${y}`,variant:x?"secondary":"primary",iconKey:"check-circle",storyFile:n.file})}if(i){const y=fl(i.file),g=i.title?`${y}. ${i.title}`:i.file,x=e.length>0;e.push({id:"review-apply-fixes",title:we.t("common:rec.applyQaFixes"),description:g,agentCommand:"/BMad:agents:dev",taskCommand:`*review-qa ${y}
|
|
856
|
+
}`,{label:"if",detail:"/ else block",type:"keyword"}),Dt('import ${name} "${module}"\n${}',{label:"import",detail:"declaration",type:"keyword"})],l2=new Lg,s3=new Set(["SourceFile","Block","FunctionDecl","MethodDecl","FunctionLiteral","ForStatement","SwitchStatement","TypeSwitchStatement","IfStatement"]);function Ec(t,e){return(r,n)=>{e:for(let i=r.node.firstChild,s=0,a=null;;){for(;!i;){if(!s)break e;s--,i=a.nextSibling,a=a.parent}e&&i.name==e||i.name=="SpecList"?(s++,a=i,i=i.firstChild):(i.name=="DefName"&&n(i,t),i=i.nextSibling)}return!0}}const Upe={FunctionDecl:Ec("function"),VarDecl:Ec("var","VarSpec"),ConstDecl:Ec("constant","ConstSpec"),TypeDecl:Ec("type","TypeSpec"),ImportDecl:Ec("constant","ImportSpec"),Parameter:Ec("var"),__proto__:null};function a3(t,e){let r=l2.get(e);if(r)return r;let n=[],i=!0;function s(a,o){let l=t.sliceString(a.from,a.to);n.push({label:l,type:o})}return e.cursor(er.IncludeAnonymous).iterate(a=>{if(i)i=!1;else if(a.name){let o=Upe[a.name];if(o&&o(a,s)||s3.has(a.name))return!1}else if(a.to-a.from>8192){for(let o of a3(t,a.node))n.push(o);return!1}}),l2.set(e,n),n}const c2=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,o3=["String","LineComment","BlockComment","DefName","LabelName","FieldName",".","?."],Vpe=t=>{let e=gr(t.state).resolveInner(t.pos,-1);if(o3.indexOf(e.name)>-1)return null;let r=e.name=="VariableName"||e.to-e.from<20&&c2.test(t.state.sliceDoc(e.from,e.to));if(!r&&!t.explicit)return null;let n=[];for(let i=e;i;i=i.parent)s3.has(i.name)&&(n=n.concat(a3(t.state.doc,i)));return{options:n,from:r?e.from:t.pos,validFor:c2}},cy=Xi.define({name:"go",parser:zpe.configure({props:[fs.add({IfStatement:Cn({except:/^\s*({|else\b)/}),LabeledStatement:Fg,"SwitchBlock SelectBlock":t=>{let e=t.textAfter,r=/^\s*\}/.test(e),n=/^\s*(case|default)\b/.test(e);return t.baseIndent+(r||n?0:t.unit)},Block:Ua({closing:"}"}),BlockComment:()=>null,Statement:Cn({except:/^{/})}),Li.add({"Block SwitchBlock SelectBlock LiteralValue InterfaceType StructType SpecList":to,BlockComment(t){return{from:t.from+2,to:t.to-2}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case\b|default\b|\})$/}});let Ype=t=>({label:t,type:"keyword"});const Wpe="interface struct chan map package go return break continue goto fallthrough else defer range true false nil".split(" ").map(Ype);function Zpe(){let t=qpe.concat(Wpe);return new cs(cy,[cy.data.of({autocomplete:T1(o3,Hg(t))}),cy.data.of({autocomplete:Vpe})])}const Bpe={".ts":()=>Hu({typescript:!0}),".tsx":()=>Hu({typescript:!0,jsx:!0}),".js":()=>Hu(),".jsx":()=>Hu({jsx:!0}),".json":()=>Ode(),".md":()=>_he(),".html":()=>A4(),".css":()=>_4(),".py":()=>Wfe(),".go":()=>Zpe(),".rs":()=>fOe(),".java":()=>bOe(),".c":()=>oy(),".cpp":()=>oy(),".h":()=>oy(),".yaml":()=>a2(),".yml":()=>a2()};function l3(t){const e=t.lastIndexOf(".");if(e===-1)return null;const r=t.slice(e).toLowerCase(),n=Bpe[r];return n?n():null}function c3(t){return t.toLowerCase().endsWith(".md")}const Fpe=new Set([".png",".jpg",".jpeg",".gif",".svg",".webp",".bmp",".ico"]);function qo(t){const e=t.lastIndexOf(".");return e===-1?!1:Fpe.has(t.slice(e).toLowerCase())}const d2={openFile:null,content:"",originalContent:"",isDirty:!1,isLoading:!1,isSaving:!1,isTruncated:!1,isMarkdownPreview:!1,error:null,pendingNavigation:null,targetLine:null,recentFiles:{}},mn=Wn((t,e)=>({...d2,openFileInEditor:async(r,n,i)=>{const s=c3(n)&&Kt.getState().preferences.markdownDefaultMode==="preview";t({openFile:{projectSlug:r,path:n},isLoading:!0,error:null,isTruncated:!1,isMarkdownPreview:s,content:"",originalContent:"",isDirty:!1,targetLine:i??null});try{const a=await ri.readFile(r,n);if(a.isBinary){t({error:we.t("notification:file.binaryNotEditable"),isLoading:!1});return}const o=a.content??"";t({content:o,originalContent:o,isLoading:!1,isTruncated:a.isTruncated})}catch(a){t({error:a.message,isLoading:!1})}},saveFile:async()=>{const{openFile:r,content:n}=e();if(!r)return!1;t({isSaving:!0});try{return await ri.writeFile(r.projectSlug,r.path,n),t({originalContent:n,isDirty:!1,isSaving:!1}),!0}catch{return t({isSaving:!1}),!1}},requestFileNavigation:(r,n,i)=>{e().isDirty?t({pendingNavigation:{projectSlug:r,path:n,targetLine:i}}):e().openFileInEditor(r,n,i)},confirmPendingNavigation:()=>{const{pendingNavigation:r}=e();r&&(t({pendingNavigation:null}),e().openFileInEditor(r.projectSlug,r.path,r.targetLine))},cancelPendingNavigation:()=>{t({pendingNavigation:null})},closeEditor:()=>{const{recentFiles:r}=e();t({...d2,recentFiles:r})},setContent:r=>{t({content:r,isDirty:r!==e().originalContent})},resetError:()=>t({error:null}),toggleMarkdownPreview:()=>{t({isMarkdownPreview:!e().isMarkdownPreview})},addRecentFile:(r,n)=>{const s=(e().recentFiles[r]??[]).filter(o=>o!==n),a=[n,...s].slice(0,5);t({recentFiles:{...e().recentFiles,[r]:a}})}})),Gpe={stories:"document.stories",qa:"document.qa"};function u2(t,e){const r=Gpe[t];return r?e(r):t}const Op={brainstorming:"/BMad:agents:analyst","market-research":"/BMad:agents:analyst","competitor-analysis":"/BMad:agents:analyst",brief:"/BMad:agents:analyst",prd:"/BMad:agents:pm","front-end-spec":"/BMad:agents:ux-expert",architecture:"/BMad:agents:architect","ui-architecture":"/BMad:agents:architect"},Hpe=new Set(["brainstorming","brief"]),Kpe=new Set(["prd","architecture"]);function Jpe(t){const e=new Map;for(const s of t.supplementary??[])e.set(s.key,s);const r=["brainstorming","market-research","competitor-analysis","brief"],n=["front-end-spec","ui-architecture"],i=[];for(const s of r){const a=e.get(s);a&&i.push({key:a.key,label:a.label,exists:a.exists,path:a.path,optional:!0,agentCommand:Op[a.key],recommended:!t.prd.exists&&Hpe.has(a.key)})}i.push({key:"prd",label:"PRD",exists:t.prd.exists,path:t.prd.path,agentCommand:Op.prd,sharded:t.prd.sharded,shardedPath:t.prd.shardedPath,shardedFiles:t.prd.shardedFiles});for(const s of n){const a=e.get(s);a&&i.push({key:a.key,label:a.label,exists:a.exists,path:a.path,optional:!0,agentCommand:Op[a.key]})}return i.push({key:"architecture",label:"Architecture",exists:t.architecture.exists,path:t.architecture.path,agentCommand:Op.architecture,sharded:t.architecture.sharded,shardedPath:t.architecture.shardedPath,shardedFiles:t.architecture.shardedFiles}),i}function ek({entries:t,basePath:e,onOpenFile:r,expandedDocs:n,toggleDoc:i,keyPrefix:s}){return d.jsx("div",{className:"space-y-0.5",children:t.map(a=>{const o=`${s}/${a.name}`;if(a.isDir&&a.children){const l=n.has(o);return d.jsxs("div",{children:[d.jsxs("button",{onClick:()=>i(o),className:"text-xs text-gray-600 dark:text-gray-300 hover:underline cursor-pointer inline-flex items-center gap-1",children:[a.name,"/",d.jsxs("span",{className:"text-gray-500 dark:text-gray-400",children:[a.children.length,"개"]}),d.jsx(En,{className:`w-3 h-3 text-gray-500 dark:text-gray-400 transition-transform ${l?"rotate-180":""}`})]}),l&&d.jsx("div",{className:"mt-0.5 ml-4",children:d.jsx(ek,{entries:a.children,basePath:e?`${e}/${a.name}`:a.name,onOpenFile:r,expandedDocs:n,toggleDoc:i,keyPrefix:o})})]},a.name)}return d.jsx("button",{onClick:()=>r(e?`${e}/${a.name}`:a.name),className:"block text-xs text-gray-600 dark:text-gray-300 hover:underline cursor-pointer",children:a.name},a.name)})})}function eme({doc:t,isDocExpanded:e,toggleDoc:r,handleOpenDoc:n,handleCreateDoc:i,expandedDocs:s,t:a}){const o=t.sharded&&t.shardedFiles&&t.shardedFiles.length>0,l=Kpe.has(t.key);return d.jsxs("div",{children:[d.jsxs("div",{className:`flex items-center gap-2 py-1 px-2 -mx-2 rounded-md transition-colors ${l?"bg-gray-100/50 dark:bg-[#253040]/30":""}`,children:[t.exists?d.jsx(Xs,{className:`w-4 h-4 flex-shrink-0 ${t.optional?"text-green-400 dark:text-green-600":"text-green-600 dark:text-green-400"}`}):t.optional?d.jsx(rj,{className:"w-4 h-4 text-gray-400 dark:text-gray-500 flex-shrink-0"}):d.jsx(Ao,{className:"w-4 h-4 text-red-600 dark:text-red-400 flex-shrink-0"}),t.exists&&o?d.jsxs("button",{onClick:()=>r(t.key),className:"font-semibold text-gray-900 dark:text-white hover:underline cursor-pointer inline-flex items-center gap-1",children:[t.label,d.jsx(En,{className:`w-3 h-3 text-gray-500 dark:text-gray-400 transition-transform ${e?"rotate-180":""}`})]}):d.jsx("span",{className:t.exists?t.optional?"text-gray-700 dark:text-gray-200":"font-semibold text-gray-900 dark:text-white":t.optional?"text-gray-500 dark:text-gray-400":"font-semibold text-gray-900 dark:text-gray-100",children:t.label}),o&&d.jsx("span",{className:"text-xs px-1.5 py-0.5 bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 rounded",children:a("document.sharded")}),d.jsx("span",{className:"flex-1"}),!o&&t.exists&&d.jsx("button",{onClick:()=>n(t.path),className:"text-xs text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:underline cursor-pointer truncate max-w-[50%]",children:t.path}),!t.exists&&!t.optional&&d.jsx("span",{className:"text-xs px-2 py-0.5 bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300 rounded-full",children:a("document.writeRequired")}),!t.exists&&t.recommended&&d.jsx("span",{className:"text-xs px-2 py-0.5 bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300 rounded-full",children:a("document.writeRecommended")}),!t.exists&&t.agentCommand&&d.jsx("button",{onClick:()=>i(t.agentCommand),className:`p-0.5 rounded transition-colors cursor-pointer ${!t.optional||t.recommended?"bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400 hover:bg-blue-200 dark:hover:bg-blue-900/50":"bg-gray-100 dark:bg-[#253040]/50 text-gray-400 dark:text-gray-500 hover:bg-gray-200 dark:hover:bg-[#253040] hover:text-gray-500 dark:hover:text-gray-400"}`,title:a("document.writeGo"),children:d.jsx(Iee,{className:"w-3.5 h-3.5"})})]}),e&&o&&d.jsxs("div",{className:"mt-1 ml-6 space-y-1",children:[d.jsx("button",{onClick:()=>n(t.path),className:"block text-xs text-gray-600 dark:text-gray-300 hover:underline cursor-pointer",children:t.path}),d.jsx(ek,{entries:[{name:`${t.shardedPath}`,isDir:!0,children:t.shardedFiles}],basePath:"",onOpenFile:n,expandedDocs:s,toggleDoc:r,keyPrefix:t.key})]})]})}function tme({documents:t,auxiliaryDocuments:e,projectSlug:r}){const{t:n}=_e("common"),i=Tn(),s=mn(b=>b.requestFileNavigation),[a,o]=k.useState(new Set),l=b=>{o(y=>{const g=new Set(y);return g.has(b)?g.delete(b):g.add(b),g})},c=b=>{i(`/project/${r}/session/${sn()}?agent=${encodeURIComponent(b)}`)},h=b=>{s(r,b)},u=Jpe(t),O=u.filter(b=>!b.optional).length,p=u.filter(b=>!b.optional&&b.exists).length;return d.jsxs("div",{role:"region","aria-label":n("document.statusTitle"),className:"bg-gray-50 dark:bg-[#263240] rounded-xl border border-gray-200 dark:border-[#253040] p-5",children:[d.jsxs("div",{className:"flex items-center justify-between mb-4",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx(Ba,{className:"w-5 h-5 text-gray-600 dark:text-gray-300"}),d.jsx("h2",{className:"font-semibold text-gray-900 dark:text-white",children:n("document.statusTitle")})]}),O>0&&d.jsx("span",{className:"text-xs px-2 py-0.5 rounded-full bg-gray-100 dark:bg-[#253040] text-gray-500 dark:text-gray-300",children:n("document.requiredCount",{done:p,total:O})})]}),d.jsxs("div",{className:"space-y-1 text-sm",children:[u.map(b=>d.jsx(eme,{doc:b,isDocExpanded:a.has(b.key),toggleDoc:l,handleOpenDoc:h,handleCreateDoc:c,expandedDocs:a,t:n},b.key)),e.length>0&&d.jsxs("div",{className:"border-t border-gray-200 dark:border-[#253040] mt-2 pt-2 space-y-1",children:[d.jsx("p",{className:"text-[11px] uppercase tracking-wider font-medium text-gray-500 dark:text-gray-400 mb-1",children:n("document.deliverables")}),e.map(b=>{const y=b.files&&b.files.length>0,g=a.has(`aux-${b.type}`);return d.jsxs("div",{children:[d.jsxs("div",{className:"flex items-center gap-2 py-1 px-2 -mx-2 rounded-md",children:[d.jsx(As,{className:"w-4 h-4 text-gray-500 dark:text-gray-400 flex-shrink-0"}),y?d.jsxs("button",{onClick:()=>l(`aux-${b.type}`),className:"text-gray-700 dark:text-gray-200 hover:underline cursor-pointer inline-flex items-center gap-1",children:[u2(b.type,n),d.jsx(En,{className:`w-3 h-3 text-gray-500 dark:text-gray-400 transition-transform ${g?"rotate-180":""}`})]}):d.jsx("span",{className:"text-gray-700 dark:text-gray-200",children:u2(b.type,n)}),d.jsx("span",{className:"text-xs text-gray-500 dark:text-gray-400",children:n("document.count",{count:b.fileCount})})]}),g&&y&&d.jsx("div",{className:"mt-1 ml-6",children:d.jsx(ek,{entries:b.files,basePath:b.path,onOpenFile:h,expandedDocs:a,toggleDoc:l,keyPrefix:`aux-${b.type}`})})]},b.type)})]})]})]})}const rme={Done:"bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300",Draft:"bg-gray-100 dark:bg-[#253040] text-gray-600 dark:text-gray-200",Approved:"bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300","In Progress":"bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300",Blocked:"bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300"};function nme(t){return t>=100?"bg-green-500 dark:bg-green-400":t>=50?"bg-blue-500 dark:bg-blue-400":t>0?"bg-amber-500 dark:bg-amber-400":"bg-gray-300 dark:bg-gray-600"}function ime(t){return rme[t]??"bg-gray-100 dark:bg-[#253040] text-gray-600 dark:text-gray-200"}function sme({epics:t,projectSlug:e,storyBasePath:r}){const{t:n}=_e("common"),[i,s]=k.useState(new Set),a=mn(c=>c.requestFileNavigation),o=c=>{!e||!r||a(e,`${r}/${c}`)},l=c=>{s(h=>{const u=new Set(h);return u.has(c)?u.delete(c):u.add(c),u})};return d.jsxs("div",{role:"region","aria-label":n("epic.progressTitle"),className:"bg-gray-50 dark:bg-[#263240] rounded-xl border border-gray-200 dark:border-[#253040] p-5",children:[d.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[d.jsx(Hee,{className:"w-5 h-5 text-gray-600 dark:text-gray-300"}),d.jsx("h2",{className:"font-semibold text-gray-900 dark:text-white",children:n("epic.progressTitle")})]}),d.jsxs("div",{className:"space-y-3 text-sm",children:[t.map(c=>{const h=c.stories.filter(x=>x.status==="Done").length,u=c.stories.length,O=c.plannedStories??u,p=Math.max(O,u),b=p>0?h/p*100:0,y=i.has(c.number),g=u>0||O>0;return d.jsxs("div",{className:"group",children:[g?d.jsxs("div",{onClick:()=>l(c.number),className:"flex items-center justify-between hover:bg-gray-100 dark:hover:bg-[#253040]/50 rounded-md transition-colors cursor-pointer px-2 py-1.5 -mx-2",children:[d.jsxs("span",{className:"text-gray-700 dark:text-gray-200 truncate mr-2",children:[c.number,". ",c.name]}),d.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[d.jsxs("span",{className:`text-xs font-medium ${b>=100?"text-green-600 dark:text-green-400":"text-gray-500 dark:text-gray-300"}`,children:[h,"/",O]}),d.jsx(En,{className:`w-4 h-4 text-gray-500 dark:text-gray-400 transition-transform ${y?"rotate-180":""}`})]})]}):d.jsxs("div",{className:"flex items-center justify-between px-2 py-1.5 -mx-2",children:[d.jsxs("span",{className:"text-gray-700 dark:text-gray-200 truncate mr-2",children:[c.number,". ",c.name]}),d.jsx("span",{className:"text-xs text-gray-500 dark:text-gray-400",children:n("epic.storiesUndefined")})]}),p>0&&d.jsx("div",{className:"h-2 bg-gray-200 dark:bg-[#253040] rounded-full overflow-hidden mt-1 mx-0",children:d.jsx("div",{className:`h-full rounded-full transition-all ${nme(b)}`,style:{width:`${b}%`}})}),y&&g&&d.jsxs("div",{className:"mt-2 ml-4 space-y-1",children:[u>0?c.stories.map(x=>{var Q;const v=(Q=x.file.match(/^(\d+\.\d+)/))==null?void 0:Q[1],w=x.title?`${v}. ${x.title}`:x.file;return d.jsxs("div",{className:"flex items-center justify-between gap-2",children:[d.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[d.jsx("span",{className:"text-xs text-gray-600 dark:text-gray-300 truncate",children:w}),e&&r&&d.jsx("button",{onClick:()=>o(x.file),className:"flex-shrink-0 text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 cursor-pointer",title:x.file,children:d.jsx(Ba,{className:"w-3.5 h-3.5"})})]}),d.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${ime(x.status)}`,children:x.status})]},x.file)}):d.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:n("epic.plannedStoriesNoFiles",{count:O})}),u>0&&O>u&&d.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 mt-1",children:n("epic.unwrittenStories",{count:O-u})})]})]},c.number)}),t.length===0&&d.jsx("p",{className:"text-gray-500 dark:text-gray-300",children:n("epic.noEpics")})]})]})}function ame(t,e){return t.find(r=>r.key===e)}function Ku(t,e){var r;return((r=ame(t,e))==null?void 0:r.exists)??!1}function t0(t){return t.epics.flatMap(e=>e.stories)}function dy(t,...e){for(const r of t.epics){const n=r.stories.find(i=>e.includes(i.status));if(n)return n}}function d3(t,e){return t.epics.reduce((r,n)=>r+n.stories.filter(i=>i.status===e).length,0)}function fl(t){var e;return((e=t.match(/^(\d+\.\d+)/))==null?void 0:e[1])??t}function ome(t){const e=t0(t);if(e.length===0){const i=t.epics[0];return i?`${i.number}.1`:"1.1"}let r=0,n=0;for(const i of e){const s=i.file.match(/^(\d+)\.(\d+)/);if(s){const a=parseInt(s[1],10),o=parseInt(s[2],10);(a>r||a===r&&o>n)&&(r=a,n=o)}}return`${r}.${n+1}`}function lme(t){if(!t.documents.prd.exists)return{phase:"pre-prd",label:we.t("common:phase.prePrd")};if(!t.documents.architecture.exists)return{phase:"pre-architecture",label:we.t("common:phase.preArchitecture")};const e=t0(t),r=t.epics.reduce((i,s)=>i+(s.plannedStories??s.stories.length),0),n=e.filter(i=>i.status!=="Done");return e.length>0&&n.length===0&&r<=e.length?{phase:"completed",label:we.t("common:phase.completed")}:{phase:"implementation",label:we.t("common:phase.implementation")}}function cme(t){const e=t.documents.supplementary,r=[],n=Ku(e,"brainstorming"),i=Ku(e,"brief"),s=i?"primary":"secondary";return n||r.push({id:"brainstorming",title:we.t("common:rec.brainstorming"),description:we.t("common:rec.brainstormingDesc"),agentCommand:"/BMad:agents:analyst",taskCommand:"*brainstorm",variant:"primary",iconKey:"lightbulb"}),i||r.push({id:"brief",title:we.t("common:rec.projectBrief"),description:we.t("common:rec.projectBriefDesc"),agentCommand:"/BMad:agents:analyst",taskCommand:"*create-project-brief",variant:"primary",iconKey:"clipboard"}),r.push({id:"create-prd",title:we.t("common:rec.createPrd"),description:we.t("common:rec.createPrdDesc"),agentCommand:"/BMad:agents:pm",taskCommand:"*create-prd",variant:s,iconKey:"file-text"}),Ku(e,"market-research")||r.push({id:"market-research",title:we.t("common:rec.marketResearch"),description:we.t("common:rec.marketResearchDesc"),agentCommand:"/BMad:agents:analyst",taskCommand:"*perform-market-research",variant:"secondary",iconKey:"search"}),Ku(e,"competitor-analysis")||r.push({id:"competitor-analysis",title:we.t("common:rec.competitorAnalysis"),description:we.t("common:rec.competitorAnalysisDesc"),agentCommand:"/BMad:agents:analyst",taskCommand:"*create-competitor-analysis",variant:"secondary",iconKey:"users"}),r}function dme(t){const e=t.documents.supplementary,r=[],n=Ku(e,"front-end-spec");return r.push({id:"create-backend-arch",title:we.t("common:rec.backendArch"),description:we.t("common:rec.backendArchDesc"),agentCommand:"/BMad:agents:architect",taskCommand:"*create-backend-architecture",variant:"primary",iconKey:"blocks"}),n&&r.push({id:"create-frontend-arch",title:we.t("common:rec.feArch"),description:we.t("common:rec.feArchDesc"),agentCommand:"/BMad:agents:architect",taskCommand:"*create-front-end-architecture",variant:"primary",iconKey:"layout"}),r.push({id:"create-fullstack-arch",title:we.t("common:rec.fullstackArch"),description:we.t("common:rec.fullstackArchDesc"),agentCommand:"/BMad:agents:architect",taskCommand:"*create-full-stack-architecture",variant:"primary",iconKey:"blocks"}),n||r.push({id:"fe-spec",title:we.t("common:rec.feSpec"),description:we.t("common:rec.feSpecDesc"),agentCommand:"/BMad:agents:ux-expert",taskCommand:"*create-front-end-spec",variant:"secondary",iconKey:"palette"}),r}function pp(t,...e){const r=["Review","Ready for Review","Ready for Done"];for(const n of t.epics){const i=n.stories.find(s=>r.includes(s.status)&&e.includes(s.gateResult));if(i)return i}}function ume(t){const e=[],r=pp(t,"PASS","WAIVED"),n=pp(t,"FIXED"),i=pp(t,"FAIL","CONCERNS"),s=pp(t,void 0),a=dy(t,"In Progress","InProgress"),o=dy(t,"Approved"),l=dy(t,"Draft"),c=t0(t),h=t.epics.reduce((y,g)=>y+(g.plannedStories??g.stories.length),0),u=d3(t,"Done"),O=c.filter(y=>y.status!=="Done");if(r){const y=fl(r.file),g=r.title?`${y}. ${r.title}`:r.file;e.push({id:"mark-done",title:we.t("common:rec.markDone"),description:we.t("common:rec.markDoneDesc"),agentCommand:"/BMad:agents:dev",taskCommand:`Update story ${y} status to Done. The QA gate has passed.`,variant:"primary",iconKey:"check-circle",storyFile:r.file}),e.push({id:"request-qa-review",title:we.t("common:rec.requestQAReview"),description:g,agentCommand:"/BMad:agents:qa",taskCommand:`*review ${y}`,variant:"secondary",iconKey:"rotate-ccw",storyFile:r.file})}if(n){const y=fl(n.file),g=n.title?`${y}. ${n.title}`:n.file,x=e.length>0;e.push({id:"review-fixed",title:we.t("common:rec.qaReview"),description:we.t("common:rec.qaReviewDesc",{label:g}),agentCommand:"/BMad:agents:qa",taskCommand:`*review ${y}`,variant:x?"secondary":"primary",iconKey:"check-circle",storyFile:n.file})}if(i){const y=fl(i.file),g=i.title?`${y}. ${i.title}`:i.file,x=e.length>0;e.push({id:"review-apply-fixes",title:we.t("common:rec.applyQaFixes"),description:g,agentCommand:"/BMad:agents:dev",taskCommand:`*review-qa ${y}
|
|
857
857
|
|
|
858
858
|
${we.t("board:workflow.resolveGateOutro")}`,variant:x?"secondary":"primary",iconKey:"wrench",storyFile:i.file})}if(s){const y=fl(s.file),g=s.title?`${y}. ${s.title}`:s.file,x=e.length>0;e.push({id:"review-story",title:we.t("common:rec.qaReview"),description:we.t("common:rec.qaReviewDesc",{label:g}),agentCommand:"/BMad:agents:qa",taskCommand:`*review ${y}`,variant:x?"secondary":"primary",iconKey:"check-circle",storyFile:s.file})}if(a){const y=fl(a.file),g=a.title?`${y}. ${a.title}`:a.file,x=e.length>0;e.push({id:"continue-dev",title:we.t("common:rec.continueDev"),description:g,agentCommand:"/BMad:agents:dev",taskCommand:`*develop-story ${y}`,variant:x?"secondary":"primary",iconKey:"code",storyFile:a.file})}if(o){const y=fl(o.file),g=o.title?`${y}. ${o.title}`:o.file,x=e.length>0;e.push({id:"start-dev",title:we.t("common:rec.startDev"),description:g,agentCommand:"/BMad:agents:dev",taskCommand:`*develop-story ${y}`,variant:x?"secondary":"primary",iconKey:"play",storyFile:o.file}),e.push({id:"validate-fix-approved-story",title:we.t("common:rec.validateAndFixStory"),description:g,agentCommand:"/BMad:agents:po",taskCommand:`*validate-story-draft ${y}`,variant:"secondary",iconKey:"shield-check",storyFile:o.file,chainPrompts:[we.t("common:rec.validateFixPrompt"),we.t("common:rec.approveAfterFixPrompt")]}),e.push({id:"validate-approved-story",title:we.t("common:rec.validateStoryOnly"),description:g,agentCommand:"/BMad:agents:po",taskCommand:`*validate-story-draft ${y}`,variant:"secondary",iconKey:"shield-check",storyFile:o.file})}if(l){const y=fl(l.file),g=l.title?`${y}. ${l.title}`:l.file,x=e.length>0;e.push({id:"validate-fix-story",title:we.t("common:rec.validateAndFixStory"),description:g,agentCommand:"/BMad:agents:po",taskCommand:`*validate-story-draft ${y}`,variant:x?"secondary":"primary",iconKey:"shield-check",storyFile:l.file,chainPrompts:[we.t("common:rec.validateFixPrompt"),we.t("common:rec.approveAfterFixPrompt")]}),e.push({id:"validate-story",title:we.t("common:rec.validateStoryOnly"),description:g,agentCommand:"/BMad:agents:po",taskCommand:`*validate-story-draft ${y}`,variant:"secondary",iconKey:"shield-check",storyFile:l.file})}const p=e.length>0,b=h>c.length;if(c.length>0&&O.length,O.length===0&&(!p||b)){const y=ome(t);e.push({id:"create-story",title:c.length===0?we.t("common:rec.createFirstStory"):we.t("common:rec.createNextStory"),description:b?we.t("common:rec.storiesRemaining",{count:h-u}):we.t("common:rec.createStoryDesc"),agentCommand:"/BMad:agents:sm",taskCommand:`*draft ${y}`,variant:p?"secondary":"primary",iconKey:"plus-circle"})}return e}function hme(t){const e=[];return t0(t),d3(t,"Done"),e.push({id:"brainstorm-features",title:we.t("common:rec.newFeatureBrainstorm"),description:we.t("common:rec.newFeatureBrainstormDesc"),agentCommand:"/BMad:agents:analyst",taskCommand:"*brainstorm",variant:"primary",iconKey:"lightbulb"}),e.push({id:"new-epic",title:we.t("common:rec.addNewEpic"),description:we.t("common:rec.addNewEpicDesc"),agentCommand:"/BMad:agents:pm",taskCommand:"*brownfield-create-epic",variant:"primary",iconKey:"plus-circle"}),e.push({id:"add-brownfield-story",title:we.t("common:rec.addStoryToEpic"),description:we.t("common:rec.addStoryToEpicDesc"),agentCommand:"/BMad:agents:sm",taskCommand:"*brownfield-create-story",variant:"secondary",iconKey:"file-text"}),e}function fme(t){const e=lme(t);let r;switch(e.phase){case"pre-prd":r=cme(t);break;case"pre-architecture":r=dme(t);break;case"implementation":r=ume(t);break;case"completed":r=hme(t);break}return{phase:e,recommendations:r}}const fn={getBoard:t=>qe.get(`/projects/${t}/board`),createIssue:(t,e)=>qe.post(`/projects/${t}/board/issues`,e),updateIssue:(t,e,r)=>qe.patch(`/projects/${t}/board/issues/${e}`,r),deleteIssue:(t,e)=>qe.delete(`/projects/${t}/board/issues/${e}`),uploadAttachment:(t,e,r)=>{const n=new FormData;return n.append("file",r),qe.upload(`/projects/${t}/board/issues/${e}/attachments`,n)},deleteAttachment:(t,e,r)=>qe.delete(`/projects/${t}/board/issues/${e}/attachments/${r}`),getAttachmentUrl:(t,e,r)=>`/api/projects/${t}/board/issues/${e}/attachments/${r}`},Ome={"file-text":Ba,lightbulb:ure,search:vd,users:fj,clipboard:nj,blocks:Vee,palette:Are,layout:lj,code:yte,"check-circle":Xs,wrench:i1,"shield-check":Wu,play:mf,"plus-circle":lte};function pme({rec:t,onClick:e}){const r=Ome[t.iconKey]??Sm,n=t.variant==="primary";return d.jsxs("button",{onClick:e,className:`w-full flex items-center gap-3 px-4 py-3 rounded-lg transition-colors text-left cursor-pointer ${n?"bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300 hover:bg-blue-100 dark:hover:bg-blue-900/30":"bg-gray-100/80 dark:bg-[#253040]/50 text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040]"}`,children:[d.jsx(r,{className:`w-4 h-4 flex-shrink-0 ${n?"text-blue-600 dark:text-blue-400":"text-gray-500 dark:text-gray-400"}`}),d.jsxs("div",{className:"min-w-0 flex-1",children:[d.jsx("span",{className:"text-sm font-medium block",children:t.title}),d.jsx("span",{className:`text-xs block truncate ${n?"text-blue-600/70 dark:text-blue-400/70":"text-gray-500 dark:text-gray-300"}`,children:t.description})]}),d.jsx(Sm,{className:`w-3.5 h-3.5 flex-shrink-0 ${n?"text-blue-400 dark:text-blue-500":"text-gray-400 dark:text-gray-500"}`})]})}function mme({data:t,projectSlug:e}){const{t:r}=_e("common"),n=Tn(),{phase:i,recommendations:s}=fme(t),a=async c=>{var O;if(c.id==="start-dev"&&c.storyFile)try{const p=`story-${((O=c.storyFile.match(/^(\d+\.\d+)/))==null?void 0:O[1])??c.storyFile}`;await fn.updateIssue(e,p,{status:"In Progress"})}catch(p){console.warn("Failed to transition story to In Progress:",p)}const h=sn(),u=new URLSearchParams({agent:c.agentCommand});if(c.taskCommand&&u.set("task",c.taskCommand),c.chainPrompts)for(const p of c.chainPrompts)u.append("chain",p);n(`/project/${e}/session/${h}?${u.toString()}`)},o=()=>{const c=sn();n(`/project/${e}/session/${c}`)},l=i.phase==="completed";return d.jsxs("div",{className:"bg-gray-50 dark:bg-[#263240] rounded-xl border border-gray-200 dark:border-[#253040] p-5",children:[d.jsxs("div",{className:"flex items-center justify-between mb-4",children:[d.jsx("h2",{className:"font-semibold text-gray-900 dark:text-white",children:r(l?"nextSteps.title":"nextSteps.tasks")}),d.jsxs("span",{className:`text-xs px-2 py-0.5 rounded-full ${l?"bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400":"bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400"}`,children:[l&&d.jsx(Mre,{className:"w-3 h-3 inline-block mr-1 -mt-0.5"}),i.label]})]}),d.jsx("div",{className:"space-y-2",children:s.map(c=>d.jsx(pme,{rec:c,onClick:()=>a(c)},c.id))}),d.jsxs("div",{className:"mt-4 pt-3 border-t border-gray-200 dark:border-[#253040] flex items-center gap-3",children:[d.jsxs("button",{onClick:o,className:"text-xs text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 cursor-pointer",children:[d.jsx(Qr,{className:"w-3 h-3"}),r("nextSteps.newSession")]}),d.jsx("span",{className:"text-gray-200 dark:text-gray-700",children:"|"}),d.jsxs("button",{onClick:()=>n(`/project/${e}/queue`),className:"text-xs text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 cursor-pointer",children:[d.jsx(Xg,{className:"w-3 h-3"}),r("nextSteps.queueTask")]}),d.jsx("span",{className:"text-gray-200 dark:text-gray-700",children:"|"}),d.jsxs("button",{onClick:()=>n(`/project/${e}/files`),className:"text-xs text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 cursor-pointer",children:[d.jsx(As,{className:"w-3 h-3"}),r("nextSteps.fileExplore")]})]})]})}let Ro=null,uy=0;function u3(){Ro&&(clearTimeout(Ro),Ro=null)}function mp(t,e){u3(),t({error:e,isLoading:!1}),Ro=setTimeout(()=>{t({error:null}),Ro=null},5e3)}function gp(t){return t instanceof Gr?t.message:we.t("notification:board.loadError")}function gme(){if(typeof window>"u")return"kanban";const t=localStorage.getItem("bmad-board-viewMode");return t==="kanban"||t==="list"?t:window.matchMedia("(max-width: 767px)").matches?"list":"kanban"}function bme(){if(typeof window>"u")return 4;const t=localStorage.getItem("bmad-board-visibleColumns");if(t){const e=parseInt(t,10);if(e>=2&&e<=10)return e}return 4}const Jn=Wn((t,e)=>({items:[],boardConfig:HP,viewMode:gme(),visibleColumns:bme(),isLoading:!1,error:null,fetchBoard:async r=>{const n=++uy;t({isLoading:!0,items:[],error:null});try{const i=await fn.getBoard(r);if(n!==uy)return;u3(),t({items:i.items,boardConfig:i.config??HP,isLoading:!1,error:null})}catch(i){if(n!==uy)return;mp(t,gp(i))}},createIssue:async(r,n)=>{t({isLoading:!0});try{const i=await fn.createIssue(r,n);return await e().fetchBoard(r),i}catch(i){throw mp(t,gp(i)),i}},updateIssue:async(r,n,i)=>{t({isLoading:!0});try{await fn.updateIssue(r,n,i),await e().fetchBoard(r)}catch(s){throw mp(t,gp(s)),s}},deleteIssue:async(r,n)=>{t({isLoading:!0});try{await fn.deleteIssue(r,n),await e().fetchBoard(r)}catch(i){throw mp(t,gp(i)),i}},setViewMode:r=>{localStorage.setItem("bmad-board-viewMode",r),t({viewMode:r})},setVisibleColumns:r=>{const n=Math.max(2,Math.min(10,r));localStorage.setItem("bmad-board-visibleColumns",String(n)),t({visibleColumns:n})},setBoardConfig:r=>{t({boardConfig:r})},clearError:()=>{Ro&&(clearTimeout(Ro),Ro=null),t({error:null})}})),tk=[{id:"qa-failed",label:"QA Failed",colorClass:"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400",conditions:[{field:"status",value:"Ready for Review"},{field:"gateResult",value:"FAIL"}]},{id:"qa-concerns",label:"QA Concerns",colorClass:"bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400",conditions:[{field:"status",value:"Ready for Review"},{field:"gateResult",value:"CONCERNS"}]},{id:"qa-passed",label:"QA Passed",colorClass:"bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400",conditions:[{field:"status",value:"Ready for Review"},{field:"gateResult",value:"PASS"}]},{id:"qa-waived",label:"QA Waived",colorClass:"bg-teal-100 text-teal-800 dark:bg-teal-900/30 dark:text-teal-400",conditions:[{field:"status",value:"Ready for Review"},{field:"gateResult",value:"WAIVED"}]},{id:"qa-fixed",label:"QA Fixed",colorClass:"bg-sky-100 text-sky-800 dark:bg-sky-900/30 dark:text-sky-400",conditions:[{field:"status",value:"Ready for Review"},{field:"gateResult",value:"FIXED"}]},{id:"open",label:"Open",colorClass:"bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300",conditions:[{field:"status",value:"Open"}]},{id:"draft",label:"Draft",colorClass:"bg-slate-100 text-slate-700 dark:bg-slate-700 dark:text-slate-300",conditions:[{field:"status",value:"Draft"}]},{id:"approved",label:"Approved",colorClass:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",conditions:[{field:"status",value:"Approved"}]},{id:"in-progress",label:"In Progress",colorClass:"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",conditions:[{field:"status",value:"In Progress"}]},{id:"in-progress",label:"In Progress",colorClass:"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",conditions:[{field:"status",value:"InProgress"}]},{id:"blocked",label:"Blocked",colorClass:"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",conditions:[{field:"status",value:"Blocked"}]},{id:"ready-for-review",label:"Ready for Review",colorClass:"bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400",conditions:[{field:"status",value:"Ready for Review"}]},{id:"ready-for-done",label:"Ready for Done",colorClass:"bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400",conditions:[{field:"status",value:"Ready for Done"}]},{id:"done",label:"Done",colorClass:"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400",conditions:[{field:"status",value:"Done"}]},{id:"closed",label:"Closed",colorClass:"bg-gray-200 text-gray-600 dark:bg-gray-600 dark:text-gray-400",conditions:[{field:"status",value:"Closed"}]},{id:"promoted",label:"Promoted",colorClass:"bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-400",conditions:[{field:"status",value:"Promoted"}]}],xme={id:"unknown",label:"Unknown",colorClass:"bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300",conditions:[]};function Qd(t){for(const e of tk)if(e.conditions.every(n=>{const i=t[n.field];return i!=null&&String(i)===n.value}))return e;return{...xme,label:t.status}}const h2=[...new Set(tk.map(t=>t.id))];function yme(t){return tk.find(e=>e.id===t)}const f2={critical:"bg-red-500",high:"bg-orange-500",medium:"bg-yellow-500",low:"bg-gray-400"};function vme(){const{t}=_e("common"),{projectSlug:e}=Rn(),r=Tn(),{items:n,fetchBoard:i}=Jn();k.useEffect(()=>{e&&i(e)},[e,i]);const s=n.filter(a=>a.type==="issue").slice(-5).reverse();return d.jsxs("div",{className:"bg-gray-50 dark:bg-[#263240] rounded-xl border border-gray-200 dark:border-[#253040]",children:[d.jsxs("div",{className:"flex items-center justify-between px-5 py-4 border-b border-gray-200 dark:border-[#253040]",children:[d.jsx("h2",{className:"font-semibold text-gray-900 dark:text-white",children:t("overview.recentIssues")}),d.jsxs("button",{onClick:()=>r(`/project/${e}/board`),className:"text-sm text-blue-600 dark:text-blue-400 hover:underline flex items-center gap-1",children:[t("overview.viewBoard"),d.jsx(Sm,{className:"w-3.5 h-3.5"})]})]}),s.length===0?d.jsxs("div",{className:"py-8 px-5 text-center",children:[d.jsx("div",{className:"inline-flex items-center justify-center w-10 h-10 rounded-xl bg-gray-100 dark:bg-[#253040]/50 mb-3",children:d.jsx(Ri,{className:"w-5 h-5 text-gray-500 dark:text-gray-400"})}),d.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:t("overview.noIssues")})]}):d.jsx("div",{className:"divide-y divide-gray-100 dark:divide-gray-700",children:s.map(a=>{const o=Qd(a);return d.jsxs("button",{onClick:()=>r(`/project/${e}/board`),className:"w-full flex items-center gap-3 px-5 py-3 hover:bg-gray-100/50 dark:hover:bg-[#253040]/50 transition-colors text-left",children:[a.severity&&d.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${f2[a.severity]??f2.low}`}),d.jsx("span",{className:"text-sm text-gray-900 dark:text-white truncate flex-1",children:a.title}),d.jsx("span",{className:`text-[11px] px-1.5 py-0.5 rounded-full flex-shrink-0 ${o.colorClass}`,children:o.label})]},a.id)})})]})}function Sme(){return d.jsxs("div",{className:"space-y-4 animate-pulse",children:[d.jsxs("div",{className:"bg-gradient-to-r from-blue-50 to-indigo-50 dark:from-blue-950/30 dark:to-indigo-950/30 rounded-xl border border-blue-200 dark:border-blue-800/50 p-5",children:[d.jsxs("div",{className:"flex items-center justify-between gap-4 flex-wrap",children:[d.jsxs("div",{className:"flex items-center gap-4",children:[d.jsx("div",{className:"h-7 w-14 bg-blue-200 dark:bg-blue-800 rounded-md"}),d.jsxs("div",{className:"flex items-center gap-1",children:[d.jsx("div",{className:"h-8 w-12 bg-gray-200 dark:bg-[#253040] rounded"}),d.jsx("div",{className:"h-4 w-16 bg-gray-200 dark:bg-[#253040] rounded ml-1"})]})]}),d.jsxs("div",{className:"flex items-center gap-6",children:[d.jsx("div",{className:"h-4 w-24 bg-gray-200 dark:bg-[#253040] rounded"}),d.jsx("div",{className:"h-4 w-24 bg-gray-200 dark:bg-[#253040] rounded"})]})]}),d.jsx("div",{className:"mt-3 h-2.5 bg-blue-100 dark:bg-blue-900/40 rounded-full"})]}),d.jsxs("div",{className:"bg-gray-50 dark:bg-[#263240] rounded-xl border border-gray-200 dark:border-[#253040] p-5 space-y-3",children:[d.jsx("div",{className:"h-5 w-36 bg-gray-200 dark:bg-[#253040] rounded"}),d.jsx("div",{className:"h-4 w-full bg-gray-200 dark:bg-[#253040] rounded"}),d.jsx("div",{className:"h-4 w-2/3 bg-gray-200 dark:bg-[#253040] rounded"})]}),d.jsx("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:Array.from({length:2}).map((t,e)=>d.jsxs("div",{className:"bg-gray-50 dark:bg-[#263240] rounded-xl border border-gray-200 dark:border-[#253040] p-5 space-y-4",children:[d.jsx("div",{className:"h-5 w-32 bg-gray-200 dark:bg-[#253040] rounded"}),d.jsxs("div",{className:"space-y-2",children:[d.jsx("div",{className:"h-4 w-full bg-gray-200 dark:bg-[#253040] rounded"}),d.jsx("div",{className:"h-4 w-3/4 bg-gray-200 dark:bg-[#253040] rounded"}),d.jsx("div",{className:"h-4 w-1/2 bg-gray-200 dark:bg-[#253040] rounded"})]})]},e))})]})}function wme(t){const e=t.length,r=t.reduce((a,o)=>a+(o.plannedStories??o.stories.length),0),n=t.reduce((a,o)=>a+o.stories.filter(l=>l.status==="Done").length,0),i=t.filter(a=>{const o=a.plannedStories??a.stories.length;return o>0&&a.stories.filter(l=>l.status==="Done").length>=o}).length,s=r>0?Math.round(n/r*100):0;return{totalEpics:e,doneEpics:i,totalStories:r,doneStories:n,pct:s}}function kme({epics:t,isRefreshing:e}){const{t:r}=_e("common"),{totalEpics:n,doneEpics:i,totalStories:s,doneStories:a,pct:o}=wme(t);return d.jsxs("div",{className:"bg-gradient-to-r from-blue-50 to-indigo-50 dark:from-blue-950/30 dark:to-indigo-950/30 rounded-xl border border-blue-200 dark:border-blue-800/50 p-5",children:[d.jsxs("div",{className:"flex items-center justify-between gap-4 flex-wrap",children:[d.jsxs("div",{className:"flex items-center gap-4 min-w-0",children:[d.jsx("span",{className:"text-sm font-semibold px-3 py-1 bg-blue-600 dark:bg-blue-500 text-white rounded-md",children:r("overview.bmadLabel")}),d.jsx(Dg,{isRefreshing:e}),d.jsxs("div",{className:"flex items-center gap-1 min-w-0",children:[d.jsxs("span",{className:"text-2xl font-bold text-gray-900 dark:text-white",children:[o,"%"]}),d.jsx("span",{className:"text-sm text-gray-500 dark:text-gray-300 ml-1",children:r("overview.completedStatus")})]})]}),d.jsxs("div",{className:"flex items-center gap-6",children:[d.jsxs("div",{className:"flex items-center gap-1.5",children:[d.jsx(ire,{className:"w-4 h-4 text-blue-500 dark:text-blue-400"}),d.jsxs("span",{className:"text-sm text-gray-600 dark:text-gray-200",children:[d.jsxs("span",{className:"font-semibold text-gray-900 dark:text-white",children:[i,"/",n]})," ",r("overview.epicsLabel")]})]}),d.jsxs("div",{className:"flex items-center gap-1.5",children:[d.jsx(Wee,{className:"w-4 h-4 text-indigo-500 dark:text-indigo-400"}),d.jsxs("span",{className:"text-sm text-gray-600 dark:text-gray-200",children:[d.jsxs("span",{className:"font-semibold text-gray-900 dark:text-white",children:[a,"/",s]})," ",r("overview.storiesLabel")]})]})]})]}),d.jsx("div",{className:"mt-3 h-2.5 bg-blue-100 dark:bg-blue-900/40 rounded-full overflow-hidden",children:d.jsx("div",{className:"h-full bg-blue-500 dark:bg-blue-400 rounded-full transition-all",style:{width:`${o}%`}})})]})}function Qme({data:t,isLoading:e,isRefreshing:r,error:n,retry:i,projectSlug:s}){const{t:a}=_e("common");return d.jsxs("div",{className:"px-6 pt-6 space-y-4",children:[e&&d.jsx(Sme,{}),n&&d.jsxs("div",{role:"alert",className:"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-xl p-4",children:[d.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[d.jsx(Fa,{className:"w-4 h-4 text-red-600 dark:text-red-400"}),d.jsx("span",{className:"text-sm font-medium text-red-800 dark:text-red-200",children:a("overview.bmadLoadFailed")})]}),d.jsx("p",{className:"text-xs text-red-700 dark:text-red-300 mb-2",children:n}),d.jsx("button",{onClick:i,className:"text-xs px-3 py-1 bg-red-100 dark:bg-red-800/30 text-red-700 dark:text-red-300 rounded hover:bg-red-200 dark:hover:bg-red-800/50 transition-colors",children:a("button.retry")})]}),t&&d.jsxs(d.Fragment,{children:[d.jsx(kme,{epics:t.epics,isRefreshing:r}),d.jsx(mme,{data:t,projectSlug:s}),d.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[d.jsx(tme,{documents:t.documents,auxiliaryDocuments:t.auxiliaryDocuments,projectSlug:s}),d.jsx(sme,{epics:t.epics,projectSlug:s,storyBasePath:t.config.devStoryLocation})]})]})]})}function _me(){const{projectSlug:t}=Rn(),{projects:e}=Ga(),r=e.find(h=>h.projectSlug===t),n=(r==null?void 0:r.isBmadProject)??!1,{data:i,isLoading:s,isRefreshing:a,error:o,retry:l}=bie(n?t:void 0),c=n?d.jsx(vme,{}):void 0;return d.jsxs(d.Fragment,{children:[n&&t&&d.jsxs(d.Fragment,{children:[d.jsx(Qme,{data:i,isLoading:s,isRefreshing:a,error:o,retry:l,projectSlug:t}),d.jsx("div",{className:"mx-6 border-t border-gray-200 dark:border-[#253040]"})]}),d.jsx(vie,{quickActionsSlot:c})]})}const zn={getStatus:t=>qe.get(`/projects/${t}/queue/status`),getStories:t=>qe.get(`/projects/${t}/queue/stories`),getTemplates:t=>qe.get(`/projects/${t}/queue/templates`),saveTemplate:(t,e,r)=>qe.post(`/projects/${t}/queue/templates`,{name:e,template:r}),updateTemplate:(t,e,r,n)=>qe.put(`/projects/${t}/queue/templates/${e}`,{name:r,template:n}),deleteTemplate:(t,e)=>qe.delete(`/projects/${t}/queue/templates/${e}`),getGlobalTemplates:t=>qe.get(`/projects/${t}/queue/global-templates`),saveGlobalTemplate:(t,e,r)=>qe.post(`/projects/${t}/queue/global-templates`,{name:e,template:r}),updateGlobalTemplate:(t,e,r,n)=>qe.put(`/projects/${t}/queue/global-templates/${e}`,{name:r,template:n}),deleteGlobalTemplate:(t,e)=>qe.delete(`/projects/${t}/queue/global-templates/${e}`)};let bp=null,Ol=null;const ii=Wn((t,e)=>({script:"",parsedItems:[],warnings:[],isRunning:!1,isPaused:!1,isCompleted:!1,isErrored:!1,isStarting:!1,isAborted:!1,currentIndex:0,totalItems:0,pauseReason:void 0,lockedSessionId:null,currentModel:void 0,completedItems:new Set,errorItem:null,itemSessionIds:new Map,isReordering:!1,setScript:r=>{t({script:r}),bp&&clearTimeout(bp),bp=setTimeout(()=>{e().parseScript(),bp=null},300)},parseScript:()=>{const{script:r}=e(),n=oq(r);t({parsedItems:n.items,warnings:n.warnings})},handleProgress:r=>{if(e().isAborted)return;const n={currentIndex:r.currentIndex,totalItems:r.totalItems,pauseReason:r.pauseReason,lockedSessionId:r.sessionId,isStarting:!1};switch(r.status){case"running":n.isRunning=!0,n.isPaused=!1,n.isCompleted=!1,n.isErrored=!1,n.errorItem=null;break;case"paused":n.isRunning=!0,n.isPaused=!0;break;case"completed":n.isRunning=!1,n.isPaused=!1,n.isCompleted=!0,n.lockedSessionId=null;break;case"aborted":n.isRunning=!1,n.isPaused=!1,n.isCompleted=!1,n.isErrored=!1,n.errorItem=null,n.pauseReason=void 0,n.lockedSessionId=null;break;case"error":n.isRunning=!1,n.isPaused=!1,n.isErrored=!0,n.lockedSessionId=null;break}if(r.status==="running"&&r.sessionId){const i=new Map(e().itemSessionIds);i.set(r.currentIndex,r.sessionId),n.itemSessionIds=i}t(n)},handleItemComplete:r=>{e().isAborted||t(n=>{const i=new Map(n.itemSessionIds);return r.sessionId&&i.set(r.itemIndex,r.sessionId),{completedItems:new Set([...n.completedItems,r.itemIndex]),itemSessionIds:i}})},handleError:r=>{e().isAborted||t({errorItem:{index:r.itemIndex,error:r.error}})},setStarting:r=>{t({isStarting:r,isAborted:!1,...r?{errorItem:null}:{}})},syncFromStatus:r=>{const n=r.totalItems>0?Math.min(r.currentIndex,r.totalItems):r.currentIndex,i=r.isRunning||n>0?new Set(Array.from({length:n},(s,a)=>a)):new Set;t({isRunning:r.isRunning,isPaused:r.isPaused,isCompleted:r.isCompleted??!1,isErrored:r.isErrored??!1,isAborted:!1,isReordering:!1,currentIndex:Math.min(r.currentIndex,r.totalItems>0?r.totalItems:r.currentIndex),totalItems:r.totalItems,pauseReason:r.pauseReason,lockedSessionId:r.lockedSessionId,currentModel:r.currentModel,completedItems:i,errorItem:r.lastError?{index:r.lastError.itemIndex,error:r.lastError.error}:null,...r.items&&r.items.length>0?{parsedItems:r.items}:{},itemSessionIds:r.completedSessionIds?new Map(Object.entries(r.completedSessionIds).map(([s,a])=>[Number(s),a])):new Map})},handleItemsUpdated:r=>{e().isAborted||(Ol&&(clearTimeout(Ol),Ol=null),t({parsedItems:r.items,totalItems:r.totalItems,currentIndex:r.currentIndex,isReordering:!1}))},optimisticReorder:(r,n)=>{const{parsedItems:i,currentIndex:s,isPaused:a}=e(),o=a?s:s+1,l=r.map(c=>i[c]);Ol&&clearTimeout(Ol),Ol=setTimeout(()=>{e().isReordering&&(zn.getStatus(n).then(c=>e().syncFromStatus(c)).catch(()=>t({isReordering:!1})),Ol=null)},3e3),t({parsedItems:[...i.slice(0,o),...l],isReordering:!0})},reset:()=>{t({isRunning:!1,isPaused:!1,isCompleted:!1,isErrored:!1,isStarting:!1,isAborted:!0,currentIndex:0,totalItems:0,pauseReason:void 0,lockedSessionId:null,currentModel:void 0,completedItems:new Set,errorItem:null,itemSessionIds:new Map,isReordering:!1})}}));function Pme({session:t,onClick:e,onDelete:r,onRename:n,selectionMode:i,selected:s,onToggleSelect:a,agentInfo:o,isEditing:l,onEditStart:c,onEditEnd:h,isQueueActive:u}){const{t:O}=_e("chat"),[p,b]=k.useState(!1),y=k.useRef(null),[g,x]=k.useState(t.name||""),v=k.useRef(null),w=()=>{if(i){a==null||a(t.sessionId);return}p||e(t.sessionId)},Q=X=>{X.stopPropagation(),b(I=>!I)},_=X=>{X.stopPropagation(),b(!1),r==null||r(t.sessionId)},P=X=>{X.stopPropagation(),b(!1),x(t.name||""),c==null||c(t.sessionId)},T=X=>{X.stopPropagation(),b(!1),n==null||n(t.sessionId,null)},C=()=>{const X=g.trim();n==null||n(t.sessionId,X||null),h==null||h()},R=()=>{h==null||h()};k.useEffect(()=>{l&&v.current&&(v.current.focus(),v.current.select())},[l]);const N=k.useCallback(X=>{y.current&&!y.current.contains(X.target)&&b(!1)},[]);k.useEffect(()=>{if(p)return document.addEventListener("mousedown",N),()=>document.removeEventListener("mousedown",N)},[p,N]);const A=X=>{X.stopPropagation(),a==null||a(t.sessionId)};return d.jsxs("div",{role:"button",tabIndex:0,onClick:w,onKeyDown:X=>{(X.key==="Enter"||X.key===" ")&&(X.preventDefault(),w())},className:`relative w-full text-left p-4 bg-gray-50 dark:bg-[#263240] rounded-lg border transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-[#1c2129] cursor-pointer ${s?"border-blue-500 dark:border-blue-400 bg-blue-50 dark:bg-blue-900/20":"border-gray-200 dark:border-[#253040] hover:border-blue-500 dark:hover:border-blue-400"}`,"aria-label":`${O("sessionListItem.ariaLabel",{prompt:t.firstPrompt||O("sessionListItem.emptySession")})}. ${O("sessionListItem.messageCount",{count:t.messageCount})}. ${Ll(t.modified)}`,children:[d.jsxs("div",{className:"flex items-start gap-3",children:[i&&d.jsx("div",{className:"flex-shrink-0 pt-0.5",children:d.jsx("input",{type:"checkbox",checked:s||!1,onChange:A,onClick:X=>X.stopPropagation(),className:"w-4 h-4 rounded border-gray-300 dark:border-[#2d3a4a] text-blue-600 focus:ring-blue-500 dark:bg-[#253040]","aria-label":O("sessionListItem.checkbox",{prompt:t.firstPrompt||O("sessionListItem.emptySession")})})}),d.jsxs("div",{className:"flex-1 min-w-0",children:[d.jsxs("div",{className:"flex items-baseline gap-1.5 mb-0.5 min-w-0",children:[t.name&&d.jsx("span",{className:"flex-shrink-0 inline-block text-[11px] leading-tight font-medium px-1.5 py-px rounded bg-blue-100 dark:bg-blue-900/40 text-blue-700 dark:text-blue-300 max-w-[40%] truncate",children:t.name}),o&&d.jsxs("span",{className:"flex-shrink-0 inline-block text-[11px] leading-tight font-medium px-1.5 py-px rounded bg-purple-100 dark:bg-purple-900/40 text-purple-700 dark:text-purple-300","data-testid":"session-agent-badge",children:[o.icon&&d.jsx("span",{children:o.icon})," ",o.name]}),d.jsx("span",{className:"text-xs text-gray-500 dark:text-gray-400 truncate font-mono",children:t.sessionId})]}),l?d.jsx("input",{ref:v,type:"text",value:g,onChange:X=>x(X.target.value),onKeyDown:X=>{X.key==="Enter"&&(X.stopPropagation(),X.preventDefault(),C()),X.key==="Escape"&&(X.stopPropagation(),X.preventDefault(),R())},onBlur:C,onClick:X=>X.stopPropagation(),placeholder:O("sessionListItem.nameInput"),className:"w-full text-sm font-medium bg-white dark:bg-[#253040] border border-blue-500 rounded px-2 py-1 mb-2 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"}):d.jsx("p",{className:"text-gray-900 dark:text-white font-medium truncate mb-1",children:t.firstPrompt||O("sessionListItem.emptySession")}),d.jsxs("div",{className:"flex items-center justify-between text-sm text-gray-500 dark:text-gray-300",children:[d.jsxs("div",{className:"flex items-center gap-1",children:[d.jsxs("span",{className:"relative flex h-2 w-2 mr-1",title:t.isStreaming?O("sessionListItem.streaming"):O("sessionListItem.waiting"),children:[t.isStreaming&&d.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"}),d.jsx("span",{className:`relative inline-flex rounded-full h-2 w-2 ${t.isStreaming?"bg-green-500":"bg-gray-300 dark:bg-gray-600"}`})]}),u&&d.jsxs("span",{className:"inline-flex items-center gap-1 text-[11px] font-medium px-1.5 py-px rounded bg-indigo-100 dark:bg-indigo-900/40 text-indigo-600 dark:text-indigo-300",title:O("sessionListItem.queueActive"),children:[d.jsx(Xg,{className:"w-3 h-3"}),O("sessionListItem.queue")]}),d.jsx(Wo,{className:"w-4 h-4","aria-hidden":"true"}),d.jsx("span",{children:O("sessionListItem.messageCount",{count:t.messageCount})})]}),d.jsx("span",{children:Ll(t.modified)})]})]})]}),(r||n)&&!i&&d.jsxs("div",{ref:y,className:"absolute top-2 right-2 z-10",children:[d.jsx("button",{type:"button",onClick:Q,"aria-label":O("sessionListItem.menu"),"aria-expanded":p,className:"p-1 rounded-md text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-[#253040] focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors",children:d.jsx(Za,{className:"w-4 h-4","aria-hidden":"true"})}),p&&d.jsxs("div",{className:"absolute right-0 mt-1 w-36 bg-white dark:bg-[#263240] rounded-md shadow-lg border border-gray-200 dark:border-[#253040] py-1",role:"menu",children:[n&&d.jsxs("button",{type:"button",onClick:P,role:"menuitem",className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040] transition-colors",children:[d.jsx(Ag,{className:"w-4 h-4","aria-hidden":"true"}),O("sessionListItem.rename")]}),n&&t.name&&d.jsxs("button",{type:"button",onClick:T,role:"menuitem",className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040] transition-colors",children:[d.jsx(Yt,{className:"w-4 h-4","aria-hidden":"true"}),O("sessionListItem.removeName")]}),r&&d.jsxs("button",{type:"button",onClick:_,role:"menuitem",className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors",children:[d.jsx(Ns,{className:"w-4 h-4","aria-hidden":"true"}),O("sessionListItem.delete")]})]})]})]})}function $me(){return d.jsx("div",{className:"w-full p-4 bg-gray-50 dark:bg-[#263240] rounded-lg border border-gray-200 dark:border-[#253040] animate-pulse",children:d.jsx("div",{className:"flex items-start gap-3",children:d.jsxs("div",{className:"flex-1 min-w-0",children:[d.jsxs("div",{className:"flex items-baseline gap-1.5 mb-1",children:[d.jsx("div",{className:"h-4 bg-blue-100 dark:bg-blue-900/40 rounded w-16 flex-shrink-0"}),d.jsx("div",{className:"h-3 bg-gray-200 dark:bg-[#253040] rounded w-24"})]}),d.jsx("div",{className:"h-5 bg-gray-200 dark:bg-[#253040] rounded w-3/4 mb-2"}),d.jsxs("div",{className:"flex items-center justify-between",children:[d.jsxs("div",{className:"flex items-center gap-1",children:[d.jsx("div",{className:"w-2 h-2 bg-gray-300 dark:bg-gray-600 rounded-full"}),d.jsx("div",{className:"h-4 bg-gray-200 dark:bg-[#253040] rounded w-16"})]}),d.jsx("div",{className:"h-4 bg-gray-200 dark:bg-[#253040] rounded w-14"})]})]})})})}function h3({icon:t=Wo,title:e,description:r,actionLabel:n,onAction:i}){return d.jsxs("div",{className:"text-center py-6 md:py-12 px-4",role:"status","aria-label":e,children:[d.jsx(t,{className:"w-10 h-10 md:w-16 md:h-16 mx-auto text-gray-400 dark:text-gray-500 mb-3 md:mb-4","aria-hidden":"true"}),d.jsx("p",{className:"text-base md:text-lg font-medium text-gray-900 dark:text-white mb-1 md:mb-2",children:e}),d.jsx("p",{className:"text-sm md:text-base text-gray-500 dark:text-gray-300 mb-3 md:mb-4",children:r}),n&&i&&d.jsxs("button",{onClick:i,className:"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 dark:focus:ring-offset-[#1c2129]",children:[d.jsx(Qr,{className:"w-5 h-5","aria-hidden":"true"}),n]})]})}function Cme({pullDistance:t,threshold:e,isRefreshing:r}){const{t:n}=_e("common"),s=Math.min(t/e,1)*180;return t===0&&!r?null:d.jsxs("div",{className:"flex justify-center py-4 transition-all",style:{height:t},children:[d.jsx(Ir,{className:`w-6 h-6 text-blue-600 ${r?"animate-spin":""}`,style:{transform:`rotate(${s}deg)`},"aria-hidden":"true"}),r&&d.jsx("span",{className:"sr-only",children:n("pullToRefresh")})]})}function Tme({onRefresh:t,threshold:e=80,disabled:r=!1}){const n=k.useRef(null),[i,s]=k.useState(0),[a,o]=k.useState(!1),l=k.useRef(0),c=k.useRef(!1),h=k.useRef(!1),u=k.useRef(0),O=k.useRef(!1),p=k.useRef(t);p.current=t;const b=15;return k.useEffect(()=>{const y=n.current;if(!y)return;const g=_=>{let P=_.parentElement;for(;P&&P!==document.documentElement;){const{overflowY:T}=getComputedStyle(P);if((T==="auto"||T==="scroll")&&P.scrollHeight>P.clientHeight)return P;P=P.parentElement}return document.documentElement},x=y.scrollHeight>y.clientHeight?y:g(y),v=_=>{const T=_.touches[0].clientY-l.current;if(x.scrollTop>0||T<=0){c.current=!1,h.current=!1,u.current=0,s(0),y.removeEventListener("touchmove",v);return}if(!h.current){if(T<b)return;h.current=!0}const C=T-b,R=Math.min(C*.5,e*1.5);u.current=R,s(R),_.preventDefault()},w=_=>{r||O.current||x.scrollTop>0||(l.current=_.touches[0].clientY,c.current=!0,h.current=!1,y.addEventListener("touchmove",v,{passive:!1}))},Q=async()=>{if(y.removeEventListener("touchmove",v),!!c.current)if(c.current=!1,h.current=!1,u.current>=e&&!O.current){O.current=!0,o(!0),s(e);try{await p.current()}finally{O.current=!1,o(!1),u.current=0,s(0)}}else u.current=0,s(0)};return y.addEventListener("touchstart",w,{passive:!0}),y.addEventListener("touchend",Q),()=>{y.removeEventListener("touchstart",w),y.removeEventListener("touchmove",v),y.removeEventListener("touchend",Q)}},[r,e]),{containerRef:n,isPulling:i>0,pullDistance:i,isRefreshing:a}}const Rme=76,Eme=56;function jme(t=5){const[e,r]=k.useState(t);return k.useEffect(()=>{const n=()=>{const i=window.innerHeight-Eme,s=Math.ceil(i/Rme);r(Math.min(Math.max(s,3),10))};return n(),window.addEventListener("resize",n),()=>window.removeEventListener("resize",n)},[]),e}const O2=80;function Xme(){const{t}=_e("chat"),{projectSlug:e}=Rn(),r=Tn(),n=us(),{sessions:i,isLoading:s,error:a,isRefreshing:o,isLoadingMore:l,hasMore:c,fetchSessions:h,loadMoreSessions:u,deleteSession:O,deleteSessions:p,renameSession:b,includeEmpty:y,setIncludeEmpty:g,searchQuery:x,searchContent:v,isSearching:w,searchSessions:Q,clearSearch:_,setSearchContent:P}=ua(),T=ii(Me=>Me.isRunning||Me.isPaused?Me.lockedSessionId:null),C=jme(5),[R,N]=k.useState(!1),[A,X]=k.useState(new Set),[I,W]=k.useState(null),[Y,ne]=k.useState(null),[K,B]=k.useState(!1),[D,E]=k.useState(!1),[M,U]=k.useState(""),z=k.useRef(void 0),J=k.useMemo(()=>i.filter(Me=>!Me.firstPrompt||Me.messageCount===0).map(Me=>Me.sessionId),[i]);k.useEffect(()=>{if(!e)return;let Me=null,Mt,zt=0;const G=10,ie=()=>{Me==null||Me.emit("project:join",e)};function pe(){try{Me=$t(),ie(),Me.on("connect",ie)}catch{++zt<G&&(Mt=setTimeout(pe,200))}}return pe(),()=>{clearTimeout(Mt),Me&&(Me.off("connect",ie),Me.emit("project:leave",e))}},[e]);const ce=k.useRef(!0);k.useEffect(()=>{e&&(clearTimeout(z.current),U(""),_(e)),ce.current=!0},[e,_,n.key]),k.useEffect(()=>{if(ce.current){ce.current=!1;return}e&&h(e,{limit:20})},[y,e,h]),k.useEffect(()=>()=>clearTimeout(z.current),[]),k.useEffect(()=>{const Me=Mt=>{Mt.key==="Escape"&&R&&(N(!1),X(new Set))};return document.addEventListener("keydown",Me),()=>document.removeEventListener("keydown",Me)},[R]);const le=k.useCallback(async()=>{e&&await h(e,{limit:20})},[e,h]),{containerRef:Z,pullDistance:V,isRefreshing:H}=Tme({onRefresh:le,threshold:O2,disabled:s||!!a}),te=k.useCallback(Me=>{U(Me),clearTimeout(z.current),Me.trim()?z.current=setTimeout(()=>{e&&Q(e,Me.trim(),v)},300):e&&_(e)},[e,v,Q,_]),ue=k.useCallback(()=>{const Me=!v;P(Me),M.trim()&&e&&(clearTimeout(z.current),Q(e,M.trim(),Me))},[v,P,M,e,Q]),ae=k.useCallback(()=>{U(""),clearTimeout(z.current),e&&_(e)},[e,_]),he=k.useCallback(()=>{e&&x&&Q(e,x,v)},[e,x,v,Q]),re=k.useCallback(()=>{const Me=sn();r(`/project/${e}/session/${Me}`)},[r,e]),Qe=k.useCallback(Me=>r(`/project/${e}/session/${Me}`),[r,e]),me=k.useCallback((Me,Mt)=>{e&&b(e,Me,Mt)},[e,b]),xe=k.useCallback(Me=>ne(Me),[]),ft=k.useCallback(async()=>{!Y||!e||(await O(e,Y),ne(null))},[Y,e,O]),St=k.useCallback(Me=>{X(Mt=>{const zt=new Set(Mt);return zt.has(Me)?zt.delete(Me):zt.add(Me),zt})},[]),bt=k.useCallback(()=>{X(new Set(i.map(Me=>Me.sessionId)))},[i]),It=k.useCallback(async()=>{!e||A.size===0||(B(!1),await p(e,[...A]),X(new Set),N(!1))},[e,A,p]),ar=k.useCallback(async()=>{!e||J.length===0||(E(!1),await p(e,J))},[e,J,p]);return d.jsxs(d.Fragment,{children:[d.jsx("div",{className:"sticky top-0 z-[5] bg-white dark:bg-[#1c2129] border-b border-gray-200 dark:border-[#253040]",children:d.jsx("div",{className:"flex items-center justify-between px-4 py-2",children:R?d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("button",{onClick:()=>{N(!1),X(new Set)},className:"p-1.5 hover:bg-gray-200 dark:hover:bg-[#253040] rounded-lg text-gray-600 dark:text-gray-300","aria-label":t("session.exitSelection"),children:d.jsx(Yt,{className:"w-4 h-4"})}),d.jsx("span",{className:"text-sm font-medium text-gray-700 dark:text-gray-200",children:t("session.selectedCount",{count:A.size})})]}),d.jsxs("div",{className:"flex items-center gap-1",children:[d.jsx("button",{onClick:A.size<i.length?bt:()=>X(new Set),className:"px-3 py-1.5 text-xs rounded-lg hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-600 dark:text-gray-300",children:A.size<i.length?t("session.selectAll"):t("session.deselectAll")}),d.jsxs("button",{onClick:()=>B(!0),disabled:A.size===0,className:"inline-flex items-center gap-1 px-3 py-1.5 text-xs rounded-lg bg-red-100 dark:bg-red-600 text-red-700 dark:text-white hover:bg-red-200 dark:hover:bg-red-500 disabled:opacity-50 transition-colors",children:[d.jsx(Ns,{className:"w-3.5 h-3.5"}),t("session.delete")]})]})]}):d.jsxs(d.Fragment,{children:[d.jsx(Dg,{isRefreshing:o,className:"ml-1"}),d.jsxs("div",{className:"flex items-center gap-1 ml-auto",children:[d.jsxs("button",{onClick:re,className:"inline-flex items-center gap-1.5 px-3 py-1.5 bg-blue-100 dark:bg-blue-600 text-blue-700 dark:text-white text-xs font-medium rounded-lg hover:bg-blue-200 dark:hover:bg-blue-500 transition-colors",children:[d.jsx(Qr,{className:"w-3.5 h-3.5"}),t("session.newSession")]}),d.jsx("div",{className:"w-px h-5 bg-gray-200 dark:bg-[#253040] ml-2"}),d.jsx("button",{onClick:()=>g(!y),className:`p-1.5 rounded-lg transition-colors ${y?"bg-blue-100 dark:bg-blue-600 text-blue-700 dark:text-white":"hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300"}`,"aria-label":t(y?"session.hideEmpty":"session.showEmpty"),title:t(y?"session.hideEmpty":"session.showEmpty"),children:y?d.jsx(Jc,{className:"w-4 h-4"}):d.jsx(Qh,{className:"w-4 h-4"})}),y&&J.length>0&&d.jsxs("button",{onClick:()=>E(!0),className:"inline-flex items-center gap-1 px-2.5 py-1.5 text-xs rounded-lg bg-red-100 dark:bg-red-600 text-red-700 dark:text-white hover:bg-red-200 dark:hover:bg-red-500 transition-colors",children:[d.jsx(Ns,{className:"w-3.5 h-3.5"}),t("session.deleteEmpty")]}),i.length>0&&d.jsx("button",{onClick:()=>{N(!0),X(new Set)},className:"p-1.5 hover:bg-gray-200 dark:hover:bg-[#253040] rounded-lg text-gray-500 dark:text-gray-300","aria-label":t("session.selectionMode"),children:d.jsx(One,{className:"w-4 h-4"})}),d.jsx("button",{onClick:le,disabled:s||o,className:"p-1.5 hover:bg-gray-200 dark:hover:bg-[#253040] rounded-lg disabled:opacity-50 text-gray-500 dark:text-gray-300","aria-label":t("session.refresh"),children:d.jsx(Ir,{className:`w-4 h-4 ${o?"animate-spin":""}`})})]})]})})}),!R&&d.jsxs("div",{className:"px-4 pt-3 pb-1 bg-white dark:bg-[#1c2129]",children:[d.jsxs("div",{role:"search",className:"relative",children:[d.jsx(vd,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-500 dark:text-gray-400 pointer-events-none","aria-hidden":"true"}),d.jsx("input",{type:"text",value:M,onChange:Me=>te(Me.target.value),placeholder:t("session.searchPlaceholder"),"aria-label":t("session.searchPlaceholder"),className:"w-full pl-10 pr-9 py-2 text-sm bg-gray-100 dark:bg-[#263240] border border-gray-200 dark:border-[#253040] rounded-lg text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"}),M&&d.jsx("button",{onClick:ae,className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded","aria-label":t("session.clearSearch"),children:d.jsx(Yt,{className:"w-4 h-4"})})]}),M.trim()&&d.jsxs("div",{className:"mt-2 flex items-center gap-2",children:[d.jsxs("label",{className:"flex items-center gap-2 cursor-pointer text-sm text-gray-600 dark:text-gray-300",children:[d.jsx("input",{type:"checkbox",checked:v,onChange:ue,className:"rounded border-gray-300 dark:border-[#2d3a4a] text-blue-600 focus:ring-blue-500"}),t("session.searchContent")]}),d.jsx("span",{className:"text-xs text-gray-500 dark:text-gray-400",children:t(v?"session.searchContentCap":"session.searchContentHint")})]})]}),d.jsx(Cme,{pullDistance:V,threshold:O2,isRefreshing:H}),d.jsxs("div",{ref:Z,className:"flex-1 overflow-auto","aria-live":"polite",children:[w&&d.jsxs("div",{className:"flex items-center justify-center py-12 gap-2 text-gray-500 dark:text-gray-300",role:"status",children:[d.jsx(vt,{className:"w-5 h-5 animate-spin","aria-hidden":"true"}),d.jsx("span",{children:t("session.searching")})]}),!w&&a&&x&&d.jsxs("div",{className:"flex flex-col items-center justify-center py-12 gap-3 text-gray-500 dark:text-gray-300",children:[d.jsx("p",{className:"text-sm",children:t("session.searchError")}),d.jsx("button",{onClick:he,className:"px-4 py-2 text-sm bg-blue-100 dark:bg-blue-600 text-blue-700 dark:text-white rounded-lg hover:bg-blue-200 dark:hover:bg-blue-500 transition-colors",children:t("session.refresh")})]}),!w&&s&&!o&&d.jsx("div",{className:"p-4 space-y-3","aria-label":t("session.loading"),role:"status",children:Array.from({length:C}).map((Me,Mt)=>d.jsx($me,{},Mt))}),!w&&!s&&i.length===0&&x&&!a&&d.jsx("div",{className:"flex items-center justify-center py-12 text-gray-500 dark:text-gray-300",children:d.jsx("p",{className:"text-sm",children:t("session.searchNoResults")})}),!w&&!s&&i.length===0&&!x&&!a&&d.jsx(h3,{title:t("session.empty.title"),description:t("session.empty.description"),actionLabel:t("session.empty.action"),onAction:re}),!w&&!s&&i.length>0&&d.jsxs("div",{className:"p-4 space-y-3",children:[i.map(Me=>d.jsx(Pme,{session:Me,agentInfo:null,onClick:Qe,onDelete:xe,onRename:me,selectionMode:R,selected:A.has(Me.sessionId),onToggleSelect:St,isEditing:I===Me.sessionId,onEditStart:Mt=>W(Mt),onEditEnd:()=>W(null),isQueueActive:T===Me.sessionId},Me.sessionId)),c&&e&&d.jsx("button",{onClick:()=>u(e,{limit:20}),disabled:l,className:"w-full py-3 text-sm text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 hover:bg-gray-50 dark:hover:bg-[#263240]/50 rounded-lg transition-colors disabled:opacity-50 flex items-center justify-center gap-2","data-testid":"load-more-sessions",children:l?d.jsxs(d.Fragment,{children:[d.jsx(vt,{className:"w-4 h-4 animate-spin","aria-hidden":"true"}),t("session.loadingMore")]}):t("session.loadMore")})]})]}),d.jsx(Ia,{isOpen:!!Y,title:t("session.confirmDelete.title"),message:t("session.confirmDelete.message"),confirmText:t("session.confirmDelete.confirm"),cancelText:t("session.confirmDelete.cancel"),variant:"danger",onConfirm:ft,onCancel:()=>ne(null)}),d.jsx(Ia,{isOpen:K,title:t("session.confirmBatchDelete.title"),message:t("session.confirmBatchDelete.message",{count:A.size}),confirmText:t("session.confirmDelete.confirm"),cancelText:t("session.confirmDelete.cancel"),variant:"danger",onConfirm:It,onCancel:()=>B(!1)}),d.jsx(Ia,{isOpen:D,title:t("session.confirmEmptyDelete.title"),message:t("session.confirmEmptyDelete.message",{count:J.length}),confirmText:t("session.confirmDelete.confirm"),cancelText:t("session.confirmDelete.cancel"),variant:"danger",onConfirm:ar,onCancel:()=>E(!1)})]})}function Ame(t,e){if(e.length===0)return t;if(t.length===0)return e;const r=new Map;for(const c of e)if(c.type==="user"){const h=c.content.trim(),u=r.get(h)??[];u.push(c),r.set(h,u)}const n=new Set,i=new Set,s=new Map;for(const c of t)if(c._optimistic&&c.type==="user"){const h=c.content.trim(),u=r.get(h);if(u&&u.length>0){const O=u.shift();n.add(O.id),i.add(c.id),s.set(O.id,c.id)}}const a=new Map(t.filter(c=>c._optimistic).map(c=>[c.id,c])),o=new Map;for(const c of t)c.type==="user"&&c.images&&c.images.length>0&&!c._optimistic&&o.set(c.content,c.images);const l=[];for(const c of e)if(c.type==="user"&&n.has(c.id)){const h=s.get(c.id),u=h?a.get(h):void 0;u!=null&&u.images&&u.images.length>0?l.push({...c,images:u.images}):l.push(c)}else c.type==="user"&&!c.images&&o.has(c.content)?l.push({...c,images:o.get(c.content)}):l.push(c);for(const c of t)c._optimistic&&!i.has(c.id)&&l.push(c);return l}const Cu=new Map,Nme=5,nt=Wn((t,e)=>({messages:[],currentProjectSlug:null,currentSessionId:null,isLoading:!1,isLoadingMore:!1,error:null,pagination:null,lastAgentCommand:null,fetchMessages:async(r,n,i)=>{var o,l,c,h,u;const s=e(),a=s.currentSessionId===n;Je.message("fetchMessages called",{projectSlug:r,sessionId:n,silent:i==null?void 0:i.silent,minMessageCount:i==null?void 0:i.minMessageCount,isSameSession:a,currentMsgCount:s.messages.length,isStreaming:Ce.getState().isStreaming}),a||t({messages:[],pagination:null}),!(i!=null&&i.silent)&&!a&&t({isLoading:!0}),t({error:null,currentProjectSlug:r,currentSessionId:n});try{const O=await Js.getMessages(r,n);if(i!=null&&i.minMessageCount&&O.messages.length<i.minMessageCount){Je.message("fetchMessages → stale data guard (minMessageCount)",{serverCount:O.messages.length,minRequired:i.minMessageCount});return}const p=e().messages,b=Ce.getState(),y=(((o=O.pagination)==null?void 0:o.offset)??0)>0,x=b.streamCompletedAt!==null&&Date.now()-b.streamCompletedAt<1e4,v=b.streamingMessageId==="restoring",w=i!=null&&i.force?!1:x,Q=!y&&(v&&O.messages.length<=p.length||!v&&O.messages.length<p.length&&(b.isStreaming||b.segmentsPendingClear||w||b.isCompacting));if(Je.message("fetchMessages → guard check",{shouldGuard:Q,isRestoring:v,isPaginationFetch:y,serverCount:O.messages.length,currentCount:p.length,serverLessThanCurrent:O.messages.length<p.length,isStreaming:b.isStreaming,segmentsPendingClear:b.segmentsPendingClear,isInCooldown:x,isCompacting:b.isCompacting,streamCompletedAt:b.streamCompletedAt,guardConditionMet:b.isStreaming||b.segmentsPendingClear||x||b.isCompacting,paginationOffset:(l=O.pagination)==null?void 0:l.offset,currentAssistantCount:p.filter(T=>T.type==="assistant").length,serverAssistantCount:O.messages.filter(T=>T.type==="assistant").length}),Q){Je.message("fetchMessages → streaming guard BLOCKED update",{serverCount:O.messages.length,currentCount:p.length,isStreaming:b.isStreaming,segmentsPendingClear:b.segmentsPendingClear,isInCooldown:x,isCompacting:b.isCompacting}),t({isLoading:!1});return}const _=Ame(p,O.messages);_.sort((T,C)=>new Date(T.timestamp).getTime()-new Date(C.timestamp).getTime());const P=T=>T.map((C,R)=>`${R}:${C.type}:${(C.content||"").slice(0,30)}`);if(Je.message("fetchMessages → messages updated",{serverCount:O.messages.length,currentCount:p.length,reconciledCount:_.length,serverTypes:O.messages.map(T=>T.type),currentTypes:p.map(T=>T.type),reconciledTypes:_.map(T=>T.type),serverMsgs:P(O.messages),currentMsgs:P(p),reconciledMsgs:P(_),paginationTotal:(c=O.pagination)==null?void 0:c.total,paginationOffset:(h=O.pagination)==null?void 0:h.offset,paginationHasMore:(u=O.pagination)==null?void 0:u.hasMore}),i!=null&&i.silent&&_.length===p.length&&_.every((C,R)=>{const N=p[R];return N&&C.type===N.type&&C.timestamp===N.timestamp&&C.content===N.content})){Je.message("fetchMessages → silent skip (no change)",{count:_.length}),t({isLoading:!1});return}Je.message("DEDUP fetchMessages → setting messages",{serverCount:O.messages.length,reconciledCount:_.length,reconciledTypes:_.map(T=>T.type),isStreaming:Ce.getState().isStreaming,segCount:Ce.getState().streamingSegments.length}),t({messages:_,pagination:O.pagination,lastAgentCommand:O.lastAgentCommand??null,isLoading:!1})}catch(O){if(i!=null&&i.silent)return;const p=O instanceof Gr?O.message:we.t("notification:message.loadError");t({error:p,isLoading:!1})}},fetchMoreMessages:async()=>{const r=e(),{currentProjectSlug:n,currentSessionId:i,pagination:s,messages:a,isLoadingMore:o}=r;if(!(!n||!i||!(s!=null&&s.hasMore)||o)){t({isLoadingMore:!0});try{const l=await Js.getMessages(n,i,{limit:s.limit,offset:s.offset+s.limit}),c=[...l.messages,...a];c.sort((h,u)=>new Date(h.timestamp).getTime()-new Date(u.timestamp).getTime()),t({messages:c,pagination:l.pagination,lastAgentCommand:l.lastAgentCommand??e().lastAgentCommand,isLoadingMore:!1})}catch{t({isLoadingMore:!1})}}},clearMessages:()=>{t({messages:[],currentProjectSlug:null,currentSessionId:null,pagination:null,lastAgentCommand:null,error:null})},addOptimisticMessage:(r,n,i)=>{const s=e(),{messages:a}=s,o=a[a.length-1];if(o!=null&&o._optimistic&&(o==null?void 0:o.type)==="user"&&(o==null?void 0:o.content.trim())===r.trim()&&Date.now()-new Date(o.timestamp).getTime()<1e3)return;const l=r.trim(),c=i??new Date().toISOString(),h=`${s.currentSessionId??""}:${c}:${l}`;let u=n;if(n&&n.length>0&&n.every(p=>p.data)){if(Cu.set(h,n),Cu.size>Nme){const p=Cu.keys().next().value;p&&Cu.delete(p)}}else if(n&&n.length>0&&n.every(p=>!p.data)){const p=Cu.get(h);p&&(u=p)}const O={id:`optimistic-${sn()}`,type:"user",content:l,timestamp:i??new Date().toISOString(),_optimistic:!0,...u&&u.length>0?{images:u}:{}};t({messages:[...a,O]})},addMessages:r=>{r.length!==0&&t(n=>{const i=new Set(n.messages.map(o=>o.id)),s=r.filter(o=>!i.has(o.id));if(Je.message("DEDUP addMessages",{incomingCount:r.length,incomingTypes:r.map(o=>o.type),existingCount:n.messages.length,existingTypes:n.messages.map(o=>o.type),uniqueCount:s.length,duplicateCount:r.length-s.length}),s.length===0)return n;const a=[...n.messages,...s];return a.sort((o,l)=>new Date(o.timestamp).getTime()-new Date(l.timestamp).getTime()),{messages:a}})}})),Si=Wn(t=>({chainItems:[],setChainItems:e=>t({chainItems:e}),clearChainItems:()=>t({chainItems:[]})})),p2=1e3;let kr=null;const pl=new Map,ml=new Map;function ZS(t){return t.type==="text"}function BS(t){return t.type==="thinking"}function FS(t){return t.type==="tool"}function f3(t){return t.type==="system"}function O3(t){return t.type==="interactive"}function p3(t){return t.type==="task_notification"}function m3(t){return t.type==="tool_summary"}function g3(t){return t.type==="result_error"}const Ce=Wn((t,e)=>({isStreaming:!1,streamingSessionId:null,streamingMessageId:null,streamingSegments:[],streamingStartedAt:null,lastResultError:null,selectedModel:"",activeModel:null,thinkingExpanded:!1,isCompacting:!1,isSessionLocked:!1,segmentsPendingClear:!1,streamCompletedAt:null,streamCompleteCount:0,projectSettings:null,permissionMode:(()=>{const r=Kt.getState().preferences;return r.permissionMode==="latest"?r.lastPermissionMode??"default":r.permissionMode??"default"})(),contextUsage:null,subscriptionRateLimit:null,apiHealth:null,setStreaming:r=>t({isStreaming:r}),sendMessage:(r,n)=>{const i=$t(),{workingDirectory:s,sessionId:a,resume:o,attachments:l}=n,c=nt.getState();Je.state("sendMessage",{content:r.slice(0,50),sessionId:a,resume:o,currentMsgCount:c.messages.length,currentMsgTypes:c.messages.map(p=>p.type),segmentCount:e().streamingSegments.length,segmentsPendingClear:e().segmentsPendingClear}),kr&&(clearTimeout(kr),kr=null),e().streamingSegments.length>0&&t({streamingSegments:[]});const h=r.trim()==="/compact";t({isStreaming:!0,isCompacting:h}),kr=setTimeout(()=>{const p=e();p.isStreaming&&p.streamingSegments.length===0&&!p.streamingSessionId&&t({streamingSessionId:a??"pending",streamingMessageId:"pending",streamingSegments:[],streamingStartedAt:new Date}),kr=null},p2);const u=e().projectSettings,O=(u==null?void 0:u.permissionModeOverride)??e().permissionMode;i.emit("chat:send",{content:r,workingDirectory:s,sessionId:a,resume:o,permissionMode:O,...(()=>{const p=Kt.getState().preferences.defaultModel||"",b=(u==null?void 0:u.modelOverride)??p,y=e().selectedModel||b;return y?{model:y}:{}})(),images:l==null?void 0:l.map(p=>({mimeType:p.mimeType,data:p.data,name:p.name}))})},startStreaming:(r,n)=>{Je.state("startStreaming",{sessionId:r,messageId:n,hadDelayTimeout:!!kr,msgCount:nt.getState().messages.length}),kr&&(clearTimeout(kr),kr=null),e().isSessionLocked&&ht.dismiss("session-locked"),t({isStreaming:!0,isSessionLocked:!1,streamingSessionId:r,streamingMessageId:n,streamingSegments:[],streamingStartedAt:new Date,lastResultError:null,segmentsPendingClear:!1,streamCompletedAt:null})},appendStreamingContent:r=>{if(!r)return;const n=e().streamingSegments,i=n[n.length-1];if((i==null?void 0:i.type)==="text"){const s=[...n];s[s.length-1]={type:"text",content:i.content+r},t({streamingSegments:s})}else t({streamingSegments:[...n,{type:"text",content:r}]})},addStreamingThinking:r=>{if(!r)return;const n=e().streamingSegments,i=n[n.length-1];if((i==null?void 0:i.type)==="thinking"){const s=[...n];s[s.length-1]={type:"thinking",content:i.content+r},t({streamingSegments:s})}else t({streamingSegments:[...n,{type:"thinking",content:r}]})},addStreamingToolCall:r=>{const n=e().streamingSegments;if(n.some(a=>a.type==="tool"&&a.toolCall.id===r.id))return;const i=pl.get(r.id);i&&pl.delete(r.id);const s=ml.get(r.id);s&&ml.delete(r.id),t({...e().isCompacting&&{isCompacting:!1},streamingSegments:[...n,{type:"tool",toolCall:{...r,...s&&{input:s},startedAt:r.startedAt??Date.now()},status:"pending",...i&&{permissionId:i,permissionStatus:"waiting"}}]})},updateStreamingToolCallInput:(r,n,i)=>{const s=e().streamingSegments;if(!s.some(l=>l.type==="tool"&&l.toolCall.id===r)){i&&ml.set(r,n);return}const o=s.map(l=>l.type==="tool"&&l.toolCall.id===r?{...l,toolCall:{...l.toolCall,input:n}}:l);t({streamingSegments:o})},updateStreamingToolCall:(r,n,i)=>{const a=e().streamingSegments.map(o=>{if(o.type!=="tool"||o.toolCall.id!==r)return o;const l=o.toolCall.startedAt?Date.now()-o.toolCall.startedAt:void 0;return{...o,toolCall:{...o.toolCall,output:n,duration:l},status:i?"error":"completed",...o.permissionStatus==="waiting"&&{permissionStatus:i?"denied":"approved"}}});t({streamingSegments:a})},completeStreaming:()=>{var c,h,u,O;const r=e();Je.state("completeStreaming",{sessionId:r.streamingSessionId,messageId:r.streamingMessageId,segmentCount:r.streamingSegments.length,segmentTypes:r.streamingSegments.map(p=>p.type),msgCount:nt.getState().messages.length}),pl.clear(),ml.clear(),kr&&(clearTimeout(kr),kr=null);const n=[];let i;const s=nt.getState().messages;let a=r.streamingStartedAt?new Date(r.streamingStartedAt).getTime():Date.now();for(let p=s.length-1;p>=0;p--)if(s[p].type==="user"){a=new Date(s[p].timestamp).getTime();break}let o=1;const l=()=>new Date(a+o++).toISOString();for(const p of r.streamingSegments)if(p.type==="thinking")i&&r.streamingMessageId&&n.push({id:`${r.streamingMessageId}-thinking-${n.length}`,type:"assistant",content:"",timestamp:l(),thinking:i}),i=p.content;else if(p.type==="text")n.push({id:`${r.streamingMessageId}-text-${n.length}`,type:"assistant",content:p.content,timestamp:l(),thinking:i}),i=void 0;else if(p.type==="tool")n.push({id:`${r.streamingMessageId}-tool-${p.toolCall.id}`,type:"tool_use",content:`Calling ${p.toolCall.name}`,timestamp:l(),toolName:p.toolCall.name,toolInput:p.toolCall.input,thinking:i,...p.status!=="pending"&&p.toolCall.output&&{toolResult:{success:p.status==="completed",output:p.status==="completed"?p.toolCall.output:void 0,error:p.status==="error"?p.toolCall.output:void 0}}}),i=void 0;else if(p.type==="interactive"){const b=((c=p.toolCall)==null?void 0:c.id)||p.id;let y;p.status==="responded"&&p.response&&(typeof p.response=="string"?y=p.response:Array.isArray(p.response)?y=p.response.join(", "):typeof p.response=="object"&&(y=Object.values(p.response).flat().join(", "))),n.push({id:`${r.streamingMessageId}-tool-${b}`,type:"tool_use",content:`Calling ${((h=p.toolCall)==null?void 0:h.name)||"AskUserQuestion"}`,timestamp:l(),toolName:((u=p.toolCall)==null?void 0:u.name)||"AskUserQuestion",toolInput:(O=p.toolCall)==null?void 0:O.input,thinking:i,...y&&{toolResult:{success:!0,output:y}}}),i=void 0}if(i&&r.streamingMessageId&&n.push({id:`${r.streamingMessageId}-thinking`,type:"assistant",content:"",timestamp:l(),thinking:i}),n.length>0){const b=nt.getState().messages;let y=-1;for(let g=b.length-1;g>=0;g--)if(b[g].type==="user"){y=g;break}Je.state("DEDUP completeStreaming → safety net trim",{existingCount:b.length,existingTypes:b.map(g=>g.type),lastUserIdx:y,willTrim:y>=0&&y<b.length-1,convertedCount:n.length,convertedTypes:n.map(g=>g.type)}),y>=0&&y<b.length-1&&nt.setState({messages:b.slice(0,y+1)}),nt.getState().addMessages(n),Je.state("DEDUP completeStreaming → after addMessages",{totalMsgCount:nt.getState().messages.length,totalMsgTypes:nt.getState().messages.map(g=>g.type)}),Je.state("completeStreaming → converted segments to messages",{messageCount:n.length,messageTypes:n.map(g=>g.type),totalMsgCount:nt.getState().messages.length})}t({isStreaming:!1,isCompacting:!1,streamingSessionId:null,streamingMessageId:null,streamingStartedAt:null,streamingSegments:[],segmentsPendingClear:!1,streamCompletedAt:Date.now(),streamCompleteCount:e().streamCompleteCount+1})},abortStreaming:()=>{const r=e();Je.state("abortStreaming",{sessionId:r.streamingSessionId,segmentCount:r.streamingSegments.length,msgCount:nt.getState().messages.length}),pl.clear(),ml.clear(),kr&&(clearTimeout(kr),kr=null),t({isStreaming:!1,isCompacting:!1,streamingSessionId:null,streamingMessageId:null,streamingSegments:[],streamingStartedAt:null,segmentsPendingClear:!1,streamCompletedAt:Date.now()})},abortResponse:()=>{const r=e();if(!r.isStreaming)return;pl.clear(),ml.clear(),kr&&(clearTimeout(kr),kr=null),$t().emit("chat:abort"),Si.getState().clearChainItems();const i=r.streamingSegments.map(o=>o.type==="tool"&&o.status==="pending"?{...o,status:"error",toolCall:{...o.toolCall,output:we.t("notification:chat.aborted")}}:o),s=[];let a;for(const o of i)o.type==="thinking"?(a&&r.streamingMessageId&&s.push({id:`${r.streamingMessageId}-thinking-${s.length}`,type:"assistant",content:"",timestamp:new Date().toISOString(),thinking:a}),a=o.content):o.type==="text"?(s.push({id:`${r.streamingMessageId}-text-${s.length}`,type:"assistant",content:o.content,timestamp:new Date().toISOString(),thinking:a}),a=void 0):o.type==="tool"&&(s.push({id:`${r.streamingMessageId}-tool-${o.toolCall.id}`,type:"tool_use",content:`Calling ${o.toolCall.name}`,timestamp:new Date().toISOString(),toolName:o.toolCall.name,toolInput:o.toolCall.input,thinking:a,...o.status!=="pending"&&o.toolCall.output&&{toolResult:{success:o.status==="completed",output:o.status==="completed"?o.toolCall.output:void 0,error:o.status==="error"?o.toolCall.output:void 0}}}),a=void 0);a&&r.streamingMessageId&&s.push({id:`${r.streamingMessageId}-thinking`,type:"assistant",content:"",timestamp:new Date().toISOString(),thinking:a}),s.length>0&&(nt.getState().addMessages(s),Je.state("abortResponse → converted partial segments to messages",{messageCount:s.length,messageTypes:s.map(o=>o.type)})),t({isStreaming:!1,streamingSessionId:null,streamingMessageId:null,streamingSegments:[],streamingStartedAt:null,segmentsPendingClear:!1,streamCompletedAt:Date.now()})},setPermissionMode:r=>{if(t({permissionMode:r}),Kt.getState().updatePreference("lastPermissionMode",r),(Kt.getState().preferences.permissionSyncPolicy==="always"?"always":"streaming")==="streaming"&&!e().isStreaming)return;const s=$t(),a=nt.getState().currentProjectSlug??void 0;s.emit("permission:mode-change",{mode:r,projectSlug:a})},setContextUsage:r=>t({contextUsage:r}),resetContextUsage:()=>t({contextUsage:null}),setSubscriptionRateLimit:r=>t({subscriptionRateLimit:r}),setApiHealth:r=>t({apiHealth:r}),clearStreamingSegments:()=>{const r=e();Je.state("clearStreamingSegments",{clearedSegmentCount:r.streamingSegments.length,segmentTypes:r.streamingSegments.map(n=>n.type),msgCount:nt.getState().messages.length,isStreaming:r.isStreaming,wasPending:r.segmentsPendingClear}),pl.clear(),ml.clear(),t({streamingSegments:[],segmentsPendingClear:!1})},updateStreamingSessionId:r=>t({streamingSessionId:r}),addSystemSegment:(r,n="compact")=>{const i=e().streamingSegments;t({streamingSegments:[...i,{type:"system",subtype:n,message:r}]})},addInteractiveSegment:r=>{const n=e().streamingSegments;n.some(i=>i.type==="interactive"&&i.id===r.id)||t({streamingSegments:[...n,{type:"interactive",id:r.id,interactionType:r.interactionType,toolCall:r.toolCall,choices:r.choices,questions:r.questions,multiSelect:r.multiSelect,status:"waiting"}]})},setToolPermission:(r,n)=>{const i=e().streamingSegments,s=i.findIndex(l=>l.type==="tool"&&l.toolCall.id===r);if(Je.state("setToolPermission",{toolCallId:r,permissionId:n,foundIdx:s,segmentToolIds:i.filter(l=>l.type==="tool").map(l=>l.toolCall.id)}),s===-1){pl.set(r,n);return}const a=[...i],o=a[s];o.type==="tool"&&(a[s]={...o,permissionId:n,permissionStatus:"waiting"},t({streamingSegments:a}))},respondToolPermission:(r,n)=>{const i=$t(),s=e().streamingSegments,a=s.findIndex(c=>c.type==="tool"&&c.toolCall.id===r);if(a===-1)return;const o=s[a];if(o.type!=="tool"||!o.permissionId)return;i.emit("permission:respond",{requestId:o.permissionId,approved:n,interactionType:"permission"});const l=[...s];l[a]={...o,permissionStatus:n?"approved":"denied"},t({streamingSegments:l})},respondToInteractive:(r,n)=>{const i=$t(),s=e().streamingSegments,a=s.findIndex(u=>u.type==="interactive"&&u.id===r);if(a===-1)return;const o=s[a];if(o.type!=="interactive")return;const l=[...s];if(l[a]={...o,status:"sending"},t({streamingSegments:l}),!i.connected){const u=[...e().streamingSegments],O=u[a];(O==null?void 0:O.type)==="interactive"&&(u[a]={...O,status:"error",errorMessage:we.t("notification:streaming.disconnectedRetry")},t({streamingSegments:u}));return}i.emit("permission:respond",{requestId:r,approved:n.approved,interactionType:o.interactionType,response:n.value});const c=[...e().streamingSegments],h=c[a];(h==null?void 0:h.type)==="interactive"&&(c[a]={...h,status:"responded",response:n.value??(n.approved?we.t("chat:interactive.approved"):we.t("chat:interactive.rejected"))},t({streamingSegments:c}))},updateToolProgress:(r,n)=>{const s=e().streamingSegments.map(a=>{if(a.type!=="tool"||a.toolCall.id!==r)return a;const o=Date.now()-n*1e3;return{...a,toolCall:{...a.toolCall,startedAt:o}}});t({streamingSegments:s})},addTaskNotification:r=>{const n=e().streamingSegments;t({streamingSegments:[...n,{type:"task_notification",taskId:r.taskId,status:r.status,outputFile:r.outputFile,summary:r.summary,toolUseId:r.toolUseId}]})},addToolSummary:(r,n)=>{const i=e().streamingSegments;t({streamingSegments:[...i,{type:"tool_summary",summary:r,precedingToolUseIds:n}]})},startStreamingDelay:r=>{kr&&clearTimeout(kr),t({isStreaming:!0}),kr=setTimeout(()=>{const n=e();n.isStreaming&&n.streamingSegments.length===0&&!n.streamingSessionId&&t({streamingSessionId:r??"pending",streamingMessageId:"pending",streamingSegments:[],streamingStartedAt:new Date}),kr=null},p2)},restoreStreaming:r=>{Je.state("DEDUP restoreStreaming called",{sessionId:r,prevSessionId:e().streamingSessionId,prevIsStreaming:e().isStreaming,prevSegmentCount:e().streamingSegments.length,msgCount:nt.getState().messages.length,msgTypes:nt.getState().messages.map(n=>n.type)}),Je.state("restoreStreaming",{sessionId:r,prevSessionId:e().streamingSessionId,prevSegmentCount:e().streamingSegments.length,msgCount:nt.getState().messages.length}),kr&&(clearTimeout(kr),kr=null),e().isSessionLocked&&ht.dismiss("session-locked"),t({isStreaming:!0,isSessionLocked:!1,streamingSessionId:r,streamingMessageId:"restoring",streamingSegments:[],streamingStartedAt:new Date,lastResultError:null,segmentsPendingClear:!1})},setSelectedModel:r=>t({selectedModel:r}),resetSelectedModel:()=>{const r=e().projectSettings,n=Kt.getState().preferences.defaultModel||"",i=(r==null?void 0:r.modelOverride)??n;t({selectedModel:i})},resetPermissionMode:()=>{const r=e().projectSettings;if(r!=null&&r.permissionModeOverride){t({permissionMode:r.permissionModeOverride});return}const n=Kt.getState().preferences;if(n.permissionMode==="latest"){const i=n.lastPermissionMode??e().permissionMode;t({permissionMode:i})}else t({permissionMode:n.permissionMode??"default"})},setActiveModel:r=>t({activeModel:r}),toggleThinkingExpanded:()=>t(r=>({thinkingExpanded:!r.thinkingExpanded})),setProjectSettings:r=>t({projectSettings:r}),addResultError:r=>{const n=e().streamingSegments;t({lastResultError:r,streamingSegments:[...n,{type:"result_error",subtype:r.subtype,errors:r.errors,totalCostUSD:r.totalCostUSD,numTurns:r.numTurns,result:r.result}]})}})),Dme=Object.freeze(Object.defineProperty({__proto__:null,isInteractiveSegment:O3,isResultErrorSegment:g3,isSystemSegment:f3,isTaskNotificationSegment:p3,isTextSegment:ZS,isThinkingSegment:BS,isToolSegment:FS,isToolSummarySegment:m3,useChatStore:Ce},Symbol.toStringTag,{value:"Module"}));function Lme(t){const{isRunning:e,isPaused:r,isStarting:n,isCompleted:i,currentIndex:s,totalItems:a,lockedSessionId:o,pauseReason:l,completedItems:c,errorItem:h,itemSessionIds:u}=ii(s1(Q=>({isRunning:Q.isRunning,isPaused:Q.isPaused,isStarting:Q.isStarting,isCompleted:Q.isCompleted,currentIndex:Q.currentIndex,totalItems:Q.totalItems,lockedSessionId:Q.lockedSessionId,pauseReason:Q.pauseReason,completedItems:Q.completedItems,errorItem:Q.errorItem,itemSessionIds:Q.itemSessionIds})));k.useEffect(()=>{const Q=$t(),{handleProgress:_,handleItemComplete:P,handleError:T,handleItemsUpdated:C,syncFromStatus:R}=ii.getState();Q.emit("project:join",t);const N=W=>_(W),A=W=>P(W),X=W=>T(W),I=W=>C(W);return Q.on("queue:progress",N),Q.on("queue:itemComplete",A),Q.on("queue:error",X),Q.on("queue:itemsUpdated",I),zn.getStatus(t).then(W=>{R(W)}).catch(()=>{}),()=>{Q.off("queue:progress",N),Q.off("queue:itemComplete",A),Q.off("queue:error",X),Q.off("queue:itemsUpdated",I),Q.emit("project:leave",t),ii.getState().reset()}},[t]);const O=k.useCallback((Q,_)=>{const P=$t(),T=Ce.getState().permissionMode;ii.getState().setStarting(!0),P.emit("queue:start",{items:Q,sessionId:_,projectSlug:t,permissionMode:T})},[t]),p=k.useCallback(()=>{$t().emit("queue:pause",{projectSlug:t})},[t]),b=k.useCallback(()=>{$t().emit("queue:resume",{projectSlug:t})},[t]),y=k.useCallback(()=>{$t().emit("queue:abort",{projectSlug:t}),ii.getState().reset()},[t]),g=k.useCallback(()=>{$t().emit("queue:dismiss",{projectSlug:t}),ii.getState().reset()},[t]),x=k.useCallback(Q=>{$t().emit("queue:removeItem",{projectSlug:t,itemIndex:Q})},[t]),v=k.useCallback(Q=>{$t().emit("queue:addItem",{projectSlug:t,rawLine:Q})},[t]),w=k.useCallback(Q=>{ii.getState().optimisticReorder(Q,t),$t().emit("queue:reorderItems",{projectSlug:t,newOrder:Q})},[t]);return{isRunning:e,isPaused:r,isStarting:n,isCompleted:i,progress:{current:s,total:a},lockedSessionId:o,pauseReason:l,completedItems:c,errorItem:h,itemSessionIds:u,start:O,pause:p,resume:b,abort:y,removeItem:x,addItem:v,reorderItems:w,dismiss:g}}function Mn(t){return`Minified Redux error #${t}; visit https://redux.js.org/Errors?code=${t} for the full message or use the non-minified dev environment for full errors. `}var Ime=typeof Symbol=="function"&&Symbol.observable||"@@observable",m2=Ime,g2=()=>Math.random().toString(36).substring(7).split("").join("."),Mme={INIT:`@@redux/INIT${g2()}`,REPLACE:`@@redux/REPLACE${g2()}`},b2=Mme;function zme(t){if(typeof t!="object"||t===null)return!1;let e=t;for(;Object.getPrototypeOf(e)!==null;)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e||Object.getPrototypeOf(t)===null}function b3(t,e,r){if(typeof t!="function")throw new Error(Mn(2));if(typeof e=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(Mn(0));if(typeof e=="function"&&typeof r>"u"&&(r=e,e=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Mn(1));return r(b3)(t,e)}let n=t,i=e,s=new Map,a=s,o=0,l=!1;function c(){a===s&&(a=new Map,s.forEach((g,x)=>{a.set(x,g)}))}function h(){if(l)throw new Error(Mn(3));return i}function u(g){if(typeof g!="function")throw new Error(Mn(4));if(l)throw new Error(Mn(5));let x=!0;c();const v=o++;return a.set(v,g),function(){if(x){if(l)throw new Error(Mn(6));x=!1,c(),a.delete(v),s=null}}}function O(g){if(!zme(g))throw new Error(Mn(7));if(typeof g.type>"u")throw new Error(Mn(8));if(typeof g.type!="string")throw new Error(Mn(17));if(l)throw new Error(Mn(9));try{l=!0,i=n(i,g)}finally{l=!1}return(s=a).forEach(v=>{v()}),g}function p(g){if(typeof g!="function")throw new Error(Mn(10));n=g,O({type:b2.REPLACE})}function b(){const g=u;return{subscribe(x){if(typeof x!="object"||x===null)throw new Error(Mn(11));function v(){const Q=x;Q.next&&Q.next(h())}return v(),{unsubscribe:g(v)}},[m2](){return this}}}return O({type:b2.INIT}),{dispatch:O,subscribe:u,getState:h,replaceReducer:p,[m2]:b}}function x2(t,e){return function(...r){return e(t.apply(this,r))}}function y2(t,e){if(typeof t=="function")return x2(t,e);if(typeof t!="object"||t===null)throw new Error(Mn(16));const r={};for(const n in t){const i=t[n];typeof i=="function"&&(r[n]=x2(i,e))}return r}function x3(...t){return t.length===0?e=>e:t.length===1?t[0]:t.reduce((e,r)=>(...n)=>e(r(...n)))}function qme(...t){return e=>(r,n)=>{const i=e(r,n);let s=()=>{throw new Error(Mn(15))};const a={getState:i.getState,dispatch:(l,...c)=>s(l,...c)},o=t.map(l=>l(a));return s=x3(...o)(i.dispatch),{...i,dispatch:s}}}var hy={exports:{}},fy={};/**
|
|
859
859
|
* @license React
|
|
@@ -1056,7 +1056,7 @@ ${t("issue.typeLabel")} ${H.issueType||t("promote.none")}
|
|
|
1056
1056
|
${t("workflow.issueFileLabel")} ${re}
|
|
1057
1057
|
${t("workflow.reviewFileLabel")} ${me}
|
|
1058
1058
|
|
|
1059
|
-
${t("workflow.issueQAOutro")}`}else ae=`*review ${H.id.replace(/^story-/,"")}`;const he=new URLSearchParams({agent:ue,task:ae});r(`/project/${e}/session/${te}?${he.toString()}`)},[e,r,t]),le=k.useCallback(H=>{const ue=Object.values(o).flat().filter(ae=>ae.type==="story"&&ae.epicNumber===H.epicNumber);C({epic:H,stories:ue})},[o]),Z=k.useCallback(H=>{if(H.type==="issue"){P(H);return}if(H.type==="epic"){le(H);return}!e||!H.filePath||mn.getState().openFileInEditor(e,H.filePath)},[e,le]),V={onQuickFix:W,onPromote:Y,onEdit:ne,onClose:B,onReopen:D,onDelete:M,onWorkflowAction:U,onValidateAndFixAction:J,onValidateOnlyAction:z,onViewEpicStories:le,onRequestQAReview:ce,onIssueStatusChange:E,onCardClick:Z};return s&&l.length===0?d.jsxs("div",{className:"p-4 h-full flex flex-col animate-pulse",children:[d.jsxs("div",{className:"flex items-center justify-between mb-4 flex-shrink-0",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("div",{className:"w-9 h-9 bg-gray-200 dark:bg-[#253040] rounded-lg"}),d.jsx("div",{className:"w-9 h-9 bg-gray-200 dark:bg-[#253040] rounded-lg"})]}),d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("div",{className:"w-9 h-9 bg-gray-200 dark:bg-[#253040] rounded-lg"}),d.jsx("div",{className:"h-8 w-20 bg-blue-200 dark:bg-blue-900/30 rounded-lg"})]})]}),d.jsx("div",{className:"flex-1 flex gap-4 overflow-hidden",children:Array.from({length:g?1:4}).map((H,te)=>d.jsxs("div",{className:"flex-shrink-0 w-72 space-y-3",children:[d.jsxs("div",{className:"flex items-center gap-2 p-2",children:[d.jsx("div",{className:"w-3 h-3 rounded-full bg-gray-300 dark:bg-gray-600"}),d.jsx("div",{className:"h-4 w-20 bg-gray-200 dark:bg-[#253040] rounded"}),d.jsx("div",{className:"h-4 w-6 bg-gray-200 dark:bg-[#253040] rounded-full"})]}),Array.from({length:2}).map((ue,ae)=>d.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-[#263240] rounded-lg border border-gray-200 dark:border-[#253040] space-y-2",children:[d.jsx("div",{className:"h-4 w-3/4 bg-gray-200 dark:bg-[#253040] rounded"}),d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("div",{className:"h-3 w-12 bg-gray-200 dark:bg-[#253040] rounded-full"}),d.jsx("div",{className:"h-3 w-16 bg-gray-200 dark:bg-[#253040] rounded"})]})]},ae))]},te))})]}):a&&l.length===0?d.jsxs("div",{className:"p-4 flex flex-col items-center justify-center min-h-[300px] text-center",children:[d.jsx(Ri,{className:"w-12 h-12 text-red-400 mb-4"}),d.jsx("p",{className:"text-red-600 dark:text-red-400 mb-4",children:a}),d.jsxs("button",{onClick:y,className:"px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg flex items-center gap-2 transition-colors",children:[d.jsx(Ir,{className:"w-4 h-4"}),t("common:button.retry")]})]}):l.length===0?d.jsxs("div",{className:"p-4 flex flex-col items-center justify-center min-h-[300px] text-center",children:[d.jsx(Dv,{className:"w-12 h-12 text-gray-400 dark:text-gray-500 mb-4"}),d.jsx("p",{className:"text-gray-500 dark:text-gray-300 mb-4",children:t("empty.message")}),d.jsxs("button",{onClick:()=>v(!0),className:"px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg flex items-center gap-2 transition-colors",children:[d.jsx(Qr,{className:"w-4 h-4"}),t("issue.add")]}),d.jsx(TR,{open:x,onClose:()=>v(!1),onSubmit:I})]}):d.jsxs("div",{className:"p-4 h-full flex flex-col",children:[d.jsxs("div",{className:"flex items-center justify-between mb-4 flex-shrink-0",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("button",{onClick:()=>h("kanban"),className:`p-2 rounded-lg transition-colors ${n==="kanban"?"bg-blue-100 text-blue-600 dark:bg-blue-900/30 dark:text-blue-400":"text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040]"}`,"aria-label":t("view.kanban"),"aria-pressed":n==="kanban",children:d.jsx(Dv,{className:"w-5 h-5"})}),d.jsx("button",{onClick:()=>h("list"),className:`p-2 rounded-lg transition-colors ${n==="list"?"bg-blue-100 text-blue-600 dark:bg-blue-900/30 dark:text-blue-400":"text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040]"}`,"aria-label":t("view.list"),"aria-pressed":n==="list",children:d.jsx(cre,{className:"w-5 h-5"})}),n==="kanban"&&!g&&d.jsxs("div",{className:"flex items-center gap-1 ml-2 border-l border-gray-200 dark:border-[#253040] pl-2",children:[d.jsx("button",{onClick:()=>u(i-1),disabled:i<=2,className:"p-1 rounded text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040] disabled:opacity-30 disabled:cursor-not-allowed transition-colors","aria-label":t("view.lessColumns"),children:d.jsx(_h,{className:"w-4 h-4"})}),d.jsx("span",{className:"text-xs font-medium text-gray-600 dark:text-gray-300 min-w-[1.5rem] text-center tabular-nums",children:i}),d.jsx("button",{onClick:()=>u(i+1),disabled:i>=c.columns.length,className:"p-1 rounded text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040] disabled:opacity-30 disabled:cursor-not-allowed transition-colors","aria-label":t("view.moreColumns"),children:d.jsx(Qr,{className:"w-4 h-4"})})]})]}),d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("button",{onClick:()=>N(!0),className:"p-2 rounded-lg text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040] transition-colors","aria-label":t("config.title"),children:d.jsx(sa,{className:"w-5 h-5"})}),d.jsxs("button",{onClick:()=>v(!0),className:"px-3 py-1.5 bg-blue-500 hover:bg-blue-600 text-white rounded-lg flex items-center gap-1.5 text-sm transition-colors",children:[d.jsx(Qr,{className:"w-4 h-4"}),t("issue.add")]})]})]}),(a||w)&&d.jsxs("div",{className:"mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg text-red-600 dark:text-red-400 text-sm flex items-center gap-2",children:[d.jsx(Ri,{className:"w-4 h-4 flex-shrink-0"}),w||a]}),d.jsx("div",{className:"flex-1 min-h-0",children:n==="kanban"?g?d.jsx(OSe,{itemsByColumn:o,boardConfig:c,...V}):d.jsx(hSe,{itemsByColumn:o,boardConfig:c,visibleColumns:i,...V}):d.jsx(pSe,{itemsByColumn:o,boardConfig:c,isMobile:g,...V})}),d.jsx(TR,{open:x,onClose:()=>v(!1),onSubmit:I}),d.jsx(vSe,{open:!!_,issue:_,projectSlug:e,onClose:()=>P(null),onSubmit:K}),d.jsx(SSe,{open:!!T,epic:(T==null?void 0:T.epic)??null,stories:(T==null?void 0:T.stories)??[],onClose:()=>C(null)}),d.jsx(wSe,{open:R,config:c,onClose:()=>N(!1),onSave:async H=>{await p(H),N(!1)},onReset:async()=>{await b(),N(!1)}})]})}function QSe(){const{startStreaming:t,appendStreamingContent:e,addStreamingThinking:r,addStreamingToolCall:n,updateStreamingToolCallInput:i,updateStreamingToolCall:s,completeStreaming:a,abortStreaming:o,abortResponse:l,setContextUsage:c,updateStreamingSessionId:h,addInteractiveSegment:u,setToolPermission:O,addSystemSegment:p,updateToolProgress:b,addTaskNotification:y,addToolSummary:g,addResultError:x,restoreStreaming:v}=Ce(),w=k.useRef(new Set),Q=k.useCallback(_=>{if(Ce.getState().isStreaming){if(_.key==="Escape"){_.preventDefault(),l();return}if(_.key==="c"&&(_.ctrlKey||_.metaKey)){const P=window.getSelection();(!P||P.isCollapsed)&&(_.preventDefault(),l())}}},[l]);k.useEffect(()=>{const _=$t();let P=null;const T=1e4;let C="",R=null;const N=()=>{if(R=null,C.length>0){const G=C;C="",e(G)}},A=G=>{C+=G,R===null&&(R=requestAnimationFrame(N))},X=()=>{if(R!==null&&(cancelAnimationFrame(R),R=null),C.length>0){const G=C;C="",e(G)}},I=()=>{C="",R!==null&&(cancelAnimationFrame(R),R=null)},W=G=>{var Ze;if(!G.content)return;const ie=nt.getState().messages,pe=G.content.trim(),Re=[...ie].reverse().find(ge=>ge.type==="user"),Le=Re&&Re.content.trim()===pe;if(Je.stream("DEDUP user:message received",{sessionId:G.sessionId,contentPreview:G.content.slice(0,50),msgCount:ie.length,msgTypes:ie.map(ge=>ge.type),isDuplicate:Le,lastUserContent:(Ze=Re==null?void 0:Re.content)==null?void 0:Ze.slice(0,50),isStreaming:Ce.getState().isStreaming}),Je.message("user:message",{sessionId:G.sessionId,contentPreview:G.content.slice(0,50),msgCount:ie.length,isDuplicate:Le,lastUserMsgId:Re==null?void 0:Re.id}),!Le){const ge=G.imageCount?Array.from({length:G.imageCount},(je,dt)=>({mimeType:"image/jpeg",data:"",name:`image-${dt+1}`})):void 0;nt.getState().addOptimisticMessage(G.content,ge,G.timestamp),Je.stream("DEDUP user:message → added optimistic",{newMsgCount:nt.getState().messages.length})}pe==="/compact"&&Ce.setState({isCompacting:!0}),Ce.getState().isStreaming||Ce.getState().startStreamingDelay(G.sessionId)},Y=G=>{const ie=Ce.getState();(!ie.isStreaming||ie.streamingSessionId===null)&&t("pending","pending"),ie.isCompacting&&Ce.setState({isCompacting:!1}),X(),r(G.content)},ne=G=>{const ie=Ce.getState();if(Je.stream("message:chunk",{sessionId:G.sessionId,messageId:G.messageId,contentLen:G.content.length,isStreaming:ie.isStreaming,streamingSessionId:ie.streamingSessionId,segmentCount:ie.streamingSegments.length}),G.sessionId){if(ie.streamingSessionId&&ie.streamingSessionId!=="pending"&&ie.streamingSessionId!==G.sessionId){Je.stream("chunk dropped: streamingSessionId mismatch",{streaming:ie.streamingSessionId,chunk:G.sessionId});return}if(!ie.isStreaming){const pe=nt.getState().currentSessionId;if(pe&&pe!==G.sessionId){Je.stream("chunk dropped: viewingSessionId mismatch",{viewing:pe,chunk:G.sessionId});return}}}!ie.isStreaming||ie.streamingSessionId===null?t(G.sessionId,G.messageId):ie.streamingSessionId==="pending"&&h(G.sessionId),Ce.getState().isCompacting&&Ce.setState({isCompacting:!1}),K(),A(G.content)},K=()=>{const G=Ce.getState().streamingSegments;if(!G.some(Re=>Re.type==="interactive"&&Re.status==="waiting"))return;const pe=G.map(Re=>Re.type==="interactive"&&Re.status==="waiting"?{...Re,status:"responded",response:we.t("notification:streaming.respondedBeforeReconnect")}:Re);Ce.setState({streamingSegments:pe})},B=async G=>{X();const ie=Ce.getState();if(Je.stream("message:complete",{sessionId:G.sessionId,isStreaming:ie.isStreaming,streamingSessionId:ie.streamingSessionId,segmentCount:ie.streamingSegments.length,msgCount:nt.getState().messages.length,hasUsage:!!G.usage}),G.sessionId){if(ie.streamingSessionId&&ie.streamingSessionId!=="pending"&&ie.streamingSessionId!==G.sessionId){Je.stream("complete dropped: streamingSessionId mismatch",{streaming:ie.streamingSessionId,complete:G.sessionId});return}if(!ie.isStreaming){const pe=nt.getState().currentSessionId;if(pe&&pe!==G.sessionId){Je.stream("complete dropped: viewingSessionId mismatch",{viewing:pe,complete:G.sessionId});return}}}if(G.sessionId&&(!ie.streamingSessionId||ie.streamingSessionId==="pending")&&h(G.sessionId),G.id&&(Ce.setState({streamingMessageId:G.id}),Je.stream("message:complete → set streamingMessageId",{messageId:G.id})),G.usage){Je.stream("usage from message:complete (metadata only)",{contextWindow:G.usage.contextWindow,model:G.usage.model,totalCostUSD:G.usage.totalCostUSD});const pe=Ce.getState().contextUsage;c(pe?{...pe,contextWindow:G.usage.contextWindow,totalCostUSD:G.usage.totalCostUSD,model:G.usage.model??pe.model}:G.usage),G.usage.model&&Ce.getState().setActiveModel(G.usage.model)}Je.stream("DEDUP message:complete → before completeStreaming",{segCount:Ce.getState().streamingSegments.length,segTypes:Ce.getState().streamingSegments.map(pe=>pe.type),msgCount:nt.getState().messages.length,msgTypes:nt.getState().messages.map(pe=>pe.type)}),a(),Je.stream("DEDUP message:complete → after completeStreaming",{msgCount:nt.getState().messages.length,msgTypes:nt.getState().messages.map(pe=>pe.type),isStreaming:Ce.getState().isStreaming,segCount:Ce.getState().streamingSegments.length})},D=G=>{G.name!=="AskUserQuestion"&&(X(),n({id:G.id,name:G.name,input:G.input,startedAt:G.startedAt}))},E=G=>{var ie;if(X(),Je.stream("permission:request received",{permissionId:G.id,toolCallId:G.toolCall.id,toolName:G.toolCall.name,alreadySeen:w.current.has(G.id),segmentCount:Ce.getState().streamingSegments.length,existingToolIds:Ce.getState().streamingSegments.filter(pe=>pe.type==="tool").map(pe=>pe.toolCall.id)}),!w.current.has(G.id)){if(w.current.add(G.id),G.toolCall.name==="AskUserQuestion"&&((ie=G.toolCall.input)!=null&&ie.questions)){const pe=G.toolCall.input.questions;if(pe.length>0){const Re=pe.map(Be=>({question:Be.question,header:Be.header,choices:Be.options.map(Ze=>({label:Ze.label,description:Ze.description,value:Ze.label})),multiSelect:Be.multiSelect})),Le=Re[0];u({id:G.id,interactionType:"question",toolCall:{id:G.toolCall.id,name:G.toolCall.name,input:G.toolCall.input},choices:Le.choices,questions:Re,multiSelect:Le.multiSelect});return}}G.toolCall.input&&i(G.toolCall.id,G.toolCall.input,!0),O(G.toolCall.id,G.id)}},M=G=>{const ie=Ce.getState().streamingSegments;let pe=!1;const Re=ie.map(Le=>{if(G.interactionType==="question"){if(Le.type==="interactive"&&Le.id===G.requestId){pe=!0;let Be;return typeof G.response=="string"?Be=G.response:Array.isArray(G.response)?Be=G.response.join(", "):G.response&&typeof G.response=="object"?Be=Object.values(G.response).flat().join(", "):Be=we.t("notification:streaming.respondedInOtherBrowser"),{...Le,status:"responded",response:Be}}}else if(Le.type==="tool"&&Le.permissionId===G.requestId)return pe=!0,{...Le,permissionStatus:G.approved?"approved":"denied"};return Le});pe&&Ce.setState({streamingSegments:Re})},U=G=>{ht.info(we.t("notification:streaming.alreadyResponded"))},z=G=>{i(G.toolCallId,G.input)},J=G=>{const{success:ie,output:pe,error:Re}=G.result;s(G.toolCallId,pe??Re??"",!ie);const Le=Ce.getState().streamingSegments,Be=Le.findIndex(Ze=>{var ge;return Ze.type==="interactive"&&Ze.status==="waiting"&&((ge=Ze.toolCall)==null?void 0:ge.id)===G.toolCallId});if(Be!==-1){const Ze=[...Le],ge=Ze[Be];ge.type==="interactive"&&(Ze[Be]={...ge,status:"responded",response:we.t("notification:streaming.respondedBeforeReconnect")},Ce.setState({streamingSegments:Ze}))}},ce=G=>{if(X(),Ce.getState().isStreaming||Ce.setState({streamCompletedAt:Date.now()}),G.preTokens>0){const ie=Ce.getState().contextUsage,pe=(ie==null?void 0:ie.contextWindow)??0;c({inputTokens:G.preTokens,outputTokens:(ie==null?void 0:ie.outputTokens)??0,cacheCreationInputTokens:0,cacheReadInputTokens:0,totalCostUSD:(ie==null?void 0:ie.totalCostUSD)??0,contextWindow:pe,model:ie==null?void 0:ie.model})}Ce.setState({isCompacting:!0}),p(`Context compaction (${G.trigger})...`,"compact")},le=G=>{b(G.toolUseId,G.elapsedTimeSeconds)},Z=G=>{X(),y(G)},V=G=>{X(),g(G.summary,G.precedingToolUseIds)},H=G=>{X(),x(G)},te=G=>{const ie=Ce.getState();Je.stream("session:init",{sessionId:G.sessionId,model:G.model,currentStreamingSessionId:ie.streamingSessionId,isStreaming:ie.isStreaming}),ie.streamingSessionId?ie.streamingSessionId==="pending"&&h(G.sessionId):t(G.sessionId,"pending")},ue=G=>{Je.stream("context:usage received",{inputTokens:G.inputTokens,outputTokens:G.outputTokens,cacheCreationInputTokens:G.cacheCreationInputTokens,cacheReadInputTokens:G.cacheReadInputTokens,model:G.model,totalCostUSD:G.totalCostUSD}),G.model&&Ce.getState().setActiveModel(G.model);const ie=Ce.getState().contextUsage;c(ie?{...ie,totalCostUSD:G.totalCostUSD,model:G.model??ie.model,rateLimit:G.rateLimit??ie.rateLimit}:G)},ae=G=>{const ie=G.inputTokens+G.cacheCreationInputTokens+G.cacheReadInputTokens;Je.stream("assistant:usage received",{inputTokens:G.inputTokens,cacheCreationInputTokens:G.cacheCreationInputTokens,cacheReadInputTokens:G.cacheReadInputTokens,totalContext:ie});const pe=Ce.getState().contextUsage;c({inputTokens:G.inputTokens,outputTokens:G.outputTokens,cacheCreationInputTokens:G.cacheCreationInputTokens,cacheReadInputTokens:G.cacheReadInputTokens,totalCostUSD:(pe==null?void 0:pe.totalCostUSD)??0,contextWindow:(pe==null?void 0:pe.contextWindow)??0,model:pe==null?void 0:pe.model})},he=G=>{Je.stream("context:estimate received",G);const ie=Ce.getState().contextUsage,pe=ie?ie.inputTokens+ie.cacheCreationInputTokens+ie.cacheReadInputTokens:0;G.estimatedTokens>pe&&c({inputTokens:G.estimatedTokens,outputTokens:(ie==null?void 0:ie.outputTokens)??0,cacheCreationInputTokens:0,cacheReadInputTokens:0,totalCostUSD:(ie==null?void 0:ie.totalCostUSD)??0,contextWindow:G.contextWindow,model:ie==null?void 0:ie.model})},re=G=>{const ie=Ce.getState();if(Je.stream("stream:status",{active:G.active,sessionId:G.sessionId,isStreaming:ie.isStreaming,streamingSessionId:ie.streamingSessionId,segmentCount:ie.streamingSegments.length,hadTimeout:!!P,msgCount:nt.getState().messages.length}),P&&(clearTimeout(P),P=null),G.active)w.current.clear(),I(),Je.stream("DEDUP stream:status ACTIVE → before restoreStreaming",{sessionId:G.sessionId,msgCount:nt.getState().messages.length,msgTypes:nt.getState().messages.map(pe=>pe.type),prevIsStreaming:ie.isStreaming,prevSegCount:ie.streamingSegments.length}),v(G.sessionId),G.permissionMode&&Ce.setState({permissionMode:G.permissionMode}),Qe(),Je.stream("DEDUP stream:status ACTIVE → after trim",{msgCount:nt.getState().messages.length,msgTypes:nt.getState().messages.map(pe=>pe.type)}),Je.stream("stream:status → restored",{sessionId:G.sessionId});else if(G.permissionMode&&Ce.setState({permissionMode:G.permissionMode}),ie.isStreaming){const pe=ie.streamingSegments.length>0;X(),Je.stream("stream:status → completing stale stream",{sessionId:G.sessionId,hadSegments:pe}),a();const Re=nt.getState(),{currentProjectSlug:Le,currentSessionId:Be}=Re;Le&&Be&&(Je.stream("stream:status → fetching messages after stale stream completion",{projectSlug:Le,sessionId:Be,hadSegments:pe}),Re.fetchMessages(Le,Be,{silent:!0,force:!0}))}else Je.stream("stream:status → inactive, no-op (not streaming)")},Qe=()=>{const G=nt.getState().messages;let ie=-1;for(let pe=G.length-1;pe>=0;pe--)if(G[pe].type==="user"){ie=pe;break}ie>=0&&ie<G.length-1&&nt.setState({messages:G.slice(0,ie+1)})},me=G=>{const ie=Ce.getState().isStreaming;Je.stream("stream:detached",{reason:G.reason,isStreaming:ie}),ie&&(X(),a()),G.reason==="user-abort"?ie&&ht.info(we.t("notification:streaming.abortedInOtherBrowser")):(Ce.setState({isSessionLocked:!0}),ht.warning(we.t("notification:streaming.sessionInUseWarning"),{id:"session-locked",duration:1/0}));const pe=nt.getState(),{currentProjectSlug:Re,currentSessionId:Le}=pe;Re&&Le&&setTimeout(()=>{nt.getState().fetchMessages(Re,Le,{silent:!0})},1e3)},xe=()=>{const G=Ce.getState();Je.reconnect("disconnect",{isStreaming:G.isStreaming,streamingSessionId:G.streamingSessionId,segmentCount:G.streamingSegments.length,msgCount:nt.getState().messages.length})},ft=()=>{const G=Ce.getState();if(Je.reconnect("connect (reconnect handler)",{isStreaming:G.isStreaming,streamingSessionId:G.streamingSessionId,segmentCount:G.streamingSegments.length,msgCount:nt.getState().messages.length}),!G.isStreaming)return;const ie=G.streamingSessionId||nt.getState().currentSessionId;if(ie&&ie!=="pending"){const pe=nt.getState().currentProjectSlug;Je.reconnect("session:join emitted",{sessionId:ie,projectSlug:pe}),_.emit("session:join",ie,pe??void 0),P=setTimeout(()=>{P=null,Je.reconnect("timeout fired (10s)",{isStreaming:Ce.getState().isStreaming,sessionId:ie}),Ce.getState().isStreaming&&re({active:!1,sessionId:ie})},T)}},St=()=>{Je.reconnect("reconnect_failed",{isStreaming:Ce.getState().isStreaming}),Ce.getState().isStreaming&&(I(),o())},bt=G=>{const ie=Ce.getState().isStreaming;Je.socket("error",{isStreaming:ie,data:G}),I(),o()},It=G=>{var lt,gt,Et,ir;if(G.sessionId){const xt=Ce.getState().streamingSessionId||nt.getState().currentSessionId;if(xt&&xt!==G.sessionId){Je.stream("stream:buffer-replay dropped: session mismatch",{replay:G.sessionId,current:xt}),Ce.getState().streamingMessageId==="restoring"&&Ce.setState({streamingMessageId:null});return}}if(!G.events||G.events.length===0){Ce.getState().streamingMessageId==="restoring"&&Ce.setState({streamingMessageId:null});return}Je.stream("stream:buffer-replay received",{eventCount:G.events.length,sessionId:G.sessionId});const ie=[];let pe=G.sessionId??Ce.getState().streamingSessionId??null,Re=null;const Le={inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,totalCostUSD:0,contextWindow:0};let Be=null,Ze=null,ge=!1,je="";const dt=new Set,it=[];let tt=0,Xt=null;const rr=()=>{if(je.length>0){const xt=ie[ie.length-1];xt&&xt.type==="text"?xt.content+=je:ie.push({type:"text",content:je}),je=""}},br=xt=>{for(let Gt=ie.length-1;Gt>=0;Gt--){const Pt=ie[Gt];if(Pt.type==="tool"&&Pt.toolCall.id===xt)return{seg:Pt,idx:Gt}}return null},Er=()=>{var Se,Fe,Qt,cr;rr();let xt;const Gt=Date.now();let Pt=it.length;for(const yt of ie){const Mr=new Date(Gt+Pt++).toISOString();if(yt.type==="thinking")xt&&Re&&it.push({id:`${Re}-thinking-${it.length}`,type:"assistant",content:"",timestamp:Mr,thinking:xt}),xt=yt.content;else if(yt.type==="text")it.push({id:`${Re}-text-${it.length}`,type:"assistant",content:yt.content,timestamp:Mr,thinking:xt}),xt=void 0;else if(yt.type==="tool")it.push({id:`${Re}-tool-${yt.toolCall.id}`,type:"tool_use",content:`Calling ${yt.toolCall.name}`,timestamp:Mr,toolName:yt.toolCall.name,toolInput:yt.toolCall.input,thinking:xt,...yt.status!=="pending"&&yt.toolCall.output!==void 0&&{toolResult:{success:yt.status==="completed",output:yt.status==="completed"?yt.toolCall.output:void 0,error:yt.status==="error"?yt.toolCall.output:void 0}}}),xt=void 0;else if(yt.type==="interactive"){const cn=((Se=yt.toolCall)==null?void 0:Se.id)||yt.id;let Xn;yt.status==="responded"&&yt.response&&(typeof yt.response=="string"?Xn=yt.response:Array.isArray(yt.response)?Xn=yt.response.join(", "):typeof yt.response=="object"&&(Xn=Object.values(yt.response).flat().join(", "))),it.push({id:`${Re}-tool-${cn}`,type:"tool_use",content:`Calling ${((Fe=yt.toolCall)==null?void 0:Fe.name)||"AskUserQuestion"}`,timestamp:Mr,toolName:((Qt=yt.toolCall)==null?void 0:Qt.name)||"AskUserQuestion",toolInput:(cr=yt.toolCall)==null?void 0:cr.input,thinking:xt,...Xn&&{toolResult:{success:!0,output:Xn}}}),xt=void 0}}xt&&Re&&it.push({id:`${Re}-thinking`,type:"assistant",content:"",timestamp:new Date(Gt+Pt++).toISOString(),thinking:xt}),ie.length=0};for(const xt of G.events){const{event:Gt,data:Pt}=xt;switch(Gt){case"user:message":{const Se=Pt;if(!Se.content)break;const Fe=nt.getState().messages,Qt=Se.content.trim(),cr=[...Fe].reverse().find(yt=>yt.type==="user");if(!cr||cr.content.trim()!==Qt){const yt=Se.imageCount?Array.from({length:Se.imageCount},(Mr,cn)=>({mimeType:"image/jpeg",data:"",name:`image-${cn+1}`})):void 0;nt.getState().addOptimisticMessage(Se.content,yt,Se.timestamp)}Qt==="/compact"&&(ge=!0);break}case"session:created":case"session:resumed":{const Se=Pt;pe=Se.sessionId,Se.model&&(Ze=Se.model);break}case"message:chunk":{const Se=Pt;!pe&&Se.sessionId&&(pe=Se.sessionId),!Re&&Se.messageId&&(Re=Se.messageId),ge=!1,je+=Se.content;break}case"thinking:chunk":{const Se=Pt;rr(),ge=!1;const Fe=ie[ie.length-1];Fe&&Fe.type==="thinking"?Fe.content+=Se.content:ie.push({type:"thinking",content:Se.content});break}case"tool:call":{const Se=Pt;if(Se.name==="AskUserQuestion")break;rr(),ie.push({type:"tool",toolCall:{id:Se.id,name:Se.name,input:Se.input,startedAt:Se.startedAt},status:"pending"});break}case"tool:input-update":{const Se=Pt,Fe=br(Se.toolCallId);Fe&&(Fe.seg.toolCall.input={...Fe.seg.toolCall.input,...Se.input});break}case"tool:result":{const Se=Pt,Fe=br(Se.toolCallId);if(Fe){const Qt=Fe.seg;Qt.toolCall.output=Se.result.output??Se.result.error??"",Qt.status=Se.result.success?"completed":"error"}for(const Qt of ie)Qt.type==="interactive"&&Qt.status==="waiting"&&((lt=Qt.toolCall)==null?void 0:lt.id)===Se.toolCallId&&(Qt.status="responded",Qt.response=we.t("notification:streaming.respondedBeforeReconnect"));break}case"permission:request":{const Se=Pt;if(dt.has(Se.id))break;if(dt.add(Se.id),rr(),Se.toolCall.name==="AskUserQuestion"&&((gt=Se.toolCall.input)!=null&>.questions)){const Qt=Se.toolCall.input.questions;if(Qt.length>0){const cr=Qt.map(yt=>({question:yt.question,header:yt.header,choices:yt.options.map(Mr=>({label:Mr.label,description:Mr.description,value:Mr.label})),multiSelect:yt.multiSelect}));ie.push({type:"interactive",id:Se.id,interactionType:"question",toolCall:{id:Se.toolCall.id,name:Se.toolCall.name,input:Se.toolCall.input},choices:cr[0].choices,questions:cr,multiSelect:cr[0].multiSelect,status:"waiting"});break}}if(Se.toolCall.input){const Qt=br(Se.toolCall.id);Qt&&(Qt.seg.toolCall.input={...Qt.seg.toolCall.input,...Se.toolCall.input})}const Fe=br(Se.toolCall.id);Fe&&(Fe.seg.permissionId=Se.id,Fe.seg.permissionStatus="waiting");break}case"permission:resolved":{const Se=Pt;for(const Fe of ie)if(Se.interactionType==="question"&&Fe.type==="interactive"&&Fe.id===Se.requestId){let Qt;typeof Se.response=="string"?Qt=Se.response:Array.isArray(Se.response)?Qt=Se.response.join(", "):Se.response&&typeof Se.response=="object"?Qt=Object.values(Se.response).flat().join(", "):Qt=we.t("notification:streaming.respondedInOtherBrowser"),Fe.status="responded",Fe.response=Qt}else Fe.type==="tool"&&Fe.permissionId===Se.requestId&&(Fe.permissionStatus=Se.approved?"approved":"denied");break}case"system:compact":{const Se=Pt;rr(),ge=!0,ie.push({type:"system",subtype:"compact",message:`Context compaction (${Se.trigger})...`});break}case"tool:summary":{const Se=Pt;rr(),ie.push({type:"tool_summary",summary:Se.summary,precedingToolUseIds:Se.precedingToolUseIds});break}case"system:task-notification":{const Se=Pt;rr(),ie.push({type:"task_notification",...Se});break}case"result:error":{const Se=Pt;rr(),Xt=Se,ie.push({type:"result_error",...Se});break}case"message:complete":{const Se=Pt;if(Se.sessionId&&(pe=Se.sessionId),Se.id&&(Re=Se.id),Se.usage){const Fe=Be??Le;Be={...Fe,contextWindow:Se.usage.contextWindow,totalCostUSD:Se.usage.totalCostUSD,model:Se.usage.model??Fe.model,inputTokens:Se.usage.inputTokens??Fe.inputTokens??0,outputTokens:Se.usage.outputTokens??Fe.outputTokens??0},Se.usage.model&&(Ze=Se.usage.model)}Er(),tt++,Re=null;break}case"context:usage":{const Se=Pt;Se.model&&(Ze=Se.model);const Fe=Be??Le;Be={...Fe,totalCostUSD:Se.totalCostUSD,model:Se.model??Fe.model,rateLimit:Se.rateLimit??Fe.rateLimit};break}case"assistant:usage":{const Se=Pt,Fe=Be??Le;Be={inputTokens:Se.inputTokens,outputTokens:Se.outputTokens,cacheCreationInputTokens:Se.cacheCreationInputTokens,cacheReadInputTokens:Se.cacheReadInputTokens,totalCostUSD:Fe.totalCostUSD,contextWindow:Fe.contextWindow,model:Fe.model};break}case"context:estimate":{const Se=Pt,Fe=Be??Le,Qt=Fe.inputTokens+Fe.cacheCreationInputTokens+Fe.cacheReadInputTokens;Se.estimatedTokens>Qt&&(Be={inputTokens:Se.estimatedTokens,outputTokens:Fe.outputTokens,cacheCreationInputTokens:0,cacheReadInputTokens:0,totalCostUSD:Fe.totalCostUSD,contextWindow:Se.contextWindow,model:Fe.model});break}case"chain:update":{const Se=Pt,Fe=nt.getState().currentSessionId;Fe&&Fe===Se.sessionId&&Si.getState().setChainItems(Se.items);break}}}rr();const xr=it.length>0,jr=ie.length>0;xr&&nt.getState().addMessages(it);const qt={};if(tt>0&&(qt.streamCompleteCount=Ce.getState().streamCompleteCount+tt),jr&&Ce.getState().isStreaming)qt.isStreaming=!0,qt.streamingSessionId=pe,qt.streamingMessageId=Re,qt.streamingSegments=ie,qt.streamingStartedAt=new Date;else if(jr&&!Ce.getState().isStreaming){if(!Re){const xt=((Et=G.events[0])==null?void 0:Et.event)??"",Gt=((ir=G.events[G.events.length-1])==null?void 0:ir.event)??"";Re=`replay-${pe??"unknown"}-${G.events.length}-${xt}-${Gt}`}Er(),it.length>0&&nt.getState().addMessages(it),qt.streamingMessageId=null,qt.streamingSegments=[],qt.streamCompletedAt=Date.now()}else xr?(qt.streamingMessageId=null,qt.streamingSegments=[],qt.streamCompletedAt=Date.now()):qt.streamingMessageId=null;Be&&(qt.contextUsage=Be),Ze&&(qt.activeModel=Ze),ge&&(qt.isCompacting=!0),Xt&&(qt.lastResultError=Xt);for(const xt of dt)w.current.add(xt);Object.keys(qt).length>0&&Ce.setState(qt),Je.stream("stream:buffer-replay processed",{eventCount:G.events.length,completedTurns:it.length,activeSegments:ie.length,sessionId:pe})};_.on("user:message",W),_.on("session:created",te),_.on("session:resumed",te),_.on("message:chunk",ne),_.on("thinking:chunk",Y),_.on("message:complete",B),_.on("tool:call",D),_.on("tool:input-update",z),_.on("tool:result",J),_.on("permission:request",E),_.on("permission:resolved",M),_.on("permission:already-resolved",U),_.on("context:usage",ue),_.on("assistant:usage",ae),_.on("context:estimate",he),_.on("system:compact",ce),_.on("tool:progress",le),_.on("system:task-notification",Z),_.on("tool:summary",V),_.on("result:error",H);const ar=G=>{Ce.getState().permissionMode!==G.mode&&Ce.setState({permissionMode:G.mode})},Me=G=>{Ce.getState().setSubscriptionRateLimit(G)},Mt=G=>{Ce.getState().setApiHealth(G)};_.on("permission:mode-change",ar),_.on("rateLimit:update",Me),_.on("apiHealth:update",Mt),_.on("stream:status",re),_.on("stream:buffer-replay",It),_.on("stream:detached",me),_.on("disconnect",xe),_.on("connect",ft),_.on("error",bt);const zt=G=>{const ie=nt.getState().currentSessionId;!ie||ie!==G.sessionId||Si.getState().setChainItems(G.items)};return _.on("chain:update",zt),_.io.on("reconnect_failed",St),document.addEventListener("keydown",Q),()=>{I(),P&&(clearTimeout(P),P=null),_.off("user:message",W),_.off("session:created",te),_.off("session:resumed",te),_.off("message:chunk",ne),_.off("thinking:chunk",Y),_.off("message:complete",B),_.off("tool:call",D),_.off("tool:input-update",z),_.off("tool:result",J),_.off("permission:request",E),_.off("permission:resolved",M),_.off("permission:already-resolved",U),_.off("context:usage",ue),_.off("assistant:usage",ae),_.off("context:estimate",he),_.off("system:compact",ce),_.off("tool:progress",le),_.off("system:task-notification",Z),_.off("tool:summary",V),_.off("result:error",H),_.off("permission:mode-change",ar),_.off("rateLimit:update",Me),_.off("apiHealth:update",Mt),_.off("stream:status",re),_.off("stream:buffer-replay",It),_.off("stream:detached",me),_.off("disconnect",xe),_.off("connect",ft),_.off("error",bt),_.off("chain:update",zt),_.io.off("reconnect_failed",St),document.removeEventListener("keydown",Q)}},[t,e,r,n,i,s,a,o,l,c,h,u,O,p,b,y,g,x,v,Q])}const _Se={list:t=>qe.get(`/projects/${t}/commands`)},My=new Map,XR=new Set;function PSe(t){const e=t?My.get(t):void 0,[r,n]=k.useState((e==null?void 0:e.commands)??[]),[i,s]=k.useState((e==null?void 0:e.starCommands)??{}),[a,o]=k.useState(!1),l=k.useCallback(async c=>{var h;My.has(c)||o(!0);try{const u=await _Se.list(c);My.set(c,{commands:u.commands,starCommands:u.starCommands??{}}),n(u.commands),s(u.starCommands??{}),(h=u.warnings)!=null&&h.includes("MISSING_CLAUDE_COMMANDS")&&!XR.has(c)&&(XR.add(c),ht.warning(we.t("common:project.missingClaudeCommands")))}catch(u){Pr.error("Failed to fetch slash commands",{error:u instanceof Error?u.message:String(u)}),n([]),s({})}finally{o(!1)}},[]);return k.useEffect(()=>{t?l(t):(n([]),s({}))},[t,l]),{commands:r,starCommands:i,isLoading:a}}const $Se=20,CSe=[];function TSe(){const t=Kt(s=>s.preferences.commandFavorites??CSe),e=k.useCallback(s=>{const a=Kt.getState(),o=a.preferences.commandFavorites??[];o.includes(s)||o.length>=$Se||a.updatePreference("commandFavorites",[...o,s])},[]),r=k.useCallback(s=>{const a=Kt.getState(),o=a.preferences.commandFavorites??[];a.updatePreference("commandFavorites",o.filter(l=>l!==s))},[]),n=k.useCallback(s=>{const a=Kt.getState(),o=a.preferences.commandFavorites??[];if(s.length===0)return;const l=s.filter(h=>o.includes(h)),c=o.filter(h=>!s.includes(h));a.updatePreference("commandFavorites",[...l,...c])},[]),i=k.useCallback(s=>(Kt.getState().preferences.commandFavorites??[]).includes(s),[]);return{favoriteCommands:t,addFavorite:e,removeFavorite:r,reorderFavorites:n,isFavorite:i}}const RSe=10,AR=[];function ESe(t){const e=Kt(o=>{var l;return t?((l=o.preferences.starFavorites)==null?void 0:l[t])??AR:AR}),r=k.useCallback(o=>{if(!t)return;const l=Kt.getState(),c={...l.preferences.starFavorites};c[t]=o,l.updatePreference("starFavorites",c)},[t]),n=k.useCallback(o=>{var h;if(!t)return;const c=((h=Kt.getState().preferences.starFavorites)==null?void 0:h[t])??[];c.includes(o)||c.length>=RSe||r([...c,o])},[t,r]),i=k.useCallback(o=>{var h;if(!t)return;const c=((h=Kt.getState().preferences.starFavorites)==null?void 0:h[t])??[];r(c.filter(u=>u!==o))},[t,r]),s=k.useCallback(o=>{var O;if(!t)return;const c=((O=Kt.getState().preferences.starFavorites)==null?void 0:O[t])??[];if(o.length===0)return;const h=o.filter(p=>c.includes(p)),u=c.filter(p=>!o.includes(p));r([...h,...u])},[t,r]),a=k.useCallback(o=>{var l;return t?(((l=Kt.getState().preferences.starFavorites)==null?void 0:l[t])??[]).includes(o):!1},[t]);return{starFavorites:e,addStarFavorite:n,removeStarFavorite:i,reorderStarFavorites:s,isStarFavorite:a}}function NR(t,e){const r=t.trim();return r?e.find(n=>n.category==="agent"&&n.command===r)??null:null}function Gc(t){const e=t.split(":");return e[e.length-1]||""}function Ow(t){const e=Gc(t);return e?e.split("-").map(r=>r.length<=2?r.toUpperCase():r.charAt(0).toUpperCase()+r.slice(1)).join(" "):""}const DR=["analyst","pm","ux-expert","architect"],LR=["sm","po","dev","qa"],IR={qa:"agent.qaDescription","bmad-master":null,"bmad-orchestrator":null};function jSe(t){const e=Gc(t.command);return e in IR?IR[e]:t.description??null}function XSe(t){const e=[],r=[],n=[];for(const a of t){const o=Gc(a.command);DR.includes(o)?e.push(a):LR.includes(o)?r.push(a):n.push(a)}const i=(a,o)=>a.sort((l,c)=>o.indexOf(Gc(l.command))-o.indexOf(Gc(c.command)));i(e,DR),i(r,LR);const s=[];return e.length>0&&s.push({label:"agent.groupPlanning",testId:"bmad-group-planning",agents:e}),r.length>0&&s.push({label:"agent.groupImplementation",testId:"bmad-group-implementation",agents:r}),n.length>0&&s.push({label:"agent.groupOther",testId:"bmad-group-other",agents:n}),s}function ASe(t,e,r){return{activeAgent:k.useMemo(()=>{for(let i=t.length-1;i>=0;i--)if(t[i].type==="user"){const s=NR(t[i].content,e);if(s)return s}return r?NR(r,e):null},[t,e,r])}}function Rk(){const{t}=_e("common"),e=$t(),[r,n]=k.useState(()=>e.connected?"connected":"reconnecting"),[i,s]=k.useState(0),[a,o]=k.useState(null),l=k.useRef(e.connected),c=k.useCallback(()=>{e.connected||(o(null),e.connect())},[e]),h=k.useCallback(()=>{e.disconnect()},[e]);return k.useEffect(()=>{e.connected||e.connect();const u=()=>{n("connected"),s(0),o(null),l.current=!0},O=()=>{n("disconnected")},p=g=>{n("reconnecting"),s(g)},b=()=>{n("disconnected"),o(t("connection.reconnectFailed")),Pr.error("WebSocket reconnection failed",{error:"Maximum reconnection attempts exceeded"})},y=g=>{o(t("connection.connectError",{message:g.message}))};return e.on("connect",u),e.on("disconnect",O),e.io.on("reconnect_attempt",p),e.io.on("reconnect_failed",b),e.on("connect_error",y),()=>{e.off("connect",u),e.off("disconnect",O),e.io.off("reconnect_attempt",p),e.io.off("reconnect_failed",b),e.off("connect_error",y)}},[e,t]),{connectionStatus:r,isConnected:r==="connected",isReconnecting:r==="reconnecting",reconnectAttempt:i,lastError:a,connect:c,disconnect:h}}function fD({status:t,reconnectAttempt:e,lastError:r,onReconnect:n,compact:i=!1,apiHealthy:s}){const{t:a}=_e("common"),l={connected:s===!1?{icon:d.jsx(Fa,{className:"w-4 h-4 text-yellow-500","aria-hidden":"true"}),text:a("connection.apiUnavailable"),ariaLabel:a("connection.apiUnavailableAria"),bgColor:"bg-yellow-100 dark:bg-yellow-900/30"}:{icon:d.jsx(Pne,{className:"w-4 h-4 text-green-500","aria-hidden":"true"}),text:a("connection.connected"),ariaLabel:a("connection.connectedAria"),bgColor:"bg-green-100 dark:bg-green-900/30"},disconnected:{icon:d.jsx(Oj,{className:"w-4 h-4 text-red-500","aria-hidden":"true"}),text:a("connection.disconnected"),ariaLabel:a("connection.disconnectedAria"),bgColor:"bg-red-100 dark:bg-red-900/30"},reconnecting:{icon:d.jsx(Ir,{className:"w-4 h-4 text-yellow-500 animate-spin","aria-hidden":"true"}),text:a("connection.reconnecting"),ariaLabel:a("connection.reconnectingAria"),bgColor:"bg-yellow-100 dark:bg-yellow-900/30"}}[t],c=t==="reconnecting"?`${l.text} (${e}/5)`:l.text,h=t==="reconnecting"?a("connection.reconnectingAttemptAria",{attempt:e}):l.ariaLabel,u=r||(t==="connected"&&s===!1?a("connection.apiCannotConnect"):c);return i?d.jsxs("div",{role:"status","aria-live":"polite","aria-label":h,className:`flex items-center gap-1 p-1.5 rounded-full ${l.bgColor} transition-colors duration-300`,title:u,"data-testid":"connection-status-indicator",children:[l.icon,t==="disconnected"&&r&&d.jsx("button",{onClick:n,className:"p-0.5 hover:bg-gray-200 dark:hover:bg-[#253040] rounded-full transition-colors","aria-label":a("connection.reconnectButtonAria"),title:a("connection.reconnectButton"),children:d.jsx(Ir,{className:"w-3 h-3 text-blue-500","aria-hidden":"true"})})]}):d.jsxs("div",{role:"status","aria-live":"polite","aria-label":h,className:"flex items-center gap-2 transition-opacity duration-300",title:r||void 0,"data-testid":"connection-status-indicator",children:[l.icon,d.jsx("span",{className:"text-sm text-gray-900 dark:text-gray-100",children:c}),t==="disconnected"&&r&&d.jsx("button",{onClick:n,className:"text-xs text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300 underline","aria-label":a("connection.reconnectButtonAria"),children:a("connection.reconnectButton")})]})}function NSe({onShowSessions:t,onShowFileExplorer:e,onShowGit:r,onShowTerminal:n,terminalAccessible:i=!0,onNewSession:s,onRefresh:a,isRefreshing:o=!1,onNavigateSettings:l}){const{t:c}=_e("common"),[h,u]=k.useState(!1),O=k.useRef(null);k.useEffect(()=>{if(!h)return;const P=T=>{O.current&&!O.current.contains(T.target)&&u(!1)};return document.addEventListener("mousedown",P),()=>document.removeEventListener("mousedown",P)},[h]),k.useEffect(()=>{if(!h)return;const P=T=>{T.key==="Escape"&&u(!1)};return document.addEventListener("keydown",P),()=>document.removeEventListener("keydown",P)},[h]);const p=k.useCallback(()=>{u(P=>!P)},[]),b=k.useCallback(()=>{t==null||t(),u(!1)},[t]),y=k.useCallback(()=>{e==null||e(),u(!1)},[e]),g=k.useCallback(()=>{r==null||r(),u(!1)},[r]),x=k.useCallback(()=>{n==null||n(),u(!1)},[n]),v=k.useCallback(()=>{s==null||s(),u(!1)},[s]),w=k.useCallback(()=>{a==null||a(),u(!1)},[a]),Q=k.useCallback(()=>{l==null||l(),u(!1)},[l]),_="w-full flex items-center gap-3 px-3 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040] transition-colors";return d.jsxs("div",{ref:O,className:"relative",children:[d.jsx("button",{type:"button",onClick:p,className:`p-2 hover:bg-white/10 dark:hover:bg-[#253040] rounded-lg\r
|
|
1059
|
+
${t("workflow.issueQAOutro")}`}else ae=`*review ${H.id.replace(/^story-/,"")}`;const he=new URLSearchParams({agent:ue,task:ae});r(`/project/${e}/session/${te}?${he.toString()}`)},[e,r,t]),le=k.useCallback(H=>{const ue=Object.values(o).flat().filter(ae=>ae.type==="story"&&ae.epicNumber===H.epicNumber);C({epic:H,stories:ue})},[o]),Z=k.useCallback(H=>{if(H.type==="issue"){P(H);return}if(H.type==="epic"){le(H);return}!e||!H.filePath||mn.getState().openFileInEditor(e,H.filePath)},[e,le]),V={onQuickFix:W,onPromote:Y,onEdit:ne,onClose:B,onReopen:D,onDelete:M,onWorkflowAction:U,onValidateAndFixAction:J,onValidateOnlyAction:z,onViewEpicStories:le,onRequestQAReview:ce,onIssueStatusChange:E,onCardClick:Z};return s&&l.length===0?d.jsxs("div",{className:"p-4 h-full flex flex-col animate-pulse",children:[d.jsxs("div",{className:"flex items-center justify-between mb-4 flex-shrink-0",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("div",{className:"w-9 h-9 bg-gray-200 dark:bg-[#253040] rounded-lg"}),d.jsx("div",{className:"w-9 h-9 bg-gray-200 dark:bg-[#253040] rounded-lg"})]}),d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("div",{className:"w-9 h-9 bg-gray-200 dark:bg-[#253040] rounded-lg"}),d.jsx("div",{className:"h-8 w-20 bg-blue-200 dark:bg-blue-900/30 rounded-lg"})]})]}),d.jsx("div",{className:"flex-1 flex gap-4 overflow-hidden",children:Array.from({length:g?1:4}).map((H,te)=>d.jsxs("div",{className:"flex-shrink-0 w-72 space-y-3",children:[d.jsxs("div",{className:"flex items-center gap-2 p-2",children:[d.jsx("div",{className:"w-3 h-3 rounded-full bg-gray-300 dark:bg-gray-600"}),d.jsx("div",{className:"h-4 w-20 bg-gray-200 dark:bg-[#253040] rounded"}),d.jsx("div",{className:"h-4 w-6 bg-gray-200 dark:bg-[#253040] rounded-full"})]}),Array.from({length:2}).map((ue,ae)=>d.jsxs("div",{className:"p-3 bg-gray-50 dark:bg-[#263240] rounded-lg border border-gray-200 dark:border-[#253040] space-y-2",children:[d.jsx("div",{className:"h-4 w-3/4 bg-gray-200 dark:bg-[#253040] rounded"}),d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("div",{className:"h-3 w-12 bg-gray-200 dark:bg-[#253040] rounded-full"}),d.jsx("div",{className:"h-3 w-16 bg-gray-200 dark:bg-[#253040] rounded"})]})]},ae))]},te))})]}):a&&l.length===0?d.jsxs("div",{className:"p-4 flex flex-col items-center justify-center min-h-[300px] text-center",children:[d.jsx(Ri,{className:"w-12 h-12 text-red-400 mb-4"}),d.jsx("p",{className:"text-red-600 dark:text-red-400 mb-4",children:a}),d.jsxs("button",{onClick:y,className:"px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg flex items-center gap-2 transition-colors",children:[d.jsx(Ir,{className:"w-4 h-4"}),t("common:button.retry")]})]}):l.length===0?d.jsxs("div",{className:"p-4 flex flex-col items-center justify-center min-h-[300px] text-center",children:[d.jsx(Dv,{className:"w-12 h-12 text-gray-400 dark:text-gray-500 mb-4"}),d.jsx("p",{className:"text-gray-500 dark:text-gray-300 mb-4",children:t("empty.message")}),d.jsxs("button",{onClick:()=>v(!0),className:"px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg flex items-center gap-2 transition-colors",children:[d.jsx(Qr,{className:"w-4 h-4"}),t("issue.add")]}),d.jsx(TR,{open:x,onClose:()=>v(!1),onSubmit:I})]}):d.jsxs("div",{className:"p-4 h-full flex flex-col",children:[d.jsxs("div",{className:"flex items-center justify-between mb-4 flex-shrink-0",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("button",{onClick:()=>h("kanban"),className:`p-2 rounded-lg transition-colors ${n==="kanban"?"bg-blue-100 text-blue-600 dark:bg-blue-900/30 dark:text-blue-400":"text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040]"}`,"aria-label":t("view.kanban"),"aria-pressed":n==="kanban",children:d.jsx(Dv,{className:"w-5 h-5"})}),d.jsx("button",{onClick:()=>h("list"),className:`p-2 rounded-lg transition-colors ${n==="list"?"bg-blue-100 text-blue-600 dark:bg-blue-900/30 dark:text-blue-400":"text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040]"}`,"aria-label":t("view.list"),"aria-pressed":n==="list",children:d.jsx(cre,{className:"w-5 h-5"})}),n==="kanban"&&!g&&d.jsxs("div",{className:"flex items-center gap-1 ml-2 border-l border-gray-200 dark:border-[#253040] pl-2",children:[d.jsx("button",{onClick:()=>u(i-1),disabled:i<=2,className:"p-1 rounded text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040] disabled:opacity-30 disabled:cursor-not-allowed transition-colors","aria-label":t("view.lessColumns"),children:d.jsx(_h,{className:"w-4 h-4"})}),d.jsx("span",{className:"text-xs font-medium text-gray-600 dark:text-gray-300 min-w-[1.5rem] text-center tabular-nums",children:i}),d.jsx("button",{onClick:()=>u(i+1),disabled:i>=c.columns.length,className:"p-1 rounded text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040] disabled:opacity-30 disabled:cursor-not-allowed transition-colors","aria-label":t("view.moreColumns"),children:d.jsx(Qr,{className:"w-4 h-4"})})]})]}),d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("button",{onClick:()=>N(!0),className:"p-2 rounded-lg text-gray-500 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-[#253040] transition-colors","aria-label":t("config.title"),children:d.jsx(sa,{className:"w-5 h-5"})}),d.jsxs("button",{onClick:()=>v(!0),className:"px-3 py-1.5 bg-blue-500 hover:bg-blue-600 text-white rounded-lg flex items-center gap-1.5 text-sm transition-colors",children:[d.jsx(Qr,{className:"w-4 h-4"}),t("issue.add")]})]})]}),(a||w)&&d.jsxs("div",{className:"mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg text-red-600 dark:text-red-400 text-sm flex items-center gap-2",children:[d.jsx(Ri,{className:"w-4 h-4 flex-shrink-0"}),w||a]}),d.jsx("div",{className:"flex-1 min-h-0",children:n==="kanban"?g?d.jsx(OSe,{itemsByColumn:o,boardConfig:c,...V}):d.jsx(hSe,{itemsByColumn:o,boardConfig:c,visibleColumns:i,...V}):d.jsx(pSe,{itemsByColumn:o,boardConfig:c,isMobile:g,...V})}),d.jsx(TR,{open:x,onClose:()=>v(!1),onSubmit:I}),d.jsx(vSe,{open:!!_,issue:_,projectSlug:e,onClose:()=>P(null),onSubmit:K}),d.jsx(SSe,{open:!!T,epic:(T==null?void 0:T.epic)??null,stories:(T==null?void 0:T.stories)??[],onClose:()=>C(null)}),d.jsx(wSe,{open:R,config:c,onClose:()=>N(!1),onSave:async H=>{await p(H),N(!1)},onReset:async()=>{await b(),N(!1)}})]})}function QSe(){const{startStreaming:t,appendStreamingContent:e,addStreamingThinking:r,addStreamingToolCall:n,updateStreamingToolCallInput:i,updateStreamingToolCall:s,completeStreaming:a,abortStreaming:o,abortResponse:l,setContextUsage:c,updateStreamingSessionId:h,addInteractiveSegment:u,setToolPermission:O,addSystemSegment:p,updateToolProgress:b,addTaskNotification:y,addToolSummary:g,addResultError:x,restoreStreaming:v}=Ce(),w=k.useRef(new Set),Q=k.useCallback(_=>{if(Ce.getState().isStreaming){if(_.key==="Escape"){_.preventDefault(),l();return}if(_.key==="c"&&(_.ctrlKey||_.metaKey)){const P=window.getSelection();(!P||P.isCollapsed)&&(_.preventDefault(),l())}}},[l]);k.useEffect(()=>{const _=$t();let P=null;const T=1e4;let C="",R=null;const N=()=>{if(R=null,C.length>0){const G=C;C="",e(G)}},A=G=>{C+=G,R===null&&(R=requestAnimationFrame(N))},X=()=>{if(R!==null&&(cancelAnimationFrame(R),R=null),C.length>0){const G=C;C="",e(G)}},I=()=>{C="",R!==null&&(cancelAnimationFrame(R),R=null)},W=G=>{var Ze;if(!G.content)return;const ie=nt.getState().messages,pe=G.content.trim(),Re=[...ie].reverse().find(ge=>ge.type==="user"),Le=!!Re&&Re.content.trim()===pe;if(Je.stream("DEDUP user:message received",{sessionId:G.sessionId,contentPreview:G.content.slice(0,50),msgCount:ie.length,msgTypes:ie.map(ge=>ge.type),isDuplicate:Le,lastUserContent:(Ze=Re==null?void 0:Re.content)==null?void 0:Ze.slice(0,50),isStreaming:Ce.getState().isStreaming}),Je.message("user:message",{sessionId:G.sessionId,contentPreview:G.content.slice(0,50),msgCount:ie.length,isDuplicate:Le,lastUserMsgId:Re==null?void 0:Re.id}),!Le){const ge=G.imageCount?Array.from({length:G.imageCount},(je,dt)=>({mimeType:"image/jpeg",data:"",name:`image-${dt+1}`})):void 0;nt.getState().addOptimisticMessage(G.content,ge,G.timestamp),Je.stream("DEDUP user:message → added optimistic",{newMsgCount:nt.getState().messages.length})}pe==="/compact"&&Ce.setState({isCompacting:!0}),Ce.getState().isStreaming||Ce.getState().startStreamingDelay(G.sessionId)},Y=G=>{const ie=Ce.getState();(!ie.isStreaming||ie.streamingSessionId===null)&&t("pending","pending"),ie.isCompacting&&Ce.setState({isCompacting:!1}),X(),r(G.content)},ne=G=>{const ie=Ce.getState();if(Je.stream("message:chunk",{sessionId:G.sessionId,messageId:G.messageId,contentLen:G.content.length,isStreaming:ie.isStreaming,streamingSessionId:ie.streamingSessionId,segmentCount:ie.streamingSegments.length}),G.sessionId){if(ie.streamingSessionId&&ie.streamingSessionId!=="pending"&&ie.streamingSessionId!==G.sessionId){Je.stream("chunk dropped: streamingSessionId mismatch",{streaming:ie.streamingSessionId,chunk:G.sessionId});return}if(!ie.isStreaming){const pe=nt.getState().currentSessionId;if(pe&&pe!==G.sessionId){Je.stream("chunk dropped: viewingSessionId mismatch",{viewing:pe,chunk:G.sessionId});return}}}!ie.isStreaming||ie.streamingSessionId===null?t(G.sessionId,G.messageId):ie.streamingSessionId==="pending"&&h(G.sessionId),Ce.getState().isCompacting&&Ce.setState({isCompacting:!1}),K(),A(G.content)},K=()=>{const G=Ce.getState().streamingSegments;if(!G.some(Re=>Re.type==="interactive"&&Re.status==="waiting"))return;const pe=G.map(Re=>Re.type==="interactive"&&Re.status==="waiting"?{...Re,status:"responded",response:we.t("notification:streaming.respondedBeforeReconnect")}:Re);Ce.setState({streamingSegments:pe})},B=async G=>{X();const ie=Ce.getState();if(Je.stream("message:complete",{sessionId:G.sessionId,isStreaming:ie.isStreaming,streamingSessionId:ie.streamingSessionId,segmentCount:ie.streamingSegments.length,msgCount:nt.getState().messages.length,hasUsage:!!G.usage}),G.sessionId){if(ie.streamingSessionId&&ie.streamingSessionId!=="pending"&&ie.streamingSessionId!==G.sessionId){Je.stream("complete dropped: streamingSessionId mismatch",{streaming:ie.streamingSessionId,complete:G.sessionId});return}if(!ie.isStreaming){const pe=nt.getState().currentSessionId;if(pe&&pe!==G.sessionId){Je.stream("complete dropped: viewingSessionId mismatch",{viewing:pe,complete:G.sessionId});return}}}if(G.sessionId&&(!ie.streamingSessionId||ie.streamingSessionId==="pending")&&h(G.sessionId),G.id&&(Ce.setState({streamingMessageId:G.id}),Je.stream("message:complete → set streamingMessageId",{messageId:G.id})),G.usage){Je.stream("usage from message:complete (metadata only)",{contextWindow:G.usage.contextWindow,model:G.usage.model,totalCostUSD:G.usage.totalCostUSD});const pe=Ce.getState().contextUsage;c(pe?{...pe,contextWindow:G.usage.contextWindow,totalCostUSD:G.usage.totalCostUSD,model:G.usage.model??pe.model}:G.usage),G.usage.model&&Ce.getState().setActiveModel(G.usage.model)}Je.stream("DEDUP message:complete → before completeStreaming",{segCount:Ce.getState().streamingSegments.length,segTypes:Ce.getState().streamingSegments.map(pe=>pe.type),msgCount:nt.getState().messages.length,msgTypes:nt.getState().messages.map(pe=>pe.type)}),a(),Je.stream("DEDUP message:complete → after completeStreaming",{msgCount:nt.getState().messages.length,msgTypes:nt.getState().messages.map(pe=>pe.type),isStreaming:Ce.getState().isStreaming,segCount:Ce.getState().streamingSegments.length})},D=G=>{G.name!=="AskUserQuestion"&&(X(),n({id:G.id,name:G.name,input:G.input,startedAt:G.startedAt}))},E=G=>{var ie;if(X(),Je.stream("permission:request received",{permissionId:G.id,toolCallId:G.toolCall.id,toolName:G.toolCall.name,alreadySeen:w.current.has(G.id),segmentCount:Ce.getState().streamingSegments.length,existingToolIds:Ce.getState().streamingSegments.filter(pe=>pe.type==="tool").map(pe=>pe.toolCall.id)}),!w.current.has(G.id)){if(w.current.add(G.id),G.toolCall.name==="AskUserQuestion"&&((ie=G.toolCall.input)!=null&&ie.questions)){const pe=G.toolCall.input.questions;if(pe.length>0){const Re=pe.map(Be=>({question:Be.question,header:Be.header,choices:Be.options.map(Ze=>({label:Ze.label,description:Ze.description,value:Ze.label})),multiSelect:Be.multiSelect})),Le=Re[0];u({id:G.id,interactionType:"question",toolCall:{id:G.toolCall.id,name:G.toolCall.name,input:G.toolCall.input},choices:Le.choices,questions:Re,multiSelect:Le.multiSelect});return}}G.toolCall.input&&i(G.toolCall.id,G.toolCall.input,!0),O(G.toolCall.id,G.id)}},M=G=>{const ie=Ce.getState().streamingSegments;let pe=!1;const Re=ie.map(Le=>{if(G.interactionType==="question"){if(Le.type==="interactive"&&Le.id===G.requestId){pe=!0;let Be;return typeof G.response=="string"?Be=G.response:Array.isArray(G.response)?Be=G.response.join(", "):G.response&&typeof G.response=="object"?Be=Object.values(G.response).flat().join(", "):Be=we.t("notification:streaming.respondedInOtherBrowser"),{...Le,status:"responded",response:Be}}}else if(Le.type==="tool"&&Le.permissionId===G.requestId)return pe=!0,{...Le,permissionStatus:G.approved?"approved":"denied"};return Le});pe&&Ce.setState({streamingSegments:Re})},U=G=>{ht.info(we.t("notification:streaming.alreadyResponded"))},z=G=>{i(G.toolCallId,G.input)},J=G=>{const{success:ie,output:pe,error:Re}=G.result;s(G.toolCallId,pe??Re??"",!ie);const Le=Ce.getState().streamingSegments,Be=Le.findIndex(Ze=>{var ge;return Ze.type==="interactive"&&Ze.status==="waiting"&&((ge=Ze.toolCall)==null?void 0:ge.id)===G.toolCallId});if(Be!==-1){const Ze=[...Le],ge=Ze[Be];ge.type==="interactive"&&(Ze[Be]={...ge,status:"responded",response:we.t("notification:streaming.respondedBeforeReconnect")},Ce.setState({streamingSegments:Ze}))}},ce=G=>{if(X(),Ce.getState().isStreaming||Ce.setState({streamCompletedAt:Date.now()}),G.preTokens>0){const ie=Ce.getState().contextUsage,pe=(ie==null?void 0:ie.contextWindow)??0;c({inputTokens:G.preTokens,outputTokens:(ie==null?void 0:ie.outputTokens)??0,cacheCreationInputTokens:0,cacheReadInputTokens:0,totalCostUSD:(ie==null?void 0:ie.totalCostUSD)??0,contextWindow:pe,model:ie==null?void 0:ie.model})}Ce.setState({isCompacting:!0}),p(`Context compaction (${G.trigger})...`,"compact")},le=G=>{b(G.toolUseId,G.elapsedTimeSeconds)},Z=G=>{X(),y(G)},V=G=>{X(),g(G.summary,G.precedingToolUseIds)},H=G=>{X(),x(G)},te=G=>{const ie=Ce.getState();Je.stream("session:init",{sessionId:G.sessionId,model:G.model,currentStreamingSessionId:ie.streamingSessionId,isStreaming:ie.isStreaming}),ie.streamingSessionId?ie.streamingSessionId==="pending"&&h(G.sessionId):t(G.sessionId,"pending")},ue=G=>{Je.stream("context:usage received",{inputTokens:G.inputTokens,outputTokens:G.outputTokens,cacheCreationInputTokens:G.cacheCreationInputTokens,cacheReadInputTokens:G.cacheReadInputTokens,model:G.model,totalCostUSD:G.totalCostUSD}),G.model&&Ce.getState().setActiveModel(G.model);const ie=Ce.getState().contextUsage;c(ie?{...ie,totalCostUSD:G.totalCostUSD,model:G.model??ie.model,rateLimit:G.rateLimit??ie.rateLimit}:G)},ae=G=>{const ie=G.inputTokens+G.cacheCreationInputTokens+G.cacheReadInputTokens;Je.stream("assistant:usage received",{inputTokens:G.inputTokens,cacheCreationInputTokens:G.cacheCreationInputTokens,cacheReadInputTokens:G.cacheReadInputTokens,totalContext:ie});const pe=Ce.getState().contextUsage;c({inputTokens:G.inputTokens,outputTokens:G.outputTokens,cacheCreationInputTokens:G.cacheCreationInputTokens,cacheReadInputTokens:G.cacheReadInputTokens,totalCostUSD:(pe==null?void 0:pe.totalCostUSD)??0,contextWindow:(pe==null?void 0:pe.contextWindow)??0,model:pe==null?void 0:pe.model})},he=G=>{Je.stream("context:estimate received",G);const ie=Ce.getState().contextUsage,pe=ie?ie.inputTokens+ie.cacheCreationInputTokens+ie.cacheReadInputTokens:0;G.estimatedTokens>pe&&c({inputTokens:G.estimatedTokens,outputTokens:(ie==null?void 0:ie.outputTokens)??0,cacheCreationInputTokens:0,cacheReadInputTokens:0,totalCostUSD:(ie==null?void 0:ie.totalCostUSD)??0,contextWindow:G.contextWindow,model:ie==null?void 0:ie.model})},re=G=>{const ie=Ce.getState();if(Je.stream("stream:status",{active:G.active,sessionId:G.sessionId,isStreaming:ie.isStreaming,streamingSessionId:ie.streamingSessionId,segmentCount:ie.streamingSegments.length,hadTimeout:!!P,msgCount:nt.getState().messages.length}),P&&(clearTimeout(P),P=null),G.active)w.current.clear(),I(),Je.stream("DEDUP stream:status ACTIVE → before restoreStreaming",{sessionId:G.sessionId,msgCount:nt.getState().messages.length,msgTypes:nt.getState().messages.map(pe=>pe.type),prevIsStreaming:ie.isStreaming,prevSegCount:ie.streamingSegments.length}),v(G.sessionId),G.permissionMode&&Ce.setState({permissionMode:G.permissionMode}),Qe(),Je.stream("DEDUP stream:status ACTIVE → after trim",{msgCount:nt.getState().messages.length,msgTypes:nt.getState().messages.map(pe=>pe.type)}),Je.stream("stream:status → restored",{sessionId:G.sessionId});else if(G.permissionMode&&Ce.setState({permissionMode:G.permissionMode}),ie.isStreaming){const pe=ie.streamingSegments.length>0;X(),Je.stream("stream:status → completing stale stream",{sessionId:G.sessionId,hadSegments:pe}),a();const Re=nt.getState(),{currentProjectSlug:Le,currentSessionId:Be}=Re;Le&&Be&&(Je.stream("stream:status → fetching messages after stale stream completion",{projectSlug:Le,sessionId:Be,hadSegments:pe}),Re.fetchMessages(Le,Be,{silent:!0,force:!0}))}else Je.stream("stream:status → inactive, no-op (not streaming)")},Qe=()=>{const G=nt.getState().messages;let ie=-1;for(let pe=G.length-1;pe>=0;pe--)if(G[pe].type==="user"){ie=pe;break}ie>=0&&ie<G.length-1&&nt.setState({messages:G.slice(0,ie+1)})},me=G=>{const ie=Ce.getState().isStreaming;Je.stream("stream:detached",{reason:G.reason,isStreaming:ie}),ie&&(X(),a()),G.reason==="user-abort"?ie&&ht.info(we.t("notification:streaming.abortedInOtherBrowser")):(Ce.setState({isSessionLocked:!0}),ht.warning(we.t("notification:streaming.sessionInUseWarning"),{id:"session-locked",duration:1/0}));const pe=nt.getState(),{currentProjectSlug:Re,currentSessionId:Le}=pe;Re&&Le&&setTimeout(()=>{nt.getState().fetchMessages(Re,Le,{silent:!0})},1e3)},xe=()=>{const G=Ce.getState();Je.reconnect("disconnect",{isStreaming:G.isStreaming,streamingSessionId:G.streamingSessionId,segmentCount:G.streamingSegments.length,msgCount:nt.getState().messages.length})},ft=()=>{const G=Ce.getState();if(Je.reconnect("connect (reconnect handler)",{isStreaming:G.isStreaming,streamingSessionId:G.streamingSessionId,segmentCount:G.streamingSegments.length,msgCount:nt.getState().messages.length}),!G.isStreaming)return;const ie=G.streamingSessionId||nt.getState().currentSessionId;if(ie&&ie!=="pending"){const pe=nt.getState().currentProjectSlug;Je.reconnect("session:join emitted",{sessionId:ie,projectSlug:pe}),_.emit("session:join",ie,pe??void 0),P=setTimeout(()=>{P=null,Je.reconnect("timeout fired (10s)",{isStreaming:Ce.getState().isStreaming,sessionId:ie}),Ce.getState().isStreaming&&re({active:!1,sessionId:ie})},T)}},St=()=>{Je.reconnect("reconnect_failed",{isStreaming:Ce.getState().isStreaming}),Ce.getState().isStreaming&&(I(),o())},bt=G=>{const ie=Ce.getState().isStreaming;Je.socket("error",{isStreaming:ie,data:G}),I(),o()},It=G=>{var lt,gt,Et,ir;if(G.sessionId){const xt=Ce.getState().streamingSessionId||nt.getState().currentSessionId;if(xt&&xt!==G.sessionId){Je.stream("stream:buffer-replay dropped: session mismatch",{replay:G.sessionId,current:xt}),Ce.getState().streamingMessageId==="restoring"&&Ce.setState({streamingMessageId:null});return}}if(!G.events||G.events.length===0){Ce.getState().streamingMessageId==="restoring"&&Ce.setState({streamingMessageId:null});return}Je.stream("stream:buffer-replay received",{eventCount:G.events.length,sessionId:G.sessionId});const ie=[];let pe=G.sessionId??Ce.getState().streamingSessionId??null,Re=null;const Le={inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,totalCostUSD:0,contextWindow:0};let Be=null,Ze=null,ge=!1,je="";const dt=new Set,it=[];let tt=0,Xt=null;const rr=()=>{if(je.length>0){const xt=ie[ie.length-1];xt&&xt.type==="text"?xt.content+=je:ie.push({type:"text",content:je}),je=""}},br=xt=>{for(let Gt=ie.length-1;Gt>=0;Gt--){const Pt=ie[Gt];if(Pt.type==="tool"&&Pt.toolCall.id===xt)return{seg:Pt,idx:Gt}}return null},Er=()=>{var Se,Fe,Qt,cr;rr();let xt;const Gt=Date.now();let Pt=it.length;for(const yt of ie){const Mr=new Date(Gt+Pt++).toISOString();if(yt.type==="thinking")xt&&Re&&it.push({id:`${Re}-thinking-${it.length}`,type:"assistant",content:"",timestamp:Mr,thinking:xt}),xt=yt.content;else if(yt.type==="text")it.push({id:`${Re}-text-${it.length}`,type:"assistant",content:yt.content,timestamp:Mr,thinking:xt}),xt=void 0;else if(yt.type==="tool")it.push({id:`${Re}-tool-${yt.toolCall.id}`,type:"tool_use",content:`Calling ${yt.toolCall.name}`,timestamp:Mr,toolName:yt.toolCall.name,toolInput:yt.toolCall.input,thinking:xt,...yt.status!=="pending"&&yt.toolCall.output!==void 0&&{toolResult:{success:yt.status==="completed",output:yt.status==="completed"?yt.toolCall.output:void 0,error:yt.status==="error"?yt.toolCall.output:void 0}}}),xt=void 0;else if(yt.type==="interactive"){const cn=((Se=yt.toolCall)==null?void 0:Se.id)||yt.id;let Xn;yt.status==="responded"&&yt.response&&(typeof yt.response=="string"?Xn=yt.response:Array.isArray(yt.response)?Xn=yt.response.join(", "):typeof yt.response=="object"&&(Xn=Object.values(yt.response).flat().join(", "))),it.push({id:`${Re}-tool-${cn}`,type:"tool_use",content:`Calling ${((Fe=yt.toolCall)==null?void 0:Fe.name)||"AskUserQuestion"}`,timestamp:Mr,toolName:((Qt=yt.toolCall)==null?void 0:Qt.name)||"AskUserQuestion",toolInput:(cr=yt.toolCall)==null?void 0:cr.input,thinking:xt,...Xn&&{toolResult:{success:!0,output:Xn}}}),xt=void 0}}xt&&Re&&it.push({id:`${Re}-thinking`,type:"assistant",content:"",timestamp:new Date(Gt+Pt++).toISOString(),thinking:xt}),ie.length=0};for(const xt of G.events){const{event:Gt,data:Pt}=xt;switch(Gt){case"user:message":{const Se=Pt;if(!Se.content)break;const Fe=nt.getState().messages,Qt=Se.content.trim(),cr=[...Fe].reverse().find(yt=>yt.type==="user");if(!cr||cr.content.trim()!==Qt){const yt=Se.imageCount?Array.from({length:Se.imageCount},(Mr,cn)=>({mimeType:"image/jpeg",data:"",name:`image-${cn+1}`})):void 0;nt.getState().addOptimisticMessage(Se.content,yt,Se.timestamp)}Qt==="/compact"&&(ge=!0);break}case"session:created":case"session:resumed":{const Se=Pt;pe=Se.sessionId,Se.model&&(Ze=Se.model);break}case"message:chunk":{const Se=Pt;!pe&&Se.sessionId&&(pe=Se.sessionId),!Re&&Se.messageId&&(Re=Se.messageId),ge=!1,je+=Se.content;break}case"thinking:chunk":{const Se=Pt;rr(),ge=!1;const Fe=ie[ie.length-1];Fe&&Fe.type==="thinking"?Fe.content+=Se.content:ie.push({type:"thinking",content:Se.content});break}case"tool:call":{const Se=Pt;if(Se.name==="AskUserQuestion")break;rr(),ie.push({type:"tool",toolCall:{id:Se.id,name:Se.name,input:Se.input,startedAt:Se.startedAt},status:"pending"});break}case"tool:input-update":{const Se=Pt,Fe=br(Se.toolCallId);Fe&&(Fe.seg.toolCall.input={...Fe.seg.toolCall.input,...Se.input});break}case"tool:result":{const Se=Pt,Fe=br(Se.toolCallId);if(Fe){const Qt=Fe.seg;Qt.toolCall.output=Se.result.output??Se.result.error??"",Qt.status=Se.result.success?"completed":"error"}for(const Qt of ie)Qt.type==="interactive"&&Qt.status==="waiting"&&((lt=Qt.toolCall)==null?void 0:lt.id)===Se.toolCallId&&(Qt.status="responded",Qt.response=we.t("notification:streaming.respondedBeforeReconnect"));break}case"permission:request":{const Se=Pt;if(dt.has(Se.id))break;if(dt.add(Se.id),rr(),Se.toolCall.name==="AskUserQuestion"&&((gt=Se.toolCall.input)!=null&>.questions)){const Qt=Se.toolCall.input.questions;if(Qt.length>0){const cr=Qt.map(yt=>({question:yt.question,header:yt.header,choices:yt.options.map(Mr=>({label:Mr.label,description:Mr.description,value:Mr.label})),multiSelect:yt.multiSelect}));ie.push({type:"interactive",id:Se.id,interactionType:"question",toolCall:{id:Se.toolCall.id,name:Se.toolCall.name,input:Se.toolCall.input},choices:cr[0].choices,questions:cr,multiSelect:cr[0].multiSelect,status:"waiting"});break}}if(Se.toolCall.input){const Qt=br(Se.toolCall.id);Qt&&(Qt.seg.toolCall.input={...Qt.seg.toolCall.input,...Se.toolCall.input})}const Fe=br(Se.toolCall.id);Fe&&(Fe.seg.permissionId=Se.id,Fe.seg.permissionStatus="waiting");break}case"permission:resolved":{const Se=Pt;for(const Fe of ie)if(Se.interactionType==="question"&&Fe.type==="interactive"&&Fe.id===Se.requestId){let Qt;typeof Se.response=="string"?Qt=Se.response:Array.isArray(Se.response)?Qt=Se.response.join(", "):Se.response&&typeof Se.response=="object"?Qt=Object.values(Se.response).flat().join(", "):Qt=we.t("notification:streaming.respondedInOtherBrowser"),Fe.status="responded",Fe.response=Qt}else Fe.type==="tool"&&Fe.permissionId===Se.requestId&&(Fe.permissionStatus=Se.approved?"approved":"denied");break}case"system:compact":{const Se=Pt;rr(),ge=!0,ie.push({type:"system",subtype:"compact",message:`Context compaction (${Se.trigger})...`});break}case"tool:summary":{const Se=Pt;rr(),ie.push({type:"tool_summary",summary:Se.summary,precedingToolUseIds:Se.precedingToolUseIds});break}case"system:task-notification":{const Se=Pt;rr(),ie.push({type:"task_notification",...Se});break}case"result:error":{const Se=Pt;rr(),Xt=Se,ie.push({type:"result_error",...Se});break}case"message:complete":{const Se=Pt;if(Se.sessionId&&(pe=Se.sessionId),Se.id&&(Re=Se.id),Se.usage){const Fe=Be??Le;Be={...Fe,contextWindow:Se.usage.contextWindow,totalCostUSD:Se.usage.totalCostUSD,model:Se.usage.model??Fe.model,inputTokens:Se.usage.inputTokens??Fe.inputTokens??0,outputTokens:Se.usage.outputTokens??Fe.outputTokens??0},Se.usage.model&&(Ze=Se.usage.model)}Er(),tt++,Re=null;break}case"context:usage":{const Se=Pt;Se.model&&(Ze=Se.model);const Fe=Be??Le;Be={...Fe,totalCostUSD:Se.totalCostUSD,model:Se.model??Fe.model,rateLimit:Se.rateLimit??Fe.rateLimit};break}case"assistant:usage":{const Se=Pt,Fe=Be??Le;Be={inputTokens:Se.inputTokens,outputTokens:Se.outputTokens,cacheCreationInputTokens:Se.cacheCreationInputTokens,cacheReadInputTokens:Se.cacheReadInputTokens,totalCostUSD:Fe.totalCostUSD,contextWindow:Fe.contextWindow,model:Fe.model};break}case"context:estimate":{const Se=Pt,Fe=Be??Le,Qt=Fe.inputTokens+Fe.cacheCreationInputTokens+Fe.cacheReadInputTokens;Se.estimatedTokens>Qt&&(Be={inputTokens:Se.estimatedTokens,outputTokens:Fe.outputTokens,cacheCreationInputTokens:0,cacheReadInputTokens:0,totalCostUSD:Fe.totalCostUSD,contextWindow:Se.contextWindow,model:Fe.model});break}case"chain:update":{const Se=Pt,Fe=nt.getState().currentSessionId;Fe&&Fe===Se.sessionId&&Si.getState().setChainItems(Se.items);break}}}rr();const xr=it.length>0,jr=ie.length>0;xr&&nt.getState().addMessages(it);const qt={};if(tt>0&&(qt.streamCompleteCount=Ce.getState().streamCompleteCount+tt),jr&&Ce.getState().isStreaming)qt.isStreaming=!0,qt.streamingSessionId=pe,qt.streamingMessageId=Re,qt.streamingSegments=ie,qt.streamingStartedAt=new Date;else if(jr&&!Ce.getState().isStreaming){if(!Re){const xt=((Et=G.events[0])==null?void 0:Et.event)??"",Gt=((ir=G.events[G.events.length-1])==null?void 0:ir.event)??"";Re=`replay-${pe??"unknown"}-${G.events.length}-${xt}-${Gt}`}Er(),it.length>0&&nt.getState().addMessages(it),qt.streamingMessageId=null,qt.streamingSegments=[],qt.streamCompletedAt=Date.now()}else xr?(qt.streamingMessageId=null,qt.streamingSegments=[],qt.streamCompletedAt=Date.now()):qt.streamingMessageId=null;Be&&(qt.contextUsage=Be),Ze&&(qt.activeModel=Ze),ge&&(qt.isCompacting=!0),Xt&&(qt.lastResultError=Xt);for(const xt of dt)w.current.add(xt);Object.keys(qt).length>0&&Ce.setState(qt),Je.stream("stream:buffer-replay processed",{eventCount:G.events.length,completedTurns:it.length,activeSegments:ie.length,sessionId:pe})};_.on("user:message",W),_.on("session:created",te),_.on("session:resumed",te),_.on("message:chunk",ne),_.on("thinking:chunk",Y),_.on("message:complete",B),_.on("tool:call",D),_.on("tool:input-update",z),_.on("tool:result",J),_.on("permission:request",E),_.on("permission:resolved",M),_.on("permission:already-resolved",U),_.on("context:usage",ue),_.on("assistant:usage",ae),_.on("context:estimate",he),_.on("system:compact",ce),_.on("tool:progress",le),_.on("system:task-notification",Z),_.on("tool:summary",V),_.on("result:error",H);const ar=G=>{Ce.getState().permissionMode!==G.mode&&Ce.setState({permissionMode:G.mode})},Me=G=>{Ce.getState().setSubscriptionRateLimit(G)},Mt=G=>{Ce.getState().setApiHealth(G)};_.on("permission:mode-change",ar),_.on("rateLimit:update",Me),_.on("apiHealth:update",Mt),_.on("stream:status",re),_.on("stream:buffer-replay",It),_.on("stream:detached",me),_.on("disconnect",xe),_.on("connect",ft),_.on("error",bt);const zt=G=>{const ie=nt.getState().currentSessionId;!ie||ie!==G.sessionId||Si.getState().setChainItems(G.items)};return _.on("chain:update",zt),_.io.on("reconnect_failed",St),document.addEventListener("keydown",Q),()=>{I(),P&&(clearTimeout(P),P=null),_.off("user:message",W),_.off("session:created",te),_.off("session:resumed",te),_.off("message:chunk",ne),_.off("thinking:chunk",Y),_.off("message:complete",B),_.off("tool:call",D),_.off("tool:input-update",z),_.off("tool:result",J),_.off("permission:request",E),_.off("permission:resolved",M),_.off("permission:already-resolved",U),_.off("context:usage",ue),_.off("assistant:usage",ae),_.off("context:estimate",he),_.off("system:compact",ce),_.off("tool:progress",le),_.off("system:task-notification",Z),_.off("tool:summary",V),_.off("result:error",H),_.off("permission:mode-change",ar),_.off("rateLimit:update",Me),_.off("apiHealth:update",Mt),_.off("stream:status",re),_.off("stream:buffer-replay",It),_.off("stream:detached",me),_.off("disconnect",xe),_.off("connect",ft),_.off("error",bt),_.off("chain:update",zt),_.io.off("reconnect_failed",St),document.removeEventListener("keydown",Q)}},[t,e,r,n,i,s,a,o,l,c,h,u,O,p,b,y,g,x,v,Q])}const _Se={list:t=>qe.get(`/projects/${t}/commands`)},My=new Map,XR=new Set;function PSe(t){const e=t?My.get(t):void 0,[r,n]=k.useState((e==null?void 0:e.commands)??[]),[i,s]=k.useState((e==null?void 0:e.starCommands)??{}),[a,o]=k.useState(!1),l=k.useCallback(async c=>{var h;My.has(c)||o(!0);try{const u=await _Se.list(c);My.set(c,{commands:u.commands,starCommands:u.starCommands??{}}),n(u.commands),s(u.starCommands??{}),(h=u.warnings)!=null&&h.includes("MISSING_CLAUDE_COMMANDS")&&!XR.has(c)&&(XR.add(c),ht.warning(we.t("common:project.missingClaudeCommands")))}catch(u){Pr.error("Failed to fetch slash commands",{error:u instanceof Error?u.message:String(u)}),n([]),s({})}finally{o(!1)}},[]);return k.useEffect(()=>{t?l(t):(n([]),s({}))},[t,l]),{commands:r,starCommands:i,isLoading:a}}const $Se=20,CSe=[];function TSe(){const t=Kt(s=>s.preferences.commandFavorites??CSe),e=k.useCallback(s=>{const a=Kt.getState(),o=a.preferences.commandFavorites??[];o.includes(s)||o.length>=$Se||a.updatePreference("commandFavorites",[...o,s])},[]),r=k.useCallback(s=>{const a=Kt.getState(),o=a.preferences.commandFavorites??[];a.updatePreference("commandFavorites",o.filter(l=>l!==s))},[]),n=k.useCallback(s=>{const a=Kt.getState(),o=a.preferences.commandFavorites??[];if(s.length===0)return;const l=s.filter(h=>o.includes(h)),c=o.filter(h=>!s.includes(h));a.updatePreference("commandFavorites",[...l,...c])},[]),i=k.useCallback(s=>(Kt.getState().preferences.commandFavorites??[]).includes(s),[]);return{favoriteCommands:t,addFavorite:e,removeFavorite:r,reorderFavorites:n,isFavorite:i}}const RSe=10,AR=[];function ESe(t){const e=Kt(o=>{var l;return t?((l=o.preferences.starFavorites)==null?void 0:l[t])??AR:AR}),r=k.useCallback(o=>{if(!t)return;const l=Kt.getState(),c={...l.preferences.starFavorites};c[t]=o,l.updatePreference("starFavorites",c)},[t]),n=k.useCallback(o=>{var h;if(!t)return;const c=((h=Kt.getState().preferences.starFavorites)==null?void 0:h[t])??[];c.includes(o)||c.length>=RSe||r([...c,o])},[t,r]),i=k.useCallback(o=>{var h;if(!t)return;const c=((h=Kt.getState().preferences.starFavorites)==null?void 0:h[t])??[];r(c.filter(u=>u!==o))},[t,r]),s=k.useCallback(o=>{var O;if(!t)return;const c=((O=Kt.getState().preferences.starFavorites)==null?void 0:O[t])??[];if(o.length===0)return;const h=o.filter(p=>c.includes(p)),u=c.filter(p=>!o.includes(p));r([...h,...u])},[t,r]),a=k.useCallback(o=>{var l;return t?(((l=Kt.getState().preferences.starFavorites)==null?void 0:l[t])??[]).includes(o):!1},[t]);return{starFavorites:e,addStarFavorite:n,removeStarFavorite:i,reorderStarFavorites:s,isStarFavorite:a}}function NR(t,e){const r=t.trim();return r?e.find(n=>n.category==="agent"&&n.command===r)??null:null}function Gc(t){const e=t.split(":");return e[e.length-1]||""}function Ow(t){const e=Gc(t);return e?e.split("-").map(r=>r.length<=2?r.toUpperCase():r.charAt(0).toUpperCase()+r.slice(1)).join(" "):""}const DR=["analyst","pm","ux-expert","architect"],LR=["sm","po","dev","qa"],IR={qa:"agent.qaDescription","bmad-master":null,"bmad-orchestrator":null};function jSe(t){const e=Gc(t.command);return e in IR?IR[e]:t.description??null}function XSe(t){const e=[],r=[],n=[];for(const a of t){const o=Gc(a.command);DR.includes(o)?e.push(a):LR.includes(o)?r.push(a):n.push(a)}const i=(a,o)=>a.sort((l,c)=>o.indexOf(Gc(l.command))-o.indexOf(Gc(c.command)));i(e,DR),i(r,LR);const s=[];return e.length>0&&s.push({label:"agent.groupPlanning",testId:"bmad-group-planning",agents:e}),r.length>0&&s.push({label:"agent.groupImplementation",testId:"bmad-group-implementation",agents:r}),n.length>0&&s.push({label:"agent.groupOther",testId:"bmad-group-other",agents:n}),s}function ASe(t,e,r){return{activeAgent:k.useMemo(()=>{for(let i=t.length-1;i>=0;i--)if(t[i].type==="user"){const s=NR(t[i].content,e);if(s)return s}return r?NR(r,e):null},[t,e,r])}}function Rk(){const{t}=_e("common"),e=$t(),[r,n]=k.useState(()=>e.connected?"connected":"reconnecting"),[i,s]=k.useState(0),[a,o]=k.useState(null),l=k.useRef(e.connected),c=k.useCallback(()=>{e.connected||(o(null),e.connect())},[e]),h=k.useCallback(()=>{e.disconnect()},[e]);return k.useEffect(()=>{e.connected||e.connect();const u=()=>{n("connected"),s(0),o(null),l.current=!0},O=()=>{n("disconnected")},p=g=>{n("reconnecting"),s(g)},b=()=>{n("disconnected"),o(t("connection.reconnectFailed")),Pr.error("WebSocket reconnection failed",{error:"Maximum reconnection attempts exceeded"})},y=g=>{o(t("connection.connectError",{message:g.message}))};return e.on("connect",u),e.on("disconnect",O),e.io.on("reconnect_attempt",p),e.io.on("reconnect_failed",b),e.on("connect_error",y),()=>{e.off("connect",u),e.off("disconnect",O),e.io.off("reconnect_attempt",p),e.io.off("reconnect_failed",b),e.off("connect_error",y)}},[e,t]),{connectionStatus:r,isConnected:r==="connected",isReconnecting:r==="reconnecting",reconnectAttempt:i,lastError:a,connect:c,disconnect:h}}function fD({status:t,reconnectAttempt:e,lastError:r,onReconnect:n,compact:i=!1,apiHealthy:s}){const{t:a}=_e("common"),l={connected:s===!1?{icon:d.jsx(Fa,{className:"w-4 h-4 text-yellow-500","aria-hidden":"true"}),text:a("connection.apiUnavailable"),ariaLabel:a("connection.apiUnavailableAria"),bgColor:"bg-yellow-100 dark:bg-yellow-900/30"}:{icon:d.jsx(Pne,{className:"w-4 h-4 text-green-500","aria-hidden":"true"}),text:a("connection.connected"),ariaLabel:a("connection.connectedAria"),bgColor:"bg-green-100 dark:bg-green-900/30"},disconnected:{icon:d.jsx(Oj,{className:"w-4 h-4 text-red-500","aria-hidden":"true"}),text:a("connection.disconnected"),ariaLabel:a("connection.disconnectedAria"),bgColor:"bg-red-100 dark:bg-red-900/30"},reconnecting:{icon:d.jsx(Ir,{className:"w-4 h-4 text-yellow-500 animate-spin","aria-hidden":"true"}),text:a("connection.reconnecting"),ariaLabel:a("connection.reconnectingAria"),bgColor:"bg-yellow-100 dark:bg-yellow-900/30"}}[t],c=t==="reconnecting"?`${l.text} (${e}/5)`:l.text,h=t==="reconnecting"?a("connection.reconnectingAttemptAria",{attempt:e}):l.ariaLabel,u=r||(t==="connected"&&s===!1?a("connection.apiCannotConnect"):c);return i?d.jsxs("div",{role:"status","aria-live":"polite","aria-label":h,className:`flex items-center gap-1 p-1.5 rounded-full ${l.bgColor} transition-colors duration-300`,title:u,"data-testid":"connection-status-indicator",children:[l.icon,t==="disconnected"&&r&&d.jsx("button",{onClick:n,className:"p-0.5 hover:bg-gray-200 dark:hover:bg-[#253040] rounded-full transition-colors","aria-label":a("connection.reconnectButtonAria"),title:a("connection.reconnectButton"),children:d.jsx(Ir,{className:"w-3 h-3 text-blue-500","aria-hidden":"true"})})]}):d.jsxs("div",{role:"status","aria-live":"polite","aria-label":h,className:"flex items-center gap-2 transition-opacity duration-300",title:r||void 0,"data-testid":"connection-status-indicator",children:[l.icon,d.jsx("span",{className:"text-sm text-gray-900 dark:text-gray-100",children:c}),t==="disconnected"&&r&&d.jsx("button",{onClick:n,className:"text-xs text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300 underline","aria-label":a("connection.reconnectButtonAria"),children:a("connection.reconnectButton")})]})}function NSe({onShowSessions:t,onShowFileExplorer:e,onShowGit:r,onShowTerminal:n,terminalAccessible:i=!0,onNewSession:s,onRefresh:a,isRefreshing:o=!1,onNavigateSettings:l}){const{t:c}=_e("common"),[h,u]=k.useState(!1),O=k.useRef(null);k.useEffect(()=>{if(!h)return;const P=T=>{O.current&&!O.current.contains(T.target)&&u(!1)};return document.addEventListener("mousedown",P),()=>document.removeEventListener("mousedown",P)},[h]),k.useEffect(()=>{if(!h)return;const P=T=>{T.key==="Escape"&&u(!1)};return document.addEventListener("keydown",P),()=>document.removeEventListener("keydown",P)},[h]);const p=k.useCallback(()=>{u(P=>!P)},[]),b=k.useCallback(()=>{t==null||t(),u(!1)},[t]),y=k.useCallback(()=>{e==null||e(),u(!1)},[e]),g=k.useCallback(()=>{r==null||r(),u(!1)},[r]),x=k.useCallback(()=>{n==null||n(),u(!1)},[n]),v=k.useCallback(()=>{s==null||s(),u(!1)},[s]),w=k.useCallback(()=>{a==null||a(),u(!1)},[a]),Q=k.useCallback(()=>{l==null||l(),u(!1)},[l]),_="w-full flex items-center gap-3 px-3 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040] transition-colors";return d.jsxs("div",{ref:O,className:"relative",children:[d.jsx("button",{type:"button",onClick:p,className:`p-2 hover:bg-white/10 dark:hover:bg-[#253040] rounded-lg\r
|
|
1060
1060
|
text-white/80 dark:text-gray-200\r
|
|
1061
1061
|
focus:outline-none focus:ring-2 focus:ring-blue-500`,"aria-label":c("headerMenu.moreMenu"),"aria-haspopup":"menu","aria-expanded":h,children:d.jsx(Za,{className:"w-5 h-5","aria-hidden":"true"})}),h&&d.jsxs("div",{role:"menu",className:`absolute right-0 top-full mt-1 w-48 bg-white dark:bg-[#263240]\r
|
|
1062
1062
|
border border-gray-200 dark:border-[#253040] rounded-lg shadow-lg z-50\r
|
|
@@ -1435,7 +1435,7 @@ ${a}`:a;return d.jsxs("div",{"data-testid":"tool-result-bash",children:[d.jsx(y0
|
|
|
1435
1435
|
focus:outline-none focus:ring-2 focus:ring-blue-500`}),d.jsx("p",{className:"mt-1 text-xs text-gray-500 dark:text-gray-300",children:t("advanced.maxBudgetDesc")})]})]})}const Om=[{id:"global",titleKey:"tabs.global",icon:sa},{id:"project",titleKey:"tabs.project",icon:Mte},{id:"notifications",titleKey:"tabs.notifications",icon:Eg},{id:"advanced",titleKey:"tabs.advanced",icon:i1},{id:"help",titleKey:"tabs.help",icon:hte},{id:"about",titleKey:"tabs.about",icon:e1}],TRe=Om.map(t=>t.id);function sE(){const{t}=_e("settings"),{t:e}=_e("common"),r=Tn(),{tab:n}=Rn(),{logout:i}=Xo(),s=n&&TRe.includes(n)?n:"global",[a,o]=k.useState(s),l=k.useRef(null),c=()=>{r("/")},h=k.useCallback(async()=>{await i(),r("/login",{replace:!0})},[i,r]),u=k.useRef(null),O=b=>{const y=a!==b;o(g=>g===b?null:b),u.current=y?b:null};k.useEffect(()=>{const b=u.current;b&&(u.current=null,requestAnimationFrame(()=>{const y=document.getElementById(`settings-section-${b}`),g=l.current;if(y&&g){const x=y.getBoundingClientRect(),v=g.getBoundingClientRect(),w=g.scrollTop+(x.top-v.top);g.scrollTop=w}}))},[a]);const p=b=>{switch(b){case"global":return d.jsx(pRe,{});case"project":return d.jsx(bRe,{});case"notifications":return d.jsxs(d.Fragment,{children:[d.jsxs("h3",{className:"text-sm font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2",children:[d.jsx(Eg,{className:"w-4 h-4"}),"Web Push"]}),d.jsx(vRe,{}),d.jsx("hr",{className:"my-8 border-gray-200 dark:border-[#2d3a4a]"}),d.jsxs("h3",{className:"text-sm font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2",children:[d.jsx(Ng,{className:"w-4 h-4"}),"Telegram"]}),d.jsx(xRe,{})]});case"advanced":return d.jsx(CRe,{});case"help":return d.jsx(_Re,{});case"about":return d.jsx($Re,{})}};return d.jsxs("div",{className:"h-dvh flex flex-col bg-white dark:bg-[#1c2129] transition-colors duration-200",children:[d.jsx("header",{className:"flex-shrink-0 sticky top-0 z-10 bg-gray-50 dark:bg-[#263240] border-b border-gray-200 dark:border-[#253040]",children:d.jsxs("div",{className:"content-container flex items-center px-4 py-3 min-h-14",children:[d.jsx("button",{onClick:c,className:`p-2 -ml-2 mr-3 hover:bg-gray-100 dark:hover:bg-[#253040] rounded-lg\r
|
|
1436
1436
|
text-gray-700 dark:text-gray-200\r
|
|
1437
1437
|
focus:outline-none focus:ring-2 focus:ring-blue-500`,"aria-label":t("page.backAriaLabel"),children:d.jsx(Rg,{className:"w-5 h-5","aria-hidden":"true"})}),d.jsx("h1",{className:"text-lg font-semibold text-gray-900 dark:text-white flex-1",children:t("page.title")}),d.jsx($h,{className:"hidden sm:block"}),d.jsx("button",{onClick:h,"aria-label":e("project.logout"),title:e("project.logout"),className:"p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-[#253040] text-red-600 dark:text-red-400 transition-colors",children:d.jsx(Sre,{className:"w-5 h-5","aria-hidden":"true"})})]})}),d.jsxs("div",{className:"content-container hidden md:flex flex-1 overflow-hidden w-full",children:[d.jsx("nav",{className:"flex-shrink-0 border-r border-gray-200 dark:border-[#253040] overflow-y-auto py-4 px-3",children:Om.map(b=>d.jsxs("button",{onClick:()=>r(`/settings/${b.id}`),className:`flex items-center gap-3 w-full px-4 py-2.5 text-sm rounded-lg transition-colors mb-1
|
|
1438
|
-
${s===b.id?"bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300 font-medium":"text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040]"}`,children:[d.jsx(b.icon,{className:"w-4 h-4 flex-shrink-0","aria-hidden":"true"}),d.jsx("span",{className:"whitespace-nowrap",children:t(b.titleKey)})]},b.id))}),d.jsxs("main",{className:"flex-1 min-w-0 overflow-y-auto p-6",children:[d.jsx("h2",{className:"text-base font-semibold text-gray-900 dark:text-white mb-4",children:t(Om.find(b=>b.id===s).titleKey)}),p(s)]})]}),d.jsx("div",{ref:l,className:"content-container md:hidden flex-1 overflow-y-auto w-full",style:{scrollBehavior:"auto"},children:Om.map(b=>d.jsx(fRe,{sectionId:b.id,title:t(b.titleKey),icon:b.icon,isExpanded:a===b.id,onToggle:()=>O(b.id),children:p(b.id)},b.id))})]})}const aE=[{id:"overview",labelKey:"tabs.overview",icon:lj,path:""},{id:"board",labelKey:"tabs.board",icon:Dv,path:"/board"},{id:"sessions",labelKey:"tabs.sessions",icon:Wo,path:"/sessions"},{id:"queue",labelKey:"tabs.queue",icon:Xg,path:"/queue"},{id:"files",labelKey:"tabs.files",icon:As,path:"/files"},{id:"git",labelKey:"tabs.git",icon:No,path:"/git"},{id:"terminal",labelKey:"tabs.terminal",icon:Rs,path:"/terminal"}];function RRe(){const{t}=_e("common"),{projectSlug:e}=Rn(),r=Tn(),n=us(),{projects:i,fetchProjects:s}=Ga(),{connectionStatus:a,reconnectAttempt:o,lastError:l,connect:c}=Rk(),h=Vt(_=>_.terminalAccess),u=(h==null?void 0:h.enabled)!==!1,O=(h==null?void 0:h.allowed)??!0;k.useEffect(()=>{i.length===0&&s()},[i.length,s]);const[p,b]=k.useState(!1),y=k.useRef(null);Ch(y,()=>b(!1));const g=k.useMemo(()=>{const _=i.find(P=>P.projectSlug===e);return(_==null?void 0:_.originalPath)||e||""},[i,e]),x=k.useMemo(()=>{const _=g.replace(/\\/g,"/").split("/");return _[_.length-1]||g},[g]),v=k.useMemo(()=>{const _=`/project/${e}`;for(const P of[...aE].reverse())if(P.path&&n.pathname.startsWith(`${_}${P.path}`))return P.id;return"overview"},[n.pathname,e]),w=()=>r("/"),Q=_=>{r(`/project/${e}${_}`)};return d.jsxs("div",{className:"h-dvh flex flex-col bg-white dark:bg-[#1c2129] transition-colors duration-200",children:[d.jsxs("header",{className:"flex-shrink-0 sticky top-0 z-10 bg-[#243648] dark:bg-[#171e24] border-b border-slate-200 dark:border-slate-700/50",children:[d.jsxs("div",{className:"content-container flex items-center justify-between px-4 py-3 min-h-14",children:[d.jsxs("div",{className:"flex items-stretch min-w-0 flex-1",children:[d.jsx("button",{onClick:w,className:"self-center p-2 -ml-2 mr-2 hover:bg-white/10 dark:hover:bg-[#253040] rounded-lg text-white/80 dark:text-gray-200","aria-label":t("layout.back"),children:d.jsx(Rg,{className:"w-5 h-5"})}),d.jsx(km,{}),d.jsx("div",{className:"w-px self-stretch bg-gray-200 dark:bg-[#253040] mx-3"}),d.jsxs("div",{className:"min-w-0 flex-1",children:[d.jsx("h1",{className:"text-base font-semibold truncate text-white dark:text-white",children:x}),d.jsx("p",{className:"text-xs text-white/60 dark:text-gray-400 truncate",children:g})]})]}),d.jsxs("div",{className:"flex items-center gap-1 ml-4",children:[d.jsx(fD,{status:a,reconnectAttempt:o,lastError:l,onReconnect:c,compact:!0}),d.jsx($h,{className:"hidden sm:block"}),d.jsx("button",{onClick:()=>window.location.reload(),"aria-label":t("layout.refresh"),className:"hidden sm:block p-2 rounded-lg hover:bg-white/10 dark:hover:bg-[#253040] text-white/80 dark:text-gray-200 transition-colors",children:d.jsx(Ir,{className:"w-5 h-5","aria-hidden":"true"})}),d.jsx("button",{onClick:()=>r("/settings"),"aria-label":t("project.settings"),className:"hidden sm:block p-2 rounded-lg hover:bg-white/10 dark:hover:bg-[#253040] text-white/80 dark:text-gray-200 transition-colors",children:d.jsx(sa,{className:"w-5 h-5","aria-hidden":"true"})}),d.jsxs("div",{className:"relative sm:hidden",ref:y,children:[d.jsx("button",{onClick:()=>b(!p),className:"p-2 hover:bg-white/10 dark:hover:bg-[#253040] rounded-lg text-white/80 dark:text-gray-200","aria-label":t("project.menuLabel"),"aria-expanded":p,"aria-haspopup":"menu",children:d.jsx(Za,{className:"w-5 h-5"})}),p&&d.jsxs("div",{role:"menu",className:"absolute right-0 top-full mt-2 w-48 bg-white dark:bg-[#263240] rounded-lg shadow-lg border border-gray-200 dark:border-[#253040] z-50 py-1",children:[d.jsxs("button",{role:"menuitem",onClick:()=>window.location.reload(),className:"w-full px-4 py-2 text-left text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040] flex items-center gap-2",children:[d.jsx(Ir,{className:"w-4 h-4"}),t("layout.refresh")]}),d.jsx("div",{className:"border-t border-gray-200 dark:border-[#253040] my-1"}),d.jsxs("button",{role:"menuitem",onClick:()=>{r("/settings"),b(!1)},className:"w-full px-4 py-2 text-left text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040] flex items-center gap-2",children:[d.jsx(sa,{className:"w-4 h-4"}),t("project.settings")]})]})]})]})]}),d.jsx("nav",{className:"content-container flex px-4","aria-label":t("layout.projectTabs"),children:aE.map(_=>{if(_.id==="terminal"&&!u)return null;const P=v===_.id,T=_.icon,C=_.id==="terminal"&&!O;return d.jsxs("button",{onClick:C?void 0:()=>Q(_.path),disabled:C,className:`flex items-center gap-2 px-4 py-2.5 text-sm font-medium border-b-2 transition-colors whitespace-nowrap ${C?"border-transparent opacity-50 cursor-not-allowed text-gray-500 dark:text-gray-400":P?"border-blue-300 text-blue-200 dark:text-blue-400":"border-transparent text-white/50 dark:text-gray-300 hover:text-white/80 dark:hover:text-gray-300 hover:border-white/30 dark:hover:border-[#2d3a4a]"}`,"aria-current":P?"page":void 0,"aria-disabled":C||void 0,"aria-label":C?t("layout.terminalDisabled"):void 0,children:[d.jsx(T,{className:"w-4 h-4"}),d.jsx("span",{className:"hidden sm:inline",children:t(_.labelKey)})]},_.id)})})]}),d.jsx("main",{className:"flex-1 overflow-auto",children:d.jsx("div",{className:"content-container h-full",children:d.jsx(vK,{})})})]})}let pm=!1,zw=null;const xI="cli-status-cache",ERe=3600*1e3;function jRe(){try{const t=sessionStorage.getItem(xI);if(!t)return null;const{status:e,timestamp:r}=JSON.parse(t);return Date.now()-r>ERe?null:e!=null&&e.authenticated||e!=null&&e.apiKeySet?e:null}catch{return null}}function XRe(t){try{sessionStorage.setItem(xI,JSON.stringify({status:t,timestamp:Date.now()}))}catch{}}const oE=jRe();oE&&(pm=!0,zw=oE);function Ac({children:t}){const{t:e}=_e("common"),{isAuthenticated:r,isLoading:n,checkAuth:i}=Xo(),s=us(),[a,o]=k.useState(zw),[l,c]=k.useState(!pm),[h,u]=k.useState(null),[O,p]=k.useState(!1),b=k.useCallback(async(g=!1)=>{if(!g&&pm)return;c(!0),u(null);const x=2,v=1500;for(let w=0;w<=x;w++)try{const Q=await qe.get("/cli-status");console.log("[AuthGuard] CLI status response:",Q),o(Q),zw=Q,pm=!0,XRe(Q);const _=!Q.authenticated&&!Q.apiKeySet;p(_),c(!1);return}catch(Q){if(console.error("[AuthGuard] CLI status fetch failed (attempt",w+1,"):",Q),Q instanceof Gr&&Q.status===401){console.warn("[AuthGuard] Session expired during CLI status check, re-checking auth"),c(!1),Xo.getState().recheckAuth();return}if(w<x){await new Promise(_=>setTimeout(_,v));continue}u(Q instanceof Error?Q.message:e("error.cliStatusFailed")),p(!1),c(!1)}},[]);if(k.useEffect(()=>{i()},[i]),k.useEffect(()=>{r&&!n&&s.pathname!=="/onboarding"?b():s.pathname==="/onboarding"&&c(!1)},[r,n,s.pathname,b]),n)return d.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-100 dark:bg-[#1c2129]",children:d.jsx(kh,{size:"lg"})});if(!r)return d.jsx(_v,{to:"/login",state:{from:s},replace:!0});if(l&&s.pathname!=="/onboarding")return d.jsx("div",{className:"min-h-screen flex items-center justify-center bg-white dark:bg-[#1c2129]",role:"status","aria-label":e("loading"),children:d.jsxs("div",{className:"flex flex-col items-center gap-3",children:[d.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500","aria-hidden":"true"}),d.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-300",children:e("cliStatusChecking")})]})});if(O&&s.pathname!=="/onboarding")return d.jsx(_v,{to:"/onboarding",replace:!0});const y={cliStatus:a,isLoading:l,error:h,refetch:b,isReady:(a==null?void 0:a.authenticated)===!0||(a==null?void 0:a.apiKeySet)===!0};return d.jsx(Nne,{value:y,children:t})}function ARe({children:t}){const{isAuthenticated:e,isLoading:r,checkAuth:n}=Xo(),i=Tn();return k.useEffect(()=>{n()},[n]),k.useEffect(()=>{!r&&e&&i("/",{replace:!0})},[e,r,i]),r?d.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-100 dark:bg-[#1c2129]",children:d.jsx(kh,{size:"lg"})}):e?null:d.jsx(d.Fragment,{children:t})}function NRe({content:t}){return d.jsx("div",{className:"flex-1 overflow-y-auto p-4 bg-white dark:bg-[#1c2129]",children:d.jsx("div",{className:"max-w-4xl mx-auto",children:d.jsx(Xf,{content:t})})})}const DRe=k.lazy(()=>ee(()=>import("./index-CFWfpySn.js"),[]));function LRe(){const{openFile:t,content:e,isDirty:r,isLoading:n,isSaving:i,isTruncated:s,error:a,isMarkdownPreview:o,saveFile:l,closeEditor:c,setContent:h,resetError:u,openFileInEditor:O,toggleMarkdownPreview:p,pendingNavigation:b,confirmPendingNavigation:y,cancelPendingNavigation:g}=mn(),{t:x}=_e("common"),[v,w]=k.useState(!1),Q=k.useRef(null),_=k.useRef(null),{resolvedTheme:P}=Cd(),T=Td(),C=Oa(U=>U.activePanel),R=Oa(U=>U.panelWidth),N=480,[A,X]=k.useState(()=>typeof window<"u"?window.innerWidth:1024);k.useEffect(()=>{const U=()=>X(window.innerWidth);return window.addEventListener("resize",U),()=>window.removeEventListener("resize",U)},[]);const W=!(T||C!==null&&A-R<N)&&C?R:0,Y=t?c3(t.path):!1,ne=k.useMemo(()=>{const U=[Ve.lineWrapping];if(t){const z=l3(t.path);z&&U.push(z)}return s&&U.push(Ve.editable.of(!1)),U},[t,s]),K=k.useCallback(async()=>{if(!r||i)return;await l()?ht.success(x("editor.fileSaved")):ht.error(x("editor.fileSaveFailed"))},[r,i,l]),B=k.useCallback(()=>{b&&g(),r?w(!0):c()},[r,c,b,g]);k.useEffect(()=>{t&&(_.current={...t})},[t]);const D=k.useCallback(()=>{_.current&&O(_.current.projectSlug,_.current.path)},[O]);d0(!!t,B,D),k.useEffect(()=>{if(!t)return;const U=z=>{if((z.ctrlKey||z.metaKey)&&z.key==="s"){z.preventDefault(),K();return}if(z.key==="Escape"){if(z.stopImmediatePropagation(),b)return;if(v){w(!1);return}B()}};return document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)},[t,K,B,v,b]),k.useEffect(()=>{if(t)return document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}},[t]),k.useEffect(()=>{var U;!o&&Y&&((U=Q.current)==null||U.focus())},[o,Y]);const E=k.useCallback(U=>{Q.current=U;const z=mn.getState().targetLine;z&&requestAnimationFrame(()=>{try{const J=Math.min(z,U.state.doc.lines),ce=U.state.doc.line(J);U.dispatch({selection:{anchor:ce.from},effects:Ve.scrollIntoView(ce.from,{y:"start",yMargin:8})})}catch{}mn.setState({targetLine:null})})},[]);if(!t)return null;const M=t.path;return d.jsxs(d.Fragment,{children:[d.jsx("div",{className:"fixed inset-0 bg-black/50 z-[55] transition-[right] duration-300 ease-in-out",style:{right:W},onClick:U=>{U.stopPropagation(),B()}}),d.jsxs("div",{className:"fixed inset-0 z-[60] flex flex-col bg-white dark:bg-[#1c2129] transition-[right] duration-300 ease-in-out",style:{right:W},children:[d.jsxs("div",{className:"flex items-center justify-between px-4 py-2 border-b border-gray-200 dark:border-[#253040] bg-gray-50 dark:bg-[#263240]",children:[d.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[d.jsx(Ba,{className:"w-4 h-4 shrink-0 text-gray-500 dark:text-gray-300"}),d.jsx("span",{className:"truncate text-sm font-mono text-gray-700 dark:text-gray-200",children:M}),r&&d.jsx("span",{className:"text-xs font-bold text-amber-500 shrink-0",children:"M"})]}),d.jsxs("div",{className:"flex items-center gap-2 ml-3 shrink-0",children:[Y&&d.jsx("button",{onClick:p,className:"flex items-center gap-1 px-3 py-1 text-sm font-medium whitespace-nowrap text-gray-700 dark:text-gray-200 bg-gray-100 dark:bg-[#253040] hover:bg-gray-200 dark:hover:bg-[#2d3a4a] rounded transition-colors",title:x(o?"editor.editMode":"editor.previewLabel"),"aria-label":x(o?"editor.editMode":"editor.previewLabel"),children:o?d.jsxs(d.Fragment,{children:[d.jsx(Ag,{className:"w-4 h-4"}),d.jsx("span",{children:x("editor.editLabel")})]}):d.jsxs(d.Fragment,{children:[d.jsx(Jc,{className:"w-4 h-4"}),d.jsx("span",{children:x("editor.previewLabel")})]})}),d.jsx("button",{onClick:K,disabled:!r||i,title:x("editor.saveShortcut"),className:"px-3 py-1 text-sm font-medium whitespace-nowrap text-white bg-blue-600 hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 rounded disabled:opacity-40 disabled:cursor-not-allowed transition-colors",children:x(i?"editor.saving":"editor.save")}),d.jsx("button",{onClick:B,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300","aria-label":x("editor.close"),children:d.jsx(Yt,{className:"w-5 h-5"})})]})]}),n?d.jsxs("div",{className:"flex-1 flex items-center justify-center",children:[d.jsx(vt,{className:"w-8 h-8 animate-spin text-gray-400"}),d.jsx("span",{className:"ml-2 text-sm text-gray-500 dark:text-gray-300",children:x("editor.loadingFile")})]}):a?d.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center gap-4 text-red-500",children:[d.jsx("p",{children:a}),d.jsx("button",{onClick:()=>{u(),O(t.projectSlug,t.path)},className:"px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors",children:x("button.retry")})]}):d.jsxs(d.Fragment,{children:[s&&d.jsx("div",{className:"px-4 py-2 bg-amber-50 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300 text-xs border-b border-amber-200 dark:border-amber-800",children:x("editor.fileTruncated")}),o&&Y?d.jsx(NRe,{content:e}):d.jsx("div",{className:"flex-1 min-h-0 [&_.cm-editor]:h-full [&_.cm-scroller]:!overflow-auto","aria-label":`Editing ${M}`,children:d.jsx(k.Suspense,{fallback:d.jsxs("div",{className:"h-full flex items-center justify-center",children:[d.jsx(vt,{className:"w-8 h-8 animate-spin text-gray-400"}),d.jsx("span",{className:"ml-2 text-sm text-gray-500 dark:text-gray-300",children:x("editor.loadingEditor")})]}),children:d.jsx(DRe,{value:e,extensions:ne,theme:P==="dark"?sD:"light",onChange:U=>h(U),onCreateEditor:E,height:"100%",style:{height:"100%"},basicSetup:{lineNumbers:!0,highlightActiveLine:!0,tabSize:2,foldGutter:!1},readOnly:s})})})]})]}),d.jsx(Ia,{isOpen:v,title:x("editor.unsavedTitle"),message:x("editor.unsavedCloseMessage"),confirmText:x("editor.closeWithoutSaving"),cancelText:x("button.cancel"),variant:"danger",onConfirm:()=>{c(),w(!1)},onCancel:()=>w(!1)}),d.jsx(Ia,{isOpen:!!b,title:x("editor.unsavedTitle"),message:x("editor.unsavedOpenMessage",{path:(b==null?void 0:b.path)??""}),confirmText:x("editor.openWithoutSaving"),cancelText:x("button.cancel"),variant:"danger",onConfirm:y,onCancel:g})]})}const Mp=.25,IRe=.1,MRe=10;function zRe(){const{openImage:t,zoomLevel:e,closeViewer:r,setZoom:n,resetView:i}=Vo(),{t:s}=_e("common"),[a,o]=k.useState(!0),[l,c]=k.useState(!1),[h,u]=k.useState(!1),[O,p]=k.useState({x:0,y:0}),b=k.useRef({x:0,y:0}),y=k.useRef({x:0,y:0}),g=k.useRef(null),x=Td(),v=Oa(E=>E.activePanel),w=Oa(E=>E.panelWidth),Q=480,[_,P]=k.useState(()=>typeof window<"u"?window.innerWidth:1024);k.useEffect(()=>{const E=()=>P(window.innerWidth);return window.addEventListener("resize",E),()=>window.removeEventListener("resize",E)},[]);const C=!(x||v!==null&&_-w<Q)&&v?w:0,R=k.useCallback(()=>{r()},[r]);k.useEffect(()=>{t&&(g.current={...t})},[t]);const N=k.useCallback(()=>{g.current&&Vo.getState().openImageViewer(g.current.projectSlug,g.current.path)},[]);d0(!!t,R,N),k.useEffect(()=>{t&&(o(!0),c(!1),p({x:0,y:0}))},[t]),k.useEffect(()=>{if(!t)return;const E=M=>{M.key==="Escape"&&(M.stopImmediatePropagation(),R())};return document.addEventListener("keydown",E),()=>document.removeEventListener("keydown",E)},[t,R]),k.useEffect(()=>{if(t)return document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}},[t]);const A=k.useCallback(E=>{E.preventDefault();const M=E.deltaY>0?-Mp:Mp;n(e+M)},[e,n]),X=k.useCallback(E=>{E.button===0&&(u(!0),b.current={x:E.clientX,y:E.clientY},y.current={...O})},[O]),I=k.useCallback(E=>{h&&p({x:y.current.x+(E.clientX-b.current.x),y:y.current.y+(E.clientY-b.current.y)})},[h]),W=k.useCallback(()=>{u(!1)},[]),Y=k.useCallback(()=>{i(),p({x:0,y:0})},[i]);if(!t)return null;const ne=t.path,K=ne.includes("/")?ne.split("/").pop():ne,B=`/api/projects/${t.projectSlug}/fs/raw?path=${encodeURIComponent(ne)}`,D=Math.round(e*100);return d.jsxs(d.Fragment,{children:[d.jsx("div",{className:"fixed inset-0 bg-black/50 z-[55] transition-[right] duration-300 ease-in-out",style:{right:C},onClick:R}),d.jsxs("div",{className:"fixed inset-0 z-[60] flex flex-col bg-white dark:bg-[#1c2129] transition-[right] duration-300 ease-in-out",style:{right:C},children:[d.jsxs("div",{className:"flex items-center justify-between px-4 py-2 border-b border-gray-200 dark:border-[#253040] bg-gray-50 dark:bg-[#263240]",children:[d.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[d.jsx(x$,{className:"w-4 h-4 shrink-0 text-gray-500 dark:text-gray-300"}),d.jsx("span",{className:"truncate text-sm font-mono text-gray-700 dark:text-gray-200",children:ne})]}),d.jsxs("div",{className:"flex items-center gap-1 ml-3",children:[d.jsx("button",{onClick:()=>n(e-Mp),disabled:e<=IRe,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300 disabled:opacity-40",title:s("imageViewer.zoomOut"),children:d.jsx(Ane,{className:"w-4 h-4"})}),d.jsxs("span",{className:"text-xs text-gray-500 dark:text-gray-300 w-12 text-center tabular-nums",children:[D,"%"]}),d.jsx("button",{onClick:()=>n(e+Mp),disabled:e>=MRe,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300 disabled:opacity-40",title:s("imageViewer.zoomIn"),children:d.jsx(jne,{className:"w-4 h-4"})}),d.jsx("button",{onClick:Y,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300",title:s("imageViewer.resetZoom"),children:d.jsx(t1,{className:"w-4 h-4"})}),d.jsx("div",{className:"w-px h-5 bg-gray-200 dark:bg-[#253040] mx-1"}),d.jsx("button",{onClick:R,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300","aria-label":s("imageViewer.close"),children:d.jsx(Yt,{className:"w-5 h-5"})})]})]}),d.jsxs("div",{className:`flex-1 overflow-hidden flex items-center justify-center bg-gray-100 dark:bg-gray-950 ${h?"cursor-grabbing":"cursor-grab"}`,onWheel:A,onMouseDown:X,onMouseMove:I,onMouseUp:W,onMouseLeave:W,children:[a&&!l&&d.jsxs("div",{className:"absolute flex items-center gap-2",children:[d.jsx(vt,{className:"w-8 h-8 animate-spin text-gray-400"}),d.jsx("span",{className:"text-sm text-gray-500 dark:text-gray-300",children:s("imageViewer.loadingImage")})]}),l?d.jsxs("div",{className:"flex flex-col items-center gap-2 text-red-500",children:[d.jsx(x$,{className:"w-12 h-12 opacity-50"}),d.jsx("p",{className:"text-sm",children:s("imageViewer.loadFailed")}),d.jsx("p",{className:"text-xs text-gray-400",children:K})]}):d.jsx("img",{src:B,alt:K,draggable:!1,className:"select-none transition-opacity duration-200",style:{transform:`translate(${O.x}px, ${O.y}px) scale(${e})`,opacity:a?0:1,maxWidth:"none",maxHeight:"none"},onLoad:()=>o(!1),onError:()=>{o(!1),c(!0)}})]})]})]})}function qRe({entryType:t,initialValue:e,onConfirm:r,onCancel:n}){const{t:i}=_e("common"),[s,a]=k.useState(e),o=k.useRef(null);k.useEffect(()=>{if(o.current&&(o.current.focus(),e)){const h=e.lastIndexOf("."),u=h>0?h:e.length;o.current.setSelectionRange(0,u)}},[]);const l=h=>{h.key==="Enter"?(h.preventDefault(),r(s)):h.key==="Escape"&&(h.preventDefault(),n())},c=()=>{s.trim()?r(s):n()};return d.jsxs("div",{className:"flex flex-col items-center gap-1 p-2 rounded-lg",children:[t==="directory"?d.jsx(Dl,{className:"w-8 h-8 text-blue-500 dark:text-blue-400"}):d.jsx(Nl,{className:"w-8 h-8 text-gray-500 dark:text-gray-400"}),d.jsx("input",{ref:o,type:"text",value:s,onChange:h=>a(h.target.value),onKeyDown:l,onBlur:c,className:"text-xs text-center w-full bg-white dark:bg-[#1c2129] dark:text-white border border-blue-500 rounded px-1 py-0 outline-none h-4 leading-4","aria-label":i("files.renameAria")})]})}function URe({projectSlug:t,currentPath:e,showHidden:r,onFileSelect:n,onNavigate:i,enableContextMenu:s=!1,onCreateEntry:a,onDeleteEntry:o,onRenameEntry:l,onCopy:c,onCut:h,onPaste:u,onDownload:O,hasClipboard:p=!1,cutPath:b,refreshTrigger:y,onFileDrop:g,isUploading:x=!1}){const{t:v}=_e("common"),[w,Q]=k.useState([]),[_,P]=k.useState(!0),[T,C]=k.useState(!1),[R,N]=k.useState(null),[A,X]=k.useState(null),[I,W]=k.useState(null),[Y,ne]=k.useState(null),K=mn(me=>{var xe;return((xe=me.openFile)==null?void 0:xe.path)??null}),B=k.useCallback(async()=>{P(!0),N(null),Q([]);try{const me=await ri.listDirectory(t,e);Q(me.entries)}catch(me){N(me.message)}finally{P(!1)}},[t,e]);k.useEffect(()=>{B()},[B]),k.useEffect(()=>{y===void 0||y===0||B()},[y]),k.useEffect(()=>{if(!_){C(!1);return}const me=setTimeout(()=>C(!0),300);return()=>clearTimeout(me)},[_]);const D=k.useMemo(()=>{const me=k0(w);return r?me:me.filter(xe=>!w0.includes(xe.name))},[w,r]),E=k.useCallback(me=>{const xe=e==="."?me.name:`${e}/${me.name}`;me.type==="directory"?i(xe):n(xe)},[e,i,n]),M=k.useCallback((me,xe)=>{if(!s)return;me.preventDefault(),me.stopPropagation(),me.nativeEvent.stopImmediatePropagation();const ft=e==="."?xe.name:`${e}/${xe.name}`,St=xe.type==="directory"?ft:e;X({x:me.clientX,y:me.clientY,targetPath:ft,targetType:xe.type,parentPath:St})},[s,e]),U=k.useCallback((me,xe)=>{if(!s)return;me.stopPropagation();const ft=me.currentTarget.getBoundingClientRect(),St=e==="."?xe.name:`${e}/${xe.name}`,bt=xe.type==="directory"?St:e;X({x:ft.right,y:ft.bottom,targetPath:St,targetType:xe.type,parentPath:bt})},[s,e]),z=k.useCallback(me=>{if(!s)return;const xe=me.target;xe instanceof Element&&xe.closest("[data-grid-item]")||(me.preventDefault(),me.stopPropagation(),me.nativeEvent.stopImmediatePropagation(),X({x:me.clientX,y:me.clientY,targetPath:e,targetType:"directory",parentPath:e}))},[s,e]),J=k.useCallback(me=>{A&&(W({mode:"create",parentPath:A.parentPath,entryType:me,initialValue:""}),X(null))},[A]),ce=k.useCallback(()=>{if(!A)return;const me=A.targetPath.includes("/")?A.targetPath.split("/").pop():A.targetPath;W({mode:"rename",parentPath:e,targetPath:A.targetPath,entryType:A.targetType,initialValue:me}),X(null)},[A,e]),le=k.useCallback(async me=>{if(!I||!me.trim()){W(null);return}try{I.mode==="create"?(await(a==null?void 0:a(I.parentPath,I.entryType,me.trim())),await B()):I.mode==="rename"&&I.targetPath&&me.trim()!==I.initialValue&&(await(l==null?void 0:l(I.targetPath,me.trim())),await B())}catch{}W(null)},[I,a,l,B]),Z=k.useCallback(()=>{if(!A)return;const me=A.targetPath.includes("/")?A.targetPath.split("/").pop():A.targetPath;ne({path:A.targetPath,name:me,type:A.targetType}),X(null)},[A]),V=k.useCallback(async()=>{if(Y){try{await(o==null?void 0:o(Y.path)),await B()}catch{}ne(null)}},[Y,o,B]),[H,te]=k.useState(!1),ue=k.useRef(0),ae=k.useCallback(me=>{g&&me.dataTransfer.types.includes("Files")&&(me.preventDefault(),ue.current++,ue.current===1&&te(!0))},[g]),he=k.useCallback(me=>{g&&me.dataTransfer.types.includes("Files")&&(me.preventDefault(),me.dataTransfer.dropEffect="copy")},[g]),re=k.useCallback(me=>{g&&me.dataTransfer.types.includes("Files")&&(me.preventDefault(),ue.current=Math.max(0,ue.current-1),ue.current===0&&te(!1))},[g]),Qe=k.useCallback(me=>{if(!g)return;me.preventDefault(),ue.current=0,te(!1);const xe=Array.from(me.dataTransfer.files);xe.length>0&&g(xe)},[g]);return k.useEffect(()=>{const me=()=>{ue.current=0,te(!1)};return window.addEventListener("dragend",me),window.addEventListener("drop",me),()=>{window.removeEventListener("dragend",me),window.removeEventListener("drop",me)}},[]),_&&w.length===0?T?d.jsxs("div",{className:"flex items-center gap-2 p-4 text-sm text-gray-500 dark:text-gray-300 justify-center",children:[d.jsx(vt,{className:"w-4 h-4 animate-spin"}),d.jsx("span",{children:v("loadingStatus")})]}):null:R&&w.length===0?d.jsx("div",{className:"p-4",children:d.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-red-500 dark:text-red-400",children:[d.jsx(Ri,{className:"w-3.5 h-3.5"}),d.jsx("span",{children:R}),d.jsx("button",{className:"text-xs text-blue-500 dark:text-blue-400 hover:underline cursor-pointer ml-2",onClick:B,children:v("button.retry")})]})}):d.jsxs("div",{className:"p-2 relative",onContextMenu:z,onDragEnter:ae,onDragOver:he,onDragLeave:re,onDrop:Qe,children:[H&&d.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center bg-blue-50/80 dark:bg-blue-900/30 border-2 border-dashed border-blue-400 dark:border-blue-500 rounded-lg pointer-events-none",children:d.jsxs("div",{className:"flex flex-col items-center gap-2 text-blue-600 dark:text-blue-400",children:[d.jsx(Ph,{className:"w-8 h-8"}),d.jsx("span",{className:"text-sm font-medium",children:v("files.dropHere")})]})}),x&&d.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center bg-white/60 dark:bg-[#1c2129]/60 rounded-lg pointer-events-none",children:d.jsxs("div",{className:"flex items-center gap-2 text-gray-600 dark:text-gray-300",children:[d.jsx(vt,{className:"w-5 h-5 animate-spin"}),d.jsx("span",{className:"text-sm",children:v("files.uploading")})]})}),(I==null?void 0:I.mode)==="create"&&d.jsx("div",{className:"mb-2",children:d.jsx(Sg,{initialValue:I.initialValue,entryType:I.entryType,depth:0,onConfirm:le,onCancel:()=>W(null)})}),D.length===0&&!I?d.jsx("div",{className:"text-sm text-gray-500 dark:text-gray-400 italic text-center py-8",children:v("files.emptyFolder")}):d.jsxs("div",{className:"grid grid-cols-5 sm:grid-cols-7 md:grid-cols-9 gap-1",children:[e!=="."&&d.jsxs("div",{"data-grid-item":!0,role:"button",tabIndex:0,className:"group relative flex flex-col items-center gap-1 p-2 rounded-lg cursor-pointer transition-colors hover:bg-gray-100 dark:hover:bg-[#253040]/50",onClick:()=>{const me=e.includes("/")?e.substring(0,e.lastIndexOf("/")):".";i(me)},onKeyDown:me=>{if(me.key==="Enter"){const xe=e.includes("/")?e.substring(0,e.lastIndexOf("/")):".";i(xe)}},children:[d.jsx(Dl,{className:"w-8 h-8 text-blue-500 dark:text-blue-400"}),d.jsx("span",{className:"text-xs text-center w-full truncate text-gray-500 dark:text-gray-300",children:v("files.parentDir")})]}),D.map(me=>{const xe=e==="."?me.name:`${e}/${me.name}`,ft=K===xe;return(I==null?void 0:I.mode)==="rename"&&I.targetPath===xe?d.jsx(qRe,{entryType:me.type,initialValue:I.initialValue,onConfirm:le,onCancel:()=>W(null)},me.name):d.jsxs("div",{"data-grid-item":!0,role:"button",tabIndex:0,className:`group relative flex flex-col items-center gap-1 p-2 rounded-lg cursor-pointer select-none transition-colors hover:bg-gray-100 dark:hover:bg-[#253040]/50 ${ft?"bg-blue-50 dark:bg-blue-900/20 ring-1 ring-blue-300 dark:ring-blue-700":""} ${b===xe?"opacity-50":""}`,onClick:()=>E(me),onKeyDown:bt=>{bt.key==="Enter"&&E(me)},onContextMenu:bt=>M(bt,me),children:[me.type==="directory"?d.jsx(Dl,{className:"w-8 h-8 text-blue-500 dark:text-blue-400"}):d.jsx(Nl,{className:"w-8 h-8 text-gray-500 dark:text-gray-400"}),d.jsx("span",{className:`text-xs text-center w-full truncate ${ft?"text-blue-600 dark:text-blue-400":"text-gray-700 dark:text-gray-200"}`,children:me.name}),s&&d.jsx("button",{className:"absolute top-1 right-1 p-0.5 rounded opacity-0 group-hover:opacity-100 hover:bg-gray-200 dark:hover:bg-[#2d3a4a] transition-opacity",onClick:bt=>U(bt,me),"aria-label":v("files.moreMenu"),children:d.jsx(Za,{className:"w-3 h-3 text-gray-400"})})]},me.name)})]}),A&&d.jsx(pI,{x:A.x,y:A.y,targetType:A.targetType,onNewFile:()=>J("file"),onNewFolder:()=>J("directory"),onRename:()=>ce(),onDelete:()=>Z(),onClose:()=>X(null),onCopy:c?()=>{c(A.targetPath),X(null)}:void 0,onCut:h?()=>{h(A.targetPath),X(null)}:void 0,onPaste:u?()=>{const me=A.targetType==="directory"?A.targetPath:e;u(me).catch(()=>{}).finally(()=>B()),X(null)}:void 0,onDownload:O?()=>{O(A.targetPath),X(null)}:void 0,hasClipboard:p}),Y&&d.jsx(mI,{name:Y.name,type:Y.type,onConfirm:V,onCancel:()=>ne(null)})]})}const VRe=[".env",".git","node_modules",".next",".cache","__pycache__",".DS_Store","dist",".turbo"],lE={FILE_ALREADY_EXISTS:"files.crudErrors.alreadyExists",PARENT_NOT_FOUND:"files.crudErrors.parentNotFound",PROTECTED_PATH:"files.crudErrors.protectedPath",RENAME_TARGET_EXISTS:"files.crudErrors.targetExists",COPY_TARGET_EXISTS:"files.crudErrors.targetExists",COPY_TOO_LARGE:"files.crudErrors.copyTooLarge",PATH_TRAVERSAL:"files.crudErrors.outsideRoot"};function YRe(){const{t}=_e("common"),{projectSlug:e}=Rn(),r=k.useCallback((Z,V)=>{const H=Z;return H.code&&lE[H.code]?`${V}: ${t(lE[H.code])}`:`${V}: ${Z.message}`},[t]),[n,i]=k.useState(""),[s,a]=k.useState(!1),o=Kt(Z=>Z.preferences.fileExplorerViewMode??"grid"),[l,c]=k.useState(o),[h,u]=k.useState("."),{toasts:O,showToast:p,removeToast:b}=gj(),[y,g]=k.useState(null),x=k.useRef(null),[v,w]=k.useState(!1),[Q,_]=k.useState(0),[P,T]=k.useState(null),[C,R]=k.useState(!1);k.useEffect(()=>{if(!n.trim()||!e){T(null),R(!1);return}R(!0);const Z=setTimeout(async()=>{try{const V=await ri.searchFiles(e,n.trim(),s),H=s?V.results:V.results.filter(te=>!te.path.split("/").some(ae=>VRe.includes(ae)));T(H)}catch{T([])}finally{R(!1)}},300);return()=>clearTimeout(Z)},[n,e,s]);const N=k.useCallback(Z=>{qo(Z)?Vo.getState().openImageViewer(e,Z):mn.getState().requestFileNavigation(e,Z)},[e]),A=k.useCallback(Z=>{Z.type==="file"&&(qo(Z.path)?Vo.getState().openImageViewer(e,Z.path):mn.getState().requestFileNavigation(e,Z.path)),i("")},[e]),X=k.useCallback(async(Z,V,H)=>{try{const te=Z==="."?H:`${Z}/${H}`;await ri.createEntry(e,te,V),p({message:V==="directory"?t("files.toast.folderCreated",{name:H}):t("files.toast.fileCreated",{name:H}),type:"success"})}catch(te){throw p({message:r(te,t("files.toast.createFailed")),type:"error"}),te}},[e,p,t,r]),I=k.useCallback(async Z=>{try{const V=Z.includes("/")?Z.split("/").pop():Z;await ri.deleteEntry(e,Z),p({message:t("files.toast.deleted",{name:V}),type:"success"})}catch(V){throw p({message:r(V,t("files.toast.deleteFailed")),type:"error"}),V}},[e,p,t,r]),W=k.useCallback(async(Z,V)=>{try{const H=Z.includes("/")?Z.substring(0,Z.lastIndexOf("/")):".",te=H==="."?V:`${H}/${V}`;await ri.renameEntry(e,Z,te),p({message:t("files.toast.renamed",{name:V}),type:"success"})}catch(H){throw p({message:r(H,t("files.toast.renameFailed")),type:"error"}),H}},[e,p,t,r]),Y=k.useCallback(Z=>{g({path:Z,operation:"copy"});const V=Z.includes("/")?Z.split("/").pop():Z;p({message:t("files.toast.copied",{name:V}),type:"success"})},[p,t]),ne=k.useCallback(Z=>{g({path:Z,operation:"cut"});const V=Z.includes("/")?Z.split("/").pop():Z;p({message:t("files.toast.cut",{name:V}),type:"success"})},[p,t]),K=k.useCallback(async Z=>{if(!y||!e)return{};const V=y,H=V.path.includes("/")?V.path.split("/").pop():V.path,te=V.path.includes("/")?V.path.substring(0,V.path.lastIndexOf("/")):".";if(V.operation==="cut"&&te===Z)return{};const ue=V.operation==="cut";try{let ae=H;if(!ue&&te===Z){const re=H.match(/^(.+?)(\.tar\.\w+)$/);let Qe,me;if(re)Qe=re[1],me=re[2];else{const bt=H.lastIndexOf(".");Qe=bt>0?H.substring(0,bt):H,me=bt>0?H.substring(bt):""}const xe=await ri.listDirectory(e,Z),ft=new Set(xe.entries.map(bt=>bt.name));ae=`${Qe} - Copy${me}`;let St=2;for(;ft.has(ae);)ae=`${Qe} - Copy (${St})${me}`,St++}const he=Z==="."?ae:`${Z}/${ae}`;return ue?(await ri.renameEntry(e,V.path,he),p({message:t("files.toast.moved",{name:ae}),type:"success"}),g(re=>(re==null?void 0:re.path)===V.path&&(re==null?void 0:re.operation)==="cut"?null:re)):(await ri.copyEntry(e,V.path,he),p({message:t("files.toast.pasted",{name:ae}),type:"success"})),ue&&te!==Z?{sourceDir:te}:{}}catch(ae){throw p({message:r(ae,t("files.toast.pasteFailed")),type:"error"}),ae}},[y,e,p,t,r]),B=k.useCallback(async Z=>{if(!e)return;const V=ri.getDownloadUrl(e,Z);try{if(!(await fetch(V,{method:"HEAD"})).ok){p({message:t("files.toast.downloadFailed"),type:"error"});return}const te=document.createElement("a");te.href=V,te.download=Z.includes("/")?Z.split("/").pop():Z,document.body.appendChild(te),te.click(),document.body.removeChild(te)}catch{p({message:t("files.toast.downloadFailed"),type:"error"})}},[e,p,t]),D=k.useRef(!1),E=k.useCallback(async Z=>{if(!(Z.length===0||!e)){if(D.current){p({message:t("files.toast.uploadInProgress"),type:"info"});return}D.current=!0,w(!0);try{const V=await ri.uploadFiles(e,h,Z),H=V.files.length;p({message:H===1?t("files.toast.uploaded",{name:V.files[0].path.split("/").pop()}):t("files.toast.uploadedMultiple",{count:H}),type:"success"}),_(te=>te+1)}catch(V){p({message:r(V,t("files.toast.uploadFailed")),type:"error"})}finally{D.current=!1,w(!1),x.current&&(x.current.value="")}}},[e,h,p,t,r]),M=k.useCallback(()=>{var Z;(Z=x.current)==null||Z.click()},[]),U=k.useCallback(async Z=>{const V=Z.target.files;!V||V.length===0||await E(Array.from(V))},[E]),z=k.useCallback(Z=>{var H;const V=(H=Z.clipboardData)==null?void 0:H.files;!V||V.length===0||(Z.preventDefault(),E(Array.from(V)))},[E]),J=k.useRef(null);k.useEffect(()=>{const Z=J.current;if(Z)return Z.addEventListener("paste",z),()=>Z.removeEventListener("paste",z)},[z]);const ce=(()=>{if(h===".")return[{name:t("files.root"),path:"."}];const Z=h.split("/"),V=[{name:t("files.root"),path:"."}];for(let H=0;H<Z.length;H++)V.push({name:Z[H],path:Z.slice(0,H+1).join("/")});return V})();if(!e)return d.jsx("div",{className:"flex items-center justify-center h-full text-gray-500 dark:text-gray-300",children:t("files.projectNotFound")});const le=P!==null||C;return d.jsxs("div",{ref:J,className:"flex flex-col h-full",tabIndex:-1,children:[d.jsx("input",{ref:x,type:"file",multiple:!0,className:"hidden",onChange:U}),d.jsx("div",{className:"sticky top-0 z-[5] bg-white dark:bg-[#1c2129] border-b border-gray-200 dark:border-[#253040]",children:d.jsxs("div",{className:"flex items-center justify-between px-4 py-2 gap-3",children:[le?d.jsx("div",{}):d.jsx("nav",{"aria-label":t("files.breadcrumb"),className:"flex-shrink min-w-0",children:d.jsx("ol",{className:"flex items-center gap-0.5 text-xs",children:ce.map((Z,V)=>d.jsxs("li",{className:"flex items-center gap-0.5 min-w-0",children:[V>0&&d.jsx(Yo,{className:"w-3 h-3 text-gray-400 dark:text-gray-500 flex-shrink-0","aria-hidden":"true"}),V===ce.length-1?d.jsxs("span",{className:"inline-flex items-center gap-1 font-medium text-gray-800 dark:text-gray-200 truncate","aria-current":"page",children:[V===0&&d.jsx(b$,{className:"w-3.5 h-3.5 text-gray-500 dark:text-gray-400 flex-shrink-0"}),Z.name]}):d.jsxs("button",{onClick:()=>u(Z.path),className:`inline-flex items-center gap-1 text-gray-500 dark:text-gray-300
|
|
1438
|
+
${s===b.id?"bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300 font-medium":"text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040]"}`,children:[d.jsx(b.icon,{className:"w-4 h-4 flex-shrink-0","aria-hidden":"true"}),d.jsx("span",{className:"whitespace-nowrap",children:t(b.titleKey)})]},b.id))}),d.jsxs("main",{className:"flex-1 min-w-0 overflow-y-auto p-6",children:[d.jsx("h2",{className:"text-base font-semibold text-gray-900 dark:text-white mb-4",children:t(Om.find(b=>b.id===s).titleKey)}),p(s)]})]}),d.jsx("div",{ref:l,className:"content-container md:hidden flex-1 overflow-y-auto w-full",style:{scrollBehavior:"auto"},children:Om.map(b=>d.jsx(fRe,{sectionId:b.id,title:t(b.titleKey),icon:b.icon,isExpanded:a===b.id,onToggle:()=>O(b.id),children:p(b.id)},b.id))})]})}const aE=[{id:"overview",labelKey:"tabs.overview",icon:lj,path:""},{id:"board",labelKey:"tabs.board",icon:Dv,path:"/board"},{id:"sessions",labelKey:"tabs.sessions",icon:Wo,path:"/sessions"},{id:"queue",labelKey:"tabs.queue",icon:Xg,path:"/queue"},{id:"files",labelKey:"tabs.files",icon:As,path:"/files"},{id:"git",labelKey:"tabs.git",icon:No,path:"/git"},{id:"terminal",labelKey:"tabs.terminal",icon:Rs,path:"/terminal"}];function RRe(){const{t}=_e("common"),{projectSlug:e}=Rn(),r=Tn(),n=us(),{projects:i,fetchProjects:s}=Ga(),{connectionStatus:a,reconnectAttempt:o,lastError:l,connect:c}=Rk(),h=Vt(_=>_.terminalAccess),u=(h==null?void 0:h.enabled)!==!1,O=(h==null?void 0:h.allowed)??!0;k.useEffect(()=>{i.length===0&&s()},[i.length,s]);const[p,b]=k.useState(!1),y=k.useRef(null);Ch(y,()=>b(!1));const g=k.useMemo(()=>{const _=i.find(P=>P.projectSlug===e);return(_==null?void 0:_.originalPath)||e||""},[i,e]),x=k.useMemo(()=>{const _=g.replace(/\\/g,"/").split("/");return _[_.length-1]||g},[g]),v=k.useMemo(()=>{const _=`/project/${e}`;for(const P of[...aE].reverse())if(P.path&&n.pathname.startsWith(`${_}${P.path}`))return P.id;return"overview"},[n.pathname,e]),w=()=>r("/"),Q=_=>{r(`/project/${e}${_}`)};return d.jsxs("div",{className:"h-dvh flex flex-col bg-white dark:bg-[#1c2129] transition-colors duration-200",children:[d.jsxs("header",{className:"flex-shrink-0 sticky top-0 z-10 bg-[#243648] dark:bg-[#171e24] border-b border-slate-200 dark:border-slate-700/50",children:[d.jsxs("div",{className:"content-container flex items-center justify-between px-4 py-3 min-h-14",children:[d.jsxs("div",{className:"flex items-stretch min-w-0 flex-1",children:[d.jsx("button",{onClick:w,className:"self-center p-2 -ml-2 mr-2 hover:bg-white/10 dark:hover:bg-[#253040] rounded-lg text-white/80 dark:text-gray-200","aria-label":t("layout.back"),children:d.jsx(Rg,{className:"w-5 h-5"})}),d.jsx(km,{}),d.jsx("div",{className:"w-px self-stretch bg-gray-200 dark:bg-[#253040] mx-3"}),d.jsxs("div",{className:"min-w-0 flex-1",children:[d.jsx("h1",{className:"text-base font-semibold truncate text-white dark:text-white",children:x}),d.jsx("p",{className:"text-xs text-white/60 dark:text-gray-400 truncate",children:g})]})]}),d.jsxs("div",{className:"flex items-center gap-1 ml-4",children:[d.jsx(fD,{status:a,reconnectAttempt:o,lastError:l,onReconnect:c,compact:!0}),d.jsx($h,{className:"hidden sm:block"}),d.jsx("button",{onClick:()=>window.location.reload(),"aria-label":t("layout.refresh"),className:"hidden sm:block p-2 rounded-lg hover:bg-white/10 dark:hover:bg-[#253040] text-white/80 dark:text-gray-200 transition-colors",children:d.jsx(Ir,{className:"w-5 h-5","aria-hidden":"true"})}),d.jsx("button",{onClick:()=>r("/settings"),"aria-label":t("project.settings"),className:"hidden sm:block p-2 rounded-lg hover:bg-white/10 dark:hover:bg-[#253040] text-white/80 dark:text-gray-200 transition-colors",children:d.jsx(sa,{className:"w-5 h-5","aria-hidden":"true"})}),d.jsxs("div",{className:"relative sm:hidden",ref:y,children:[d.jsx("button",{onClick:()=>b(!p),className:"p-2 hover:bg-white/10 dark:hover:bg-[#253040] rounded-lg text-white/80 dark:text-gray-200","aria-label":t("project.menuLabel"),"aria-expanded":p,"aria-haspopup":"menu",children:d.jsx(Za,{className:"w-5 h-5"})}),p&&d.jsxs("div",{role:"menu",className:"absolute right-0 top-full mt-2 w-48 bg-white dark:bg-[#263240] rounded-lg shadow-lg border border-gray-200 dark:border-[#253040] z-50 py-1",children:[d.jsxs("button",{role:"menuitem",onClick:()=>window.location.reload(),className:"w-full px-4 py-2 text-left text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040] flex items-center gap-2",children:[d.jsx(Ir,{className:"w-4 h-4"}),t("layout.refresh")]}),d.jsx("div",{className:"border-t border-gray-200 dark:border-[#253040] my-1"}),d.jsxs("button",{role:"menuitem",onClick:()=>{r("/settings"),b(!1)},className:"w-full px-4 py-2 text-left text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-[#253040] flex items-center gap-2",children:[d.jsx(sa,{className:"w-4 h-4"}),t("project.settings")]})]})]})]})]}),d.jsx("nav",{className:"content-container flex px-4","aria-label":t("layout.projectTabs"),children:aE.map(_=>{if(_.id==="terminal"&&!u)return null;const P=v===_.id,T=_.icon,C=_.id==="terminal"&&!O;return d.jsxs("button",{onClick:C?void 0:()=>Q(_.path),disabled:C,className:`flex items-center gap-2 px-4 py-2.5 text-sm font-medium border-b-2 transition-colors whitespace-nowrap ${C?"border-transparent opacity-50 cursor-not-allowed text-gray-500 dark:text-gray-400":P?"border-blue-300 text-blue-200 dark:text-blue-400":"border-transparent text-white/50 dark:text-gray-300 hover:text-white/80 dark:hover:text-gray-300 hover:border-white/30 dark:hover:border-[#2d3a4a]"}`,"aria-current":P?"page":void 0,"aria-disabled":C||void 0,"aria-label":C?t("layout.terminalDisabled"):void 0,children:[d.jsx(T,{className:"w-4 h-4"}),d.jsx("span",{className:"hidden sm:inline",children:t(_.labelKey)})]},_.id)})})]}),d.jsx("main",{className:"flex-1 overflow-auto",children:d.jsx("div",{className:"content-container h-full",children:d.jsx(vK,{})})})]})}let pm=!1,zw=null;const xI="cli-status-cache",ERe=3600*1e3;function jRe(){try{const t=sessionStorage.getItem(xI);if(!t)return null;const{status:e,timestamp:r}=JSON.parse(t);return Date.now()-r>ERe?null:e!=null&&e.authenticated||e!=null&&e.apiKeySet?e:null}catch{return null}}function XRe(t){try{sessionStorage.setItem(xI,JSON.stringify({status:t,timestamp:Date.now()}))}catch{}}const oE=jRe();oE&&(pm=!0,zw=oE);function Ac({children:t}){const{t:e}=_e("common"),{isAuthenticated:r,isLoading:n,checkAuth:i}=Xo(),s=us(),[a,o]=k.useState(zw),[l,c]=k.useState(!pm),[h,u]=k.useState(null),[O,p]=k.useState(!1),b=k.useCallback(async(g=!1)=>{if(!g&&pm)return;c(!0),u(null);const x=2,v=1500;for(let w=0;w<=x;w++)try{const Q=await qe.get("/cli-status");console.log("[AuthGuard] CLI status response:",Q),o(Q),zw=Q,pm=!0,XRe(Q);const _=!Q.authenticated&&!Q.apiKeySet;p(_),c(!1);return}catch(Q){if(console.error("[AuthGuard] CLI status fetch failed (attempt",w+1,"):",Q),Q instanceof Gr&&Q.status===401){console.warn("[AuthGuard] Session expired during CLI status check, re-checking auth"),c(!1),Xo.getState().recheckAuth();return}if(w<x){await new Promise(_=>setTimeout(_,v));continue}u(Q instanceof Error?Q.message:e("error.cliStatusFailed")),p(!1),c(!1)}},[]);if(k.useEffect(()=>{i()},[i]),k.useEffect(()=>{r&&!n&&s.pathname!=="/onboarding"?b():s.pathname==="/onboarding"&&c(!1)},[r,n,s.pathname,b]),n)return d.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-100 dark:bg-[#1c2129]",children:d.jsx(kh,{size:"lg"})});if(!r)return d.jsx(_v,{to:"/login",state:{from:s},replace:!0});if(l&&s.pathname!=="/onboarding")return d.jsx("div",{className:"min-h-screen flex items-center justify-center bg-white dark:bg-[#1c2129]",role:"status","aria-label":e("loading"),children:d.jsxs("div",{className:"flex flex-col items-center gap-3",children:[d.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500","aria-hidden":"true"}),d.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-300",children:e("cliStatusChecking")})]})});if(O&&s.pathname!=="/onboarding")return d.jsx(_v,{to:"/onboarding",replace:!0});const y={cliStatus:a,isLoading:l,error:h,refetch:b,isReady:(a==null?void 0:a.authenticated)===!0||(a==null?void 0:a.apiKeySet)===!0};return d.jsx(Nne,{value:y,children:t})}function ARe({children:t}){const{isAuthenticated:e,isLoading:r,checkAuth:n}=Xo(),i=Tn();return k.useEffect(()=>{n()},[n]),k.useEffect(()=>{!r&&e&&i("/",{replace:!0})},[e,r,i]),r?d.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-100 dark:bg-[#1c2129]",children:d.jsx(kh,{size:"lg"})}):e?null:d.jsx(d.Fragment,{children:t})}function NRe({content:t}){return d.jsx("div",{className:"flex-1 overflow-y-auto p-4 bg-white dark:bg-[#1c2129]",children:d.jsx("div",{className:"max-w-4xl mx-auto",children:d.jsx(Xf,{content:t})})})}const DRe=k.lazy(()=>ee(()=>import("./index-cwHQKX3r.js"),[]));function LRe(){const{openFile:t,content:e,isDirty:r,isLoading:n,isSaving:i,isTruncated:s,error:a,isMarkdownPreview:o,saveFile:l,closeEditor:c,setContent:h,resetError:u,openFileInEditor:O,toggleMarkdownPreview:p,pendingNavigation:b,confirmPendingNavigation:y,cancelPendingNavigation:g}=mn(),{t:x}=_e("common"),[v,w]=k.useState(!1),Q=k.useRef(null),_=k.useRef(null),{resolvedTheme:P}=Cd(),T=Td(),C=Oa(U=>U.activePanel),R=Oa(U=>U.panelWidth),N=480,[A,X]=k.useState(()=>typeof window<"u"?window.innerWidth:1024);k.useEffect(()=>{const U=()=>X(window.innerWidth);return window.addEventListener("resize",U),()=>window.removeEventListener("resize",U)},[]);const W=!(T||C!==null&&A-R<N)&&C?R:0,Y=t?c3(t.path):!1,ne=k.useMemo(()=>{const U=[Ve.lineWrapping];if(t){const z=l3(t.path);z&&U.push(z)}return s&&U.push(Ve.editable.of(!1)),U},[t,s]),K=k.useCallback(async()=>{if(!r||i)return;await l()?ht.success(x("editor.fileSaved")):ht.error(x("editor.fileSaveFailed"))},[r,i,l]),B=k.useCallback(()=>{b&&g(),r?w(!0):c()},[r,c,b,g]);k.useEffect(()=>{t&&(_.current={...t})},[t]);const D=k.useCallback(()=>{_.current&&O(_.current.projectSlug,_.current.path)},[O]);d0(!!t,B,D),k.useEffect(()=>{if(!t)return;const U=z=>{if((z.ctrlKey||z.metaKey)&&z.key==="s"){z.preventDefault(),K();return}if(z.key==="Escape"){if(z.stopImmediatePropagation(),b)return;if(v){w(!1);return}B()}};return document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)},[t,K,B,v,b]),k.useEffect(()=>{if(t)return document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}},[t]),k.useEffect(()=>{var U;!o&&Y&&((U=Q.current)==null||U.focus())},[o,Y]);const E=k.useCallback(U=>{Q.current=U;const z=mn.getState().targetLine;z&&requestAnimationFrame(()=>{try{const J=Math.min(z,U.state.doc.lines),ce=U.state.doc.line(J);U.dispatch({selection:{anchor:ce.from},effects:Ve.scrollIntoView(ce.from,{y:"start",yMargin:8})})}catch{}mn.setState({targetLine:null})})},[]);if(!t)return null;const M=t.path;return d.jsxs(d.Fragment,{children:[d.jsx("div",{className:"fixed inset-0 bg-black/50 z-[55] transition-[right] duration-300 ease-in-out",style:{right:W},onClick:U=>{U.stopPropagation(),B()}}),d.jsxs("div",{className:"fixed inset-0 z-[60] flex flex-col bg-white dark:bg-[#1c2129] transition-[right] duration-300 ease-in-out",style:{right:W},children:[d.jsxs("div",{className:"flex items-center justify-between px-4 py-2 border-b border-gray-200 dark:border-[#253040] bg-gray-50 dark:bg-[#263240]",children:[d.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[d.jsx(Ba,{className:"w-4 h-4 shrink-0 text-gray-500 dark:text-gray-300"}),d.jsx("span",{className:"truncate text-sm font-mono text-gray-700 dark:text-gray-200",children:M}),r&&d.jsx("span",{className:"text-xs font-bold text-amber-500 shrink-0",children:"M"})]}),d.jsxs("div",{className:"flex items-center gap-2 ml-3 shrink-0",children:[Y&&d.jsx("button",{onClick:p,className:"flex items-center gap-1 px-3 py-1 text-sm font-medium whitespace-nowrap text-gray-700 dark:text-gray-200 bg-gray-100 dark:bg-[#253040] hover:bg-gray-200 dark:hover:bg-[#2d3a4a] rounded transition-colors",title:x(o?"editor.editMode":"editor.previewLabel"),"aria-label":x(o?"editor.editMode":"editor.previewLabel"),children:o?d.jsxs(d.Fragment,{children:[d.jsx(Ag,{className:"w-4 h-4"}),d.jsx("span",{children:x("editor.editLabel")})]}):d.jsxs(d.Fragment,{children:[d.jsx(Jc,{className:"w-4 h-4"}),d.jsx("span",{children:x("editor.previewLabel")})]})}),d.jsx("button",{onClick:K,disabled:!r||i,title:x("editor.saveShortcut"),className:"px-3 py-1 text-sm font-medium whitespace-nowrap text-white bg-blue-600 hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 rounded disabled:opacity-40 disabled:cursor-not-allowed transition-colors",children:x(i?"editor.saving":"editor.save")}),d.jsx("button",{onClick:B,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300","aria-label":x("editor.close"),children:d.jsx(Yt,{className:"w-5 h-5"})})]})]}),n?d.jsxs("div",{className:"flex-1 flex items-center justify-center",children:[d.jsx(vt,{className:"w-8 h-8 animate-spin text-gray-400"}),d.jsx("span",{className:"ml-2 text-sm text-gray-500 dark:text-gray-300",children:x("editor.loadingFile")})]}):a?d.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center gap-4 text-red-500",children:[d.jsx("p",{children:a}),d.jsx("button",{onClick:()=>{u(),O(t.projectSlug,t.path)},className:"px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors",children:x("button.retry")})]}):d.jsxs(d.Fragment,{children:[s&&d.jsx("div",{className:"px-4 py-2 bg-amber-50 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300 text-xs border-b border-amber-200 dark:border-amber-800",children:x("editor.fileTruncated")}),o&&Y?d.jsx(NRe,{content:e}):d.jsx("div",{className:"flex-1 min-h-0 [&_.cm-editor]:h-full [&_.cm-scroller]:!overflow-auto","aria-label":`Editing ${M}`,children:d.jsx(k.Suspense,{fallback:d.jsxs("div",{className:"h-full flex items-center justify-center",children:[d.jsx(vt,{className:"w-8 h-8 animate-spin text-gray-400"}),d.jsx("span",{className:"ml-2 text-sm text-gray-500 dark:text-gray-300",children:x("editor.loadingEditor")})]}),children:d.jsx(DRe,{value:e,extensions:ne,theme:P==="dark"?sD:"light",onChange:U=>h(U),onCreateEditor:E,height:"100%",style:{height:"100%"},basicSetup:{lineNumbers:!0,highlightActiveLine:!0,tabSize:2,foldGutter:!1},readOnly:s})})})]})]}),d.jsx(Ia,{isOpen:v,title:x("editor.unsavedTitle"),message:x("editor.unsavedCloseMessage"),confirmText:x("editor.closeWithoutSaving"),cancelText:x("button.cancel"),variant:"danger",onConfirm:()=>{c(),w(!1)},onCancel:()=>w(!1)}),d.jsx(Ia,{isOpen:!!b,title:x("editor.unsavedTitle"),message:x("editor.unsavedOpenMessage",{path:(b==null?void 0:b.path)??""}),confirmText:x("editor.openWithoutSaving"),cancelText:x("button.cancel"),variant:"danger",onConfirm:y,onCancel:g})]})}const Mp=.25,IRe=.1,MRe=10;function zRe(){const{openImage:t,zoomLevel:e,closeViewer:r,setZoom:n,resetView:i}=Vo(),{t:s}=_e("common"),[a,o]=k.useState(!0),[l,c]=k.useState(!1),[h,u]=k.useState(!1),[O,p]=k.useState({x:0,y:0}),b=k.useRef({x:0,y:0}),y=k.useRef({x:0,y:0}),g=k.useRef(null),x=Td(),v=Oa(E=>E.activePanel),w=Oa(E=>E.panelWidth),Q=480,[_,P]=k.useState(()=>typeof window<"u"?window.innerWidth:1024);k.useEffect(()=>{const E=()=>P(window.innerWidth);return window.addEventListener("resize",E),()=>window.removeEventListener("resize",E)},[]);const C=!(x||v!==null&&_-w<Q)&&v?w:0,R=k.useCallback(()=>{r()},[r]);k.useEffect(()=>{t&&(g.current={...t})},[t]);const N=k.useCallback(()=>{g.current&&Vo.getState().openImageViewer(g.current.projectSlug,g.current.path)},[]);d0(!!t,R,N),k.useEffect(()=>{t&&(o(!0),c(!1),p({x:0,y:0}))},[t]),k.useEffect(()=>{if(!t)return;const E=M=>{M.key==="Escape"&&(M.stopImmediatePropagation(),R())};return document.addEventListener("keydown",E),()=>document.removeEventListener("keydown",E)},[t,R]),k.useEffect(()=>{if(t)return document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}},[t]);const A=k.useCallback(E=>{E.preventDefault();const M=E.deltaY>0?-Mp:Mp;n(e+M)},[e,n]),X=k.useCallback(E=>{E.button===0&&(u(!0),b.current={x:E.clientX,y:E.clientY},y.current={...O})},[O]),I=k.useCallback(E=>{h&&p({x:y.current.x+(E.clientX-b.current.x),y:y.current.y+(E.clientY-b.current.y)})},[h]),W=k.useCallback(()=>{u(!1)},[]),Y=k.useCallback(()=>{i(),p({x:0,y:0})},[i]);if(!t)return null;const ne=t.path,K=ne.includes("/")?ne.split("/").pop():ne,B=`/api/projects/${t.projectSlug}/fs/raw?path=${encodeURIComponent(ne)}`,D=Math.round(e*100);return d.jsxs(d.Fragment,{children:[d.jsx("div",{className:"fixed inset-0 bg-black/50 z-[55] transition-[right] duration-300 ease-in-out",style:{right:C},onClick:R}),d.jsxs("div",{className:"fixed inset-0 z-[60] flex flex-col bg-white dark:bg-[#1c2129] transition-[right] duration-300 ease-in-out",style:{right:C},children:[d.jsxs("div",{className:"flex items-center justify-between px-4 py-2 border-b border-gray-200 dark:border-[#253040] bg-gray-50 dark:bg-[#263240]",children:[d.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[d.jsx(x$,{className:"w-4 h-4 shrink-0 text-gray-500 dark:text-gray-300"}),d.jsx("span",{className:"truncate text-sm font-mono text-gray-700 dark:text-gray-200",children:ne})]}),d.jsxs("div",{className:"flex items-center gap-1 ml-3",children:[d.jsx("button",{onClick:()=>n(e-Mp),disabled:e<=IRe,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300 disabled:opacity-40",title:s("imageViewer.zoomOut"),children:d.jsx(Ane,{className:"w-4 h-4"})}),d.jsxs("span",{className:"text-xs text-gray-500 dark:text-gray-300 w-12 text-center tabular-nums",children:[D,"%"]}),d.jsx("button",{onClick:()=>n(e+Mp),disabled:e>=MRe,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300 disabled:opacity-40",title:s("imageViewer.zoomIn"),children:d.jsx(jne,{className:"w-4 h-4"})}),d.jsx("button",{onClick:Y,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300",title:s("imageViewer.resetZoom"),children:d.jsx(t1,{className:"w-4 h-4"})}),d.jsx("div",{className:"w-px h-5 bg-gray-200 dark:bg-[#253040] mx-1"}),d.jsx("button",{onClick:R,className:"p-1 rounded hover:bg-gray-200 dark:hover:bg-[#253040] text-gray-500 dark:text-gray-300","aria-label":s("imageViewer.close"),children:d.jsx(Yt,{className:"w-5 h-5"})})]})]}),d.jsxs("div",{className:`flex-1 overflow-hidden flex items-center justify-center bg-gray-100 dark:bg-gray-950 ${h?"cursor-grabbing":"cursor-grab"}`,onWheel:A,onMouseDown:X,onMouseMove:I,onMouseUp:W,onMouseLeave:W,children:[a&&!l&&d.jsxs("div",{className:"absolute flex items-center gap-2",children:[d.jsx(vt,{className:"w-8 h-8 animate-spin text-gray-400"}),d.jsx("span",{className:"text-sm text-gray-500 dark:text-gray-300",children:s("imageViewer.loadingImage")})]}),l?d.jsxs("div",{className:"flex flex-col items-center gap-2 text-red-500",children:[d.jsx(x$,{className:"w-12 h-12 opacity-50"}),d.jsx("p",{className:"text-sm",children:s("imageViewer.loadFailed")}),d.jsx("p",{className:"text-xs text-gray-400",children:K})]}):d.jsx("img",{src:B,alt:K,draggable:!1,className:"select-none transition-opacity duration-200",style:{transform:`translate(${O.x}px, ${O.y}px) scale(${e})`,opacity:a?0:1,maxWidth:"none",maxHeight:"none"},onLoad:()=>o(!1),onError:()=>{o(!1),c(!0)}})]})]})]})}function qRe({entryType:t,initialValue:e,onConfirm:r,onCancel:n}){const{t:i}=_e("common"),[s,a]=k.useState(e),o=k.useRef(null);k.useEffect(()=>{if(o.current&&(o.current.focus(),e)){const h=e.lastIndexOf("."),u=h>0?h:e.length;o.current.setSelectionRange(0,u)}},[]);const l=h=>{h.key==="Enter"?(h.preventDefault(),r(s)):h.key==="Escape"&&(h.preventDefault(),n())},c=()=>{s.trim()?r(s):n()};return d.jsxs("div",{className:"flex flex-col items-center gap-1 p-2 rounded-lg",children:[t==="directory"?d.jsx(Dl,{className:"w-8 h-8 text-blue-500 dark:text-blue-400"}):d.jsx(Nl,{className:"w-8 h-8 text-gray-500 dark:text-gray-400"}),d.jsx("input",{ref:o,type:"text",value:s,onChange:h=>a(h.target.value),onKeyDown:l,onBlur:c,className:"text-xs text-center w-full bg-white dark:bg-[#1c2129] dark:text-white border border-blue-500 rounded px-1 py-0 outline-none h-4 leading-4","aria-label":i("files.renameAria")})]})}function URe({projectSlug:t,currentPath:e,showHidden:r,onFileSelect:n,onNavigate:i,enableContextMenu:s=!1,onCreateEntry:a,onDeleteEntry:o,onRenameEntry:l,onCopy:c,onCut:h,onPaste:u,onDownload:O,hasClipboard:p=!1,cutPath:b,refreshTrigger:y,onFileDrop:g,isUploading:x=!1}){const{t:v}=_e("common"),[w,Q]=k.useState([]),[_,P]=k.useState(!0),[T,C]=k.useState(!1),[R,N]=k.useState(null),[A,X]=k.useState(null),[I,W]=k.useState(null),[Y,ne]=k.useState(null),K=mn(me=>{var xe;return((xe=me.openFile)==null?void 0:xe.path)??null}),B=k.useCallback(async()=>{P(!0),N(null),Q([]);try{const me=await ri.listDirectory(t,e);Q(me.entries)}catch(me){N(me.message)}finally{P(!1)}},[t,e]);k.useEffect(()=>{B()},[B]),k.useEffect(()=>{y===void 0||y===0||B()},[y]),k.useEffect(()=>{if(!_){C(!1);return}const me=setTimeout(()=>C(!0),300);return()=>clearTimeout(me)},[_]);const D=k.useMemo(()=>{const me=k0(w);return r?me:me.filter(xe=>!w0.includes(xe.name))},[w,r]),E=k.useCallback(me=>{const xe=e==="."?me.name:`${e}/${me.name}`;me.type==="directory"?i(xe):n(xe)},[e,i,n]),M=k.useCallback((me,xe)=>{if(!s)return;me.preventDefault(),me.stopPropagation(),me.nativeEvent.stopImmediatePropagation();const ft=e==="."?xe.name:`${e}/${xe.name}`,St=xe.type==="directory"?ft:e;X({x:me.clientX,y:me.clientY,targetPath:ft,targetType:xe.type,parentPath:St})},[s,e]),U=k.useCallback((me,xe)=>{if(!s)return;me.stopPropagation();const ft=me.currentTarget.getBoundingClientRect(),St=e==="."?xe.name:`${e}/${xe.name}`,bt=xe.type==="directory"?St:e;X({x:ft.right,y:ft.bottom,targetPath:St,targetType:xe.type,parentPath:bt})},[s,e]),z=k.useCallback(me=>{if(!s)return;const xe=me.target;xe instanceof Element&&xe.closest("[data-grid-item]")||(me.preventDefault(),me.stopPropagation(),me.nativeEvent.stopImmediatePropagation(),X({x:me.clientX,y:me.clientY,targetPath:e,targetType:"directory",parentPath:e}))},[s,e]),J=k.useCallback(me=>{A&&(W({mode:"create",parentPath:A.parentPath,entryType:me,initialValue:""}),X(null))},[A]),ce=k.useCallback(()=>{if(!A)return;const me=A.targetPath.includes("/")?A.targetPath.split("/").pop():A.targetPath;W({mode:"rename",parentPath:e,targetPath:A.targetPath,entryType:A.targetType,initialValue:me}),X(null)},[A,e]),le=k.useCallback(async me=>{if(!I||!me.trim()){W(null);return}try{I.mode==="create"?(await(a==null?void 0:a(I.parentPath,I.entryType,me.trim())),await B()):I.mode==="rename"&&I.targetPath&&me.trim()!==I.initialValue&&(await(l==null?void 0:l(I.targetPath,me.trim())),await B())}catch{}W(null)},[I,a,l,B]),Z=k.useCallback(()=>{if(!A)return;const me=A.targetPath.includes("/")?A.targetPath.split("/").pop():A.targetPath;ne({path:A.targetPath,name:me,type:A.targetType}),X(null)},[A]),V=k.useCallback(async()=>{if(Y){try{await(o==null?void 0:o(Y.path)),await B()}catch{}ne(null)}},[Y,o,B]),[H,te]=k.useState(!1),ue=k.useRef(0),ae=k.useCallback(me=>{g&&me.dataTransfer.types.includes("Files")&&(me.preventDefault(),ue.current++,ue.current===1&&te(!0))},[g]),he=k.useCallback(me=>{g&&me.dataTransfer.types.includes("Files")&&(me.preventDefault(),me.dataTransfer.dropEffect="copy")},[g]),re=k.useCallback(me=>{g&&me.dataTransfer.types.includes("Files")&&(me.preventDefault(),ue.current=Math.max(0,ue.current-1),ue.current===0&&te(!1))},[g]),Qe=k.useCallback(me=>{if(!g)return;me.preventDefault(),ue.current=0,te(!1);const xe=Array.from(me.dataTransfer.files);xe.length>0&&g(xe)},[g]);return k.useEffect(()=>{const me=()=>{ue.current=0,te(!1)};return window.addEventListener("dragend",me),window.addEventListener("drop",me),()=>{window.removeEventListener("dragend",me),window.removeEventListener("drop",me)}},[]),_&&w.length===0?T?d.jsxs("div",{className:"flex items-center gap-2 p-4 text-sm text-gray-500 dark:text-gray-300 justify-center",children:[d.jsx(vt,{className:"w-4 h-4 animate-spin"}),d.jsx("span",{children:v("loadingStatus")})]}):null:R&&w.length===0?d.jsx("div",{className:"p-4",children:d.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-red-500 dark:text-red-400",children:[d.jsx(Ri,{className:"w-3.5 h-3.5"}),d.jsx("span",{children:R}),d.jsx("button",{className:"text-xs text-blue-500 dark:text-blue-400 hover:underline cursor-pointer ml-2",onClick:B,children:v("button.retry")})]})}):d.jsxs("div",{className:"p-2 relative",onContextMenu:z,onDragEnter:ae,onDragOver:he,onDragLeave:re,onDrop:Qe,children:[H&&d.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center bg-blue-50/80 dark:bg-blue-900/30 border-2 border-dashed border-blue-400 dark:border-blue-500 rounded-lg pointer-events-none",children:d.jsxs("div",{className:"flex flex-col items-center gap-2 text-blue-600 dark:text-blue-400",children:[d.jsx(Ph,{className:"w-8 h-8"}),d.jsx("span",{className:"text-sm font-medium",children:v("files.dropHere")})]})}),x&&d.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center bg-white/60 dark:bg-[#1c2129]/60 rounded-lg pointer-events-none",children:d.jsxs("div",{className:"flex items-center gap-2 text-gray-600 dark:text-gray-300",children:[d.jsx(vt,{className:"w-5 h-5 animate-spin"}),d.jsx("span",{className:"text-sm",children:v("files.uploading")})]})}),(I==null?void 0:I.mode)==="create"&&d.jsx("div",{className:"mb-2",children:d.jsx(Sg,{initialValue:I.initialValue,entryType:I.entryType,depth:0,onConfirm:le,onCancel:()=>W(null)})}),D.length===0&&!I?d.jsx("div",{className:"text-sm text-gray-500 dark:text-gray-400 italic text-center py-8",children:v("files.emptyFolder")}):d.jsxs("div",{className:"grid grid-cols-5 sm:grid-cols-7 md:grid-cols-9 gap-1",children:[e!=="."&&d.jsxs("div",{"data-grid-item":!0,role:"button",tabIndex:0,className:"group relative flex flex-col items-center gap-1 p-2 rounded-lg cursor-pointer transition-colors hover:bg-gray-100 dark:hover:bg-[#253040]/50",onClick:()=>{const me=e.includes("/")?e.substring(0,e.lastIndexOf("/")):".";i(me)},onKeyDown:me=>{if(me.key==="Enter"){const xe=e.includes("/")?e.substring(0,e.lastIndexOf("/")):".";i(xe)}},children:[d.jsx(Dl,{className:"w-8 h-8 text-blue-500 dark:text-blue-400"}),d.jsx("span",{className:"text-xs text-center w-full truncate text-gray-500 dark:text-gray-300",children:v("files.parentDir")})]}),D.map(me=>{const xe=e==="."?me.name:`${e}/${me.name}`,ft=K===xe;return(I==null?void 0:I.mode)==="rename"&&I.targetPath===xe?d.jsx(qRe,{entryType:me.type,initialValue:I.initialValue,onConfirm:le,onCancel:()=>W(null)},me.name):d.jsxs("div",{"data-grid-item":!0,role:"button",tabIndex:0,className:`group relative flex flex-col items-center gap-1 p-2 rounded-lg cursor-pointer select-none transition-colors hover:bg-gray-100 dark:hover:bg-[#253040]/50 ${ft?"bg-blue-50 dark:bg-blue-900/20 ring-1 ring-blue-300 dark:ring-blue-700":""} ${b===xe?"opacity-50":""}`,onClick:()=>E(me),onKeyDown:bt=>{bt.key==="Enter"&&E(me)},onContextMenu:bt=>M(bt,me),children:[me.type==="directory"?d.jsx(Dl,{className:"w-8 h-8 text-blue-500 dark:text-blue-400"}):d.jsx(Nl,{className:"w-8 h-8 text-gray-500 dark:text-gray-400"}),d.jsx("span",{className:`text-xs text-center w-full truncate ${ft?"text-blue-600 dark:text-blue-400":"text-gray-700 dark:text-gray-200"}`,children:me.name}),s&&d.jsx("button",{className:"absolute top-1 right-1 p-0.5 rounded opacity-0 group-hover:opacity-100 hover:bg-gray-200 dark:hover:bg-[#2d3a4a] transition-opacity",onClick:bt=>U(bt,me),"aria-label":v("files.moreMenu"),children:d.jsx(Za,{className:"w-3 h-3 text-gray-400"})})]},me.name)})]}),A&&d.jsx(pI,{x:A.x,y:A.y,targetType:A.targetType,onNewFile:()=>J("file"),onNewFolder:()=>J("directory"),onRename:()=>ce(),onDelete:()=>Z(),onClose:()=>X(null),onCopy:c?()=>{c(A.targetPath),X(null)}:void 0,onCut:h?()=>{h(A.targetPath),X(null)}:void 0,onPaste:u?()=>{const me=A.targetType==="directory"?A.targetPath:e;u(me).catch(()=>{}).finally(()=>B()),X(null)}:void 0,onDownload:O?()=>{O(A.targetPath),X(null)}:void 0,hasClipboard:p}),Y&&d.jsx(mI,{name:Y.name,type:Y.type,onConfirm:V,onCancel:()=>ne(null)})]})}const VRe=[".env",".git","node_modules",".next",".cache","__pycache__",".DS_Store","dist",".turbo"],lE={FILE_ALREADY_EXISTS:"files.crudErrors.alreadyExists",PARENT_NOT_FOUND:"files.crudErrors.parentNotFound",PROTECTED_PATH:"files.crudErrors.protectedPath",RENAME_TARGET_EXISTS:"files.crudErrors.targetExists",COPY_TARGET_EXISTS:"files.crudErrors.targetExists",COPY_TOO_LARGE:"files.crudErrors.copyTooLarge",PATH_TRAVERSAL:"files.crudErrors.outsideRoot"};function YRe(){const{t}=_e("common"),{projectSlug:e}=Rn(),r=k.useCallback((Z,V)=>{const H=Z;return H.code&&lE[H.code]?`${V}: ${t(lE[H.code])}`:`${V}: ${Z.message}`},[t]),[n,i]=k.useState(""),[s,a]=k.useState(!1),o=Kt(Z=>Z.preferences.fileExplorerViewMode??"grid"),[l,c]=k.useState(o),[h,u]=k.useState("."),{toasts:O,showToast:p,removeToast:b}=gj(),[y,g]=k.useState(null),x=k.useRef(null),[v,w]=k.useState(!1),[Q,_]=k.useState(0),[P,T]=k.useState(null),[C,R]=k.useState(!1);k.useEffect(()=>{if(!n.trim()||!e){T(null),R(!1);return}R(!0);const Z=setTimeout(async()=>{try{const V=await ri.searchFiles(e,n.trim(),s),H=s?V.results:V.results.filter(te=>!te.path.split("/").some(ae=>VRe.includes(ae)));T(H)}catch{T([])}finally{R(!1)}},300);return()=>clearTimeout(Z)},[n,e,s]);const N=k.useCallback(Z=>{qo(Z)?Vo.getState().openImageViewer(e,Z):mn.getState().requestFileNavigation(e,Z)},[e]),A=k.useCallback(Z=>{Z.type==="file"&&(qo(Z.path)?Vo.getState().openImageViewer(e,Z.path):mn.getState().requestFileNavigation(e,Z.path)),i("")},[e]),X=k.useCallback(async(Z,V,H)=>{try{const te=Z==="."?H:`${Z}/${H}`;await ri.createEntry(e,te,V),p({message:V==="directory"?t("files.toast.folderCreated",{name:H}):t("files.toast.fileCreated",{name:H}),type:"success"})}catch(te){throw p({message:r(te,t("files.toast.createFailed")),type:"error"}),te}},[e,p,t,r]),I=k.useCallback(async Z=>{try{const V=Z.includes("/")?Z.split("/").pop():Z;await ri.deleteEntry(e,Z),p({message:t("files.toast.deleted",{name:V}),type:"success"})}catch(V){throw p({message:r(V,t("files.toast.deleteFailed")),type:"error"}),V}},[e,p,t,r]),W=k.useCallback(async(Z,V)=>{try{const H=Z.includes("/")?Z.substring(0,Z.lastIndexOf("/")):".",te=H==="."?V:`${H}/${V}`;await ri.renameEntry(e,Z,te),p({message:t("files.toast.renamed",{name:V}),type:"success"})}catch(H){throw p({message:r(H,t("files.toast.renameFailed")),type:"error"}),H}},[e,p,t,r]),Y=k.useCallback(Z=>{g({path:Z,operation:"copy"});const V=Z.includes("/")?Z.split("/").pop():Z;p({message:t("files.toast.copied",{name:V}),type:"success"})},[p,t]),ne=k.useCallback(Z=>{g({path:Z,operation:"cut"});const V=Z.includes("/")?Z.split("/").pop():Z;p({message:t("files.toast.cut",{name:V}),type:"success"})},[p,t]),K=k.useCallback(async Z=>{if(!y||!e)return{};const V=y,H=V.path.includes("/")?V.path.split("/").pop():V.path,te=V.path.includes("/")?V.path.substring(0,V.path.lastIndexOf("/")):".";if(V.operation==="cut"&&te===Z)return{};const ue=V.operation==="cut";try{let ae=H;if(!ue&&te===Z){const re=H.match(/^(.+?)(\.tar\.\w+)$/);let Qe,me;if(re)Qe=re[1],me=re[2];else{const bt=H.lastIndexOf(".");Qe=bt>0?H.substring(0,bt):H,me=bt>0?H.substring(bt):""}const xe=await ri.listDirectory(e,Z),ft=new Set(xe.entries.map(bt=>bt.name));ae=`${Qe} - Copy${me}`;let St=2;for(;ft.has(ae);)ae=`${Qe} - Copy (${St})${me}`,St++}const he=Z==="."?ae:`${Z}/${ae}`;return ue?(await ri.renameEntry(e,V.path,he),p({message:t("files.toast.moved",{name:ae}),type:"success"}),g(re=>(re==null?void 0:re.path)===V.path&&(re==null?void 0:re.operation)==="cut"?null:re)):(await ri.copyEntry(e,V.path,he),p({message:t("files.toast.pasted",{name:ae}),type:"success"})),ue&&te!==Z?{sourceDir:te}:{}}catch(ae){throw p({message:r(ae,t("files.toast.pasteFailed")),type:"error"}),ae}},[y,e,p,t,r]),B=k.useCallback(async Z=>{if(!e)return;const V=ri.getDownloadUrl(e,Z);try{if(!(await fetch(V,{method:"HEAD"})).ok){p({message:t("files.toast.downloadFailed"),type:"error"});return}const te=document.createElement("a");te.href=V,te.download=Z.includes("/")?Z.split("/").pop():Z,document.body.appendChild(te),te.click(),document.body.removeChild(te)}catch{p({message:t("files.toast.downloadFailed"),type:"error"})}},[e,p,t]),D=k.useRef(!1),E=k.useCallback(async Z=>{if(!(Z.length===0||!e)){if(D.current){p({message:t("files.toast.uploadInProgress"),type:"info"});return}D.current=!0,w(!0);try{const V=await ri.uploadFiles(e,h,Z),H=V.files.length;p({message:H===1?t("files.toast.uploaded",{name:V.files[0].path.split("/").pop()}):t("files.toast.uploadedMultiple",{count:H}),type:"success"}),_(te=>te+1)}catch(V){p({message:r(V,t("files.toast.uploadFailed")),type:"error"})}finally{D.current=!1,w(!1),x.current&&(x.current.value="")}}},[e,h,p,t,r]),M=k.useCallback(()=>{var Z;(Z=x.current)==null||Z.click()},[]),U=k.useCallback(async Z=>{const V=Z.target.files;!V||V.length===0||await E(Array.from(V))},[E]),z=k.useCallback(Z=>{var H;const V=(H=Z.clipboardData)==null?void 0:H.files;!V||V.length===0||(Z.preventDefault(),E(Array.from(V)))},[E]),J=k.useRef(null);k.useEffect(()=>{const Z=J.current;if(Z)return Z.addEventListener("paste",z),()=>Z.removeEventListener("paste",z)},[z]);const ce=(()=>{if(h===".")return[{name:t("files.root"),path:"."}];const Z=h.split("/"),V=[{name:t("files.root"),path:"."}];for(let H=0;H<Z.length;H++)V.push({name:Z[H],path:Z.slice(0,H+1).join("/")});return V})();if(!e)return d.jsx("div",{className:"flex items-center justify-center h-full text-gray-500 dark:text-gray-300",children:t("files.projectNotFound")});const le=P!==null||C;return d.jsxs("div",{ref:J,className:"flex flex-col h-full",tabIndex:-1,children:[d.jsx("input",{ref:x,type:"file",multiple:!0,className:"hidden",onChange:U}),d.jsx("div",{className:"sticky top-0 z-[5] bg-white dark:bg-[#1c2129] border-b border-gray-200 dark:border-[#253040]",children:d.jsxs("div",{className:"flex items-center justify-between px-4 py-2 gap-3",children:[le?d.jsx("div",{}):d.jsx("nav",{"aria-label":t("files.breadcrumb"),className:"flex-shrink min-w-0",children:d.jsx("ol",{className:"flex items-center gap-0.5 text-xs",children:ce.map((Z,V)=>d.jsxs("li",{className:"flex items-center gap-0.5 min-w-0",children:[V>0&&d.jsx(Yo,{className:"w-3 h-3 text-gray-400 dark:text-gray-500 flex-shrink-0","aria-hidden":"true"}),V===ce.length-1?d.jsxs("span",{className:"inline-flex items-center gap-1 font-medium text-gray-800 dark:text-gray-200 truncate","aria-current":"page",children:[V===0&&d.jsx(b$,{className:"w-3.5 h-3.5 text-gray-500 dark:text-gray-400 flex-shrink-0"}),Z.name]}):d.jsxs("button",{onClick:()=>u(Z.path),className:`inline-flex items-center gap-1 text-gray-500 dark:text-gray-300
|
|
1439
1439
|
hover:text-blue-600 dark:hover:text-blue-400 transition-colors truncate`,children:[V===0&&d.jsx(b$,{className:"w-3.5 h-3.5 flex-shrink-0"}),Z.name]})]},Z.path))})}),d.jsxs("div",{className:"flex items-center gap-1 flex-shrink-0",children:[d.jsxs("div",{className:"relative flex items-center",children:[d.jsx(vd,{className:"absolute left-2.5 w-3.5 h-3.5 text-gray-400 pointer-events-none","aria-hidden":"true"}),d.jsx("input",{type:"text",value:n,onChange:Z=>i(Z.target.value),placeholder:t("files.searchPlaceholder"),className:`w-36 sm:w-44 pl-8 pr-7 py-1.5 text-xs bg-gray-100 dark:bg-[#263240] dark:text-white
|
|
1440
1440
|
border border-gray-200 dark:border-[#253040] rounded-lg
|
|
1441
1441
|
focus:outline-none focus:ring-1 focus:ring-blue-500 focus:w-56
|