@runfusion/fusion 0.38.0 → 0.38.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.
Files changed (46) hide show
  1. package/dist/client/.vite/manifest.json +52 -52
  2. package/dist/client/assets/{AgentDetailView-CquLtIia.js → AgentDetailView-DuRYmHK3.js} +1 -1
  3. package/dist/client/assets/{AgentPermissionPolicyEditor-Dk-oEs1X.js → AgentPermissionPolicyEditor-ClY32kYN.js} +1 -1
  4. package/dist/client/assets/{AgentsView-BZVOpQ05.js → AgentsView-UbCAHs_i.js} +3 -3
  5. package/dist/client/assets/{ChatView-CErtz86Y.js → ChatView-DDDjYRKc.js} +1 -1
  6. package/dist/client/assets/{DevServerView-BRA00XoT.js → DevServerView-DY5GlJcD.js} +1 -1
  7. package/dist/client/assets/{DirectoryPicker-D496NTjZ.js → DirectoryPicker-B4VRL2BH.js} +1 -1
  8. package/dist/client/assets/{DocumentsView-DIRlgdeB.js → DocumentsView-tqpIZ9t9.js} +1 -1
  9. package/dist/client/assets/{EvalsView-By5mtr80.js → EvalsView-C_Br3ry8.js} +1 -1
  10. package/dist/client/assets/{ExperimentalAgentOnboardingModal-Br57oNdX.js → ExperimentalAgentOnboardingModal-lXM--LV-.js} +1 -1
  11. package/dist/client/assets/{GoalsView-COI14CWJ.js → GoalsView-CI3Bzs1b.js} +1 -1
  12. package/dist/client/assets/{InsightsView-Hm7vX2lr.js → InsightsView-BYfsVobi.js} +1 -1
  13. package/dist/client/assets/{MemoryView-BLozyYur.js → MemoryView-DT4vIhaW.js} +1 -1
  14. package/dist/client/assets/{NodesView-bXC6WoE2.js → NodesView-Dx6HFqjI.js} +1 -1
  15. package/dist/client/assets/{PiExtensionsManager-DEiqcMkx.js → PiExtensionsManager-BcGBnNiC.js} +1 -1
  16. package/dist/client/assets/{PluginManager-l4224zxk.js → PluginManager-T_XZ7iNI.js} +1 -1
  17. package/dist/client/assets/{ResearchView-CpsR1Q56.js → ResearchView-Bv4igpnv.js} +1 -1
  18. package/dist/client/assets/{SecretsView-Bwme1zZI.js → SecretsView-C4VX2ZTa.js} +1 -1
  19. package/dist/client/assets/{SettingsModal-DdrXxMPW.js → SettingsModal-CLEkhLK_.js} +3 -3
  20. package/dist/client/assets/{SettingsModal-32vUNWRe.js → SettingsModal-Cy42vswI.js} +1 -1
  21. package/dist/client/assets/{SetupWizardModal-BFD9E0H_.js → SetupWizardModal-LqloAL4J.js} +1 -1
  22. package/dist/client/assets/{SkillsView-CZMLY7F_.js → SkillsView-I1SDKaRz.js} +1 -1
  23. package/dist/client/assets/{StashRecoveryView-jgZeWbZo.js → StashRecoveryView-DMUUR3cy.js} +1 -1
  24. package/dist/client/assets/{TodoView-DXdnOymj.js → TodoView-PKvJKjtV.js} +1 -1
  25. package/dist/client/assets/{dashboard-view-H8SnaCPP.js → dashboard-view-D4XVI1XP.js} +1 -1
  26. package/dist/client/assets/{folder-open-Dh5_gv6L.js → folder-open-Doam5g-y.js} +1 -1
  27. package/dist/client/assets/{index-w1dPHtmq.js → index-BS-jSWPW.js} +5 -5
  28. package/dist/client/assets/index-ktpD_W3I.css +1 -0
  29. package/dist/client/assets/{upload-ntU2YHPl.js → upload-BUfrZl69.js} +1 -1
  30. package/dist/client/assets/{users-BWK61s9U.js → users-XNGnYBJb.js} +1 -1
  31. package/dist/client/index.html +2 -2
  32. package/dist/client/version.json +1 -1
  33. package/dist/droid-cli/package.json +1 -1
  34. package/dist/pi-claude-cli/package.json +1 -1
  35. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  36. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  37. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  38. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  39. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  40. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  41. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  42. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  43. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  44. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  45. package/package.json +1 -1
  46. package/dist/client/assets/index-B9hAW3eU.css +0 -1
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-CquLtIia.js","assets/vendor-react-K0fH_qHe.js","assets/AgentPermissionPolicyEditor-Dk-oEs1X.js","assets/AgentPermissionPolicyEditor-CGxjOr6G.css","assets/ExperimentalAgentOnboardingModal-Br57oNdX.js","assets/ExperimentalAgentOnboardingModal-BNpveCEk.css","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/vendor-codemirror-jBKmHyH0.js","assets/AgentDetailView-CY-O6VkV.css","assets/addon-fit-C7jRorKK.js","assets/addon-web-links-CkJwd4cQ.js","assets/addon-webgl-BjvOw43o.js","assets/TodoView-DXdnOymj.js","assets/TodoView-Cx9cVhq7.css","assets/SetupWizardModal-BFD9E0H_.js","assets/DirectoryPicker-D496NTjZ.js","assets/folder-open-Dh5_gv6L.js","assets/DirectoryPicker-DzKVmxOf.css","assets/projectDetection-G3XuxD2X.js","assets/SetupWizardModal-CGYGKurR.css","assets/SettingsModal-DdrXxMPW.js","assets/SettingsModal-32vUNWRe.js","assets/SettingsModal-D_uIvf6n.css","assets/users-BWK61s9U.js","assets/SecretsView-Bwme1zZI.js","assets/SecretsView-D5bHZ-wM.css","assets/SettingsModal-DZrJ5PFH.css","assets/dashboard-view-H8SnaCPP.js","assets/createLucideIcon-BazL2hk5.js","assets/dashboard-view-DqWnXEbq.css","assets/dashboard-view-BWGH_fAq.js","assets/dashboard-view-DdGlfuu-.css","assets/AgentsView-BZVOpQ05.js","assets/upload-ntU2YHPl.js","assets/AgentsView-BI_CESkd.css","assets/DocumentsView-DIRlgdeB.js","assets/DocumentsView-gv4zG3aT.css","assets/InsightsView-Hm7vX2lr.js","assets/InsightsView-C9-mqVvf.css","assets/ResearchView-CpsR1Q56.js","assets/ResearchView-DTh8FLUm.css","assets/EvalsView-By5mtr80.js","assets/EvalsView-CUNJ1TLc.css","assets/NodesView-bXC6WoE2.js","assets/NodesView-DT4pXowv.css","assets/ChatView-CErtz86Y.js","assets/ChatView-DwJAd5G1.css","assets/SkillsView-CZMLY7F_.js","assets/SkillsView-CUbSBeZ2.css","assets/MemoryView-BLozyYur.js","assets/MemoryView-zaXewZzi.css","assets/ReliabilityView-C1C1j1SD.js","assets/ReliabilityView-D9AsVv5l.css","assets/DevServerView-BRA00XoT.js","assets/DevServerView-VTQY28P7.css","assets/GoalsView-COI14CWJ.js","assets/GoalsView-B65urz9k.css","assets/StashRecoveryView-jgZeWbZo.js","assets/StashRecoveryView-B_8WIQEo.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-DuRYmHK3.js","assets/vendor-react-K0fH_qHe.js","assets/AgentPermissionPolicyEditor-ClY32kYN.js","assets/AgentPermissionPolicyEditor-CGxjOr6G.css","assets/ExperimentalAgentOnboardingModal-lXM--LV-.js","assets/ExperimentalAgentOnboardingModal-BNpveCEk.css","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/vendor-codemirror-jBKmHyH0.js","assets/AgentDetailView-CY-O6VkV.css","assets/addon-fit-C7jRorKK.js","assets/addon-web-links-CkJwd4cQ.js","assets/addon-webgl-BjvOw43o.js","assets/TodoView-PKvJKjtV.js","assets/TodoView-Cx9cVhq7.css","assets/SetupWizardModal-LqloAL4J.js","assets/DirectoryPicker-B4VRL2BH.js","assets/folder-open-Doam5g-y.js","assets/DirectoryPicker-DzKVmxOf.css","assets/projectDetection-G3XuxD2X.js","assets/SetupWizardModal-CGYGKurR.css","assets/SettingsModal-CLEkhLK_.js","assets/SettingsModal-Cy42vswI.js","assets/SettingsModal-D_uIvf6n.css","assets/users-XNGnYBJb.js","assets/SecretsView-C4VX2ZTa.js","assets/SecretsView-D5bHZ-wM.css","assets/SettingsModal-DZrJ5PFH.css","assets/dashboard-view-D4XVI1XP.js","assets/createLucideIcon-BazL2hk5.js","assets/dashboard-view-DqWnXEbq.css","assets/dashboard-view-BWGH_fAq.js","assets/dashboard-view-DdGlfuu-.css","assets/AgentsView-UbCAHs_i.js","assets/upload-BUfrZl69.js","assets/AgentsView-BI_CESkd.css","assets/DocumentsView-tqpIZ9t9.js","assets/DocumentsView-gv4zG3aT.css","assets/InsightsView-BYfsVobi.js","assets/InsightsView-C9-mqVvf.css","assets/ResearchView-Bv4igpnv.js","assets/ResearchView-DTh8FLUm.css","assets/EvalsView-C_Br3ry8.js","assets/EvalsView-CUNJ1TLc.css","assets/NodesView-Dx6HFqjI.js","assets/NodesView-DT4pXowv.css","assets/ChatView-DDDjYRKc.js","assets/ChatView-DwJAd5G1.css","assets/SkillsView-I1SDKaRz.js","assets/SkillsView-CUbSBeZ2.css","assets/MemoryView-DT4vIhaW.js","assets/MemoryView-zaXewZzi.css","assets/ReliabilityView-C1C1j1SD.js","assets/ReliabilityView-D9AsVv5l.css","assets/DevServerView-DY5GlJcD.js","assets/DevServerView-VTQY28P7.css","assets/GoalsView-CI3Bzs1b.js","assets/GoalsView-B65urz9k.css","assets/StashRecoveryView-DMUUR3cy.js","assets/StashRecoveryView-B_8WIQEo.css"])))=>i.map(i=>d[i]);
2
2
  import{r as i,j as t,R as Ja,a as br,g as Pv,c as Ij}from"./vendor-react-K0fH_qHe.js";import"./vendor-xterm-DzcZoU0P.js";import{j as Tf,c as Pj,a as $j,m as Dj,C as Ho,E as qo,b as If,l as Lj,o as Oj,s as Fj,d as zj}from"./vendor-codemirror-jBKmHyH0.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))a(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const l of o.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&a(l)}).observe(document,{childList:!0,subtree:!0});function s(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function a(r){if(r.ep)return;r.ep=!0;const o=s(r);fetch(r.href,o)}})();/**
3
3
  * @license lucide-react v1.7.0 - ISC
4
4
  *
@@ -664,7 +664,7 @@ import{r as i,j as t,R as Ja,a as br,g as Pv,c as Ij}from"./vendor-react-K0fH_qH
664
664
  *
665
665
  * This source code is licensed under the ISC license.
666
666
  * See the LICENSE file in the root directory of this source tree.
667
- */const B0=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],Bs=ct("zap",B0),Uf=200,ho=[];function si(e,n,s){ho.push({ts:new Date().toISOString(),source:e,event:n,detail:s}),ho.length>Uf&&ho.splice(0,ho.length-Uf)}function U0(){return[...ho]}function H0(){ho.length=0}typeof window<"u"&&(window.__fusionDebug??={},window.__fusionDebug.dashboardTraces={get:U0,clear:H0});const Mm="fusion:version-reload",Rm="fusion:version-update";let _h=!0;function Yd(e){_h=e}function q0(){try{if(sessionStorage.getItem(Rm))return sessionStorage.removeItem(Rm),!0}catch{}return!1}function Mh(e){const n=!!sessionStorage.getItem(Mm);if(si("versionCheck","reload-attempt",{reason:e,alreadySet:n}),n){console.warn("[versionCheck] reload already attempted, suppressing",e);return}if(sessionStorage.setItem(Mm,"1"),!_h){console.info("[versionCheck] auto-reload disabled by setting, skipping reload:",e);return}console.info("[versionCheck] reloading:",e),window.location.reload()}function V0(e){const n=e instanceof Error?e.message:typeof e=="string"?e:"";return/Failed to fetch dynamically imported module|error loading dynamically imported module|Importing a module script failed|is not a valid JavaScript MIME type|ChunkLoadError|Unable to preload (?:CSS|module) for/i.test(n)}function W0(e){return V0(e)?(Mh(`chunk load error: ${e?.message??e}`),!0):!1}async function G0(){try{const e=await fetch("/version.json",{cache:"no-store",headers:{Accept:"application/json"}});if(!e.ok||!(e.headers.get("content-type")??"").includes("application/json"))return null;const s=await e.json();return typeof s.version=="string"?s.version:null}catch{return null}}async function K0(){try{const e=new AbortController,n=setTimeout(()=>e.abort(),3e3),s=await fetch("/api/settings",{headers:{Accept:"application/json"},signal:e.signal});clearTimeout(n),s.ok&&(await s.json()).autoReloadOnVersionChange===!1&&(_h=!1)}catch{}}const J0=6e4;let Hf=0,Xd=!1,ec=null,qf=0;async function Qd(e="initial"){if(!(Xd||document.visibilityState!=="visible")&&!(Date.now()-Hf<J0)){Hf=Date.now(),Xd=!0;try{const n=await G0();if(n===null){si("versionCheck","remote-unavailable",{trigger:e,visibilityState:document.visibilityState}),ec=null;return}if(n==="1207dac52-867b80ce"){ec=null;return}if(si("versionCheck","mismatch",{local:"1207dac52-867b80ce",remote:n,trigger:e,visibilityState:document.visibilityState}),console.info("[versionCheck] mismatch",{local:"1207dac52-867b80ce",remote:n,trigger:e}),ec!==n){ec=n,qf=Date.now(),si("versionCheck","mismatch-pending",{local:"1207dac52-867b80ce",remote:n,trigger:e,visibilityState:document.visibilityState});return}si("versionCheck","mismatch-confirmed",{remote:n,trigger:e,elapsedMs:Date.now()-qf});try{sessionStorage.setItem(Rm,"1")}catch{}Mh(`build version changed: 1207dac52-867b80ce -> ${n}`)}finally{Xd=!1}}}function Y0(){K0(),window.setTimeout(()=>sessionStorage.removeItem(Mm),5e3),document.addEventListener("visibilitychange",()=>{Qd("visibilitychange")}),window.addEventListener("focus",()=>{Qd("focus")}),window.setTimeout(()=>void Qd("initial"),2e3)}class Ol extends i.Component{constructor(n){super(n),this.state={hasError:!1,error:null}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,s){console.error("[ErrorBoundary]",n,s),!W0(n)&&this.props.onError?.(n,s)}resetErrorBoundary=()=>{this.setState({hasError:!1,error:null})};render(){if(!this.state.hasError)return this.props.children;if(this.props.fallback)return this.props.fallback;const n=this.props.level??"page",a=n==="modal"?"This section encountered an error":"Something went wrong";return t.jsxs("div",{className:`error-boundary error-boundary--${n}`,children:[t.jsx("div",{className:"error-boundary__icon",children:t.jsx(Ma,{size:40})}),t.jsx("div",{className:"error-boundary__title",children:a}),this.state.error&&t.jsx("pre",{className:"error-boundary__message",children:this.state.error.message}),t.jsxs("div",{className:"error-boundary__actions",children:[t.jsx("button",{className:"btn btn-primary",onClick:this.resetErrorBoundary,children:"Retry"}),t.jsx("button",{className:"btn",onClick:()=>window.location.reload(),children:"Reload page"})]})]})}}function Gs({children:e,onError:n}){return t.jsx(Ol,{level:"page",onError:n,children:e})}function hr({children:e,onError:n}){return t.jsx(Ol,{level:"modal",onError:n,children:e})}function X0({children:e,onError:n}){return t.jsx(Ol,{level:"root",onError:n,children:e})}function Zd(){return typeof window>"u"?null:window.fusionShell??null}function Q0(e){return e?.host==="desktop-shell"}function Z0(e){const n=e.desktopModeState;return n?n.isFirstRun||n.desktopMode===null:!e.desktopMode}async function Vf(e,n=3e4){const s=Date.now()+n;for(;Date.now()<s;){const r=(await e.getState()).localRuntime;if(r?.state==="running"&&(r.baseUrl||r.port))return{baseUrl:r.baseUrl??`http://127.0.0.1:${r.port}`};if(r?.state==="error")throw new Error(r.error??"Local runtime failed to start");await new Promise(o=>setTimeout(o,250))}throw new Error("Local runtime did not become ready in time")}function Wf(e){const n=new URL(window.location.href);n.searchParams.set("serverBaseUrl",e),n.searchParams.set("shellKind","desktop-shell"),n.searchParams.set("shellMode","local"),window.location.replace(n.toString())}function eC({children:e}){const[n,s]=i.useState({kind:"loading"});if(i.useEffect(()=>{const a=Zd();if(!a){s({kind:"bypass"});return}let r=!1;return(async()=>{try{const o=await a.getState();if(r)return;if(!Q0(o)){s({kind:"bypass"});return}if(Z0(o)){s({kind:"chooser",state:o});return}if(o.desktopMode==="local"){const l=new URLSearchParams(window.location.search);if(l.has("serverBaseUrl")){s({kind:"ready",serverBaseUrl:l.get("serverBaseUrl")??void 0});return}s({kind:"starting-local",message:"Starting local Fusion runtime…"});const{baseUrl:c}=await Vf(a);if(r)return;Wf(c);return}s({kind:"ready"})}catch(o){if(r)return;s({kind:"local-error",message:o instanceof Error?o.message:String(o)})}})(),()=>{r=!0}},[]),i.useEffect(()=>{const a=Zd();if(!(!a?.onResetDesktopModeRequest||!a.resetDesktopMode))return a.onResetDesktopModeRequest(()=>{(async()=>{try{await a.resetDesktopMode?.()}catch{}const r=new URL(window.location.href);r.searchParams.delete("serverBaseUrl"),r.searchParams.delete("shellMode"),window.location.replace(r.toString())})()})},[]),n.kind==="loading"||n.kind==="starting-local"){const a=n.kind==="loading"?"Loading Fusion…":n.message;return t.jsx("div",{className:"desktop-launch-gate",role:"status","aria-live":"polite",children:t.jsx("div",{className:"desktop-launch-gate__panel",children:t.jsx("p",{children:a})})})}return n.kind==="local-error"?t.jsx("div",{className:"desktop-launch-gate",role:"alert",children:t.jsxs("div",{className:"desktop-launch-gate__panel",children:[t.jsx("h2",{children:"Couldn't start local Fusion"}),t.jsx("p",{children:n.message}),t.jsx("button",{type:"button",className:"btn",onClick:()=>{window.location.reload()},children:"Retry"})]})}):n.kind==="chooser"?t.jsx(tC,{onPick:async a=>{const r=Zd();if(r){s({kind:"starting-local",message:a==="local"?"Starting local Fusion runtime…":"Setting up remote connection…"});try{if(await r.setDesktopMode(a),a==="local"){const{baseUrl:o}=await Vf(r);Wf(o);return}await r.openConnectionManager(),window.location.reload()}catch(o){s({kind:"local-error",message:o instanceof Error?o.message:String(o)})}}}}):t.jsx(t.Fragment,{children:e})}function tC({onPick:e}){const[n,s]=i.useState(null);return t.jsx("div",{className:"desktop-launch-gate",role:"dialog","aria-labelledby":"desktop-launch-gate-title",children:t.jsxs("div",{className:"desktop-launch-gate__panel",children:[t.jsx("h1",{id:"desktop-launch-gate-title",children:"How do you want to run Fusion?"}),t.jsx("p",{children:"Run Fusion locally in this app, or connect to a Fusion server you're already running somewhere else."}),t.jsxs("div",{className:"desktop-launch-gate__actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",disabled:n!==null,onClick:()=>{s("local"),e("local")},children:n==="local"?"Starting…":"Run Fusion Locally"}),t.jsx("button",{type:"button",className:"btn",disabled:n!==null,onClick:()=>{s("remote"),e("remote")},children:n==="remote"?"Opening…":"Connect to Remote Fusion"})]})]})})}const nC="modulepreload",sC=function(e){return"/"+e},Gf={},qn=function(n,s,a){let r=Promise.resolve();if(s&&s.length>0){let l=function(u){return Promise.all(u.map(h=>Promise.resolve(h).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),d=c?.nonce||c?.getAttribute("nonce");r=l(s.map(u=>{if(u=sC(u),u in Gf)return;Gf[u]=!0;const h=u.endsWith(".css"),m=h?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${m}`))return;const f=document.createElement("link");if(f.rel=h?"stylesheet":nC,h||(f.as="script"),f.crossOrigin="",f.href=u,d&&f.setAttribute("nonce",d),document.head.appendChild(f),h)return new Promise((p,b)=>{f.addEventListener("load",p),f.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${u}`)))})}))}function o(l){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=l,window.dispatchEvent(c),!c.defaultPrevented)throw l}return r.then(l=>{for(const c of l||[])c.status==="rejected"&&o(c.reason);return n().catch(o)})},iC=20;function aC(e){const n=e.todoCount>e.threshold&&e.idleNonEphemeralAgentCount===0;return{atRisk:n,todoCount:e.todoCount,inProgressCount:e.inProgressCount,inReviewCount:e.inReviewCount,idleNonEphemeralAgentCount:e.idleNonEphemeralAgentCount,threshold:e.threshold,reason:n?"todo-exceeds-threshold-and-no-idle-agents":"ok"}}const rC={themeMode:"dark",colorTheme:"default",dashboardFontScalePct:100,defaultProvider:void 0,defaultModelId:void 0,testMode:void 0,fallbackProvider:void 0,fallbackModelId:void 0,defaultThinkingLevel:void 0,ntfyEnabled:!1,ntfyTopic:void 0,ntfyBaseUrl:void 0,ntfyAccessToken:void 0,ntfyEvents:["in-review","merged","failed","awaiting-approval","awaiting-user-review","planning-awaiting-input","message:agent-to-user","message:agent-to-agent","message:room","gridlock","board-stall-unrecovered","fallback-used","memory-dreams-processed","token-budget"],ntfyDashboardHost:void 0,taskTokenBudget:void 0,failureNotificationDelayMs:3e4,failureNotificationMode:"sticky-only",webhookEnabled:!1,webhookUrl:void 0,webhookFormat:"generic",webhookEvents:[],notificationProviders:[],customProviders:[],defaultProjectId:void 0,setupComplete:void 0,favoriteProviders:void 0,favoriteModels:void 0,openrouterModelSync:!0,openrouterAppAttribution:void 0,openrouterModelFilters:void 0,openrouterProviderPreferences:void 0,opencodeGoModelSync:!0,updateCheckEnabled:!0,fnBinaryCheckEnabled:!0,updateCheckFrequency:"daily",autoReloadOnVersionChange:!0,showGitHubStarButton:!0,githubTrackingDefaultRepo:void 0,modelOnboardingComplete:void 0,useClaudeCli:void 0,useDroidCli:void 0,useLlamaCpp:void 0,executionGlobalProvider:void 0,executionGlobalModelId:void 0,planningGlobalProvider:void 0,planningGlobalModelId:void 0,validatorGlobalProvider:void 0,validatorGlobalModelId:void 0,titleSummarizerGlobalProvider:void 0,titleSummarizerGlobalModelId:void 0,daemonToken:void 0,daemonPort:4040,daemonHost:"127.0.0.1",settingsSyncEnabled:!1,settingsSyncAuth:!1,settingsSyncInterval:9e5,settingsSyncConflictResolution:"last-write-wins",dashboardCurrentNodeId:void 0,dashboardCurrentProjectIdByNode:void 0,vitestAutoKillEnabled:!0,vitestKillThresholdPct:90,persistAgentToolOutput:!0,persistAgentThinkingLogPermanent:!1,persistAgentThinkingLogEphemeral:!1,persistAgentThinkingLog:!1,agentMemoryInclusionMode:"full",secretsAccessPolicy:void 0,secretsSyncPassphraseConfigured:!1,researchGlobalDefaults:{searchProvider:void 0,synthesisProvider:void 0,synthesisModelId:void 0,enabledSources:{webSearch:!0,pageFetch:!0,github:!1,localDocs:!0,llmSynthesis:!0},maxSourcesPerRun:20,defaultExportFormat:"markdown"},researchGlobalEnabled:!0,researchGlobalMaxConcurrentRuns:3,researchGlobalDefaultTimeout:3e5,researchGlobalMaxSourcesPerRun:20,researchGlobalMaxSynthesisRounds:2,researchGlobalWebSearchProvider:"builtin",researchGlobalSearxngUrl:void 0,researchGlobalBraveApiKey:void 0,researchGlobalGoogleSearchApiKey:void 0,researchGlobalGoogleSearchCx:void 0,researchGlobalTavilyApiKey:void 0,researchGlobalGitHubEnabled:!1,researchGlobalLocalDocsEnabled:!0,researchGlobalMaxSearchResults:10,researchGlobalFetchTimeoutMs:3e4,researchGlobalUserAgent:"FusionResearchBot/1.0",remoteAccess:{activeProvider:null,providers:{tailscale:{enabled:!1,hostname:"",targetPort:0,acceptRoutes:!1},cloudflare:{enabled:!1,quickTunnel:!0,tunnelName:"",tunnelToken:null,ingressUrl:""}},tokenStrategy:{persistent:{enabled:!0,token:null},shortLived:{enabled:!1,ttlMs:9e5,maxTtlMs:864e5}},lifecycle:{rememberLastRunning:!1,wasRunningOnShutdown:!1,lastRunningProvider:null}},worktrunk:{enabled:!1,binaryPath:void 0,installedBinaryPath:void 0,onFailure:"fail"},owningNodeHandoffPolicy:"reassign-to-local",experimentalFeatures:{}},oC={globalPause:!1,globalPauseReason:void 0,enginePaused:!1,maxConcurrent:2,maxTriageConcurrent:2,globalMaxConcurrent:4,maxWorktrees:4,pollIntervalMs:15e3,heartbeatMultiplier:1,autoClaimCandidatesInPrompt:5,tombstoneStickyWindowDays:7,heartbeatScopeDiscipline:"strict",heartbeatPromptTemplate:"default",groupOverlappingFiles:!0,overlapIgnorePaths:[],autoMerge:!0,testMode:void 0,mergeStrategy:"direct",directMergeCommitStrategy:"always-squash",mergeIntegrationWorktree:"reuse-task-worktree",mergeAdvanceAutoSync:"stash-and-ff",integrationBranch:void 0,requirePrApproval:!1,pushAfterMerge:!1,pushRemote:"origin",unavailableNodePolicy:"block",owningNodeHandoffPolicy:"reassign-to-local",defaultNodeId:void 0,secretsEnv:void 0,worktreeInitCommand:void 0,testCommand:void 0,buildCommand:void 0,recycleWorktrees:!1,executorAllowSiblingBranchRename:!1,worktreeNaming:"random",worktrunk:{enabled:!1,binaryPath:void 0,installedBinaryPath:void 0,onFailure:"fail"},worktreesDir:void 0,taskPrefix:"FN",taskAttributionTrailerNames:["Fusion-Task-Id"],commitMsgHookEnabled:!0,includeTaskIdInCommit:!0,commitAuthorEnabled:!0,commitAuthorName:"Fusion",commitAuthorEmail:"noreply@runfusion.ai",planningProvider:void 0,planningModelId:void 0,planningFallbackProvider:void 0,planningFallbackModelId:void 0,defaultProviderOverride:void 0,defaultModelIdOverride:void 0,executionProvider:void 0,executionModelId:void 0,validatorProvider:void 0,validatorModelId:void 0,validatorFallbackProvider:void 0,validatorFallbackModelId:void 0,modelPresets:[],autoSelectModelPreset:!1,completionDocumentationMode:"off",defaultPresetBySize:{},autoResolveConflicts:!0,smartConflictResolution:!0,mergerAutostashMaxAgeHours:24,worktreeRebaseBeforeMerge:!0,worktreeRebaseRemote:"",worktreeRebaseLocalBase:!0,prerebaseAutoEnabled:!0,prerebaseHotFiles:["AGENTS.md","packages/core/src/store.ts","packages/core/src/db.ts","packages/engine/src/executor.ts","packages/engine/src/scheduler.ts","packages/engine/src/merger.ts","packages/dashboard/app/styles.css"],prerebaseDivergenceThreshold:50,mergeConflictStrategy:"smart-prefer-main",merger:{mode:"ai",maxReviewPasses:3},mergeDiffVolumeMinLines:void 0,mergeDiffVolumeThreshold:void 0,mergeDiffVolumeAllowlist:void 0,mergeStrategyOverlapBehavior:"flip-to-prefer-branch",postMergeAuditMode:"warn",mergeAuditAutoRecovery:"ai-assisted",autoRecovery:{mode:"deterministic-only",maxRetries:3},reliabilityStatsResetAt:void 0,workflowStepTimeoutMs:36e4,workflowStepScopeEnforcement:"block",planOnlyScopeLeakEnforcement:"warn",workflowRevisionForkOnScopeMismatch:!0,strictScopeEnforcement:!1,buildRetryCount:0,verificationFixRetries:3,buildTimeoutMs:3e5,requirePlanApproval:!1,ephemeralAgentsEnabled:!0,agentProvisioning:{},sandboxProvisioning:{},defaultAgentPermissionPolicy:void 0,specStalenessEnabled:!1,specStalenessMaxAgeMs:360*60*1e3,taskStuckTimeoutMs:6e5,runtimeStopDrainMs:2e3,engineActiveSinceMs:void 0,engineActivationGraceMs:5*6e4,inReviewStallDeadlockThreshold:3,stalePausedReviewThresholdMs:1440*6e4,inReviewStalledThresholdMs:1440*6e4,stalePausedTodoThresholdMs:1440*6e4,pausedScopeDecayMs:30*6e4,metaTaskStallAutoCloseMs:120*6e4,metaTaskActiveExecutionGraceMs:30*6e4,boardStallSweepWindowMs:120*6e4,boardStallBlockedGrowthThreshold:3,capacityRiskBannerEnabled:!1,capacityRiskTodoThreshold:20,backlogPressureAlertEnabled:!0,backlogPressureRatioThreshold:10,backlogPressureMinTodoCount:5,backlogPressureAlertCooldownMs:1440*6e4,dependencyBlockedTodoReportEnabled:!0,dependencyBlockedTodoFreshAgeMs:30*6e4,dependencyBlockedTodoStaleAgeMs:240*6e4,dependencyBlockedTodoMinCount:1,dependencyBlockedTodoReportCooldownMs:360*6e4,staleHighFanoutBlockerAgeThresholdMs:7200*1e3,staleInProgressWarningMs:240*6e4,staleInProgressCriticalMs:1440*6e4,staleInReviewWarningMs:1440*6e4,staleInReviewCriticalMs:4320*6e4,aiSessionTtlMs:10080*60*1e3,aiSessionCleanupIntervalMs:3600*1e3,autoUnpauseEnabled:!0,autoUnpauseBaseDelayMs:3e5,autoUnpauseMaxDelayMs:36e5,maxStuckKills:6,maxBranchConflictRecoveries:5,maxReviewerContextRetries:2,maxReviewerFallbackRetries:2,maxTotalRetriesBeforeFail:25,preserveProgressOnStuckRequeue:!0,maxPostReviewFixes:1,maxSpawnedAgentsPerParent:5,maxSpawnedAgentsGlobal:20,maintenanceIntervalMs:3e5,autoArchiveDoneTasksEnabled:!0,autoArchiveDoneAfterMs:2880*60*1e3,doneAutoArchiveDays:0,archiveAgentLogMode:"compact",autoUpdatePrStatus:!1,githubCommentOnDone:!1,githubCommentTemplate:void 0,githubCloseSourceIssueOnDone:!1,githubTrackingEnabledByDefault:!1,githubTrackingDefaultRepo:void 0,githubTrackingDedupEnabled:!0,githubAuthMode:"gh-cli",githubAuthToken:void 0,autoBackupEnabled:!1,autoBackupSchedule:"0 2 * * *",autoBackupRetention:7,autoBackupDir:".fusion/backups",memoryBackupEnabled:!1,memoryBackupSchedule:"0 3 * * *",memoryBackupRetention:14,memoryBackupDir:".fusion/backups/memory",memoryBackupScope:"all",autoSummarizeTitles:!1,useAiMergeCommitSummary:!0,titleSummarizerProvider:void 0,titleSummarizerModelId:void 0,titleSummarizerFallbackProvider:void 0,titleSummarizerFallbackModelId:void 0,scripts:void 0,setupScript:void 0,insightExtractionEnabled:!1,insightExtractionSchedule:"0 2 * * *",insightExtractionMinIntervalMs:864e5,taskEvaluationEnabled:!1,taskEvaluationSchedule:"0 5 * * *",taskEvaluationProvider:void 0,taskEvaluationModelId:void 0,taskEvaluationFollowUpPolicy:"off",taskEvaluationRetention:void 0,memoryEnabled:!0,memoryBackendType:"qmd",memoryAutoSummarizeEnabled:!1,memoryAutoSummarizeThresholdChars:5e4,memoryAutoSummarizeSchedule:"0 3 * * *",memoryDreamsEnabled:!1,memoryDreamsSchedule:"0 4 * * *",tokenCap:void 0,taskTokenBudget:void 0,runStepsInNewSessions:!1,maxParallelSteps:2,missionStaleThresholdMs:6e5,missionMaxTaskRetries:3,missionHealthCheckIntervalMs:3e5,agentPrompts:void 0,promptOverrides:void 0,reflectionEnabled:!1,reflectionIntervalMs:36e5,reflectionAfterTask:!0,reviewHandoffPolicy:"disabled",showQuickChatFAB:!1,chatAutoCleanupDays:0,mailAutoCleanupDays:0,chatRoomRecentVerbatimMessages:25,chatRoomCompactionFetchLimit:200,chatRoomSummaryMaxChars:3e3,researchSettings:{enabled:!0,searchProvider:void 0,synthesisProvider:void 0,synthesisModelId:void 0,enabledSources:{webSearch:!0,pageFetch:!0,github:!1,localDocs:!0,llmSynthesis:!0},limits:{maxConcurrentRuns:3,maxSourcesPerRun:20,maxDurationMs:3e5,requestTimeoutMs:3e4}},sandbox:{backend:"native",policy:{allowNetwork:!0,allowedPaths:[]},failureMode:"fail-hard"},evalSettings:{enabled:!1,intervalMs:864e5,evaluatorProvider:void 0,evaluatorModelId:void 0,followUpPolicy:"suggest-only",retentionDays:30},researchEnabled:!0,researchMaxConcurrentRuns:3,researchDefaultTimeout:3e5,researchMaxSourcesPerRun:20,researchMaxSynthesisRounds:2},lC=Object.freeze(Object.keys(rC)),cC=Object.freeze(Object.keys(oC));function JU(e){return lC.includes(e)}function YU(e){return cC.includes(e)}function XU(e,n){const s=n.ephemeral?e?.persistAgentThinkingLogEphemeral:e?.persistAgentThinkingLogPermanent;return typeof s=="boolean"?s:typeof e?.persistAgentThinkingLog=="boolean"?e.persistAgentThinkingLog:!1}function Ce(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}const dC={provider:"mock",modelId:"scripted"};function uC(e){return e?.testMode===!0||e?.defaultProvider?.trim().toLowerCase()==="mock"}function er(e,n){return uC(n)?dC:e}function mC(e){return!!(e?.provider&&e?.modelId)}function tr(...e){for(const n of e)if(mC(n))return{provider:n.provider,modelId:n.modelId};return{}}function Ed(e){return er(tr({provider:e?.defaultProviderOverride,modelId:e?.defaultModelIdOverride},{provider:e?.defaultProvider,modelId:e?.defaultModelId}),e)}function hC(e){return er(tr({provider:e?.executionProvider,modelId:e?.executionModelId},{provider:e?.executionGlobalProvider,modelId:e?.executionGlobalModelId},Ed(e)),e)}function fC(e){return er(tr({provider:e?.planningProvider,modelId:e?.planningModelId},{provider:e?.planningGlobalProvider,modelId:e?.planningGlobalModelId},Ed(e)),e)}function pC(e){return er(tr({provider:e?.validatorProvider,modelId:e?.validatorModelId},{provider:e?.validatorGlobalProvider,modelId:e?.validatorGlobalModelId},Ed(e)),e)}function QU(e){return er(tr({provider:e?.titleSummarizerProvider,modelId:e?.titleSummarizerModelId},{provider:e?.titleSummarizerGlobalProvider,modelId:e?.titleSummarizerGlobalModelId},{provider:e?.planningProvider,modelId:e?.planningModelId},Ed(e)),e)}function Kv(e,n){return er(tr({provider:e.modelProvider,modelId:e.modelId},hC(n)),n)}function Jv(e,n){return er(tr({provider:e.validatorModelProvider,modelId:e.validatorModelId},pC(n)),n)}function Yv(e,n){return er(tr({provider:e.planningModelProvider,modelId:e.planningModelId},fC(n)),n)}const ZU=["off","minimal","low","medium","high"],Ga=["triage","todo","in-progress","in-review","done","archived"],ed="triage";function Rh(e){return typeof e=="string"&&Ga.includes(e)}function Xv(e,n=ed){return Rh(e)?e:n}const nr=["low","normal","high","urgent"],di="normal",Ah=5,Qv=7200*1e3,gC=["default","ocean","forest","sunset","zen","berry","high-contrast","industrial","monochrome","slate","ash","graphite","silver","solarized","factory","ayu","one-dark","nord","dracula","gruvbox","tokyo-night","catppuccin-mocha","github-dark","everforest","rose-pine","kanagawa","night-owl","palenight","monokai-pro","slime","brutalist","neon-city","parchment","terminal","glass","horizon","vitesse","outrun","snazzy","porple","espresso","mars","poimandres","ember","rust","copper","foundry","carbon","sandstone","lagoon","frost","lavender","neon-bloom","sepia"];let Kf=!1;function e9(e){return e==="reuse-task-worktree"||e==="cwd-integration-branch"?e:e==="cwd-main"?(Kf||(Kf=!0,console.warn("[merger] settings.mergeIntegrationWorktree=cwd-main is legacy; normalized to cwd-integration-branch")),"cwd-integration-branch"):"reuse-task-worktree"}function t9(e){return e==="off"||e==="ff-only"||e==="stash-and-ff"?e:"stash-and-ff"}const _d=/^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/,Hs={triage:"Planning",todo:"Todo","in-progress":"In Progress","in-review":"In Review",done:"Done",archived:"Archived"},bC={triage:"Raw ideas — AI will plan these",todo:"Specified and ready to start","in-progress":"AI is working on this in a worktree","in-review":"Complete — ready to merge",done:"Merged and closed",archived:"Completed and archived"},Am={triage:["todo","archived"],todo:["in-progress","triage","archived"],"in-progress":["in-review","todo","triage","done"],"in-review":["done","in-progress","todo","triage"],done:["todo","triage","archived"],archived:["done"]};function xC(e){const n=e.metadata??{};return!!(n.agentKind==="task-worker"||n.taskWorker===!0||n.managedBy==="task-executor"||n.type==="spawned"||n.internal===!0||e.role==="executor"&&typeof e.name=="string"&&e.name.startsWith("executor-")&&e.reportsTo==null||e.role==="executor"&&e.name==="verification-agent"&&e.reportsTo==null)}const n9=["git_write","file_write_delete","command_execution","network_api","task_agent_mutation"],s9={git_write:["git commit","git push","git merge","git branch -d","git worktree add","write","edit"],file_write_delete:["write","edit","fn_task_attach"],command_execution:["bash (non-git)","read","find","grep","ls"],network_api:["fn_research_run (web/research)","fn_web_fetch","worktrunk_install"],task_agent_mutation:["fn_task_create","fn_delegate_task","fn_task_import_github","fn_task_import_github_issue","fn_spawn_agent","fn_update_agent_config","fn_update_identity"]},i9=["fn_send_message","fn_post_room_message","fn_read_messages","fn_task_log","fn_task_done","fn_heartbeat_done","fn_task_document_write","fn_task_document_read","fn_memory_search","fn_memory_get","fn_memory_append","fn_read_evaluations","fn_reflect_on_performance"],a9=["always","trusted-only","never"],Th="fn.authToken",Jf="token",vC="fn_token";let fo,Yf=!1,td=!1;const Tm="fn:auth-token-recovery-required",Im="fusion:oauth-relogin-success";function yC(){try{const e=window.localStorage.getItem(Th);return e&&e.length>0?e:void 0}catch{return}}function Zv(e){try{window.localStorage.setItem(Th,e)}catch{}}function wC(){if(!(Yf||typeof window>"u")){Yf=!0;try{const e=new URL(window.location.href),n=e.searchParams.get(Jf);if(!n)return;Zv(n),e.searchParams.delete(Jf);const s=e.pathname+(e.search?e.search:"")+e.hash;return window.history.replaceState(window.history.state,"",s),n}catch{return}}}function jo(){if(fo!==void 0)return fo;const e=wC();if(e)return fo=e,e;const n=yC();if(n)return fo=n,n}function kC(e){fo=e,td=!1,Zv(e)}function jC(){fo=void 0,td=!1;try{window.localStorage.removeItem(Th)}catch{}}function Xf(e){return e==="ws:"?"http:":e==="wss:"?"https:":e}function NC(e){return e==="http:"||e==="https:"||e==="ws:"||e==="wss:"}function SC(e){if(typeof window>"u")return!1;const n=new URL(window.location.origin);if(!NC(e.protocol))return!1;const s=e.hostname===n.hostname,a=e.port===n.port,r=Xf(e.protocol)===Xf(n.protocol);return s&&a&&r}function CC(e){if(!(typeof window>"u"))try{const n=new URL(e,window.location.origin),s=e.startsWith("/");return{parsed:n,preserveRelativePath:s}}catch{return}}function Qi(e){const n=jo();if(!n||typeof window>"u")return e;const s=CC(e);return!s||!SC(s.parsed)?e:(s.parsed.searchParams.set(vC,n),s.preserveRelativePath?`${s.parsed.pathname}${s.parsed.search}${s.parsed.hash}`:s.parsed.toString())}function Gi(e){const n=jo();if(!n)return e;const s=new Headers(e??{});return s.has("Authorization")||s.set("Authorization",`Bearer ${n}`),s}function EC(e){if(!e||typeof e!="object")return!1;const n=e;return n.error==="Unauthorized"&&n.message==="Valid bearer token required"}function _C(){typeof window>"u"||td||(td=!0,window.dispatchEvent(new CustomEvent(Tm)))}async function MC(e){if(e.status===401)try{const n=e.clone();if(!(n.headers.get("content-type")??"").toLowerCase().includes("application/json"))return;const a=await n.json();EC(a)&&_C()}catch{}}function RC(){if(typeof window>"u"||window.__fnAuthFetchInstalled)return;window.__fnAuthFetchInstalled=!0,jo();const e=window.fetch.bind(window);window.fetch=function(s,a){const r=jo(),o=typeof s=="string"?s:s instanceof URL?s.toString():s.url;if(!(()=>{try{const d=new URL(o,window.location.origin);return d.origin!==window.location.origin?!1:d.pathname.startsWith("/api/")||d.pathname==="/api"}catch{return o.startsWith("/api/")||o==="/api"}})())return e(s,a);const c=new Headers(a?.headers??(s instanceof Request?s.headers:void 0));return r&&!c.has("Authorization")&&c.set("Authorization",`Bearer ${r}`),e(s,{...a,headers:c}).then(d=>(MC(d),d))}}const Yr=new Map;function AC(){let e,n;return{external:new Promise((a,r)=>{e=a,n=r}),resolve:e,reject:n,done:!1}}function Qf(e,n){n.then(s=>{e.done||(e.done=!0,e.resolve(s))},s=>{e.done||(e.done=!0,e.reject(s))})}function Zi(e,n,s){const a=Yr.get(e);if(a&&!a.done)return s?.forceFresh&&Qf(a,n()),a.external;const r=AC();return Qf(r,n()),r.external.then(()=>{Yr.get(e)===r&&Yr.delete(e)},()=>{Yr.get(e)===r&&Yr.delete(e)}),Yr.set(e,r),r.external}class Nr extends Error{status;details;constructor(n,s,a){super(n),this.name="ApiRequestError",this.status=s,this.details=a}}function TC(e){const n=e.trim();return n.startsWith("<!DOCTYPE")||n.startsWith("<html")||n.startsWith("<HTML")}function Xs(e){return`/api${e}`}async function $(e,n={}){const s=Xs(e),a=jo(),r=(()=>{if(a){const f=new Headers(n.headers??{});return f.has("Content-Type")||f.set("Content-Type","application/json"),Gi(f)}if(!n.headers)return{"Content-Type":"application/json"};const m=new Headers(n.headers);return m.has("Content-Type")||m.set("Content-Type","application/json"),Object.fromEntries(m.entries())})(),o=await fetch(s,{...n,headers:r});if(o.status===204){if(!o.ok)throw new Error(`Request failed for ${s}: ${o.status} ${o.statusText}`);return}const l=o.headers.get("content-type")??"",c=await o.text(),d=l.includes("application/json");if(l.includes("text/html")||TC(c))throw new Error(`API returned HTML instead of JSON for ${s}. The endpoint may not be properly configured. (${o.status} ${o.statusText})`);if(!d){const m=c.length>160?`${c.slice(0,160)}...`:c;throw new Error(`API returned ${l||"an unknown content type"} instead of JSON for ${s}. (${o.status} ${o.statusText})${m?` Response: ${m}`:""}`)}let h;try{h=c?JSON.parse(c):null}catch{throw new Error(`API returned invalid JSON for ${s}. (${o.status} ${o.statusText})`)}if(!o.ok){const m=h;throw new Nr(m?.error||`Request failed for ${s}: ${o.status} ${o.statusText}`,o.status,m?.details)}return h}function IC(){return $("/health")}function ey(){return $("/health/refresh",{method:"POST"})}function r9(){return $("/updates/check")}function ty(e,n,s,a,r){const o=new URLSearchParams;e!==void 0&&o.set("limit",String(e)),n!==void 0&&o.set("offset",String(n)),s&&o.set("projectId",s),a&&o.set("q",a),r&&o.set("includeArchived","1");const l=o.size>0?`?${o.toString()}`:"";return $(`/tasks${l}`)}async function Sr(e,n){const a=Xs(K(`/tasks/${e}`,n));for(let r=1;r<=2;r++){const o=await fetch(a,{headers:Gi({"Content-Type":"application/json"})}),l=await o.json();if(o.ok)return l;if(r===2)throw new Error(l.error||"Request failed")}throw new Error("Request failed")}class PC extends Error{matches;constructor(n){super("duplicate_candidates"),this.name="DuplicateCandidatesError",this.matches=n}}async function $C(e,n){return(await $(K("/tasks/duplicate-check",n),{method:"POST",body:JSON.stringify(e)})).matches??[]}async function ny(e,n,s){const{title:a,description:r,column:o,dependencies:l,breakIntoSubtasks:c,enabledWorkflowSteps:d,assignedAgentId:u,modelPresetId:h,modelProvider:m,modelId:f,validatorModelProvider:p,validatorModelId:b,planningModelProvider:v,planningModelId:x,thinkingLevel:y,summarize:g,reviewLevel:j,executionMode:N,priority:C,source:w,nodeId:S,branch:R,baseBranch:I,branchSelection:E,githubTracking:M,acknowledgedDuplicates:G,bypassDuplicateCheck:U}=e;try{return await Ul(K("/tasks",n),{method:"POST",nodeId:s?.transportNodeId,localNodeId:s?.localNodeId,body:JSON.stringify({title:a,description:r,column:o,dependencies:l,breakIntoSubtasks:c,enabledWorkflowSteps:d,assignedAgentId:u,modelPresetId:h,modelProvider:m,modelId:f,validatorModelProvider:p,validatorModelId:b,planningModelProvider:v,planningModelId:x,thinkingLevel:y,summarize:g,reviewLevel:j,executionMode:N,priority:C,source:w,nodeId:S,branch:R,baseBranch:I,branchSelection:E,githubTracking:M,acknowledgedDuplicates:G,bypassDuplicateCheck:U})})}catch(P){if(P instanceof Nr&&P.status===409&&P.message==="duplicate_candidates"){const T=Array.isArray(P.details?.matches)?P.details?.matches:[];throw new PC(T)}throw P}}function ni(e,n,s){return $(K(`/tasks/${e}`,s),{method:"PATCH",body:JSON.stringify(n)})}function DC(e,n,s,a,r,o,l,c,d){return $(K("/tasks/batch-update-models",d),{method:"POST",body:JSON.stringify({taskIds:e,modelProvider:n,modelId:s,validatorModelProvider:a,validatorModelId:r,planningModelProvider:o,planningModelId:l,nodeId:c})})}function LC(e,n,s,a){return $(K(`/tasks/${e}/move`,s),{method:"POST",body:JSON.stringify({column:n,...typeof a=="object"&&a?.preserveProgress?{preserveProgress:!0}:{}})})}function OC(e,n,s){const a=new URLSearchParams;s?.removeDependencyReferences&&a.set("removeDependencyReferences","true"),s?.removeLineageReferences&&a.set("removeLineageReferences","true"),s?.githubIssueAction&&a.set("githubIssueAction",s.githubIssueAction),s?.allowResurrection&&a.set("allowResurrection","true");const r=a.size>0?`?${a.toString()}`:"";return $(K(`/tasks/${e}${r}`,n),{method:"DELETE"})}function FC(e,n){return $(K(`/tasks/${e}/merge`,n),{method:"POST"})}function zC(e,n){return $(K(`/tasks/${e}/retry`,n),{method:"POST"})}function BC(e,n){return $(K(`/tasks/${e}/recover-branch-binding`,n),{method:"POST"})}function UC(e,n){return $(K(`/tasks/${e}/reset`,n),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({confirm:!0})})}function HC(e,n){return $(K(`/tasks/${e}/duplicate`,n),{method:"POST"})}function sy(e,n){return $(K(`/tasks/${e}/pause`,n),{method:"POST"})}function iy(e,n){return $(K(`/tasks/${e}/unpause`,n),{method:"POST"})}function qC(e,n,s){const a=new URLSearchParams;s?.removeLineageReferences&&a.set("removeLineageReferences","true");const r=a.size>0?`?${a.toString()}`:"";return $(K(`/tasks/${e}/archive${r}`,n),{method:"POST"})}function VC(e,n){return $(K(`/tasks/${e}/unarchive`,n),{method:"POST"})}function WC(e){return $(K("/tasks/archive-all-done",e),{method:"POST"}).then(n=>n.archived)}function GC(e,n){return $(K(`/tasks/${e}/approve-plan`,n),{method:"POST"})}function KC(e,n){return $(K(`/tasks/${e}/reject-plan`,n),{method:"POST"})}function ay(e){const n=K("/config",e);return Zi(n,()=>$(n))}function Md(e,n){const s=K("/settings",e);return Zi(s,()=>$(s),n)}function tc(e,n){return $(K("/settings",n),{method:"PUT",body:JSON.stringify(e)})}function JC(e){return $(K("/update-check",e))}function o9(e){return $(K("/remote/settings",e))}function l9(e,n){return $(K("/remote/settings",n),{method:"PUT",body:JSON.stringify(e)})}function c9(e){return $(K("/remote/status",e))}function d9(e){return $(K("/remote/install-cloudflared",e),{method:"POST"})}function u9(e){return $(K("/remote/tunnel/start",e),{method:"POST"})}function m9(e){return $(K("/remote/tunnel/stop",e),{method:"POST"})}function h9(e){return $(K("/remote/tunnel/kill-external",e),{method:"POST"})}function f9(e){return $(K("/remote/token/persistent/regenerate",e),{method:"POST"})}function p9(e,n){return $(K("/remote/token/short-lived/generate",n),{method:"POST",body:JSON.stringify({ttlMs:e})})}function ry(e,n,s){const a=new URLSearchParams;e&&a.set("format",e),a.set("tokenType",n),n==="short-lived"&&typeof s=="number"&&Number.isFinite(s)&&a.set("ttlMs",String(s));const r=a.toString();return r?`?${r}`:""}function g9(e={}){const{projectId:n,tokenType:s="persistent",ttlMs:a}=e,r=ry(null,s,a);return $(K(`/remote/url${r}`,n))}function b9(e="text",n={}){const{projectId:s,tokenType:a="persistent",ttlMs:r}=n,o=ry(e,a,r);return $(K(`/remote/qr${o}`,s))}function x9(e){return $(K("/memory",e))}function v9(e,n){return $(K("/memory",n),{method:"PUT",body:JSON.stringify({content:e})})}function y9(e){return $(K("/memory/files",e))}function w9(e,n){const s=`path=${encodeURIComponent(e)}`;return $(K(`/memory/file?${s}`,n))}function k9(e,n,s){return $(K("/memory/file",s),{method:"PUT",body:JSON.stringify({path:e,content:n})})}function j9(e,n){let s,a=n;if(n!==void 0)s=e;else if(typeof e=="string"&&e.trim().length>0){const r=e.trim();r.includes("/")||r.endsWith(".md")||r.startsWith(".")?s=r:a=r}return $(K("/memory/compact",a),{method:"POST",body:JSON.stringify(s?{path:s}:{})})}function N9(e){return $(K("/memory/dream",e),{method:"POST"})}function S9(e){return $(K("/memory/insights",e))}function C9(e,n){return $(K("/memory/insights",n),{method:"PUT",body:JSON.stringify({content:e})})}function E9(e){return $(K("/memory/extract",e),{method:"POST"})}function _9(e){return $(K("/memory/audit",e))}function M9(e){return $(K("/memory/stats",e))}function R9(e){return $(K("/memory/backend",e))}function A9(e){return $(K("/memory/install-qmd",e),{method:"POST"})}function T9(e,n){return $(K("/memory/test",n),{method:"POST",body:JSON.stringify({query:e})})}function Ra(e){return Zi("/settings/global",()=>$("/settings/global"),e)}function Cs(e){return $("/settings/global",{method:"PUT",body:JSON.stringify(e)})}function I9(e){return $(K("/settings/scopes",e))}function P9(e){return $(K("/settings/pi-extensions",e))}function $9(e,n){return $(K("/settings/pi-extensions",n),{method:"PUT",body:JSON.stringify({disabledIds:e})})}function D9(e,n,s){return $(K("/settings/test-notification",s),{method:"POST",body:JSON.stringify({providerId:e,...n??{}})})}function L9(){return $("/pi-settings")}async function O9(e){return $("/pi-settings",{method:"PUT",body:JSON.stringify(e)})}async function F9(e){return $("/pi-settings/packages",{method:"POST",body:JSON.stringify({source:e})})}async function z9(e){return $(K("/pi-settings/reinstall-fusion",e),{method:"POST"})}async function Rd(e,n,s){const a=new FormData;a.append("file",n);const r=await fetch(Xs(K(`/tasks/${e}/attachments`,s)),{method:"POST",headers:Gi(),body:a}),o=await r.json();if(!r.ok)throw new Error(o.error||"Upload failed");return o}async function YC(e,n,s){return $(K(`/tasks/${e}/attachments/${n}`,s),{method:"DELETE"})}async function Zf(e,n,s){const a=new URLSearchParams;s?.limit!==void 0&&a.set("limit",String(s.limit)),s?.offset!==void 0&&a.set("offset",String(s.offset));const r=a.toString()?`?${a.toString()}`:"",o=K(`/tasks/${e}/logs${r}`,n),l=await fetch(Xs(o),{headers:Gi()});if(!l.ok){const h=await l.json().catch(()=>({error:"Failed to fetch agent logs"}));throw new Error(h.error||`HTTP ${l.status}`)}const c=await l.json(),d=l.headers.has("X-Total-Count")?parseInt(l.headers.get("X-Total-Count"),10):c.length,u=l.headers.has("X-Has-More")?l.headers.get("X-Has-More")==="true":!1;return{entries:c,total:d,hasMore:u}}function XC(e,n,s,a){return $(K(`/tasks/${e}/comments/${n}`,a),{method:"PATCH",body:JSON.stringify({text:s})})}function QC(e,n,s){return $(K(`/tasks/${e}/comments/${n}`,s),{method:"DELETE"})}function ZC(e,n){return $(K(`/tasks/${e}/documents`,n))}function e1(e,n,s){return $(K(`/tasks/${e}/documents/${n}/revisions`,s))}async function B9(e,n){const s=new URLSearchParams;e?.q&&s.set("q",e.q),e?.limit!==void 0&&s.set("limit",String(e.limit)),e?.offset!==void 0&&s.set("offset",String(e.offset));const a=s.toString(),r=`/documents${a?`?${a}`:""}`;return $(K(r,n))}function U9(e,n){const s=new URLSearchParams;n?.showHidden&&s.set("showHidden","1");const a=s.toString(),r=`/files/markdown-list${a?`?${a}`:""}`;return $(K(r,e))}function ep(e,n,s,a,r){return $(K(`/tasks/${e}/documents/${n}`,r),{method:"PUT",body:JSON.stringify({content:s,author:a?.author,metadata:a?.metadata})})}function t1(e,n,s){return $(K(`/tasks/${e}/documents/${n}`,s),{method:"DELETE"})}function n1(e,n,s){return $(K(`/tasks/${e}/steer`,s),{method:"POST",body:JSON.stringify({text:n})})}function s1(e,n,s){return $(K(`/tasks/${e}/spec/revise`,s),{method:"POST",body:JSON.stringify({feedback:n})})}function i1(e,n){return $(K(`/tasks/${e}/spec/rebuild`,n),{method:"POST"})}function a1(e,n,s){return $(K(`/tasks/${e}/refine`,s),{method:"POST",body:JSON.stringify({feedback:n})})}function Ki(){return $("/models")}function r1(){return $("/usage")}function o1(){return $("/providers/claude-cli/status")}function l1(){return $("/system/fn-binary/status")}function c1(){return $("/system/fn-binary/install",{method:"POST"})}function d1(){return $("/providers/droid-cli/status")}function u1(){return $("/providers/cursor-cli/status")}function m1(){return $("/providers/llama-cpp/status")}async function H9(e){const n=e?.binaryPath?`?binaryPath=${encodeURIComponent(e.binaryPath)}`:"";return $(`/providers/hermes/status${n}`)}async function q9(e){const n=e?.binaryPath?`?binaryPath=${encodeURIComponent(e.binaryPath)}`:"";return(await $(`/providers/hermes/profiles${n}`)).profiles??[]}async function V9(e){const n=e?.binaryPath?`?binaryPath=${encodeURIComponent(e.binaryPath)}`:"";return $(`/providers/openclaw/status${n}`)}async function W9(e){const n=new URLSearchParams({apiUrl:e.apiUrl});return e.apiKey&&n.set("apiKey",e.apiKey),$(`/providers/paperclip/status?${n.toString()}`)}async function G9(e){const n=new URLSearchParams({apiUrl:e.apiUrl});return e.apiKey&&n.set("apiKey",e.apiKey),(await $(`/providers/paperclip/companies?${n.toString()}`)).companies??[]}async function K9(e){const n=new URLSearchParams({apiUrl:e.apiUrl,companyId:e.companyId});return e.apiKey&&n.set("apiKey",e.apiKey),(await $(`/providers/paperclip/agents?${n.toString()}`)).agents??[]}async function J9(e){return $("/providers/paperclip/cli-mint-key",{method:"POST",body:JSON.stringify(e)})}async function Y9(e){const n=new URLSearchParams;e.cliBinaryPath&&n.set("cliBinaryPath",e.cliBinaryPath),e.cliConfigPath&&n.set("cliConfigPath",e.cliConfigPath);const s=n.toString();return $(`/providers/paperclip/cli-status${s?`?${s}`:""}`)}async function X9(e){const n=new URLSearchParams;e.cliBinaryPath&&n.set("cliBinaryPath",e.cliBinaryPath),e.cliConfigPath&&n.set("cliConfigPath",e.cliConfigPath);const s=n.toString();return(await $(`/providers/paperclip/cli-companies${s?`?${s}`:""}`)).companies??[]}async function Q9(e){const n=new URLSearchParams({companyId:e.companyId});return e.cliBinaryPath&&n.set("cliBinaryPath",e.cliBinaryPath),e.cliConfigPath&&n.set("cliConfigPath",e.cliConfigPath),(await $(`/providers/paperclip/cli-agents?${n.toString()}`)).agents??[]}async function Z9(e={}){const n=new URLSearchParams;e.cliConfigPath&&n.set("cliConfigPath",e.cliConfigPath);const s=n.toString();return $(`/providers/paperclip/cli-discovery${s?`?${s}`:""}`)}function h1(e){return $("/auth/claude-cli",{method:"POST",body:JSON.stringify({enabled:e})})}function f1(e){return $("/auth/droid-cli",{method:"POST",body:JSON.stringify({enabled:e})})}function p1(e){return $("/auth/cursor-cli",{method:"POST",body:JSON.stringify({enabled:e})})}function g1(e){return $("/auth/llama-cpp",{method:"POST",body:JSON.stringify({enabled:e})})}async function b1(){const n=(await $("/custom-providers")).map(s=>({id:s.id,name:s.name,baseUrl:s.baseUrl,api:s.apiType==="anthropic-compatible"?"anthropic-messages":s.apiType==="google-generative-ai"?"google-generative-ai":s.apiType==="openai-responses"?"openai-responses":"openai-completions",apiKey:s.apiKey,models:(s.models??[]).map(a=>({id:a.id,name:a.name}))}));return Object.assign(n,{providers:n})}function x1(e){return $("/custom-providers",{method:"POST",body:JSON.stringify(e)})}function e7(e,n){const s=n,a={...typeof s.name=="string"?{name:s.name}:{},...typeof s.baseUrl=="string"?{baseUrl:s.baseUrl}:{},...typeof s.apiKey=="string"?{apiKey:s.apiKey}:{},...Array.isArray(s.models)?{models:s.models.map(r=>({id:r.id,name:r.name??r.id}))}:{},...s.api?{apiType:s.api==="anthropic-messages"?"anthropic-compatible":s.api==="google-generative-ai"?"google-generative-ai":s.api==="openai-responses"?"openai-responses":"openai-compatible"}:{},..."apiType"in n?{apiType:n.apiType}:{}};return $(`/custom-providers/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(a)})}function t7(e){return $(`/custom-providers/${encodeURIComponent(e)}`,{method:"DELETE"})}function v1(e){const n=e.api==="anthropic-messages"?"anthropic-compatible":e.api==="google-generative-ai"?"google-generative-ai":e.api==="openai-responses"?"openai-responses":"openai-compatible";return x1({name:e.name?.trim()||e.id,apiType:n,baseUrl:e.baseUrl,apiKey:e.apiKey,models:e.models?.map(s=>({id:s.id,name:s.name??s.id}))})}async function y1(e){return $("/custom-providers/probe-models",{method:"POST",body:JSON.stringify({baseUrl:e.baseUrl,apiKey:e.apiKey,apiType:e.apiType})})}function No(e){return Zi("/auth/status",()=>$("/auth/status"),e)}function w1(e){return $("/auth/login",{method:"POST",body:JSON.stringify({provider:e,origin:window.location.origin})})}function k1(e,n){return $("/auth/manual-code",{method:"POST",body:JSON.stringify({provider:e,code:n})})}function j1(e){return $("/auth/logout",{method:"POST",body:JSON.stringify({provider:e})})}function N1(e){return $("/auth/cancel",{method:"POST",body:JSON.stringify({provider:e})})}function S1(e,n){return $("/auth/api-key",{method:"POST",body:JSON.stringify({provider:e,apiKey:n})})}function C1(e){return $("/auth/api-key",{method:"DELETE",body:JSON.stringify({provider:e})})}function E1(e,n,s,a){return $("/github/issues/fetch",{method:"POST",body:JSON.stringify({owner:e,repo:n,limit:s,labels:a})})}function _1(e,n,s,a){return $(K("/github/issues/import",a),{method:"POST",body:JSON.stringify({owner:e,repo:n,issueNumber:s})})}function M1(e,n,s){return $("/github/pulls/fetch",{method:"POST",body:JSON.stringify({owner:e,repo:n,limit:s})})}function R1(e,n,s,a){return $(K("/github/pulls/import",a),{method:"POST",body:JSON.stringify({owner:e,repo:n,prNumber:s})})}function A1(e){return $(K("/git/remotes",e))}function T1(e){return $(K("/git/remotes/detailed",e))}function I1(e,n,s){return $(K("/git/remotes",s),{method:"POST",body:JSON.stringify({name:e,url:n})})}function P1(e,n){return $(K(`/git/remotes/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function $1(e,n,s){return $(K(`/git/remotes/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify({newName:n})})}function D1(e,n,s){return $(K(`/git/remotes/${encodeURIComponent(e)}/url`,s),{method:"PUT",body:JSON.stringify({url:n})})}function tp(e,n){return $(K(`/tasks/${e}/pr/generate-metadata`,n),{method:"POST"})}function np(e,n,s){const a=s?`?base=${encodeURIComponent(s)}`:"";return $(K(`/tasks/${e}/pr/preflight${a}`,n))}function L1(e,n){return $(K(`/tasks/${e}/pr/options`,n))}function O1(e,n,s){return $(K(`/tasks/${e}/pr/create`,s),{method:"POST",body:JSON.stringify(n)})}function Pm(e,n){return $(K(`/tasks/${e}/pr/refresh`,n),{method:"POST"})}function F1(e,n,s){return $(K(`/tasks/${e}/pr/${n}/unlink`,s),{method:"POST",body:JSON.stringify({})})}function z1(e,n){return $(K(`/tasks/${e}/pr/reclaim-conflict`,n),{method:"POST"})}function B1(e,n,s,a){const r=a?`?pr=${encodeURIComponent(String(a))}`:"";return $(K(`/tasks/${e}/pr/merge${r}`,s),{method:"POST",body:JSON.stringify(n?{method:n}:{})})}function U1(e,n,s,a,r){const o=r?`?pr=${encodeURIComponent(String(r))}`:"";return $(K(`/tasks/${e}/pr/auto-merge${o}`,a),{method:"POST",body:JSON.stringify({enabled:n,strategy:s})})}function H1(e,n,s){const a=s?`?pr=${encodeURIComponent(String(s))}`:"";return $(K(`/tasks/${e}/pr/checks${a}`,n))}function sp(e,n,s){const a=s?`?pr=${encodeURIComponent(String(s))}`:"";return $(K(`/tasks/${e}/pr/reviews${a}`,n))}function nc(e,n,s,a){return $(K("/terminal/sessions",a),{method:"POST",body:JSON.stringify({cwd:e,cols:n,rows:s})})}function ip(e,n){return $(K(`/terminal/sessions/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function q1(e){return $(K("/terminal/sessions",e))}function zi(e,n){const s=K("/git/status",e);if(!n?.extended)return $(s);const a=s.includes("?")?"&":"?";return $(`${s}${a}extended=1`)}function V1(e,n){const s=e?`?limit=${e}`:"";return $(K(`/git/commits${s}`,n))}function nd(e,n){return $(K(`/git/commits/${e}/diff`,n))}function W1(e){return $(K("/git/commits/ahead",e))}function G1(e,n,s,a){const r=new URLSearchParams;r.set("limit",String(s));const o=r.size>0?`?${r.toString()}`:"";return $(K(`/git/remotes/${encodeURIComponent(e)}/commits${o}`,a))}function Vo(e){return $(K("/git/branches",e))}function K1(e,n,s){const a=`?limit=${n}`;return $(K(`/git/branches/${encodeURIComponent(e)}/commits${a}`,s))}function J1(e){return $(K("/git/worktrees",e))}function Y1(e,n,s){return $(K("/git/branches",s),{method:"POST",body:JSON.stringify({name:e,base:n})})}function X1(e,n){return $(K(`/git/branches/${encodeURIComponent(e)}/checkout`,n),{method:"POST"})}function ap(e,n,s){const a=n?"?force=true":"";return $(K(`/git/branches/${encodeURIComponent(e)}${a}`,s),{method:"DELETE"})}function Q1(e,n){return $(K("/git/fetch",n),{method:"POST",body:JSON.stringify({remote:e})})}function Z1(e,n){const s=typeof e=="string"?void 0:e;return $(K("/git/pull",typeof e=="string"?e:n),{method:"POST",body:JSON.stringify({rebase:s?.rebase??!1})})}function eE(e){return $(K("/git/push",e),{method:"POST"})}function sc(e){return $(K("/git/stashes",e))}function tE(e,n){return $(K("/git/stashes",n),{method:"POST",body:JSON.stringify({message:e})})}function nE(e,n,s){return $(K(`/git/stashes/${e}/apply`,s),{method:"POST",body:JSON.stringify({drop:n})})}function sE(e,n){return $(K(`/git/stashes/${e}`,n),{method:"DELETE"})}function iE(e,n){return $(K(`/git/stashes/${e}/diff`,n))}function aE(e,n,s){const a=new URLSearchParams;return a.set("path",e),a.set("staged",String(n)),$(K(`/git/diff/file?${a.toString()}`,s))}function Xr(e){return $(K("/git/changes",e))}function rp(e,n){return $(K("/git/stage",n),{method:"POST",body:JSON.stringify({files:e})})}function rE(e,n){return $(K("/git/unstage",n),{method:"POST",body:JSON.stringify({files:e})})}function op(e,n){return $(K("/git/commit",n),{method:"POST",body:JSON.stringify({message:e})})}function oE(e,n){return $(K("/git/discard",n),{method:"POST",body:JSON.stringify({files:e})})}function lE(e){return $(K("/workspaces",e))}function cE(e,n,s){const a=new URLSearchParams({workspace:e});return n&&a.set("path",n),s&&a.set("projectId",s),$(`/files?${a.toString()}`)}function dE(e,n,s){const a=new URLSearchParams({workspace:e});return s&&a.set("projectId",s),$(`/files/${encodeURIComponent(n)}?${a.toString()}`)}function uE(e,n,s,a){const r=new URLSearchParams({workspace:e});return a&&r.set("projectId",a),$(`/files/${encodeURIComponent(n)}?${r.toString()}`,{method:"POST",body:JSON.stringify({content:s})})}function mE(e,n,s){const a=new URLSearchParams({q:e});return n&&a.set("workspace",n),s&&a.set("projectId",s),$(`/files/search?${a.toString()}`)}function hE(e,n,s,a){const r=new URLSearchParams({workspace:e});return a&&r.set("projectId",a),$(`/files/${encodeURIComponent(n)}/copy?${r.toString()}`,{method:"POST",body:JSON.stringify({destination:s})})}function fE(e,n,s,a){const r=new URLSearchParams({workspace:e});return a&&r.set("projectId",a),$(`/files/${encodeURIComponent(n)}/move?${r.toString()}`,{method:"POST",body:JSON.stringify({destination:s})})}function pE(e,n,s){const a=new URLSearchParams({workspace:e});return s&&a.set("projectId",s),$(`/files/${encodeURIComponent(n)}/delete?${a.toString()}`,{method:"POST"})}function gE(e,n,s,a){const r=new URLSearchParams({workspace:e});return a&&r.set("projectId",a),$(`/files/${encodeURIComponent(n)}/rename?${r.toString()}`,{method:"POST",body:JSON.stringify({newName:s})})}function oy(e,n,s){const a=new URLSearchParams({workspace:e});return s&&a.set("projectId",s),`/api/files/${encodeURIComponent(n)}/download?${a.toString()}`}function bE(e,n,s){const a=new URLSearchParams({workspace:e});return s&&a.set("projectId",s),`/api/files/${encodeURIComponent(n)}/download-zip?${a.toString()}`}function xE(e,n,s){return $(K("/planning/create-draft",n),{method:"POST",body:JSON.stringify({initialPlan:e,planningModelProvider:s?.planningModelProvider,planningModelId:s?.planningModelId})})}function vE(e,n,s,a,r){return $(K("/planning/start-streaming",n),{method:"POST",body:JSON.stringify({initialPlan:e,planningModelProvider:s?.planningModelProvider,planningModelId:s?.planningModelId,planningDepth:a?.planningDepth,customQuestionCount:a?.customQuestionCount,...r?{existingSessionId:r}:{}})})}function lp(e,n,s,a){return $(K("/planning/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n,tabId:a})})}function yE(e,n,s){return $(K(`/planning/${encodeURIComponent(e)}/back`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function wE(e,n,s){return $(K(`/planning/${encodeURIComponent(e)}/retry`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function kE(e,n,s){return $(K(`/planning/${encodeURIComponent(e)}/stop`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function ly(e,n,s){return $(K("/planning/cancel",n),{method:"POST",body:JSON.stringify({sessionId:e,tabId:s})})}function n7(e,n,s,a){return $(K("/agents/onboarding/start-streaming",s),{method:"POST",body:JSON.stringify({intent:e,context:n,mode:n.mode,existingAgentConfig:n.existingAgentConfig,planningModelProvider:a?.planningModelProvider,planningModelId:a?.planningModelId})})}function s7(e,n,s){return $(K("/agents/onboarding/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n})})}function i7(e,n){return $(K("/agents/onboarding/cancel",n),{method:"POST",body:JSON.stringify({sessionId:e})})}function jE(e,n,s,a){return $(K("/planning/create-task",s),{method:"POST",body:JSON.stringify({...n?{sessionId:e,summary:n}:{sessionId:e},...a?.branch!==void 0?{branch:a.branch}:{},...a?.baseBranch!==void 0?{baseBranch:a.baseBranch}:{},...a?.branchSelection?{branchSelection:a.branchSelection}:{}})})}function NE(e,n,s){return $(K("/planning/start-breakdown",s),{method:"POST",body:JSON.stringify(n?{sessionId:e,summary:n}:{sessionId:e})})}function SE(e,n,s,a){return $(K("/planning/create-tasks",s),{method:"POST",body:JSON.stringify({planningSessionId:e,subtasks:n,...a?.branchSelection?{branchSelection:a.branchSelection}:{},...a?.branchAssignment?{branchAssignment:a.branchAssignment}:{}})})}const $m=new Set;if(typeof window<"u"){const e=()=>{for(const n of Array.from($m))try{n.close()}catch{}};window.addEventListener("pagehide",e),window.addEventListener("beforeunload",e)}function CE(e,n){if(n===null||n<=0)return e;const s=e.includes("?")?"&":"?";return`${e}${s}lastEventId=${encodeURIComponent(String(n))}`}function Lo(e,n,s={}){const a=s.maxReconnectAttempts??10;let r=null,o=!1,l=0,c=null,d=null,u=!1;const h=p=>{const b=p.lastEventId;if(!b)return!0;const v=Number.parseInt(b,10);return Number.isFinite(v)?d!==null&&v<=d?!1:(d=v,!0):!0},m=()=>{if(o)return;const p=CE(e,d),b=new EventSource(Qi(p));r=b,b.onopen=()=>{l=0,u=!1,s.onConnectionStateChange?.("connected"),n.onOpen?.()},b.onmessage=v=>{const x=v;h(x)&&n.onMessage?.(x)};for(const[v,x]of Object.entries(n.events??{}))b.addEventListener(v,y=>{const g=y;h(g)&&x(g)});b.onerror=()=>{if(o||r!==b)return;if(b.readyState===EventSource.CONNECTING){u||(u=!0,s.onConnectionStateChange?.("reconnecting"));return}if(b.close(),l>=a){s.onFatalError?.("Connection lost");return}u=!0,s.onConnectionStateChange?.("reconnecting"),l+=1;const x=Math.min(1e3*2**(l-1),3e4);c=setTimeout(()=>{c=null,m()},x)}};m();const f={close:()=>{o=!0,c&&(clearTimeout(c),c=null),r?.close(),$m.delete(f)},isConnected:()=>!o&&r?.readyState===EventSource.OPEN};return $m.add(f),f}function cp(e){const n=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",s=n==="root"?".":n,a=e.name,r=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():s,o=typeof e.confidence=="number"?e.confidence:1,l=n==="root"?"root":n,c=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:a,packagePath:r,confidence:o,cwd:s,source:n,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${c} · ${a} (${l})`}}function So(e){const n=e.status,s=n==="starting"||n==="running"||n==="failed"||n==="stopped"?n:"stopped",a=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,r=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:s,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:a,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:a,detectedPort:e.detectedPort,manualPreviewUrl:r,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:r,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function EE(e,n){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:n,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function _E(e){const s=(Array.isArray(e.lines)?e.lines:[]).map((a,r)=>EE(a,r+1));return{lines:s,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:s.length}}function ME(e,n){const s=typeof n.maxLines=="number"&&Number.isFinite(n.maxLines)?Math.max(1,Math.floor(n.maxLines)):100,a=typeof n.offset=="number"&&Number.isFinite(n.offset)?Math.max(0,Math.floor(n.offset)):0,r=typeof n.lastEventId=="number"&&Number.isFinite(n.lastEventId)?Math.max(0,Math.floor(n.lastEventId)):null,o=e.length,l=e.map((u,h)=>({id:h+1,text:u,stream:"stdout",timestamp:""}));if(r!==null)return{lines:l.filter(u=>u.id>r).slice(0,s),totalLines:o};const c=Math.max(o-a,0),d=Math.max(c-s,0);return{lines:l.slice(d,c),totalLines:o}}function dp(e){return Array.isArray(e)?e.map(cp):(e.candidates??[]).map(cp)}async function RE(e){try{const n=await $(K("/dev-server/candidates",e));return dp(n)}catch(n){if(n instanceof Error&&/\/dev-server\/candidates/.test(n.message)){const s=await $(K("/dev-server/detect",e));return dp(s)}throw n}}function Ih(e){return $(K("/dev-server/status",e)).then(So)}async function a7(e={},n){const s=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&s.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&s.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&s.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const a=s.size>0?`?${s.toString()}`:"";try{const r=await $(K(`/dev-server/logs/history${a}`,n));return _E(r)}catch(r){if(r instanceof Error&&/\/dev-server\/logs\/history/.test(r.message)){const o=await Ih(n);return ME(o.logs,e)}throw r}}function AE(e,n){const s=e.cwd??e.packagePath??".",a=e.scriptName;return $(K("/dev-server/start",n),{method:"POST",body:JSON.stringify({command:e.command,scriptName:a,scriptId:a,cwd:s,packagePath:e.packagePath})}).then(So)}function TE(e){return $(K("/dev-server/stop",e),{method:"POST"}).then(So)}function IE(e){return $(K("/dev-server/restart",e),{method:"POST"}).then(So)}async function PE(e,n){const s=typeof e=="string"?{url:e}:e;try{const a=await $(K("/dev-server/preview-url",n),{method:"POST",body:JSON.stringify(s)});return So(a)}catch(a){if(a instanceof Error&&/\/dev-server\/preview-url/.test(a.message)){const r=await $(K("/dev-server/preview-url",n),{method:"PUT",body:JSON.stringify(s)});return So(r)}throw a}}function r7(e){return Xs(K("/dev-server/logs/stream",e))}async function o7(e){try{return(await $(K("/devserver",e))).sessions??[]}catch{try{const n=await Ih(e);return[{config:{id:n.id??"default",name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function l7(e,n){try{return await $(K(`/devserver/${encodeURIComponent(e)}`,n))}catch{try{const s=await Ih(n);return!e||e==="default"||e===s.id?{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function c7(e,n){try{return await $(K(`/devserver/${encodeURIComponent(e)}/start`,n),{method:"POST"})}catch{const s=await AE({command:""},n);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}}}async function d7(e,n){try{return await $(K(`/devserver/${encodeURIComponent(e)}/stop`,n),{method:"POST"})}catch{const s=await TE(n);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}}}async function u7(e,n){try{return await $(K(`/devserver/${encodeURIComponent(e)}/restart`,n),{method:"POST"})}catch{const s=await IE(n);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}}}async function m7(e,n,s){try{const a=await $(K(`/devserver/${encodeURIComponent(e)}/preview`,s),{method:"POST",body:JSON.stringify({url:n})});return{url:a.url??null,source:a.source??null}}catch{const a=await PE({url:n},s);return{url:a.previewUrl??a.manualUrl??null,source:"manual"}}}async function h7(e){try{return(await $(K("/devserver/detect",e))).candidates??[]}catch{try{return(await RE(e)).map(s=>({name:s.name,command:s.command,cwd:s.cwd,scriptName:s.scriptName,packagePath:s.packagePath}))}catch{return[]}}}function f7(e,n){return Xs(K(`/devserver/${encodeURIComponent(e)}/logs/stream`,n))}function Fl(e,n,s=25e3){const a=setInterval(()=>{_M(e,n).catch(()=>{})},s);return{stop:()=>{clearInterval(a)}}}function $E(e,n){return Xs(K(`/planning/${encodeURIComponent(e)}/stream`,n))}function DE(e,n){return Xs(K(`/agents/onboarding/${encodeURIComponent(e)}/stream`,n))}function p7(e,n,s,a){const r=DE(e,n),o=Lo(r,{events:{thinking:l=>{try{s.onThinking?.(JSON.parse(l.data))}catch{s.onThinking?.(l.data)}},question:l=>{try{s.onQuestion?.(JSON.parse(l.data))}catch{}},summary:l=>{try{s.onSummary?.(JSON.parse(l.data))}catch{}},error:l=>{try{const c=JSON.parse(l.data);s.onError?.(c.message||c)}catch{s.onError?.(l.data||"Stream error")}},complete:()=>{s.onComplete?.()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:l=>s.onError?.(l)});return{close:o.close,isConnected:o.isConnected}}function LE(e,n,s,a){const r=$E(e,n);let o=null,l=null;const c=()=>{o?.stop(),o=null},d=Lo(r,{onOpen:()=>{c(),o=Fl(e,n)},onMessage:u=>{u.data.startsWith(":")},events:{thinking:u=>{try{s.onThinking?.(JSON.parse(u.data))}catch{s.onThinking?.(u.data)}},question:u=>{try{s.onQuestion?.(JSON.parse(u.data))}catch(h){console.error("[planning] Failed to parse question event:",h)}},summary:u=>{try{s.onSummary?.(JSON.parse(u.data))}catch(h){console.error("[planning] Failed to parse summary event:",h)}},error:u=>{try{const h=JSON.parse(u.data);s.onError?.(h.message||h)}catch{s.onError?.(u.data||"Stream error")}l?.close()},complete:()=>{s.onComplete?.(),l?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:u=>{c(),s.onError?.(u)}});return l={close:()=>{c(),d.close()},isConnected:d.isConnected},l}function zl(e,n){const s=new URLSearchParams;n?.scope&&s.set("scope",n.scope),n?.projectId&&s.set("projectId",n.projectId);const a=s.toString();return a?`${e}?${a}`:e}function OE(e){return $(zl("/routines",e))}function FE(e,n){return $(zl("/routines",n),{method:"POST",body:JSON.stringify(e)})}function up(e,n,s){return $(zl(`/routines/${e}`,s),{method:"PATCH",body:JSON.stringify(n)})}async function zE(e,n){await $(zl(`/routines/${e}`,n),{method:"DELETE"})}function BE(e,n){return $(zl(`/routines/${e}/trigger`,n),{method:"POST"})}function mp(e){const n=new URLSearchParams;e?.limit!==void 0&&n.set("limit",String(e.limit)),e?.since!==void 0&&n.set("since",e.since),e?.type!==void 0&&n.set("type",e.type),e?.projectId&&n.set("projectId",e.projectId);const s=n.size>0?`?${n.toString()}`:"";return $(`/activity${s}`)}function UE(e){const n=K("/activity",e);return $(n,{method:"DELETE"})}function Bl(e){const n=K("/workflow-steps",e);return Zi(n,()=>$(n))}function hp(e,n){return $(K("/workflow-steps",n),{method:"POST",body:JSON.stringify(e)})}function HE(e,n,s){return $(K(`/workflow-steps/${e}`,s),{method:"PATCH",body:JSON.stringify(n)})}function qE(e,n){return $(K(`/workflow-steps/${e}`,n),{method:"DELETE"})}function fp(e,n){return $(K(`/workflow-steps/${e}/refine`,n),{method:"POST"})}function VE(e,n){return $(K(`/tasks/${encodeURIComponent(e)}/workflow-results`,n))}function WE(){return $("/workflow-step-templates")}function GE(){return $("/plugin-workflow-step-templates")}function KE(e,n){return $(K(`/workflow-step-templates/${encodeURIComponent(e)}/create`,n),{method:"POST"})}function Rl(e){return $(K("/scripts",e))}function JE(e,n,s){return $(K("/scripts",s),{method:"POST",body:JSON.stringify({name:e,command:n})})}function YE(e,n){return $(K(`/scripts/${encodeURIComponent(e)}`,n),{method:"DELETE"})}async function cy(e,n,s){return(await $(K("/ai/refine-text",s),{method:"POST",body:JSON.stringify({text:e,type:n})})).refined}const ic={RATE_LIMIT:"Too many refinement requests. Please wait an hour.",INVALID_TYPE:"Invalid refinement option selected.",NETWORK:"Failed to refine text. Please try again."};function dy(e){if(!(e instanceof Error))return ic.NETWORK;const n=e.message.toLowerCase();return n.includes("rate limit")||n.includes("429")?ic.RATE_LIMIT:n.includes("invalid")&&n.includes("type")?ic.INVALID_TYPE:n.startsWith("text must")||n.includes("text is required")||n.includes("type is required")?e.message:ic.NETWORK}function XE(e,n){return $(K("/subtasks/start-streaming",n),{method:"POST",body:JSON.stringify({description:e})})}function QE(e,n,s){return $(K(`/subtasks/${encodeURIComponent(e)}/retry`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function ZE(e,n){return Xs(K(`/subtasks/${encodeURIComponent(e)}/stream`,n))}function e_(e,n,s,a){let r=null,o=null;const l=()=>{r?.stop(),r=null},c=Lo(ZE(e,n),{onOpen:()=>{l(),r=Fl(e,n)},events:{thinking:d=>{try{s.onThinking?.(JSON.parse(d.data))}catch{s.onThinking?.(d.data)}},subtasks:d=>{try{s.onSubtasks?.(JSON.parse(d.data))}catch(u){console.error("[subtasks] Failed to parse subtasks event:",u)}},error:d=>{try{const u=JSON.parse(d.data),h=typeof u=="string"&&u.length>0?u:null;s.onError?.(h||"Stream error")}catch{s.onError?.("Stream error")}o?.close()},complete:()=>{s.onComplete?.(),o?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:d=>{l(),s.onError?.(d)}});return o={close:()=>{l(),c.close()},isConnected:c.isConnected},o}function t_(e,n,s,a,r){return $(K("/subtasks/create-tasks",a),{method:"POST",body:JSON.stringify({sessionId:e,parentTaskId:s,...r?.branch!==void 0?{branch:r.branch}:{},...r?.baseBranch!==void 0?{baseBranch:r.baseBranch}:{},...r?.branchSelection?{branchSelection:r.branchSelection}:{},...r?.branchAssignment?{branchAssignment:r.branchAssignment}:{},subtasks:n.map(o=>({tempId:o.id,title:o.title,description:o.description,size:o.suggestedSize,dependsOn:o.dependsOn}))})})}function uy(e,n,s){return $(K("/subtasks/cancel",n),{method:"POST",body:JSON.stringify({sessionId:e,tabId:s})})}function K(e,n){if(!n)return e;const s=e.includes("?")?"&":"?";return`${e}${s}projectId=${encodeURIComponent(n)}`}function n_(e,n,s){if(!n||n===s)return e;const a="/api",r=e.startsWith(a)?e.slice(a.length):e;return`/proxy/${encodeURIComponent(n)}${r}`}function Ul(e,n){const{nodeId:s,localNodeId:a,...r}=n??{},o=n_(e,s,a);return $(o,r)}function Qa(e,n,s){const a=new URLSearchParams;e?.state&&a.set("state",e.state),e?.role&&a.set("role",e.role),e?.includeEphemeral===!0&&a.set("includeEphemeral","true"),n&&a.set("projectId",n);const o=`/agents${a.size>0?`?${a.toString()}`:""}`;return Zi(o,()=>$(o),s)}function Dm(e,n){return $(K(`/agents/${encodeURIComponent(e)}`,n))}function s_(e,n){return $(K("/agents",n),{method:"POST",body:JSON.stringify(e)})}function i_(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}async function g7(e,n,s){const a=new FormData;a.append("file",n);const r=await fetch(Xs(K(`/agents/${encodeURIComponent(e)}/avatar`,s)),{method:"POST",headers:Gi(),body:a}),o=await r.json();if(!r.ok)throw new Error(o.error||"Avatar upload failed");return o}function b7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/avatar`,n),{method:"DELETE"})}function x7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/upgrade-heartbeat-procedure`,n),{method:"POST"})}function v7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/instructions`,s),{method:"PATCH",body:JSON.stringify(n)})}function y7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/soul`,s),{method:"PATCH",body:JSON.stringify({soul:n})})}function w7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/memory`,s),{method:"PATCH",body:JSON.stringify({memory:n})})}function k7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/memory/files`,n))}function j7(e,n,s){const a=`path=${encodeURIComponent(n)}`;return $(K(`/agents/${encodeURIComponent(e)}/memory/file?${a}`,s))}function N7(e,n,s,a){return $(K(`/agents/${encodeURIComponent(e)}/memory/file`,a),{method:"PUT",body:JSON.stringify({path:n,content:s})})}function a_(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/state`,s),{method:"POST",body:JSON.stringify({state:n})})}function r_(e,n){return $(K(`/agents/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function S7(e,n,s){const a=new URLSearchParams;n!==void 0&&a.set("limit",String(n)),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/runs${r}`)}function C7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/runs/${encodeURIComponent(n)}`,s))}function E7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/runs/${encodeURIComponent(n)}/logs`,s))}function _7(e,n,s){const a=new URLSearchParams;a.set("limit",String(n)),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/prompt-sizes${r}`)}function M7(e,n,s){const a=s?.source??"manual",r=s?.triggerDetail??"Agent activated via dashboard";return $(K(`/agents/${encodeURIComponent(e)}/runs`,n),{method:"POST",body:JSON.stringify({source:a,triggerDetail:r})})}function R7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/runs/stop`,n),{method:"POST"})}function pp(e,n){const s=K("/agents/stats",e);return Zi(s,()=>$(s),n)}function A7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/chain-of-command`,n))}function T7(e,n){const s=new URLSearchParams;e&&s.set("projectId",e),n?.includeEphemeral&&s.set("includeEphemeral","true");const a=s.toString();return $(`/agents/org-tree${a?`?${a}`:""}`)}function I7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/children`,n)).catch(s=>{if(s.message.includes("not found"))return[];throw s})}function gp(e,n,s){return $(K(`/tasks/${encodeURIComponent(e)}/assign`,s),{method:"PATCH",body:JSON.stringify({agentId:n})})}function my(e){return{reviewState:{source:e.mode,summary:e.summary??void 0,items:e.items.map(n=>({id:n.itemId,body:n.body,author:{login:n.author},createdAt:n.createdAt??new Date(0).toISOString(),updatedAt:n.updatedAt??void 0,path:n.filePath,threadId:n.threadId,htmlUrl:n.url,state:n.reviewState??void 0,isResolved:n.isResolved})),addressing:[],lastRefreshedAt:e.fetchedAt??void 0,refreshStatus:"ready",refreshSource:"initial-load"},automationStatus:null}}async function o_(e,n){const s=await $(K(`/tasks/${encodeURIComponent(e)}/review`,n));return my(s)}async function l_(e,n){const s=await $(K(`/tasks/${encodeURIComponent(e)}/review/refresh`,n),{method:"POST"});return my(s)}function c_(e,n,s){return $(K(`/tasks/${encodeURIComponent(e)}/review/address`,s),{method:"POST",body:JSON.stringify({selectedItems:n,tab:"review"})})}function P7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/tasks`,n))}function $7(){return $("/agents/companies")}function D7(e,n){return $(K("/agents/generate/start",n),{method:"POST",body:JSON.stringify({role:e})})}function L7(e,n){return $(K("/agents/generate/spec",n),{method:"POST",body:JSON.stringify({sessionId:e})})}function O7(e,n){return $(K(`/agents/generate/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function F7(e){return $(K("/backups",e))}function z7(e){return $(K("/backups",e),{method:"POST"})}function B7(e,n){const s=K("/settings/export",n),a=`${s}${s.includes("?")?"&":"?"}scope=${encodeURIComponent(e)}`;return $(a)}function U7(e,n,s){return $(K("/settings/import",s),{method:"POST",body:JSON.stringify({data:e,scope:n?.scope??"both",merge:n?.merge??!0})})}function H7(){return $("/projects")}function d_(e){return Array.isArray(e.nodeMappings)||Array.isArray(e.projectNodeMappings)||Array.isArray(e.pathMappings)}function bp(){return Zi("/projects/across-nodes",()=>$("/projects/across-nodes"))}function sd(){return Zi("/nodes",()=>$("/nodes"))}function q7(){return $("/docker/nodes")}function V7(e){return $(`/docker/nodes/${encodeURIComponent(e)}/container-status`)}function W7(e,n){const s=new URLSearchParams;typeof n?.tail=="number"&&s.set("tail",String(n.tail));const a=s.size>0?`?${s.toString()}`:"";return $(`/docker/nodes/${encodeURIComponent(e)}/logs${a}`)}function G7(e){return $("/docker-nodes",{method:"POST",body:JSON.stringify(e)})}function u_(e){return $("/nodes",{method:"POST",body:JSON.stringify(e)})}function m_(e){return $("/nodes/discover-projects",{method:"POST",body:JSON.stringify(e)})}function h_(e,n){return $(`/nodes/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify(n)})}function f_(e){return $(`/nodes/${encodeURIComponent(e)}/docker-config`)}function p_(e,n){return $(`/nodes/${encodeURIComponent(e)}/docker-config`,{method:"PATCH",body:JSON.stringify(n)})}function g_(e){return $(`/nodes/${encodeURIComponent(e)}/docker-config/diff`)}function xp(e){return $(`/nodes/${encodeURIComponent(e)}`,{method:"DELETE"})}async function b_(e){const n=await $(`/nodes/${encodeURIComponent(e)}/health-check`,{method:"POST"});return{nodeId:n.nodeId??e,status:n.status,responseTimeMs:n.responseTimeMs,error:n.error,checkedAt:n.checkedAt??new Date().toISOString()}}async function K7(){return $("/mesh/state")}function J7(e,n,s,a){const r=s&&s!==a?s:void 0,o=new URLSearchParams;e&&o.set("path",e),n&&o.set("showHidden","true"),r&&o.set("nodeId",r);const l=jo();l&&o.set("fn_token",l);const c=o.toString(),d=`/browse-directory${c?`?${c}`:""}`;return $(d)}function x_(e){return $("/projects",{method:"POST",body:JSON.stringify(e)})}function hy(e){return $(`/projects/${encodeURIComponent(e)}`,{method:"DELETE"})}function v_(e,n,s){return $(`/projects/${encodeURIComponent(e)}/path-mappings/${encodeURIComponent(n)}`,{method:"PUT",body:JSON.stringify({path:s})})}function vp(e){return $(`/projects/${encodeURIComponent(e)}/health`)}function y_(e){const n=K("/executor/stats",e);return Zi(n,()=>$(n))}function w_(e){return $(K("/system-stats",e))}function k_(e){return $(K("/kill-vitest",e),{method:"POST"})}function yp(e){const n=new URLSearchParams;e?.limit!==void 0&&n.set("limit",String(e.limit)),e?.since&&n.set("since",e.since),e?.projectId&&n.set("projectId",e.projectId),e?.type&&n.set("type",e.type);const s=n.size>0?`?${n.toString()}`:"";return $(`/activity-feed${s}`)}function j_(e){return $(`/projects/${encodeURIComponent(e)}/pause`,{method:"POST"})}function N_(e){return $(`/projects/${encodeURIComponent(e)}/resume`,{method:"POST"})}function Y7(){return $("/global-concurrency")}function X7(e){return $("/global-concurrency",{method:"PUT",body:JSON.stringify(e)})}function S_(e,n){return $(`/projects/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify(n)})}function fy(e,n,s){const a=new URLSearchParams;n&&a.set("worktree",n),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/tasks/${encodeURIComponent(e)}/diff${r}`)}function C_(e,n){return $(K(`/tasks/${encodeURIComponent(e)}/commit-associations`,n))}function E_(e){return $(K("/missions",e))}function __(e,n){return $(K("/missions",n),{method:"POST",body:JSON.stringify(e)})}function py(e,n){return $(K(`/missions/${encodeURIComponent(e)}`,n))}function M_(e,n,s){return $(K(`/missions/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function R_(e,n){return $(K(`/missions/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function A_(e,n,s){const a=new URLSearchParams;a.set("limit",String(n.limit)),n?.offset!==void 0&&a.set("offset",String(n.offset));const r=a.size>0?`?${a.toString()}`:"";return $(K(`/missions/${encodeURIComponent(e)}/events${r}`,s))}function T_(e){return $(K("/missions/health",e))}function I_(e,n,s){return $(K(`/missions/${encodeURIComponent(e)}/milestones`,s),{method:"POST",body:JSON.stringify(n)})}function P_(e,n,s){return $(K(`/missions/milestones/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function $_(e,n){return $(K(`/missions/milestones/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function D_(e,n,s){return $(K(`/missions/milestones/${encodeURIComponent(e)}/slices`,s),{method:"POST",body:JSON.stringify(n)})}function L_(e,n,s){return $(K(`/missions/slices/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function O_(e,n){return $(K(`/missions/slices/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function F_(e,n){return $(K(`/missions/slices/${encodeURIComponent(e)}/activate`,n),{method:"POST"})}function z_(e,n,s){return $(K(`/missions/slices/${encodeURIComponent(e)}/features`,s),{method:"POST",body:JSON.stringify(n)})}function B_(e,n,s){return $(K(`/missions/features/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function U_(e,n){return $(K(`/missions/features/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function H_(e,n,s){return $(K(`/missions/features/${encodeURIComponent(e)}/link-task`,s),{method:"POST",body:JSON.stringify({taskId:n})})}function q_(e,n){return $(K(`/missions/features/${encodeURIComponent(e)}/unlink-task`,n),{method:"POST"})}function V_(e,n,s,a,r){return $(K(`/missions/features/${encodeURIComponent(e)}/triage`,a),{method:"POST",body:JSON.stringify({taskTitle:n,taskDescription:s,...r})})}function W_(e,n,s){return $(K(`/missions/slices/${encodeURIComponent(e)}/triage-all`,n),{method:"POST",body:JSON.stringify(s??{})})}function eu(e,n){return $(K(`/missions/milestones/${encodeURIComponent(e)}/assertions`,n))}function G_(e,n,s){return $(K(`/missions/milestones/${encodeURIComponent(e)}/assertions`,s),{method:"POST",body:JSON.stringify(n)})}function K_(e,n,s){return $(K(`/missions/assertions/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function J_(e,n,s){return $(K(`/missions/features/${encodeURIComponent(e)}/assertions/${encodeURIComponent(n)}/link`,s),{method:"POST"})}function Y_(e,n,s){return $(K(`/missions/features/${encodeURIComponent(e)}/assertions/${encodeURIComponent(n)}/unlink`,s),{method:"POST"})}function X_(e,n){return $(K(`/missions/assertions/${encodeURIComponent(e)}/features`,n))}function tu(e,n){return $(K(`/missions/milestones/${encodeURIComponent(e)}/validation`,n))}function wp(e,n){return $(K(`/missions/milestones/${encodeURIComponent(e)}/validation-telemetry`,n))}function Q_(e,n){return $(K(`/missions/features/${encodeURIComponent(e)}/validate`,n),{method:"POST"})}function kp(e,n){return $(K(`/missions/features/${encodeURIComponent(e)}/validation-loop`,n))}function Z_(e,n,s){const a=new URLSearchParams;a.set("limit",String(n.limit)),n?.offset!==void 0&&a.set("offset",String(n.offset));const r=a.size>0?`?${a.toString()}`:"";return $(K(`/missions/features/${encodeURIComponent(e)}/validation-runs${r}`,s)).then(o=>o.runs)}function eM(e,n){return $(K(`/missions/validation-runs/${encodeURIComponent(e)}`,n))}function tM(e,n){return $(K(`/missions/${encodeURIComponent(e)}/resume`,n),{method:"POST"})}function nM(e,n){return $(K(`/missions/${encodeURIComponent(e)}/stop`,n),{method:"POST"})}function sM(e,n){return $(K(`/missions/${encodeURIComponent(e)}/start`,n),{method:"POST"})}function iM(e,n,s){return $(K(`/missions/${encodeURIComponent(e)}/autopilot`,s),{method:"PATCH",body:JSON.stringify(n)})}function aM(e,n,s){return $(K("/missions/interview/start",n),{method:"POST",body:JSON.stringify({missionTitle:e,modelProvider:s?.modelProvider,modelId:s?.modelId})})}function rM(e,n,s,a){return $(K("/missions/interview/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n,tabId:a})})}function oM(e,n,s){return $(K(`/missions/interview/${encodeURIComponent(e)}/retry`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function gy(e,n,s){return $(K("/missions/interview/cancel",n),{method:"POST",body:JSON.stringify({sessionId:e,tabId:s})})}async function lM(e){const n=e?`?${new URLSearchParams({projectId:e}).toString()}`:"";return(await $(`/missions/interview/drafts${n}`)).drafts??[]}function cM(e,n,s){return $(K(`/missions/interview/drafts/${encodeURIComponent(e)}/discard`,n),{method:"POST",body:JSON.stringify({tabId:s})})}function dM(e,n,s,a){return $(K("/missions/interview/create-mission",s),{method:"POST",body:JSON.stringify({sessionId:e,summary:n})})}function uM(e,n,s,a){const r=Xs(K(`/missions/interview/${encodeURIComponent(e)}/stream`,n));let o=null,l=null;const c=()=>{o?.stop(),o=null},d=Lo(r,{onOpen:()=>{c(),o=Fl(e,n)},onMessage:u=>{u.data.startsWith(":")},events:{thinking:u=>{try{s.onThinking?.(JSON.parse(u.data))}catch{s.onThinking?.(u.data)}},question:u=>{try{s.onQuestion?.(JSON.parse(u.data))}catch(h){console.error("[mission-interview] Failed to parse question event:",h)}},summary:u=>{try{s.onSummary?.(JSON.parse(u.data))}catch(h){console.error("[mission-interview] Failed to parse summary event:",h)}},error:u=>{try{const h=JSON.parse(u.data);s.onError?.(h.message||h)}catch{s.onError?.(u.data||"Stream error")}l?.close()},complete:()=>{s.onComplete?.(),l?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:u=>{c(),s.onError?.(u)}});return l={close:()=>{c(),d.close()},isConnected:d.isConnected},l}function Hl(e,n,s){return K(`/missions/milestones/${encodeURIComponent(e)}/interview${n}`,s)}function ql(e,n,s){return K(`/missions/slices/${encodeURIComponent(e)}/interview${n}`,s)}function mM(e,n){return $(Hl(e,"/start",n),{method:"POST"})}function hM(e,n,s,a){return $(Hl(e,"/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n,tabId:a})})}function fM(e,n,s,a){const r=Xs(Hl(e,`/${encodeURIComponent(e)}/stream`,n));let o=null,l=null;const c=()=>{o?.stop(),o=null},d=Lo(r,{onOpen:()=>{c(),o=Fl(e,n)},onMessage:u=>{u.data.startsWith(":")},events:{thinking:u=>{try{s.onThinking?.(JSON.parse(u.data))}catch{s.onThinking?.(u.data)}},question:u=>{try{s.onQuestion?.(JSON.parse(u.data))}catch(h){console.error("[milestone-interview] Failed to parse question event:",h)}},summary:u=>{try{s.onSummary?.(JSON.parse(u.data))}catch(h){console.error("[milestone-interview] Failed to parse summary event:",h)}},error:u=>{try{const h=JSON.parse(u.data);s.onError?.(h.message||h)}catch{s.onError?.(u.data||"Stream error")}l?.close()},complete:()=>{s.onComplete?.(),l?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:u=>{c(),s.onError?.(u)}});return l={close:()=>{c(),d.close()},isConnected:d.isConnected},l}function pM(e,n,s){return $(Hl(e,"/apply",s),{method:"POST",body:JSON.stringify({sessionId:e,summary:n})})}function gM(e,n){return $(Hl(e,"/skip",n),{method:"POST"})}function bM(e,n){return $(ql(e,"/start",n),{method:"POST"})}function xM(e,n,s,a){return $(ql(e,"/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n,tabId:a})})}function vM(e,n,s,a){const r=Xs(ql(e,`/${encodeURIComponent(e)}/stream`,n));let o=null,l=null;const c=()=>{o?.stop(),o=null},d=Lo(r,{onOpen:()=>{c(),o=Fl(e,n)},onMessage:u=>{u.data.startsWith(":")},events:{thinking:u=>{try{s.onThinking?.(JSON.parse(u.data))}catch{s.onThinking?.(u.data)}},question:u=>{try{s.onQuestion?.(JSON.parse(u.data))}catch(h){console.error("[slice-interview] Failed to parse question event:",h)}},summary:u=>{try{s.onSummary?.(JSON.parse(u.data))}catch(h){console.error("[slice-interview] Failed to parse summary event:",h)}},error:u=>{try{const h=JSON.parse(u.data);s.onError?.(h.message||h)}catch{s.onError?.(u.data||"Stream error")}l?.close()},complete:()=>{s.onComplete?.(),l?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:u=>{c(),s.onError?.(u)}});return l={close:()=>{c(),d.close()},isConnected:d.isConnected},l}function yM(e,n,s){return $(ql(e,"/apply",s),{method:"POST",body:JSON.stringify({sessionId:e,summary:n})})}function wM(e,n){return $(ql(e,"/skip",n),{method:"POST"})}async function kM(e,n){try{return await $(K(`/missions/features/${encodeURIComponent(e)}/preview-description`,n),{method:"POST"})}catch{throw new Error("Preview endpoint not available")}}function Q7(e){return $(K("/todos",e))}function Z7(e,n){const s={title:e};return $(K("/todos",n),{method:"POST",body:JSON.stringify(s)})}function eH(e,n,s){const a={title:n};return $(K(`/todos/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(a)})}function tH(e,n){return $(K(`/todos/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function nH(e,n,s){const a={text:n};return $(K(`/todos/${encodeURIComponent(e)}/items`,s),{method:"POST",body:JSON.stringify(a)})}function sH(e,n,s){const a=n;return $(K(`/todos/items/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(a)})}function iH(e,n){return $(K(`/todos/items/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function aH(e,n,s){return $(K(`/todos/${encodeURIComponent(e)}/items/reorder`,s),{method:"POST",body:JSON.stringify({itemIds:n})})}function Co(e){if(!e)return[];try{const n=JSON.parse(e);return Array.isArray(n)?n:[]}catch{return[]}}async function Ph(e,n){const s=new URLSearchParams;e&&s.set("projectId",e),n?.includeCompleted&&s.set("includeCompleted","1"),n?.includeArchived&&s.set("includeArchived","1");const a=s.toString(),r=await fetch(Xs(`/ai-sessions${a?`?${a}`:""}`),{headers:Gi()});return r.ok?(await r.json()).sessions??[]:[]}async function jM(e){return $(`/ai-sessions/${encodeURIComponent(e)}/archive`,{method:"POST"})}async function NM(e){return $(`/ai-sessions/${encodeURIComponent(e)}/unarchive`,{method:"POST"})}async function ma(e){const n=await fetch(Xs(`/ai-sessions/${encodeURIComponent(e)}`),{headers:Gi()});return n.ok?n.json():null}async function SM(e,n){const s=await $(`/ai-sessions/${encodeURIComponent(e)}/lock`,{method:"POST",body:JSON.stringify({tabId:n})});return{acquired:s.acquired,currentHolder:s.currentHolder??null}}function CM(e,n){return $(`/ai-sessions/${encodeURIComponent(e)}/lock`,{method:"DELETE",body:JSON.stringify({tabId:n})})}function EM(e,n){return $(`/ai-sessions/${encodeURIComponent(e)}/lock/force`,{method:"POST",body:JSON.stringify({tabId:n})})}async function by(e){await fetch(Xs(`/ai-sessions/${encodeURIComponent(e)}`),{method:"DELETE",headers:Gi()})}function _M(e,n){return $(K(`/ai-sessions/${encodeURIComponent(e)}/ping`,n),{method:"POST"})}function MM(e,n,s){return $(K(`/ai-sessions/${encodeURIComponent(e)}/draft`,s),{method:"PATCH",body:JSON.stringify(n)})}function RM(e,n){return $(K(`/planning/${encodeURIComponent(e)}/summarize-draft-title`,n),{method:"POST"})}function AM(e,n){const s=new URLSearchParams;s.set("limit",String(e.limit)),e?.offset!==void 0&&s.set("offset",String(e.offset)),e?.unreadOnly&&s.set("unreadOnly","true"),e?.type&&s.set("type",e.type),n&&s.set("projectId",n);const a=s.size>0?`?${s.toString()}`:"";return $(`/messages/inbox${a}`)}function TM(e,n){const s=new URLSearchParams;s.set("limit",String(e.limit)),e?.offset!==void 0&&s.set("offset",String(e.offset)),e?.type&&s.set("type",e.type),n&&s.set("projectId",n);const a=s.size>0?`?${s.toString()}`:"";return $(`/messages/outbox${a}`)}function xy(e){return $(K("/messages/unread-count",e))}function IM(e,n){return $(K("/messages",n),{method:"POST",body:JSON.stringify(e)})}function PM(e,n){return $(K(`/messages/${encodeURIComponent(e)}/read`,n),{method:"POST"})}function $M(e){return $(K("/messages/read-all",e),{method:"POST"})}function DM(e,n){return $(K(`/messages/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function LM(e,n,s){const a=`/messages/conversation/${encodeURIComponent(n)}/${encodeURIComponent(e)}`;return $(K(a,s))}function OM(e,n){return $(K(`/agents/${encodeURIComponent(e)}/mailbox`,n))}function FM(e){return $(K("/agents/mailbox/all",e))}function ac(e,n){const s=new URLSearchParams;e?.status&&s.set("status",e.status),e?.limit!==void 0&&s.set("limit",String(e.limit)),e?.offset!==void 0&&s.set("offset",String(e.offset)),n&&s.set("projectId",n);const a=s.size>0?`?${s.toString()}`:"";return $(`/approvals${a}`)}function jp(e,n){return $(K(`/approvals/${encodeURIComponent(e)}`,n))}function zM(e,n,s){return $(K(`/approvals/${encodeURIComponent(e)}/decision`,s),{method:"POST",body:JSON.stringify(n)})}function rH(e,n,s){const a=new URLSearchParams;a.set("limit",String(n)),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/reflections${r}`)}function oH(e,n){return $(K(`/agents/${encodeURIComponent(e)}/reflections`,n),{method:"POST"})}function lH(e,n,s){const a=new URLSearchParams;s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/performance${r}`)}function cH(e,n,s){const a=new URLSearchParams;a.set("limit",String(n.limit)),n?.category&&a.set("category",n.category),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/ratings${r}`)}function dH(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/ratings`,s),{method:"POST",body:JSON.stringify(n)})}function uH(e,n){return $(K(`/agents/${encodeURIComponent(e)}/ratings/summary`,n))}function mH(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/ratings/${encodeURIComponent(n)}`,s),{method:"DELETE"})}function hH(e,n){return $(K(`/agents/${encodeURIComponent(e)}/budget`,n))}function fH(e,n){return $(K(`/agents/${encodeURIComponent(e)}/budget/reset`,n),{method:"POST"})}async function pH(e){return $(K("/plugins",e))}async function gH(e,n){return $(K("/plugins",n),{method:"POST",body:JSON.stringify({mode:"install",...e})})}async function bH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/enable`,n),{method:"POST"})}async function xH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/disable`,n),{method:"POST"})}async function vH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}`,n),{method:"DELETE"})}async function yH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/settings`,n))}async function wH(e,n,s){return $(K(`/plugins/${encodeURIComponent(e)}/settings`,s),{method:"PUT",body:JSON.stringify({settings:n})})}async function kH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/setup-status`,n))}async function jH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/setup/install`,n),{method:"POST"})}async function NH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/reload`,n),{method:"POST"})}async function SH(e,n,s){return $(K(`/plugins/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}async function CH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/rescan`,n),{method:"POST"})}async function BM(e){const n=K("/plugins/ui-slots",e);return Zi(n,()=>$(n))}async function UM(e){return $(K("/plugins/dashboard-views",e))}async function EH(e){return $(K("/plugins/runtimes",e))}async function HM(e){return(await $(K("/skills/discovered",e))).skills}async function _H(e,n,s){return $(K("/skills/execution",s),{method:"PATCH",body:JSON.stringify({skillId:e,enabled:n})})}async function MH(e,n,s){const a=new URLSearchParams;e&&a.set("q",e),a.set("limit",String(n));const r=a.size>0?`?${a.toString()}`:"";return $(K(`/skills/catalog${r}`,s))}async function RH(e,n){return(await $(K(`/skills/${encodeURIComponent(e)}/content`,n))).content}function Np(e,n){const s=new URLSearchParams;e&&s.set("projectId",e);const a=s.toString();return $(`/chat/sessions${a?`?${a}`:""}`)}async function qM(e,n){const s=e.agentId.trim();if(!s)throw new Error("agentId is required");const a=e.modelProvider?.trim(),r=e.modelId?.trim();if(a&&!r||!a&&r)throw new Error("Both modelProvider and modelId must be provided together, or neither should be provided");const o=new URLSearchParams;return o.set("lookup","resume"),o.set("agentId",s),n&&o.set("projectId",n),a&&r&&(o.set("modelProvider",a),o.set("modelId",r)),{session:(await $(`/chat/sessions?${o.toString()}`)).sessions[0]??null}}function VM(e,n){return $(K("/chat/sessions",n),{method:"POST",body:JSON.stringify(e)})}function rc(e,n){return $(K(`/chat/sessions/${encodeURIComponent(e)}`,n))}function AH(e,n,s){return $(K(`/chat/sessions/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function TH(e,n){return $(K(`/chat/sessions/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function Wo(e,n,s){const a=new URLSearchParams;n?.limit!==void 0&&a.set("limit",String(n.limit)),n?.offset!==void 0&&a.set("offset",String(n.offset)),n?.before&&a.set("before",n.before),n?.order&&a.set("order",n.order);const r=a.toString();return $(K(`/chat/sessions/${encodeURIComponent(e)}/messages${r?`?${r}`:""}`,s))}function WM(e={},n){const s=new URLSearchParams;n&&s.set("projectId",n),e.status&&s.set("status",e.status),e.agentId&&s.set("agentId",e.agentId);const a=s.toString();return $(`/chat/rooms${a?`?${a}`:""}`)}function GM(e,n){const s={...e,...n?{projectId:n}:{}};return $(K("/chat/rooms",n),{method:"POST",body:JSON.stringify(s)})}function KM(e,n){return $(K(`/chat/rooms/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function JM(e,n){return $(K(`/chat/rooms/${encodeURIComponent(e)}/members`,n))}function nu(e,n,s){const a=new URLSearchParams;n?.limit!==void 0&&a.set("limit",String(n.limit)),n?.offset!==void 0&&a.set("offset",String(n.offset)),n?.before&&a.set("before",n.before),n?.order&&a.set("order",n.order);const r=a.toString();return $(K(`/chat/rooms/${encodeURIComponent(e)}/messages${r?`?${r}`:""}`,s))}async function YM(e,n,s){const a=new FormData;a.append("file",n);const r=await fetch(Xs(K(`/chat/rooms/${encodeURIComponent(e)}/attachments`,s)),{method:"POST",headers:Gi(),body:a}),o=await r.json();if(!r.ok)throw new Error(o.error||"Upload failed");return o}function XM(e,n){return Xs(K(`/chat/rooms/${encodeURIComponent(e)}/attachments/`,n))}function QM(e,n,s){return $(K(`/chat/rooms/${encodeURIComponent(e)}/messages`,s),{method:"POST",body:JSON.stringify(n)})}function ZM(e,n){return $(K(`/chat/rooms/${encodeURIComponent(e)}/messages`,n),{method:"DELETE"})}function eR(e,n){return $(K(`/chat/sessions/${encodeURIComponent(e)}/cancel`,n),{method:"POST"})}function tR(e){if(!e||typeof e!="object")return null;const n=e,s=typeof n.summary=="string"?n.summary.trim():"";if(!s)return null;const a=(()=>{const r=n.reference;if(!r||typeof r!="object")return;const o=r,l=typeof o.kind=="string"?o.kind.trim():"",c=typeof o.id=="string"?o.id.trim():"";if(!(!l||!c))return{kind:l,id:c,...typeof o.label=="string"&&o.label.trim()?{label:o.label.trim()}:{}}})();return{summary:s,...typeof n.errorClass=="string"&&n.errorClass.trim()?{errorClass:n.errorClass.trim()}:{},...typeof n.code=="string"&&n.code.trim()?{code:n.code.trim()}:{},...typeof n.detail=="string"&&n.detail.trim()?{detail:n.detail.trim()}:{},...a?{reference:a}:{}}}function vy(e){try{const n=JSON.parse(e),s=tR(n);return s||(n&&typeof n=="object"&&typeof n.message=="string"?n.message:typeof n=="string"?n:e||"Stream error")}catch{return e||"Stream error"}}function nR(e,n,s,a,r,o){const l=Xs(K(`/chat/sessions/${encodeURIComponent(e)}/messages`,r)),c=new AbortController;let d=!1,u=!1,h=!1;const m=Math.max(1e3,6e4);let f=null;const p=()=>{f&&(clearTimeout(f),f=null)},b=()=>{h||(h=!0,p())},v=(x,y)=>{if(x)switch(b(),x){case"thinking":try{s.onThinking?.(JSON.parse(y))}catch{s.onThinking?.(y)}break;case"text":try{s.onText?.(JSON.parse(y))}catch{s.onText?.(y)}break;case"tool_start":try{s.onToolStart?.(JSON.parse(y))}catch{}break;case"tool_end":try{s.onToolEnd?.(JSON.parse(y))}catch{}break;case"fallback":try{s.onFallback?.(JSON.parse(y))}catch{}break;case"done":u=!0;try{const g=JSON.parse(y);s.onDone?.({messageId:typeof g.messageId=="string"?g.messageId:"",...g.message&&typeof g.message=="object"?{message:g.message}:{}})}catch{s.onDone?.({messageId:""})}break;case"error":u=!0,s.onError?.(vy(y));break}};return(async()=>{try{const x=Array.isArray(a)&&a.length>0,y=x?(()=>{const E=new FormData;return E.append("content",n),a.forEach(M=>E.append("attachments",M)),E})():JSON.stringify({content:n}),g=await fetch(l,{method:"POST",headers:x?Gi():Gi({"Content-Type":"application/json"}),body:y,signal:c.signal});if(!g.ok){const E=await g.text();let M=`Request failed: ${g.status}`;try{M=JSON.parse(E).error||M}catch{}s.onError?.(M);return}if(!g.body){s.onError?.("No response body");return}s.onConnectionStateChange?.("connected"),f=setTimeout(()=>{u||d||h||(u=!0,s.onError?.("Timed out waiting for first response event"),c.abort())},m);const j=g.body.getReader(),N=new TextDecoder;let C="",w="",S=[];const R=(E,M=!1)=>{C+=E;const G=C.split(`
667
+ */const B0=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],Bs=ct("zap",B0),Uf=200,ho=[];function si(e,n,s){ho.push({ts:new Date().toISOString(),source:e,event:n,detail:s}),ho.length>Uf&&ho.splice(0,ho.length-Uf)}function U0(){return[...ho]}function H0(){ho.length=0}typeof window<"u"&&(window.__fusionDebug??={},window.__fusionDebug.dashboardTraces={get:U0,clear:H0});const Mm="fusion:version-reload",Rm="fusion:version-update";let _h=!0;function Yd(e){_h=e}function q0(){try{if(sessionStorage.getItem(Rm))return sessionStorage.removeItem(Rm),!0}catch{}return!1}function Mh(e){const n=!!sessionStorage.getItem(Mm);if(si("versionCheck","reload-attempt",{reason:e,alreadySet:n}),n){console.warn("[versionCheck] reload already attempted, suppressing",e);return}if(sessionStorage.setItem(Mm,"1"),!_h){console.info("[versionCheck] auto-reload disabled by setting, skipping reload:",e);return}console.info("[versionCheck] reloading:",e),window.location.reload()}function V0(e){const n=e instanceof Error?e.message:typeof e=="string"?e:"";return/Failed to fetch dynamically imported module|error loading dynamically imported module|Importing a module script failed|is not a valid JavaScript MIME type|ChunkLoadError|Unable to preload (?:CSS|module) for/i.test(n)}function W0(e){return V0(e)?(Mh(`chunk load error: ${e?.message??e}`),!0):!1}async function G0(){try{const e=await fetch("/version.json",{cache:"no-store",headers:{Accept:"application/json"}});if(!e.ok||!(e.headers.get("content-type")??"").includes("application/json"))return null;const s=await e.json();return typeof s.version=="string"?s.version:null}catch{return null}}async function K0(){try{const e=new AbortController,n=setTimeout(()=>e.abort(),3e3),s=await fetch("/api/settings",{headers:{Accept:"application/json"},signal:e.signal});clearTimeout(n),s.ok&&(await s.json()).autoReloadOnVersionChange===!1&&(_h=!1)}catch{}}const J0=6e4;let Hf=0,Xd=!1,ec=null,qf=0;async function Qd(e="initial"){if(!(Xd||document.visibilityState!=="visible")&&!(Date.now()-Hf<J0)){Hf=Date.now(),Xd=!0;try{const n=await G0();if(n===null){si("versionCheck","remote-unavailable",{trigger:e,visibilityState:document.visibilityState}),ec=null;return}if(n==="bad8f52c5-64dd4fa6"){ec=null;return}if(si("versionCheck","mismatch",{local:"bad8f52c5-64dd4fa6",remote:n,trigger:e,visibilityState:document.visibilityState}),console.info("[versionCheck] mismatch",{local:"bad8f52c5-64dd4fa6",remote:n,trigger:e}),ec!==n){ec=n,qf=Date.now(),si("versionCheck","mismatch-pending",{local:"bad8f52c5-64dd4fa6",remote:n,trigger:e,visibilityState:document.visibilityState});return}si("versionCheck","mismatch-confirmed",{remote:n,trigger:e,elapsedMs:Date.now()-qf});try{sessionStorage.setItem(Rm,"1")}catch{}Mh(`build version changed: bad8f52c5-64dd4fa6 -> ${n}`)}finally{Xd=!1}}}function Y0(){K0(),window.setTimeout(()=>sessionStorage.removeItem(Mm),5e3),document.addEventListener("visibilitychange",()=>{Qd("visibilitychange")}),window.addEventListener("focus",()=>{Qd("focus")}),window.setTimeout(()=>void Qd("initial"),2e3)}class Ol extends i.Component{constructor(n){super(n),this.state={hasError:!1,error:null}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,s){console.error("[ErrorBoundary]",n,s),!W0(n)&&this.props.onError?.(n,s)}resetErrorBoundary=()=>{this.setState({hasError:!1,error:null})};render(){if(!this.state.hasError)return this.props.children;if(this.props.fallback)return this.props.fallback;const n=this.props.level??"page",a=n==="modal"?"This section encountered an error":"Something went wrong";return t.jsxs("div",{className:`error-boundary error-boundary--${n}`,children:[t.jsx("div",{className:"error-boundary__icon",children:t.jsx(Ma,{size:40})}),t.jsx("div",{className:"error-boundary__title",children:a}),this.state.error&&t.jsx("pre",{className:"error-boundary__message",children:this.state.error.message}),t.jsxs("div",{className:"error-boundary__actions",children:[t.jsx("button",{className:"btn btn-primary",onClick:this.resetErrorBoundary,children:"Retry"}),t.jsx("button",{className:"btn",onClick:()=>window.location.reload(),children:"Reload page"})]})]})}}function Gs({children:e,onError:n}){return t.jsx(Ol,{level:"page",onError:n,children:e})}function hr({children:e,onError:n}){return t.jsx(Ol,{level:"modal",onError:n,children:e})}function X0({children:e,onError:n}){return t.jsx(Ol,{level:"root",onError:n,children:e})}function Zd(){return typeof window>"u"?null:window.fusionShell??null}function Q0(e){return e?.host==="desktop-shell"}function Z0(e){const n=e.desktopModeState;return n?n.isFirstRun||n.desktopMode===null:!e.desktopMode}async function Vf(e,n=3e4){const s=Date.now()+n;for(;Date.now()<s;){const r=(await e.getState()).localRuntime;if(r?.state==="running"&&(r.baseUrl||r.port))return{baseUrl:r.baseUrl??`http://127.0.0.1:${r.port}`};if(r?.state==="error")throw new Error(r.error??"Local runtime failed to start");await new Promise(o=>setTimeout(o,250))}throw new Error("Local runtime did not become ready in time")}function Wf(e){const n=new URL(window.location.href);n.searchParams.set("serverBaseUrl",e),n.searchParams.set("shellKind","desktop-shell"),n.searchParams.set("shellMode","local"),window.location.replace(n.toString())}function eC({children:e}){const[n,s]=i.useState({kind:"loading"});if(i.useEffect(()=>{const a=Zd();if(!a){s({kind:"bypass"});return}let r=!1;return(async()=>{try{const o=await a.getState();if(r)return;if(!Q0(o)){s({kind:"bypass"});return}if(Z0(o)){s({kind:"chooser",state:o});return}if(o.desktopMode==="local"){const l=new URLSearchParams(window.location.search);if(l.has("serverBaseUrl")){s({kind:"ready",serverBaseUrl:l.get("serverBaseUrl")??void 0});return}s({kind:"starting-local",message:"Starting local Fusion runtime…"});const{baseUrl:c}=await Vf(a);if(r)return;Wf(c);return}s({kind:"ready"})}catch(o){if(r)return;s({kind:"local-error",message:o instanceof Error?o.message:String(o)})}})(),()=>{r=!0}},[]),i.useEffect(()=>{const a=Zd();if(!(!a?.onResetDesktopModeRequest||!a.resetDesktopMode))return a.onResetDesktopModeRequest(()=>{(async()=>{try{await a.resetDesktopMode?.()}catch{}const r=new URL(window.location.href);r.searchParams.delete("serverBaseUrl"),r.searchParams.delete("shellMode"),window.location.replace(r.toString())})()})},[]),n.kind==="loading"||n.kind==="starting-local"){const a=n.kind==="loading"?"Loading Fusion…":n.message;return t.jsx("div",{className:"desktop-launch-gate",role:"status","aria-live":"polite",children:t.jsx("div",{className:"desktop-launch-gate__panel",children:t.jsx("p",{children:a})})})}return n.kind==="local-error"?t.jsx("div",{className:"desktop-launch-gate",role:"alert",children:t.jsxs("div",{className:"desktop-launch-gate__panel",children:[t.jsx("h2",{children:"Couldn't start local Fusion"}),t.jsx("p",{children:n.message}),t.jsx("button",{type:"button",className:"btn",onClick:()=>{window.location.reload()},children:"Retry"})]})}):n.kind==="chooser"?t.jsx(tC,{onPick:async a=>{const r=Zd();if(r){s({kind:"starting-local",message:a==="local"?"Starting local Fusion runtime…":"Setting up remote connection…"});try{if(await r.setDesktopMode(a),a==="local"){const{baseUrl:o}=await Vf(r);Wf(o);return}await r.openConnectionManager(),window.location.reload()}catch(o){s({kind:"local-error",message:o instanceof Error?o.message:String(o)})}}}}):t.jsx(t.Fragment,{children:e})}function tC({onPick:e}){const[n,s]=i.useState(null);return t.jsx("div",{className:"desktop-launch-gate",role:"dialog","aria-labelledby":"desktop-launch-gate-title",children:t.jsxs("div",{className:"desktop-launch-gate__panel",children:[t.jsx("h1",{id:"desktop-launch-gate-title",children:"How do you want to run Fusion?"}),t.jsx("p",{children:"Run Fusion locally in this app, or connect to a Fusion server you're already running somewhere else."}),t.jsxs("div",{className:"desktop-launch-gate__actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",disabled:n!==null,onClick:()=>{s("local"),e("local")},children:n==="local"?"Starting…":"Run Fusion Locally"}),t.jsx("button",{type:"button",className:"btn",disabled:n!==null,onClick:()=>{s("remote"),e("remote")},children:n==="remote"?"Opening…":"Connect to Remote Fusion"})]})]})})}const nC="modulepreload",sC=function(e){return"/"+e},Gf={},qn=function(n,s,a){let r=Promise.resolve();if(s&&s.length>0){let l=function(u){return Promise.all(u.map(h=>Promise.resolve(h).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),d=c?.nonce||c?.getAttribute("nonce");r=l(s.map(u=>{if(u=sC(u),u in Gf)return;Gf[u]=!0;const h=u.endsWith(".css"),m=h?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${m}`))return;const f=document.createElement("link");if(f.rel=h?"stylesheet":nC,h||(f.as="script"),f.crossOrigin="",f.href=u,d&&f.setAttribute("nonce",d),document.head.appendChild(f),h)return new Promise((p,b)=>{f.addEventListener("load",p),f.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${u}`)))})}))}function o(l){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=l,window.dispatchEvent(c),!c.defaultPrevented)throw l}return r.then(l=>{for(const c of l||[])c.status==="rejected"&&o(c.reason);return n().catch(o)})},iC=20;function aC(e){const n=e.todoCount>e.threshold&&e.idleNonEphemeralAgentCount===0;return{atRisk:n,todoCount:e.todoCount,inProgressCount:e.inProgressCount,inReviewCount:e.inReviewCount,idleNonEphemeralAgentCount:e.idleNonEphemeralAgentCount,threshold:e.threshold,reason:n?"todo-exceeds-threshold-and-no-idle-agents":"ok"}}const rC={themeMode:"dark",colorTheme:"default",dashboardFontScalePct:100,defaultProvider:void 0,defaultModelId:void 0,testMode:void 0,fallbackProvider:void 0,fallbackModelId:void 0,defaultThinkingLevel:void 0,ntfyEnabled:!1,ntfyTopic:void 0,ntfyBaseUrl:void 0,ntfyAccessToken:void 0,ntfyEvents:["in-review","merged","failed","awaiting-approval","awaiting-user-review","planning-awaiting-input","message:agent-to-user","message:agent-to-agent","message:room","gridlock","board-stall-unrecovered","fallback-used","memory-dreams-processed","token-budget"],ntfyDashboardHost:void 0,taskTokenBudget:void 0,failureNotificationDelayMs:3e4,failureNotificationMode:"sticky-only",webhookEnabled:!1,webhookUrl:void 0,webhookFormat:"generic",webhookEvents:[],notificationProviders:[],customProviders:[],defaultProjectId:void 0,setupComplete:void 0,favoriteProviders:void 0,favoriteModels:void 0,openrouterModelSync:!0,openrouterAppAttribution:void 0,openrouterModelFilters:void 0,openrouterProviderPreferences:void 0,opencodeGoModelSync:!0,updateCheckEnabled:!0,fnBinaryCheckEnabled:!0,updateCheckFrequency:"daily",autoReloadOnVersionChange:!0,showGitHubStarButton:!0,githubTrackingDefaultRepo:void 0,modelOnboardingComplete:void 0,useClaudeCli:void 0,useDroidCli:void 0,useLlamaCpp:void 0,executionGlobalProvider:void 0,executionGlobalModelId:void 0,planningGlobalProvider:void 0,planningGlobalModelId:void 0,validatorGlobalProvider:void 0,validatorGlobalModelId:void 0,titleSummarizerGlobalProvider:void 0,titleSummarizerGlobalModelId:void 0,daemonToken:void 0,daemonPort:4040,daemonHost:"127.0.0.1",settingsSyncEnabled:!1,settingsSyncAuth:!1,settingsSyncInterval:9e5,settingsSyncConflictResolution:"last-write-wins",dashboardCurrentNodeId:void 0,dashboardCurrentProjectIdByNode:void 0,vitestAutoKillEnabled:!0,vitestKillThresholdPct:90,persistAgentToolOutput:!0,persistAgentThinkingLogPermanent:!1,persistAgentThinkingLogEphemeral:!1,persistAgentThinkingLog:!1,agentMemoryInclusionMode:"full",secretsAccessPolicy:void 0,secretsSyncPassphraseConfigured:!1,researchGlobalDefaults:{searchProvider:void 0,synthesisProvider:void 0,synthesisModelId:void 0,enabledSources:{webSearch:!0,pageFetch:!0,github:!1,localDocs:!0,llmSynthesis:!0},maxSourcesPerRun:20,defaultExportFormat:"markdown"},researchGlobalEnabled:!0,researchGlobalMaxConcurrentRuns:3,researchGlobalDefaultTimeout:3e5,researchGlobalMaxSourcesPerRun:20,researchGlobalMaxSynthesisRounds:2,researchGlobalWebSearchProvider:"builtin",researchGlobalSearxngUrl:void 0,researchGlobalBraveApiKey:void 0,researchGlobalGoogleSearchApiKey:void 0,researchGlobalGoogleSearchCx:void 0,researchGlobalTavilyApiKey:void 0,researchGlobalGitHubEnabled:!1,researchGlobalLocalDocsEnabled:!0,researchGlobalMaxSearchResults:10,researchGlobalFetchTimeoutMs:3e4,researchGlobalUserAgent:"FusionResearchBot/1.0",remoteAccess:{activeProvider:null,providers:{tailscale:{enabled:!1,hostname:"",targetPort:0,acceptRoutes:!1},cloudflare:{enabled:!1,quickTunnel:!0,tunnelName:"",tunnelToken:null,ingressUrl:""}},tokenStrategy:{persistent:{enabled:!0,token:null},shortLived:{enabled:!1,ttlMs:9e5,maxTtlMs:864e5}},lifecycle:{rememberLastRunning:!1,wasRunningOnShutdown:!1,lastRunningProvider:null}},worktrunk:{enabled:!1,binaryPath:void 0,installedBinaryPath:void 0,onFailure:"fail"},owningNodeHandoffPolicy:"reassign-to-local",experimentalFeatures:{}},oC={globalPause:!1,globalPauseReason:void 0,enginePaused:!1,maxConcurrent:2,maxTriageConcurrent:2,globalMaxConcurrent:4,maxWorktrees:4,pollIntervalMs:15e3,heartbeatMultiplier:1,autoClaimCandidatesInPrompt:5,tombstoneStickyWindowDays:7,heartbeatScopeDiscipline:"strict",heartbeatPromptTemplate:"default",groupOverlappingFiles:!0,overlapIgnorePaths:[],autoMerge:!0,testMode:void 0,mergeStrategy:"direct",directMergeCommitStrategy:"always-squash",mergeIntegrationWorktree:"reuse-task-worktree",mergeAdvanceAutoSync:"stash-and-ff",integrationBranch:void 0,requirePrApproval:!1,pushAfterMerge:!1,pushRemote:"origin",unavailableNodePolicy:"block",owningNodeHandoffPolicy:"reassign-to-local",defaultNodeId:void 0,secretsEnv:void 0,worktreeInitCommand:void 0,testCommand:void 0,buildCommand:void 0,recycleWorktrees:!1,executorAllowSiblingBranchRename:!1,worktreeNaming:"random",worktrunk:{enabled:!1,binaryPath:void 0,installedBinaryPath:void 0,onFailure:"fail"},worktreesDir:void 0,taskPrefix:"FN",taskAttributionTrailerNames:["Fusion-Task-Id"],commitMsgHookEnabled:!0,includeTaskIdInCommit:!0,commitAuthorEnabled:!0,commitAuthorName:"Fusion",commitAuthorEmail:"noreply@runfusion.ai",planningProvider:void 0,planningModelId:void 0,planningFallbackProvider:void 0,planningFallbackModelId:void 0,defaultProviderOverride:void 0,defaultModelIdOverride:void 0,executionProvider:void 0,executionModelId:void 0,validatorProvider:void 0,validatorModelId:void 0,validatorFallbackProvider:void 0,validatorFallbackModelId:void 0,modelPresets:[],autoSelectModelPreset:!1,completionDocumentationMode:"off",defaultPresetBySize:{},autoResolveConflicts:!0,smartConflictResolution:!0,mergerAutostashMaxAgeHours:24,worktreeRebaseBeforeMerge:!0,worktreeRebaseRemote:"",worktreeRebaseLocalBase:!0,prerebaseAutoEnabled:!0,prerebaseHotFiles:["AGENTS.md","packages/core/src/store.ts","packages/core/src/db.ts","packages/engine/src/executor.ts","packages/engine/src/scheduler.ts","packages/engine/src/merger.ts","packages/dashboard/app/styles.css"],prerebaseDivergenceThreshold:50,mergeConflictStrategy:"smart-prefer-main",merger:{mode:"ai",maxReviewPasses:3},mergeDiffVolumeMinLines:void 0,mergeDiffVolumeThreshold:void 0,mergeDiffVolumeAllowlist:void 0,mergeStrategyOverlapBehavior:"flip-to-prefer-branch",postMergeAuditMode:"warn",mergeAuditAutoRecovery:"ai-assisted",autoRecovery:{mode:"deterministic-only",maxRetries:3},reliabilityStatsResetAt:void 0,workflowStepTimeoutMs:36e4,workflowStepScopeEnforcement:"block",planOnlyScopeLeakEnforcement:"warn",workflowRevisionForkOnScopeMismatch:!0,strictScopeEnforcement:!1,buildRetryCount:0,verificationFixRetries:3,buildTimeoutMs:3e5,requirePlanApproval:!1,ephemeralAgentsEnabled:!0,agentProvisioning:{},sandboxProvisioning:{},defaultAgentPermissionPolicy:void 0,specStalenessEnabled:!1,specStalenessMaxAgeMs:360*60*1e3,taskStuckTimeoutMs:6e5,runtimeStopDrainMs:2e3,engineActiveSinceMs:void 0,engineActivationGraceMs:5*6e4,inReviewStallDeadlockThreshold:3,stalePausedReviewThresholdMs:1440*6e4,inReviewStalledThresholdMs:1440*6e4,stalePausedTodoThresholdMs:1440*6e4,pausedScopeDecayMs:30*6e4,metaTaskStallAutoCloseMs:120*6e4,metaTaskActiveExecutionGraceMs:30*6e4,boardStallSweepWindowMs:120*6e4,boardStallBlockedGrowthThreshold:3,capacityRiskBannerEnabled:!1,capacityRiskTodoThreshold:20,backlogPressureAlertEnabled:!0,backlogPressureRatioThreshold:10,backlogPressureMinTodoCount:5,backlogPressureAlertCooldownMs:1440*6e4,dependencyBlockedTodoReportEnabled:!0,dependencyBlockedTodoFreshAgeMs:30*6e4,dependencyBlockedTodoStaleAgeMs:240*6e4,dependencyBlockedTodoMinCount:1,dependencyBlockedTodoReportCooldownMs:360*6e4,staleHighFanoutBlockerAgeThresholdMs:7200*1e3,staleInProgressWarningMs:240*6e4,staleInProgressCriticalMs:1440*6e4,staleInReviewWarningMs:1440*6e4,staleInReviewCriticalMs:4320*6e4,aiSessionTtlMs:10080*60*1e3,aiSessionCleanupIntervalMs:3600*1e3,autoUnpauseEnabled:!0,autoUnpauseBaseDelayMs:3e5,autoUnpauseMaxDelayMs:36e5,maxStuckKills:6,maxBranchConflictRecoveries:5,maxReviewerContextRetries:2,maxReviewerFallbackRetries:2,maxTotalRetriesBeforeFail:25,preserveProgressOnStuckRequeue:!0,maxPostReviewFixes:1,maxSpawnedAgentsPerParent:5,maxSpawnedAgentsGlobal:20,maintenanceIntervalMs:3e5,autoArchiveDoneTasksEnabled:!0,autoArchiveDoneAfterMs:2880*60*1e3,doneAutoArchiveDays:0,archiveAgentLogMode:"compact",autoUpdatePrStatus:!1,githubCommentOnDone:!1,githubCommentTemplate:void 0,githubCloseSourceIssueOnDone:!1,githubTrackingEnabledByDefault:!1,githubTrackingDefaultRepo:void 0,githubTrackingDedupEnabled:!0,githubAuthMode:"gh-cli",githubAuthToken:void 0,autoBackupEnabled:!1,autoBackupSchedule:"0 2 * * *",autoBackupRetention:7,autoBackupDir:".fusion/backups",memoryBackupEnabled:!1,memoryBackupSchedule:"0 3 * * *",memoryBackupRetention:14,memoryBackupDir:".fusion/backups/memory",memoryBackupScope:"all",autoSummarizeTitles:!1,useAiMergeCommitSummary:!0,titleSummarizerProvider:void 0,titleSummarizerModelId:void 0,titleSummarizerFallbackProvider:void 0,titleSummarizerFallbackModelId:void 0,scripts:void 0,setupScript:void 0,insightExtractionEnabled:!1,insightExtractionSchedule:"0 2 * * *",insightExtractionMinIntervalMs:864e5,taskEvaluationEnabled:!1,taskEvaluationSchedule:"0 5 * * *",taskEvaluationProvider:void 0,taskEvaluationModelId:void 0,taskEvaluationFollowUpPolicy:"off",taskEvaluationRetention:void 0,memoryEnabled:!0,memoryBackendType:"qmd",memoryAutoSummarizeEnabled:!1,memoryAutoSummarizeThresholdChars:5e4,memoryAutoSummarizeSchedule:"0 3 * * *",memoryDreamsEnabled:!1,memoryDreamsSchedule:"0 4 * * *",tokenCap:void 0,taskTokenBudget:void 0,runStepsInNewSessions:!1,maxParallelSteps:2,missionStaleThresholdMs:6e5,missionMaxTaskRetries:3,missionHealthCheckIntervalMs:3e5,agentPrompts:void 0,promptOverrides:void 0,reflectionEnabled:!1,reflectionIntervalMs:36e5,reflectionAfterTask:!0,reviewHandoffPolicy:"disabled",showQuickChatFAB:!1,chatAutoCleanupDays:0,mailAutoCleanupDays:0,chatRoomRecentVerbatimMessages:25,chatRoomCompactionFetchLimit:200,chatRoomSummaryMaxChars:3e3,researchSettings:{enabled:!0,searchProvider:void 0,synthesisProvider:void 0,synthesisModelId:void 0,enabledSources:{webSearch:!0,pageFetch:!0,github:!1,localDocs:!0,llmSynthesis:!0},limits:{maxConcurrentRuns:3,maxSourcesPerRun:20,maxDurationMs:3e5,requestTimeoutMs:3e4}},sandbox:{backend:"native",policy:{allowNetwork:!0,allowedPaths:[]},failureMode:"fail-hard"},evalSettings:{enabled:!1,intervalMs:864e5,evaluatorProvider:void 0,evaluatorModelId:void 0,followUpPolicy:"suggest-only",retentionDays:30},researchEnabled:!0,researchMaxConcurrentRuns:3,researchDefaultTimeout:3e5,researchMaxSourcesPerRun:20,researchMaxSynthesisRounds:2},lC=Object.freeze(Object.keys(rC)),cC=Object.freeze(Object.keys(oC));function JU(e){return lC.includes(e)}function YU(e){return cC.includes(e)}function XU(e,n){const s=n.ephemeral?e?.persistAgentThinkingLogEphemeral:e?.persistAgentThinkingLogPermanent;return typeof s=="boolean"?s:typeof e?.persistAgentThinkingLog=="boolean"?e.persistAgentThinkingLog:!1}function Ce(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}const dC={provider:"mock",modelId:"scripted"};function uC(e){return e?.testMode===!0||e?.defaultProvider?.trim().toLowerCase()==="mock"}function er(e,n){return uC(n)?dC:e}function mC(e){return!!(e?.provider&&e?.modelId)}function tr(...e){for(const n of e)if(mC(n))return{provider:n.provider,modelId:n.modelId};return{}}function Ed(e){return er(tr({provider:e?.defaultProviderOverride,modelId:e?.defaultModelIdOverride},{provider:e?.defaultProvider,modelId:e?.defaultModelId}),e)}function hC(e){return er(tr({provider:e?.executionProvider,modelId:e?.executionModelId},{provider:e?.executionGlobalProvider,modelId:e?.executionGlobalModelId},Ed(e)),e)}function fC(e){return er(tr({provider:e?.planningProvider,modelId:e?.planningModelId},{provider:e?.planningGlobalProvider,modelId:e?.planningGlobalModelId},Ed(e)),e)}function pC(e){return er(tr({provider:e?.validatorProvider,modelId:e?.validatorModelId},{provider:e?.validatorGlobalProvider,modelId:e?.validatorGlobalModelId},Ed(e)),e)}function QU(e){return er(tr({provider:e?.titleSummarizerProvider,modelId:e?.titleSummarizerModelId},{provider:e?.titleSummarizerGlobalProvider,modelId:e?.titleSummarizerGlobalModelId},{provider:e?.planningProvider,modelId:e?.planningModelId},Ed(e)),e)}function Kv(e,n){return er(tr({provider:e.modelProvider,modelId:e.modelId},hC(n)),n)}function Jv(e,n){return er(tr({provider:e.validatorModelProvider,modelId:e.validatorModelId},pC(n)),n)}function Yv(e,n){return er(tr({provider:e.planningModelProvider,modelId:e.planningModelId},fC(n)),n)}const ZU=["off","minimal","low","medium","high"],Ga=["triage","todo","in-progress","in-review","done","archived"],ed="triage";function Rh(e){return typeof e=="string"&&Ga.includes(e)}function Xv(e,n=ed){return Rh(e)?e:n}const nr=["low","normal","high","urgent"],di="normal",Ah=5,Qv=7200*1e3,gC=["default","ocean","forest","sunset","zen","berry","high-contrast","industrial","monochrome","slate","ash","graphite","silver","solarized","factory","ayu","one-dark","nord","dracula","gruvbox","tokyo-night","catppuccin-mocha","github-dark","everforest","rose-pine","kanagawa","night-owl","palenight","monokai-pro","slime","brutalist","neon-city","parchment","terminal","glass","horizon","vitesse","outrun","snazzy","porple","espresso","mars","poimandres","ember","rust","copper","foundry","carbon","sandstone","lagoon","frost","lavender","neon-bloom","sepia"];let Kf=!1;function e9(e){return e==="reuse-task-worktree"||e==="cwd-integration-branch"?e:e==="cwd-main"?(Kf||(Kf=!0,console.warn("[merger] settings.mergeIntegrationWorktree=cwd-main is legacy; normalized to cwd-integration-branch")),"cwd-integration-branch"):"reuse-task-worktree"}function t9(e){return e==="off"||e==="ff-only"||e==="stash-and-ff"?e:"stash-and-ff"}const _d=/^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/,Hs={triage:"Planning",todo:"Todo","in-progress":"In Progress","in-review":"In Review",done:"Done",archived:"Archived"},bC={triage:"Raw ideas — AI will plan these",todo:"Specified and ready to start","in-progress":"AI is working on this in a worktree","in-review":"Complete — ready to merge",done:"Merged and closed",archived:"Completed and archived"},Am={triage:["todo","archived"],todo:["in-progress","triage","archived"],"in-progress":["in-review","todo","triage","done"],"in-review":["done","in-progress","todo","triage"],done:["todo","triage","archived"],archived:["done"]};function xC(e){const n=e.metadata??{};return!!(n.agentKind==="task-worker"||n.taskWorker===!0||n.managedBy==="task-executor"||n.type==="spawned"||n.internal===!0||e.role==="executor"&&typeof e.name=="string"&&e.name.startsWith("executor-")&&e.reportsTo==null||e.role==="executor"&&e.name==="verification-agent"&&e.reportsTo==null)}const n9=["git_write","file_write_delete","command_execution","network_api","task_agent_mutation"],s9={git_write:["git commit","git push","git merge","git branch -d","git worktree add","write","edit"],file_write_delete:["write","edit","fn_task_attach"],command_execution:["bash (non-git)","read","find","grep","ls"],network_api:["fn_research_run (web/research)","fn_web_fetch","worktrunk_install"],task_agent_mutation:["fn_task_create","fn_delegate_task","fn_task_import_github","fn_task_import_github_issue","fn_spawn_agent","fn_update_agent_config","fn_update_identity"]},i9=["fn_send_message","fn_post_room_message","fn_read_messages","fn_task_log","fn_task_done","fn_heartbeat_done","fn_task_document_write","fn_task_document_read","fn_memory_search","fn_memory_get","fn_memory_append","fn_read_evaluations","fn_reflect_on_performance"],a9=["always","trusted-only","never"],Th="fn.authToken",Jf="token",vC="fn_token";let fo,Yf=!1,td=!1;const Tm="fn:auth-token-recovery-required",Im="fusion:oauth-relogin-success";function yC(){try{const e=window.localStorage.getItem(Th);return e&&e.length>0?e:void 0}catch{return}}function Zv(e){try{window.localStorage.setItem(Th,e)}catch{}}function wC(){if(!(Yf||typeof window>"u")){Yf=!0;try{const e=new URL(window.location.href),n=e.searchParams.get(Jf);if(!n)return;Zv(n),e.searchParams.delete(Jf);const s=e.pathname+(e.search?e.search:"")+e.hash;return window.history.replaceState(window.history.state,"",s),n}catch{return}}}function jo(){if(fo!==void 0)return fo;const e=wC();if(e)return fo=e,e;const n=yC();if(n)return fo=n,n}function kC(e){fo=e,td=!1,Zv(e)}function jC(){fo=void 0,td=!1;try{window.localStorage.removeItem(Th)}catch{}}function Xf(e){return e==="ws:"?"http:":e==="wss:"?"https:":e}function NC(e){return e==="http:"||e==="https:"||e==="ws:"||e==="wss:"}function SC(e){if(typeof window>"u")return!1;const n=new URL(window.location.origin);if(!NC(e.protocol))return!1;const s=e.hostname===n.hostname,a=e.port===n.port,r=Xf(e.protocol)===Xf(n.protocol);return s&&a&&r}function CC(e){if(!(typeof window>"u"))try{const n=new URL(e,window.location.origin),s=e.startsWith("/");return{parsed:n,preserveRelativePath:s}}catch{return}}function Qi(e){const n=jo();if(!n||typeof window>"u")return e;const s=CC(e);return!s||!SC(s.parsed)?e:(s.parsed.searchParams.set(vC,n),s.preserveRelativePath?`${s.parsed.pathname}${s.parsed.search}${s.parsed.hash}`:s.parsed.toString())}function Gi(e){const n=jo();if(!n)return e;const s=new Headers(e??{});return s.has("Authorization")||s.set("Authorization",`Bearer ${n}`),s}function EC(e){if(!e||typeof e!="object")return!1;const n=e;return n.error==="Unauthorized"&&n.message==="Valid bearer token required"}function _C(){typeof window>"u"||td||(td=!0,window.dispatchEvent(new CustomEvent(Tm)))}async function MC(e){if(e.status===401)try{const n=e.clone();if(!(n.headers.get("content-type")??"").toLowerCase().includes("application/json"))return;const a=await n.json();EC(a)&&_C()}catch{}}function RC(){if(typeof window>"u"||window.__fnAuthFetchInstalled)return;window.__fnAuthFetchInstalled=!0,jo();const e=window.fetch.bind(window);window.fetch=function(s,a){const r=jo(),o=typeof s=="string"?s:s instanceof URL?s.toString():s.url;if(!(()=>{try{const d=new URL(o,window.location.origin);return d.origin!==window.location.origin?!1:d.pathname.startsWith("/api/")||d.pathname==="/api"}catch{return o.startsWith("/api/")||o==="/api"}})())return e(s,a);const c=new Headers(a?.headers??(s instanceof Request?s.headers:void 0));return r&&!c.has("Authorization")&&c.set("Authorization",`Bearer ${r}`),e(s,{...a,headers:c}).then(d=>(MC(d),d))}}const Yr=new Map;function AC(){let e,n;return{external:new Promise((a,r)=>{e=a,n=r}),resolve:e,reject:n,done:!1}}function Qf(e,n){n.then(s=>{e.done||(e.done=!0,e.resolve(s))},s=>{e.done||(e.done=!0,e.reject(s))})}function Zi(e,n,s){const a=Yr.get(e);if(a&&!a.done)return s?.forceFresh&&Qf(a,n()),a.external;const r=AC();return Qf(r,n()),r.external.then(()=>{Yr.get(e)===r&&Yr.delete(e)},()=>{Yr.get(e)===r&&Yr.delete(e)}),Yr.set(e,r),r.external}class Nr extends Error{status;details;constructor(n,s,a){super(n),this.name="ApiRequestError",this.status=s,this.details=a}}function TC(e){const n=e.trim();return n.startsWith("<!DOCTYPE")||n.startsWith("<html")||n.startsWith("<HTML")}function Xs(e){return`/api${e}`}async function $(e,n={}){const s=Xs(e),a=jo(),r=(()=>{if(a){const f=new Headers(n.headers??{});return f.has("Content-Type")||f.set("Content-Type","application/json"),Gi(f)}if(!n.headers)return{"Content-Type":"application/json"};const m=new Headers(n.headers);return m.has("Content-Type")||m.set("Content-Type","application/json"),Object.fromEntries(m.entries())})(),o=await fetch(s,{...n,headers:r});if(o.status===204){if(!o.ok)throw new Error(`Request failed for ${s}: ${o.status} ${o.statusText}`);return}const l=o.headers.get("content-type")??"",c=await o.text(),d=l.includes("application/json");if(l.includes("text/html")||TC(c))throw new Error(`API returned HTML instead of JSON for ${s}. The endpoint may not be properly configured. (${o.status} ${o.statusText})`);if(!d){const m=c.length>160?`${c.slice(0,160)}...`:c;throw new Error(`API returned ${l||"an unknown content type"} instead of JSON for ${s}. (${o.status} ${o.statusText})${m?` Response: ${m}`:""}`)}let h;try{h=c?JSON.parse(c):null}catch{throw new Error(`API returned invalid JSON for ${s}. (${o.status} ${o.statusText})`)}if(!o.ok){const m=h;throw new Nr(m?.error||`Request failed for ${s}: ${o.status} ${o.statusText}`,o.status,m?.details)}return h}function IC(){return $("/health")}function ey(){return $("/health/refresh",{method:"POST"})}function r9(){return $("/updates/check")}function ty(e,n,s,a,r){const o=new URLSearchParams;e!==void 0&&o.set("limit",String(e)),n!==void 0&&o.set("offset",String(n)),s&&o.set("projectId",s),a&&o.set("q",a),r&&o.set("includeArchived","1");const l=o.size>0?`?${o.toString()}`:"";return $(`/tasks${l}`)}async function Sr(e,n){const a=Xs(K(`/tasks/${e}`,n));for(let r=1;r<=2;r++){const o=await fetch(a,{headers:Gi({"Content-Type":"application/json"})}),l=await o.json();if(o.ok)return l;if(r===2)throw new Error(l.error||"Request failed")}throw new Error("Request failed")}class PC extends Error{matches;constructor(n){super("duplicate_candidates"),this.name="DuplicateCandidatesError",this.matches=n}}async function $C(e,n){return(await $(K("/tasks/duplicate-check",n),{method:"POST",body:JSON.stringify(e)})).matches??[]}async function ny(e,n,s){const{title:a,description:r,column:o,dependencies:l,breakIntoSubtasks:c,enabledWorkflowSteps:d,assignedAgentId:u,modelPresetId:h,modelProvider:m,modelId:f,validatorModelProvider:p,validatorModelId:b,planningModelProvider:v,planningModelId:x,thinkingLevel:y,summarize:g,reviewLevel:j,executionMode:N,priority:C,source:w,nodeId:S,branch:R,baseBranch:I,branchSelection:E,githubTracking:M,acknowledgedDuplicates:G,bypassDuplicateCheck:U}=e;try{return await Ul(K("/tasks",n),{method:"POST",nodeId:s?.transportNodeId,localNodeId:s?.localNodeId,body:JSON.stringify({title:a,description:r,column:o,dependencies:l,breakIntoSubtasks:c,enabledWorkflowSteps:d,assignedAgentId:u,modelPresetId:h,modelProvider:m,modelId:f,validatorModelProvider:p,validatorModelId:b,planningModelProvider:v,planningModelId:x,thinkingLevel:y,summarize:g,reviewLevel:j,executionMode:N,priority:C,source:w,nodeId:S,branch:R,baseBranch:I,branchSelection:E,githubTracking:M,acknowledgedDuplicates:G,bypassDuplicateCheck:U})})}catch(P){if(P instanceof Nr&&P.status===409&&P.message==="duplicate_candidates"){const T=Array.isArray(P.details?.matches)?P.details?.matches:[];throw new PC(T)}throw P}}function ni(e,n,s){return $(K(`/tasks/${e}`,s),{method:"PATCH",body:JSON.stringify(n)})}function DC(e,n,s,a,r,o,l,c,d){return $(K("/tasks/batch-update-models",d),{method:"POST",body:JSON.stringify({taskIds:e,modelProvider:n,modelId:s,validatorModelProvider:a,validatorModelId:r,planningModelProvider:o,planningModelId:l,nodeId:c})})}function LC(e,n,s,a){return $(K(`/tasks/${e}/move`,s),{method:"POST",body:JSON.stringify({column:n,...typeof a=="object"&&a?.preserveProgress?{preserveProgress:!0}:{}})})}function OC(e,n,s){const a=new URLSearchParams;s?.removeDependencyReferences&&a.set("removeDependencyReferences","true"),s?.removeLineageReferences&&a.set("removeLineageReferences","true"),s?.githubIssueAction&&a.set("githubIssueAction",s.githubIssueAction),s?.allowResurrection&&a.set("allowResurrection","true");const r=a.size>0?`?${a.toString()}`:"";return $(K(`/tasks/${e}${r}`,n),{method:"DELETE"})}function FC(e,n){return $(K(`/tasks/${e}/merge`,n),{method:"POST"})}function zC(e,n){return $(K(`/tasks/${e}/retry`,n),{method:"POST"})}function BC(e,n){return $(K(`/tasks/${e}/recover-branch-binding`,n),{method:"POST"})}function UC(e,n){return $(K(`/tasks/${e}/reset`,n),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({confirm:!0})})}function HC(e,n){return $(K(`/tasks/${e}/duplicate`,n),{method:"POST"})}function sy(e,n){return $(K(`/tasks/${e}/pause`,n),{method:"POST"})}function iy(e,n){return $(K(`/tasks/${e}/unpause`,n),{method:"POST"})}function qC(e,n,s){const a=new URLSearchParams;s?.removeLineageReferences&&a.set("removeLineageReferences","true");const r=a.size>0?`?${a.toString()}`:"";return $(K(`/tasks/${e}/archive${r}`,n),{method:"POST"})}function VC(e,n){return $(K(`/tasks/${e}/unarchive`,n),{method:"POST"})}function WC(e){return $(K("/tasks/archive-all-done",e),{method:"POST"}).then(n=>n.archived)}function GC(e,n){return $(K(`/tasks/${e}/approve-plan`,n),{method:"POST"})}function KC(e,n){return $(K(`/tasks/${e}/reject-plan`,n),{method:"POST"})}function ay(e){const n=K("/config",e);return Zi(n,()=>$(n))}function Md(e,n){const s=K("/settings",e);return Zi(s,()=>$(s),n)}function tc(e,n){return $(K("/settings",n),{method:"PUT",body:JSON.stringify(e)})}function JC(e){return $(K("/update-check",e))}function o9(e){return $(K("/remote/settings",e))}function l9(e,n){return $(K("/remote/settings",n),{method:"PUT",body:JSON.stringify(e)})}function c9(e){return $(K("/remote/status",e))}function d9(e){return $(K("/remote/install-cloudflared",e),{method:"POST"})}function u9(e){return $(K("/remote/tunnel/start",e),{method:"POST"})}function m9(e){return $(K("/remote/tunnel/stop",e),{method:"POST"})}function h9(e){return $(K("/remote/tunnel/kill-external",e),{method:"POST"})}function f9(e){return $(K("/remote/token/persistent/regenerate",e),{method:"POST"})}function p9(e,n){return $(K("/remote/token/short-lived/generate",n),{method:"POST",body:JSON.stringify({ttlMs:e})})}function ry(e,n,s){const a=new URLSearchParams;e&&a.set("format",e),a.set("tokenType",n),n==="short-lived"&&typeof s=="number"&&Number.isFinite(s)&&a.set("ttlMs",String(s));const r=a.toString();return r?`?${r}`:""}function g9(e={}){const{projectId:n,tokenType:s="persistent",ttlMs:a}=e,r=ry(null,s,a);return $(K(`/remote/url${r}`,n))}function b9(e="text",n={}){const{projectId:s,tokenType:a="persistent",ttlMs:r}=n,o=ry(e,a,r);return $(K(`/remote/qr${o}`,s))}function x9(e){return $(K("/memory",e))}function v9(e,n){return $(K("/memory",n),{method:"PUT",body:JSON.stringify({content:e})})}function y9(e){return $(K("/memory/files",e))}function w9(e,n){const s=`path=${encodeURIComponent(e)}`;return $(K(`/memory/file?${s}`,n))}function k9(e,n,s){return $(K("/memory/file",s),{method:"PUT",body:JSON.stringify({path:e,content:n})})}function j9(e,n){let s,a=n;if(n!==void 0)s=e;else if(typeof e=="string"&&e.trim().length>0){const r=e.trim();r.includes("/")||r.endsWith(".md")||r.startsWith(".")?s=r:a=r}return $(K("/memory/compact",a),{method:"POST",body:JSON.stringify(s?{path:s}:{})})}function N9(e){return $(K("/memory/dream",e),{method:"POST"})}function S9(e){return $(K("/memory/insights",e))}function C9(e,n){return $(K("/memory/insights",n),{method:"PUT",body:JSON.stringify({content:e})})}function E9(e){return $(K("/memory/extract",e),{method:"POST"})}function _9(e){return $(K("/memory/audit",e))}function M9(e){return $(K("/memory/stats",e))}function R9(e){return $(K("/memory/backend",e))}function A9(e){return $(K("/memory/install-qmd",e),{method:"POST"})}function T9(e,n){return $(K("/memory/test",n),{method:"POST",body:JSON.stringify({query:e})})}function Ra(e){return Zi("/settings/global",()=>$("/settings/global"),e)}function Cs(e){return $("/settings/global",{method:"PUT",body:JSON.stringify(e)})}function I9(e){return $(K("/settings/scopes",e))}function P9(e){return $(K("/settings/pi-extensions",e))}function $9(e,n){return $(K("/settings/pi-extensions",n),{method:"PUT",body:JSON.stringify({disabledIds:e})})}function D9(e,n,s){return $(K("/settings/test-notification",s),{method:"POST",body:JSON.stringify({providerId:e,...n??{}})})}function L9(){return $("/pi-settings")}async function O9(e){return $("/pi-settings",{method:"PUT",body:JSON.stringify(e)})}async function F9(e){return $("/pi-settings/packages",{method:"POST",body:JSON.stringify({source:e})})}async function z9(e){return $(K("/pi-settings/reinstall-fusion",e),{method:"POST"})}async function Rd(e,n,s){const a=new FormData;a.append("file",n);const r=await fetch(Xs(K(`/tasks/${e}/attachments`,s)),{method:"POST",headers:Gi(),body:a}),o=await r.json();if(!r.ok)throw new Error(o.error||"Upload failed");return o}async function YC(e,n,s){return $(K(`/tasks/${e}/attachments/${n}`,s),{method:"DELETE"})}async function Zf(e,n,s){const a=new URLSearchParams;s?.limit!==void 0&&a.set("limit",String(s.limit)),s?.offset!==void 0&&a.set("offset",String(s.offset));const r=a.toString()?`?${a.toString()}`:"",o=K(`/tasks/${e}/logs${r}`,n),l=await fetch(Xs(o),{headers:Gi()});if(!l.ok){const h=await l.json().catch(()=>({error:"Failed to fetch agent logs"}));throw new Error(h.error||`HTTP ${l.status}`)}const c=await l.json(),d=l.headers.has("X-Total-Count")?parseInt(l.headers.get("X-Total-Count"),10):c.length,u=l.headers.has("X-Has-More")?l.headers.get("X-Has-More")==="true":!1;return{entries:c,total:d,hasMore:u}}function XC(e,n,s,a){return $(K(`/tasks/${e}/comments/${n}`,a),{method:"PATCH",body:JSON.stringify({text:s})})}function QC(e,n,s){return $(K(`/tasks/${e}/comments/${n}`,s),{method:"DELETE"})}function ZC(e,n){return $(K(`/tasks/${e}/documents`,n))}function e1(e,n,s){return $(K(`/tasks/${e}/documents/${n}/revisions`,s))}async function B9(e,n){const s=new URLSearchParams;e?.q&&s.set("q",e.q),e?.limit!==void 0&&s.set("limit",String(e.limit)),e?.offset!==void 0&&s.set("offset",String(e.offset));const a=s.toString(),r=`/documents${a?`?${a}`:""}`;return $(K(r,n))}function U9(e,n){const s=new URLSearchParams;n?.showHidden&&s.set("showHidden","1");const a=s.toString(),r=`/files/markdown-list${a?`?${a}`:""}`;return $(K(r,e))}function ep(e,n,s,a,r){return $(K(`/tasks/${e}/documents/${n}`,r),{method:"PUT",body:JSON.stringify({content:s,author:a?.author,metadata:a?.metadata})})}function t1(e,n,s){return $(K(`/tasks/${e}/documents/${n}`,s),{method:"DELETE"})}function n1(e,n,s){return $(K(`/tasks/${e}/steer`,s),{method:"POST",body:JSON.stringify({text:n})})}function s1(e,n,s){return $(K(`/tasks/${e}/spec/revise`,s),{method:"POST",body:JSON.stringify({feedback:n})})}function i1(e,n){return $(K(`/tasks/${e}/spec/rebuild`,n),{method:"POST"})}function a1(e,n,s){return $(K(`/tasks/${e}/refine`,s),{method:"POST",body:JSON.stringify({feedback:n})})}function Ki(){return $("/models")}function r1(){return $("/usage")}function o1(){return $("/providers/claude-cli/status")}function l1(){return $("/system/fn-binary/status")}function c1(){return $("/system/fn-binary/install",{method:"POST"})}function d1(){return $("/providers/droid-cli/status")}function u1(){return $("/providers/cursor-cli/status")}function m1(){return $("/providers/llama-cpp/status")}async function H9(e){const n=e?.binaryPath?`?binaryPath=${encodeURIComponent(e.binaryPath)}`:"";return $(`/providers/hermes/status${n}`)}async function q9(e){const n=e?.binaryPath?`?binaryPath=${encodeURIComponent(e.binaryPath)}`:"";return(await $(`/providers/hermes/profiles${n}`)).profiles??[]}async function V9(e){const n=e?.binaryPath?`?binaryPath=${encodeURIComponent(e.binaryPath)}`:"";return $(`/providers/openclaw/status${n}`)}async function W9(e){const n=new URLSearchParams({apiUrl:e.apiUrl});return e.apiKey&&n.set("apiKey",e.apiKey),$(`/providers/paperclip/status?${n.toString()}`)}async function G9(e){const n=new URLSearchParams({apiUrl:e.apiUrl});return e.apiKey&&n.set("apiKey",e.apiKey),(await $(`/providers/paperclip/companies?${n.toString()}`)).companies??[]}async function K9(e){const n=new URLSearchParams({apiUrl:e.apiUrl,companyId:e.companyId});return e.apiKey&&n.set("apiKey",e.apiKey),(await $(`/providers/paperclip/agents?${n.toString()}`)).agents??[]}async function J9(e){return $("/providers/paperclip/cli-mint-key",{method:"POST",body:JSON.stringify(e)})}async function Y9(e){const n=new URLSearchParams;e.cliBinaryPath&&n.set("cliBinaryPath",e.cliBinaryPath),e.cliConfigPath&&n.set("cliConfigPath",e.cliConfigPath);const s=n.toString();return $(`/providers/paperclip/cli-status${s?`?${s}`:""}`)}async function X9(e){const n=new URLSearchParams;e.cliBinaryPath&&n.set("cliBinaryPath",e.cliBinaryPath),e.cliConfigPath&&n.set("cliConfigPath",e.cliConfigPath);const s=n.toString();return(await $(`/providers/paperclip/cli-companies${s?`?${s}`:""}`)).companies??[]}async function Q9(e){const n=new URLSearchParams({companyId:e.companyId});return e.cliBinaryPath&&n.set("cliBinaryPath",e.cliBinaryPath),e.cliConfigPath&&n.set("cliConfigPath",e.cliConfigPath),(await $(`/providers/paperclip/cli-agents?${n.toString()}`)).agents??[]}async function Z9(e={}){const n=new URLSearchParams;e.cliConfigPath&&n.set("cliConfigPath",e.cliConfigPath);const s=n.toString();return $(`/providers/paperclip/cli-discovery${s?`?${s}`:""}`)}function h1(e){return $("/auth/claude-cli",{method:"POST",body:JSON.stringify({enabled:e})})}function f1(e){return $("/auth/droid-cli",{method:"POST",body:JSON.stringify({enabled:e})})}function p1(e){return $("/auth/cursor-cli",{method:"POST",body:JSON.stringify({enabled:e})})}function g1(e){return $("/auth/llama-cpp",{method:"POST",body:JSON.stringify({enabled:e})})}async function b1(){const n=(await $("/custom-providers")).map(s=>({id:s.id,name:s.name,baseUrl:s.baseUrl,api:s.apiType==="anthropic-compatible"?"anthropic-messages":s.apiType==="google-generative-ai"?"google-generative-ai":s.apiType==="openai-responses"?"openai-responses":"openai-completions",apiKey:s.apiKey,models:(s.models??[]).map(a=>({id:a.id,name:a.name}))}));return Object.assign(n,{providers:n})}function x1(e){return $("/custom-providers",{method:"POST",body:JSON.stringify(e)})}function e7(e,n){const s=n,a={...typeof s.name=="string"?{name:s.name}:{},...typeof s.baseUrl=="string"?{baseUrl:s.baseUrl}:{},...typeof s.apiKey=="string"?{apiKey:s.apiKey}:{},...Array.isArray(s.models)?{models:s.models.map(r=>({id:r.id,name:r.name??r.id}))}:{},...s.api?{apiType:s.api==="anthropic-messages"?"anthropic-compatible":s.api==="google-generative-ai"?"google-generative-ai":s.api==="openai-responses"?"openai-responses":"openai-compatible"}:{},..."apiType"in n?{apiType:n.apiType}:{}};return $(`/custom-providers/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(a)})}function t7(e){return $(`/custom-providers/${encodeURIComponent(e)}`,{method:"DELETE"})}function v1(e){const n=e.api==="anthropic-messages"?"anthropic-compatible":e.api==="google-generative-ai"?"google-generative-ai":e.api==="openai-responses"?"openai-responses":"openai-compatible";return x1({name:e.name?.trim()||e.id,apiType:n,baseUrl:e.baseUrl,apiKey:e.apiKey,models:e.models?.map(s=>({id:s.id,name:s.name??s.id}))})}async function y1(e){return $("/custom-providers/probe-models",{method:"POST",body:JSON.stringify({baseUrl:e.baseUrl,apiKey:e.apiKey,apiType:e.apiType})})}function No(e){return Zi("/auth/status",()=>$("/auth/status"),e)}function w1(e){return $("/auth/login",{method:"POST",body:JSON.stringify({provider:e,origin:window.location.origin})})}function k1(e,n){return $("/auth/manual-code",{method:"POST",body:JSON.stringify({provider:e,code:n})})}function j1(e){return $("/auth/logout",{method:"POST",body:JSON.stringify({provider:e})})}function N1(e){return $("/auth/cancel",{method:"POST",body:JSON.stringify({provider:e})})}function S1(e,n){return $("/auth/api-key",{method:"POST",body:JSON.stringify({provider:e,apiKey:n})})}function C1(e){return $("/auth/api-key",{method:"DELETE",body:JSON.stringify({provider:e})})}function E1(e,n,s,a){return $("/github/issues/fetch",{method:"POST",body:JSON.stringify({owner:e,repo:n,limit:s,labels:a})})}function _1(e,n,s,a){return $(K("/github/issues/import",a),{method:"POST",body:JSON.stringify({owner:e,repo:n,issueNumber:s})})}function M1(e,n,s){return $("/github/pulls/fetch",{method:"POST",body:JSON.stringify({owner:e,repo:n,limit:s})})}function R1(e,n,s,a){return $(K("/github/pulls/import",a),{method:"POST",body:JSON.stringify({owner:e,repo:n,prNumber:s})})}function A1(e){return $(K("/git/remotes",e))}function T1(e){return $(K("/git/remotes/detailed",e))}function I1(e,n,s){return $(K("/git/remotes",s),{method:"POST",body:JSON.stringify({name:e,url:n})})}function P1(e,n){return $(K(`/git/remotes/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function $1(e,n,s){return $(K(`/git/remotes/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify({newName:n})})}function D1(e,n,s){return $(K(`/git/remotes/${encodeURIComponent(e)}/url`,s),{method:"PUT",body:JSON.stringify({url:n})})}function tp(e,n){return $(K(`/tasks/${e}/pr/generate-metadata`,n),{method:"POST"})}function np(e,n,s){const a=s?`?base=${encodeURIComponent(s)}`:"";return $(K(`/tasks/${e}/pr/preflight${a}`,n))}function L1(e,n){return $(K(`/tasks/${e}/pr/options`,n))}function O1(e,n,s){return $(K(`/tasks/${e}/pr/create`,s),{method:"POST",body:JSON.stringify(n)})}function Pm(e,n){return $(K(`/tasks/${e}/pr/refresh`,n),{method:"POST"})}function F1(e,n,s){return $(K(`/tasks/${e}/pr/${n}/unlink`,s),{method:"POST",body:JSON.stringify({})})}function z1(e,n){return $(K(`/tasks/${e}/pr/reclaim-conflict`,n),{method:"POST"})}function B1(e,n,s,a){const r=a?`?pr=${encodeURIComponent(String(a))}`:"";return $(K(`/tasks/${e}/pr/merge${r}`,s),{method:"POST",body:JSON.stringify(n?{method:n}:{})})}function U1(e,n,s,a,r){const o=r?`?pr=${encodeURIComponent(String(r))}`:"";return $(K(`/tasks/${e}/pr/auto-merge${o}`,a),{method:"POST",body:JSON.stringify({enabled:n,strategy:s})})}function H1(e,n,s){const a=s?`?pr=${encodeURIComponent(String(s))}`:"";return $(K(`/tasks/${e}/pr/checks${a}`,n))}function sp(e,n,s){const a=s?`?pr=${encodeURIComponent(String(s))}`:"";return $(K(`/tasks/${e}/pr/reviews${a}`,n))}function nc(e,n,s,a){return $(K("/terminal/sessions",a),{method:"POST",body:JSON.stringify({cwd:e,cols:n,rows:s})})}function ip(e,n){return $(K(`/terminal/sessions/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function q1(e){return $(K("/terminal/sessions",e))}function zi(e,n){const s=K("/git/status",e);if(!n?.extended)return $(s);const a=s.includes("?")?"&":"?";return $(`${s}${a}extended=1`)}function V1(e,n){const s=e?`?limit=${e}`:"";return $(K(`/git/commits${s}`,n))}function nd(e,n){return $(K(`/git/commits/${e}/diff`,n))}function W1(e){return $(K("/git/commits/ahead",e))}function G1(e,n,s,a){const r=new URLSearchParams;r.set("limit",String(s));const o=r.size>0?`?${r.toString()}`:"";return $(K(`/git/remotes/${encodeURIComponent(e)}/commits${o}`,a))}function Vo(e){return $(K("/git/branches",e))}function K1(e,n,s){const a=`?limit=${n}`;return $(K(`/git/branches/${encodeURIComponent(e)}/commits${a}`,s))}function J1(e){return $(K("/git/worktrees",e))}function Y1(e,n,s){return $(K("/git/branches",s),{method:"POST",body:JSON.stringify({name:e,base:n})})}function X1(e,n){return $(K(`/git/branches/${encodeURIComponent(e)}/checkout`,n),{method:"POST"})}function ap(e,n,s){const a=n?"?force=true":"";return $(K(`/git/branches/${encodeURIComponent(e)}${a}`,s),{method:"DELETE"})}function Q1(e,n){return $(K("/git/fetch",n),{method:"POST",body:JSON.stringify({remote:e})})}function Z1(e,n){const s=typeof e=="string"?void 0:e;return $(K("/git/pull",typeof e=="string"?e:n),{method:"POST",body:JSON.stringify({rebase:s?.rebase??!1})})}function eE(e){return $(K("/git/push",e),{method:"POST"})}function sc(e){return $(K("/git/stashes",e))}function tE(e,n){return $(K("/git/stashes",n),{method:"POST",body:JSON.stringify({message:e})})}function nE(e,n,s){return $(K(`/git/stashes/${e}/apply`,s),{method:"POST",body:JSON.stringify({drop:n})})}function sE(e,n){return $(K(`/git/stashes/${e}`,n),{method:"DELETE"})}function iE(e,n){return $(K(`/git/stashes/${e}/diff`,n))}function aE(e,n,s){const a=new URLSearchParams;return a.set("path",e),a.set("staged",String(n)),$(K(`/git/diff/file?${a.toString()}`,s))}function Xr(e){return $(K("/git/changes",e))}function rp(e,n){return $(K("/git/stage",n),{method:"POST",body:JSON.stringify({files:e})})}function rE(e,n){return $(K("/git/unstage",n),{method:"POST",body:JSON.stringify({files:e})})}function op(e,n){return $(K("/git/commit",n),{method:"POST",body:JSON.stringify({message:e})})}function oE(e,n){return $(K("/git/discard",n),{method:"POST",body:JSON.stringify({files:e})})}function lE(e){return $(K("/workspaces",e))}function cE(e,n,s){const a=new URLSearchParams({workspace:e});return n&&a.set("path",n),s&&a.set("projectId",s),$(`/files?${a.toString()}`)}function dE(e,n,s){const a=new URLSearchParams({workspace:e});return s&&a.set("projectId",s),$(`/files/${encodeURIComponent(n)}?${a.toString()}`)}function uE(e,n,s,a){const r=new URLSearchParams({workspace:e});return a&&r.set("projectId",a),$(`/files/${encodeURIComponent(n)}?${r.toString()}`,{method:"POST",body:JSON.stringify({content:s})})}function mE(e,n,s){const a=new URLSearchParams({q:e});return n&&a.set("workspace",n),s&&a.set("projectId",s),$(`/files/search?${a.toString()}`)}function hE(e,n,s,a){const r=new URLSearchParams({workspace:e});return a&&r.set("projectId",a),$(`/files/${encodeURIComponent(n)}/copy?${r.toString()}`,{method:"POST",body:JSON.stringify({destination:s})})}function fE(e,n,s,a){const r=new URLSearchParams({workspace:e});return a&&r.set("projectId",a),$(`/files/${encodeURIComponent(n)}/move?${r.toString()}`,{method:"POST",body:JSON.stringify({destination:s})})}function pE(e,n,s){const a=new URLSearchParams({workspace:e});return s&&a.set("projectId",s),$(`/files/${encodeURIComponent(n)}/delete?${a.toString()}`,{method:"POST"})}function gE(e,n,s,a){const r=new URLSearchParams({workspace:e});return a&&r.set("projectId",a),$(`/files/${encodeURIComponent(n)}/rename?${r.toString()}`,{method:"POST",body:JSON.stringify({newName:s})})}function oy(e,n,s){const a=new URLSearchParams({workspace:e});return s&&a.set("projectId",s),`/api/files/${encodeURIComponent(n)}/download?${a.toString()}`}function bE(e,n,s){const a=new URLSearchParams({workspace:e});return s&&a.set("projectId",s),`/api/files/${encodeURIComponent(n)}/download-zip?${a.toString()}`}function xE(e,n,s){return $(K("/planning/create-draft",n),{method:"POST",body:JSON.stringify({initialPlan:e,planningModelProvider:s?.planningModelProvider,planningModelId:s?.planningModelId})})}function vE(e,n,s,a,r){return $(K("/planning/start-streaming",n),{method:"POST",body:JSON.stringify({initialPlan:e,planningModelProvider:s?.planningModelProvider,planningModelId:s?.planningModelId,planningDepth:a?.planningDepth,customQuestionCount:a?.customQuestionCount,...r?{existingSessionId:r}:{}})})}function lp(e,n,s,a){return $(K("/planning/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n,tabId:a})})}function yE(e,n,s){return $(K(`/planning/${encodeURIComponent(e)}/back`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function wE(e,n,s){return $(K(`/planning/${encodeURIComponent(e)}/retry`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function kE(e,n,s){return $(K(`/planning/${encodeURIComponent(e)}/stop`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function ly(e,n,s){return $(K("/planning/cancel",n),{method:"POST",body:JSON.stringify({sessionId:e,tabId:s})})}function n7(e,n,s,a){return $(K("/agents/onboarding/start-streaming",s),{method:"POST",body:JSON.stringify({intent:e,context:n,mode:n.mode,existingAgentConfig:n.existingAgentConfig,planningModelProvider:a?.planningModelProvider,planningModelId:a?.planningModelId})})}function s7(e,n,s){return $(K("/agents/onboarding/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n})})}function i7(e,n){return $(K("/agents/onboarding/cancel",n),{method:"POST",body:JSON.stringify({sessionId:e})})}function jE(e,n,s,a){return $(K("/planning/create-task",s),{method:"POST",body:JSON.stringify({...n?{sessionId:e,summary:n}:{sessionId:e},...a?.branch!==void 0?{branch:a.branch}:{},...a?.baseBranch!==void 0?{baseBranch:a.baseBranch}:{},...a?.branchSelection?{branchSelection:a.branchSelection}:{}})})}function NE(e,n,s){return $(K("/planning/start-breakdown",s),{method:"POST",body:JSON.stringify(n?{sessionId:e,summary:n}:{sessionId:e})})}function SE(e,n,s,a){return $(K("/planning/create-tasks",s),{method:"POST",body:JSON.stringify({planningSessionId:e,subtasks:n,...a?.branchSelection?{branchSelection:a.branchSelection}:{},...a?.branchAssignment?{branchAssignment:a.branchAssignment}:{}})})}const $m=new Set;if(typeof window<"u"){const e=()=>{for(const n of Array.from($m))try{n.close()}catch{}};window.addEventListener("pagehide",e),window.addEventListener("beforeunload",e)}function CE(e,n){if(n===null||n<=0)return e;const s=e.includes("?")?"&":"?";return`${e}${s}lastEventId=${encodeURIComponent(String(n))}`}function Lo(e,n,s={}){const a=s.maxReconnectAttempts??10;let r=null,o=!1,l=0,c=null,d=null,u=!1;const h=p=>{const b=p.lastEventId;if(!b)return!0;const v=Number.parseInt(b,10);return Number.isFinite(v)?d!==null&&v<=d?!1:(d=v,!0):!0},m=()=>{if(o)return;const p=CE(e,d),b=new EventSource(Qi(p));r=b,b.onopen=()=>{l=0,u=!1,s.onConnectionStateChange?.("connected"),n.onOpen?.()},b.onmessage=v=>{const x=v;h(x)&&n.onMessage?.(x)};for(const[v,x]of Object.entries(n.events??{}))b.addEventListener(v,y=>{const g=y;h(g)&&x(g)});b.onerror=()=>{if(o||r!==b)return;if(b.readyState===EventSource.CONNECTING){u||(u=!0,s.onConnectionStateChange?.("reconnecting"));return}if(b.close(),l>=a){s.onFatalError?.("Connection lost");return}u=!0,s.onConnectionStateChange?.("reconnecting"),l+=1;const x=Math.min(1e3*2**(l-1),3e4);c=setTimeout(()=>{c=null,m()},x)}};m();const f={close:()=>{o=!0,c&&(clearTimeout(c),c=null),r?.close(),$m.delete(f)},isConnected:()=>!o&&r?.readyState===EventSource.OPEN};return $m.add(f),f}function cp(e){const n=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",s=n==="root"?".":n,a=e.name,r=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():s,o=typeof e.confidence=="number"?e.confidence:1,l=n==="root"?"root":n,c=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:a,packagePath:r,confidence:o,cwd:s,source:n,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${c} · ${a} (${l})`}}function So(e){const n=e.status,s=n==="starting"||n==="running"||n==="failed"||n==="stopped"?n:"stopped",a=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,r=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:s,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:a,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:a,detectedPort:e.detectedPort,manualPreviewUrl:r,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:r,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function EE(e,n){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:n,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function _E(e){const s=(Array.isArray(e.lines)?e.lines:[]).map((a,r)=>EE(a,r+1));return{lines:s,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:s.length}}function ME(e,n){const s=typeof n.maxLines=="number"&&Number.isFinite(n.maxLines)?Math.max(1,Math.floor(n.maxLines)):100,a=typeof n.offset=="number"&&Number.isFinite(n.offset)?Math.max(0,Math.floor(n.offset)):0,r=typeof n.lastEventId=="number"&&Number.isFinite(n.lastEventId)?Math.max(0,Math.floor(n.lastEventId)):null,o=e.length,l=e.map((u,h)=>({id:h+1,text:u,stream:"stdout",timestamp:""}));if(r!==null)return{lines:l.filter(u=>u.id>r).slice(0,s),totalLines:o};const c=Math.max(o-a,0),d=Math.max(c-s,0);return{lines:l.slice(d,c),totalLines:o}}function dp(e){return Array.isArray(e)?e.map(cp):(e.candidates??[]).map(cp)}async function RE(e){try{const n=await $(K("/dev-server/candidates",e));return dp(n)}catch(n){if(n instanceof Error&&/\/dev-server\/candidates/.test(n.message)){const s=await $(K("/dev-server/detect",e));return dp(s)}throw n}}function Ih(e){return $(K("/dev-server/status",e)).then(So)}async function a7(e={},n){const s=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&s.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&s.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&s.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const a=s.size>0?`?${s.toString()}`:"";try{const r=await $(K(`/dev-server/logs/history${a}`,n));return _E(r)}catch(r){if(r instanceof Error&&/\/dev-server\/logs\/history/.test(r.message)){const o=await Ih(n);return ME(o.logs,e)}throw r}}function AE(e,n){const s=e.cwd??e.packagePath??".",a=e.scriptName;return $(K("/dev-server/start",n),{method:"POST",body:JSON.stringify({command:e.command,scriptName:a,scriptId:a,cwd:s,packagePath:e.packagePath})}).then(So)}function TE(e){return $(K("/dev-server/stop",e),{method:"POST"}).then(So)}function IE(e){return $(K("/dev-server/restart",e),{method:"POST"}).then(So)}async function PE(e,n){const s=typeof e=="string"?{url:e}:e;try{const a=await $(K("/dev-server/preview-url",n),{method:"POST",body:JSON.stringify(s)});return So(a)}catch(a){if(a instanceof Error&&/\/dev-server\/preview-url/.test(a.message)){const r=await $(K("/dev-server/preview-url",n),{method:"PUT",body:JSON.stringify(s)});return So(r)}throw a}}function r7(e){return Xs(K("/dev-server/logs/stream",e))}async function o7(e){try{return(await $(K("/devserver",e))).sessions??[]}catch{try{const n=await Ih(e);return[{config:{id:n.id??"default",name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function l7(e,n){try{return await $(K(`/devserver/${encodeURIComponent(e)}`,n))}catch{try{const s=await Ih(n);return!e||e==="default"||e===s.id?{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function c7(e,n){try{return await $(K(`/devserver/${encodeURIComponent(e)}/start`,n),{method:"POST"})}catch{const s=await AE({command:""},n);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}}}async function d7(e,n){try{return await $(K(`/devserver/${encodeURIComponent(e)}/stop`,n),{method:"POST"})}catch{const s=await TE(n);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}}}async function u7(e,n){try{return await $(K(`/devserver/${encodeURIComponent(e)}/restart`,n),{method:"POST"})}catch{const s=await IE(n);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(a=>({timestamp:new Date().toISOString(),stream:a.startsWith("[stderr]")?"stderr":"stdout",text:a.replace(/^\[stderr\]\s*/,"")}))}}}async function m7(e,n,s){try{const a=await $(K(`/devserver/${encodeURIComponent(e)}/preview`,s),{method:"POST",body:JSON.stringify({url:n})});return{url:a.url??null,source:a.source??null}}catch{const a=await PE({url:n},s);return{url:a.previewUrl??a.manualUrl??null,source:"manual"}}}async function h7(e){try{return(await $(K("/devserver/detect",e))).candidates??[]}catch{try{return(await RE(e)).map(s=>({name:s.name,command:s.command,cwd:s.cwd,scriptName:s.scriptName,packagePath:s.packagePath}))}catch{return[]}}}function f7(e,n){return Xs(K(`/devserver/${encodeURIComponent(e)}/logs/stream`,n))}function Fl(e,n,s=25e3){const a=setInterval(()=>{_M(e,n).catch(()=>{})},s);return{stop:()=>{clearInterval(a)}}}function $E(e,n){return Xs(K(`/planning/${encodeURIComponent(e)}/stream`,n))}function DE(e,n){return Xs(K(`/agents/onboarding/${encodeURIComponent(e)}/stream`,n))}function p7(e,n,s,a){const r=DE(e,n),o=Lo(r,{events:{thinking:l=>{try{s.onThinking?.(JSON.parse(l.data))}catch{s.onThinking?.(l.data)}},question:l=>{try{s.onQuestion?.(JSON.parse(l.data))}catch{}},summary:l=>{try{s.onSummary?.(JSON.parse(l.data))}catch{}},error:l=>{try{const c=JSON.parse(l.data);s.onError?.(c.message||c)}catch{s.onError?.(l.data||"Stream error")}},complete:()=>{s.onComplete?.()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:l=>s.onError?.(l)});return{close:o.close,isConnected:o.isConnected}}function LE(e,n,s,a){const r=$E(e,n);let o=null,l=null;const c=()=>{o?.stop(),o=null},d=Lo(r,{onOpen:()=>{c(),o=Fl(e,n)},onMessage:u=>{u.data.startsWith(":")},events:{thinking:u=>{try{s.onThinking?.(JSON.parse(u.data))}catch{s.onThinking?.(u.data)}},question:u=>{try{s.onQuestion?.(JSON.parse(u.data))}catch(h){console.error("[planning] Failed to parse question event:",h)}},summary:u=>{try{s.onSummary?.(JSON.parse(u.data))}catch(h){console.error("[planning] Failed to parse summary event:",h)}},error:u=>{try{const h=JSON.parse(u.data);s.onError?.(h.message||h)}catch{s.onError?.(u.data||"Stream error")}l?.close()},complete:()=>{s.onComplete?.(),l?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:u=>{c(),s.onError?.(u)}});return l={close:()=>{c(),d.close()},isConnected:d.isConnected},l}function zl(e,n){const s=new URLSearchParams;n?.scope&&s.set("scope",n.scope),n?.projectId&&s.set("projectId",n.projectId);const a=s.toString();return a?`${e}?${a}`:e}function OE(e){return $(zl("/routines",e))}function FE(e,n){return $(zl("/routines",n),{method:"POST",body:JSON.stringify(e)})}function up(e,n,s){return $(zl(`/routines/${e}`,s),{method:"PATCH",body:JSON.stringify(n)})}async function zE(e,n){await $(zl(`/routines/${e}`,n),{method:"DELETE"})}function BE(e,n){return $(zl(`/routines/${e}/trigger`,n),{method:"POST"})}function mp(e){const n=new URLSearchParams;e?.limit!==void 0&&n.set("limit",String(e.limit)),e?.since!==void 0&&n.set("since",e.since),e?.type!==void 0&&n.set("type",e.type),e?.projectId&&n.set("projectId",e.projectId);const s=n.size>0?`?${n.toString()}`:"";return $(`/activity${s}`)}function UE(e){const n=K("/activity",e);return $(n,{method:"DELETE"})}function Bl(e){const n=K("/workflow-steps",e);return Zi(n,()=>$(n))}function hp(e,n){return $(K("/workflow-steps",n),{method:"POST",body:JSON.stringify(e)})}function HE(e,n,s){return $(K(`/workflow-steps/${e}`,s),{method:"PATCH",body:JSON.stringify(n)})}function qE(e,n){return $(K(`/workflow-steps/${e}`,n),{method:"DELETE"})}function fp(e,n){return $(K(`/workflow-steps/${e}/refine`,n),{method:"POST"})}function VE(e,n){return $(K(`/tasks/${encodeURIComponent(e)}/workflow-results`,n))}function WE(){return $("/workflow-step-templates")}function GE(){return $("/plugin-workflow-step-templates")}function KE(e,n){return $(K(`/workflow-step-templates/${encodeURIComponent(e)}/create`,n),{method:"POST"})}function Rl(e){return $(K("/scripts",e))}function JE(e,n,s){return $(K("/scripts",s),{method:"POST",body:JSON.stringify({name:e,command:n})})}function YE(e,n){return $(K(`/scripts/${encodeURIComponent(e)}`,n),{method:"DELETE"})}async function cy(e,n,s){return(await $(K("/ai/refine-text",s),{method:"POST",body:JSON.stringify({text:e,type:n})})).refined}const ic={RATE_LIMIT:"Too many refinement requests. Please wait an hour.",INVALID_TYPE:"Invalid refinement option selected.",NETWORK:"Failed to refine text. Please try again."};function dy(e){if(!(e instanceof Error))return ic.NETWORK;const n=e.message.toLowerCase();return n.includes("rate limit")||n.includes("429")?ic.RATE_LIMIT:n.includes("invalid")&&n.includes("type")?ic.INVALID_TYPE:n.startsWith("text must")||n.includes("text is required")||n.includes("type is required")?e.message:ic.NETWORK}function XE(e,n){return $(K("/subtasks/start-streaming",n),{method:"POST",body:JSON.stringify({description:e})})}function QE(e,n,s){return $(K(`/subtasks/${encodeURIComponent(e)}/retry`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function ZE(e,n){return Xs(K(`/subtasks/${encodeURIComponent(e)}/stream`,n))}function e_(e,n,s,a){let r=null,o=null;const l=()=>{r?.stop(),r=null},c=Lo(ZE(e,n),{onOpen:()=>{l(),r=Fl(e,n)},events:{thinking:d=>{try{s.onThinking?.(JSON.parse(d.data))}catch{s.onThinking?.(d.data)}},subtasks:d=>{try{s.onSubtasks?.(JSON.parse(d.data))}catch(u){console.error("[subtasks] Failed to parse subtasks event:",u)}},error:d=>{try{const u=JSON.parse(d.data),h=typeof u=="string"&&u.length>0?u:null;s.onError?.(h||"Stream error")}catch{s.onError?.("Stream error")}o?.close()},complete:()=>{s.onComplete?.(),o?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:d=>{l(),s.onError?.(d)}});return o={close:()=>{l(),c.close()},isConnected:c.isConnected},o}function t_(e,n,s,a,r){return $(K("/subtasks/create-tasks",a),{method:"POST",body:JSON.stringify({sessionId:e,parentTaskId:s,...r?.branch!==void 0?{branch:r.branch}:{},...r?.baseBranch!==void 0?{baseBranch:r.baseBranch}:{},...r?.branchSelection?{branchSelection:r.branchSelection}:{},...r?.branchAssignment?{branchAssignment:r.branchAssignment}:{},subtasks:n.map(o=>({tempId:o.id,title:o.title,description:o.description,size:o.suggestedSize,dependsOn:o.dependsOn}))})})}function uy(e,n,s){return $(K("/subtasks/cancel",n),{method:"POST",body:JSON.stringify({sessionId:e,tabId:s})})}function K(e,n){if(!n)return e;const s=e.includes("?")?"&":"?";return`${e}${s}projectId=${encodeURIComponent(n)}`}function n_(e,n,s){if(!n||n===s)return e;const a="/api",r=e.startsWith(a)?e.slice(a.length):e;return`/proxy/${encodeURIComponent(n)}${r}`}function Ul(e,n){const{nodeId:s,localNodeId:a,...r}=n??{},o=n_(e,s,a);return $(o,r)}function Qa(e,n,s){const a=new URLSearchParams;e?.state&&a.set("state",e.state),e?.role&&a.set("role",e.role),e?.includeEphemeral===!0&&a.set("includeEphemeral","true"),n&&a.set("projectId",n);const o=`/agents${a.size>0?`?${a.toString()}`:""}`;return Zi(o,()=>$(o),s)}function Dm(e,n){return $(K(`/agents/${encodeURIComponent(e)}`,n))}function s_(e,n){return $(K("/agents",n),{method:"POST",body:JSON.stringify(e)})}function i_(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}async function g7(e,n,s){const a=new FormData;a.append("file",n);const r=await fetch(Xs(K(`/agents/${encodeURIComponent(e)}/avatar`,s)),{method:"POST",headers:Gi(),body:a}),o=await r.json();if(!r.ok)throw new Error(o.error||"Avatar upload failed");return o}function b7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/avatar`,n),{method:"DELETE"})}function x7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/upgrade-heartbeat-procedure`,n),{method:"POST"})}function v7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/instructions`,s),{method:"PATCH",body:JSON.stringify(n)})}function y7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/soul`,s),{method:"PATCH",body:JSON.stringify({soul:n})})}function w7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/memory`,s),{method:"PATCH",body:JSON.stringify({memory:n})})}function k7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/memory/files`,n))}function j7(e,n,s){const a=`path=${encodeURIComponent(n)}`;return $(K(`/agents/${encodeURIComponent(e)}/memory/file?${a}`,s))}function N7(e,n,s,a){return $(K(`/agents/${encodeURIComponent(e)}/memory/file`,a),{method:"PUT",body:JSON.stringify({path:n,content:s})})}function a_(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/state`,s),{method:"POST",body:JSON.stringify({state:n})})}function r_(e,n){return $(K(`/agents/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function S7(e,n,s){const a=new URLSearchParams;n!==void 0&&a.set("limit",String(n)),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/runs${r}`)}function C7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/runs/${encodeURIComponent(n)}`,s))}function E7(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/runs/${encodeURIComponent(n)}/logs`,s))}function _7(e,n,s){const a=new URLSearchParams;a.set("limit",String(n)),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/prompt-sizes${r}`)}function M7(e,n,s){const a=s?.source??"manual",r=s?.triggerDetail??"Agent activated via dashboard";return $(K(`/agents/${encodeURIComponent(e)}/runs`,n),{method:"POST",body:JSON.stringify({source:a,triggerDetail:r})})}function R7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/runs/stop`,n),{method:"POST"})}function pp(e,n){const s=K("/agents/stats",e);return Zi(s,()=>$(s),n)}function A7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/chain-of-command`,n))}function T7(e,n){const s=new URLSearchParams;e&&s.set("projectId",e),n?.includeEphemeral&&s.set("includeEphemeral","true");const a=s.toString();return $(`/agents/org-tree${a?`?${a}`:""}`)}function I7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/children`,n)).catch(s=>{if(s.message.includes("not found"))return[];throw s})}function gp(e,n,s){return $(K(`/tasks/${encodeURIComponent(e)}/assign`,s),{method:"PATCH",body:JSON.stringify({agentId:n})})}function my(e){return{reviewState:{source:e.mode,summary:e.summary??void 0,items:e.items.map(n=>({id:n.itemId,body:n.body,author:{login:n.author},createdAt:n.createdAt??new Date(0).toISOString(),updatedAt:n.updatedAt??void 0,path:n.filePath,threadId:n.threadId,htmlUrl:n.url,state:n.reviewState??void 0,isResolved:n.isResolved})),addressing:[],lastRefreshedAt:e.fetchedAt??void 0,refreshStatus:"ready",refreshSource:"initial-load"},automationStatus:null}}async function o_(e,n){const s=await $(K(`/tasks/${encodeURIComponent(e)}/review`,n));return my(s)}async function l_(e,n){const s=await $(K(`/tasks/${encodeURIComponent(e)}/review/refresh`,n),{method:"POST"});return my(s)}function c_(e,n,s){return $(K(`/tasks/${encodeURIComponent(e)}/review/address`,s),{method:"POST",body:JSON.stringify({selectedItems:n,tab:"review"})})}function P7(e,n){return $(K(`/agents/${encodeURIComponent(e)}/tasks`,n))}function $7(){return $("/agents/companies")}function D7(e,n){return $(K("/agents/generate/start",n),{method:"POST",body:JSON.stringify({role:e})})}function L7(e,n){return $(K("/agents/generate/spec",n),{method:"POST",body:JSON.stringify({sessionId:e})})}function O7(e,n){return $(K(`/agents/generate/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function F7(e){return $(K("/backups",e))}function z7(e){return $(K("/backups",e),{method:"POST"})}function B7(e,n){const s=K("/settings/export",n),a=`${s}${s.includes("?")?"&":"?"}scope=${encodeURIComponent(e)}`;return $(a)}function U7(e,n,s){return $(K("/settings/import",s),{method:"POST",body:JSON.stringify({data:e,scope:n?.scope??"both",merge:n?.merge??!0})})}function H7(){return $("/projects")}function d_(e){return Array.isArray(e.nodeMappings)||Array.isArray(e.projectNodeMappings)||Array.isArray(e.pathMappings)}function bp(){return Zi("/projects/across-nodes",()=>$("/projects/across-nodes"))}function sd(){return Zi("/nodes",()=>$("/nodes"))}function q7(){return $("/docker/nodes")}function V7(e){return $(`/docker/nodes/${encodeURIComponent(e)}/container-status`)}function W7(e,n){const s=new URLSearchParams;typeof n?.tail=="number"&&s.set("tail",String(n.tail));const a=s.size>0?`?${s.toString()}`:"";return $(`/docker/nodes/${encodeURIComponent(e)}/logs${a}`)}function G7(e){return $("/docker-nodes",{method:"POST",body:JSON.stringify(e)})}function u_(e){return $("/nodes",{method:"POST",body:JSON.stringify(e)})}function m_(e){return $("/nodes/discover-projects",{method:"POST",body:JSON.stringify(e)})}function h_(e,n){return $(`/nodes/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify(n)})}function f_(e){return $(`/nodes/${encodeURIComponent(e)}/docker-config`)}function p_(e,n){return $(`/nodes/${encodeURIComponent(e)}/docker-config`,{method:"PATCH",body:JSON.stringify(n)})}function g_(e){return $(`/nodes/${encodeURIComponent(e)}/docker-config/diff`)}function xp(e){return $(`/nodes/${encodeURIComponent(e)}`,{method:"DELETE"})}async function b_(e){const n=await $(`/nodes/${encodeURIComponent(e)}/health-check`,{method:"POST"});return{nodeId:n.nodeId??e,status:n.status,responseTimeMs:n.responseTimeMs,error:n.error,checkedAt:n.checkedAt??new Date().toISOString()}}async function K7(){return $("/mesh/state")}function J7(e,n,s,a){const r=s&&s!==a?s:void 0,o=new URLSearchParams;e&&o.set("path",e),n&&o.set("showHidden","true"),r&&o.set("nodeId",r);const l=jo();l&&o.set("fn_token",l);const c=o.toString(),d=`/browse-directory${c?`?${c}`:""}`;return $(d)}function x_(e){return $("/projects",{method:"POST",body:JSON.stringify(e)})}function hy(e){return $(`/projects/${encodeURIComponent(e)}`,{method:"DELETE"})}function v_(e,n,s){return $(`/projects/${encodeURIComponent(e)}/path-mappings/${encodeURIComponent(n)}`,{method:"PUT",body:JSON.stringify({path:s})})}function vp(e){return $(`/projects/${encodeURIComponent(e)}/health`)}function y_(e){const n=K("/executor/stats",e);return Zi(n,()=>$(n))}function w_(e){return $(K("/system-stats",e))}function k_(e){return $(K("/kill-vitest",e),{method:"POST"})}function yp(e){const n=new URLSearchParams;e?.limit!==void 0&&n.set("limit",String(e.limit)),e?.since&&n.set("since",e.since),e?.projectId&&n.set("projectId",e.projectId),e?.type&&n.set("type",e.type);const s=n.size>0?`?${n.toString()}`:"";return $(`/activity-feed${s}`)}function j_(e){return $(`/projects/${encodeURIComponent(e)}/pause`,{method:"POST"})}function N_(e){return $(`/projects/${encodeURIComponent(e)}/resume`,{method:"POST"})}function Y7(){return $("/global-concurrency")}function X7(e){return $("/global-concurrency",{method:"PUT",body:JSON.stringify(e)})}function S_(e,n){return $(`/projects/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify(n)})}function fy(e,n,s){const a=new URLSearchParams;n&&a.set("worktree",n),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/tasks/${encodeURIComponent(e)}/diff${r}`)}function C_(e,n){return $(K(`/tasks/${encodeURIComponent(e)}/commit-associations`,n))}function E_(e){return $(K("/missions",e))}function __(e,n){return $(K("/missions",n),{method:"POST",body:JSON.stringify(e)})}function py(e,n){return $(K(`/missions/${encodeURIComponent(e)}`,n))}function M_(e,n,s){return $(K(`/missions/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function R_(e,n){return $(K(`/missions/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function A_(e,n,s){const a=new URLSearchParams;a.set("limit",String(n.limit)),n?.offset!==void 0&&a.set("offset",String(n.offset));const r=a.size>0?`?${a.toString()}`:"";return $(K(`/missions/${encodeURIComponent(e)}/events${r}`,s))}function T_(e){return $(K("/missions/health",e))}function I_(e,n,s){return $(K(`/missions/${encodeURIComponent(e)}/milestones`,s),{method:"POST",body:JSON.stringify(n)})}function P_(e,n,s){return $(K(`/missions/milestones/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function $_(e,n){return $(K(`/missions/milestones/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function D_(e,n,s){return $(K(`/missions/milestones/${encodeURIComponent(e)}/slices`,s),{method:"POST",body:JSON.stringify(n)})}function L_(e,n,s){return $(K(`/missions/slices/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function O_(e,n){return $(K(`/missions/slices/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function F_(e,n){return $(K(`/missions/slices/${encodeURIComponent(e)}/activate`,n),{method:"POST"})}function z_(e,n,s){return $(K(`/missions/slices/${encodeURIComponent(e)}/features`,s),{method:"POST",body:JSON.stringify(n)})}function B_(e,n,s){return $(K(`/missions/features/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function U_(e,n){return $(K(`/missions/features/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function H_(e,n,s){return $(K(`/missions/features/${encodeURIComponent(e)}/link-task`,s),{method:"POST",body:JSON.stringify({taskId:n})})}function q_(e,n){return $(K(`/missions/features/${encodeURIComponent(e)}/unlink-task`,n),{method:"POST"})}function V_(e,n,s,a,r){return $(K(`/missions/features/${encodeURIComponent(e)}/triage`,a),{method:"POST",body:JSON.stringify({taskTitle:n,taskDescription:s,...r})})}function W_(e,n,s){return $(K(`/missions/slices/${encodeURIComponent(e)}/triage-all`,n),{method:"POST",body:JSON.stringify(s??{})})}function eu(e,n){return $(K(`/missions/milestones/${encodeURIComponent(e)}/assertions`,n))}function G_(e,n,s){return $(K(`/missions/milestones/${encodeURIComponent(e)}/assertions`,s),{method:"POST",body:JSON.stringify(n)})}function K_(e,n,s){return $(K(`/missions/assertions/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function J_(e,n,s){return $(K(`/missions/features/${encodeURIComponent(e)}/assertions/${encodeURIComponent(n)}/link`,s),{method:"POST"})}function Y_(e,n,s){return $(K(`/missions/features/${encodeURIComponent(e)}/assertions/${encodeURIComponent(n)}/unlink`,s),{method:"POST"})}function X_(e,n){return $(K(`/missions/assertions/${encodeURIComponent(e)}/features`,n))}function tu(e,n){return $(K(`/missions/milestones/${encodeURIComponent(e)}/validation`,n))}function wp(e,n){return $(K(`/missions/milestones/${encodeURIComponent(e)}/validation-telemetry`,n))}function Q_(e,n){return $(K(`/missions/features/${encodeURIComponent(e)}/validate`,n),{method:"POST"})}function kp(e,n){return $(K(`/missions/features/${encodeURIComponent(e)}/validation-loop`,n))}function Z_(e,n,s){const a=new URLSearchParams;a.set("limit",String(n.limit)),n?.offset!==void 0&&a.set("offset",String(n.offset));const r=a.size>0?`?${a.toString()}`:"";return $(K(`/missions/features/${encodeURIComponent(e)}/validation-runs${r}`,s)).then(o=>o.runs)}function eM(e,n){return $(K(`/missions/validation-runs/${encodeURIComponent(e)}`,n))}function tM(e,n){return $(K(`/missions/${encodeURIComponent(e)}/resume`,n),{method:"POST"})}function nM(e,n){return $(K(`/missions/${encodeURIComponent(e)}/stop`,n),{method:"POST"})}function sM(e,n){return $(K(`/missions/${encodeURIComponent(e)}/start`,n),{method:"POST"})}function iM(e,n,s){return $(K(`/missions/${encodeURIComponent(e)}/autopilot`,s),{method:"PATCH",body:JSON.stringify(n)})}function aM(e,n,s){return $(K("/missions/interview/start",n),{method:"POST",body:JSON.stringify({missionTitle:e,modelProvider:s?.modelProvider,modelId:s?.modelId})})}function rM(e,n,s,a){return $(K("/missions/interview/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n,tabId:a})})}function oM(e,n,s){return $(K(`/missions/interview/${encodeURIComponent(e)}/retry`,n),{method:"POST",...s?{body:JSON.stringify({tabId:s})}:{}})}function gy(e,n,s){return $(K("/missions/interview/cancel",n),{method:"POST",body:JSON.stringify({sessionId:e,tabId:s})})}async function lM(e){const n=e?`?${new URLSearchParams({projectId:e}).toString()}`:"";return(await $(`/missions/interview/drafts${n}`)).drafts??[]}function cM(e,n,s){return $(K(`/missions/interview/drafts/${encodeURIComponent(e)}/discard`,n),{method:"POST",body:JSON.stringify({tabId:s})})}function dM(e,n,s,a){return $(K("/missions/interview/create-mission",s),{method:"POST",body:JSON.stringify({sessionId:e,summary:n})})}function uM(e,n,s,a){const r=Xs(K(`/missions/interview/${encodeURIComponent(e)}/stream`,n));let o=null,l=null;const c=()=>{o?.stop(),o=null},d=Lo(r,{onOpen:()=>{c(),o=Fl(e,n)},onMessage:u=>{u.data.startsWith(":")},events:{thinking:u=>{try{s.onThinking?.(JSON.parse(u.data))}catch{s.onThinking?.(u.data)}},question:u=>{try{s.onQuestion?.(JSON.parse(u.data))}catch(h){console.error("[mission-interview] Failed to parse question event:",h)}},summary:u=>{try{s.onSummary?.(JSON.parse(u.data))}catch(h){console.error("[mission-interview] Failed to parse summary event:",h)}},error:u=>{try{const h=JSON.parse(u.data);s.onError?.(h.message||h)}catch{s.onError?.(u.data||"Stream error")}l?.close()},complete:()=>{s.onComplete?.(),l?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:u=>{c(),s.onError?.(u)}});return l={close:()=>{c(),d.close()},isConnected:d.isConnected},l}function Hl(e,n,s){return K(`/missions/milestones/${encodeURIComponent(e)}/interview${n}`,s)}function ql(e,n,s){return K(`/missions/slices/${encodeURIComponent(e)}/interview${n}`,s)}function mM(e,n){return $(Hl(e,"/start",n),{method:"POST"})}function hM(e,n,s,a){return $(Hl(e,"/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n,tabId:a})})}function fM(e,n,s,a){const r=Xs(Hl(e,`/${encodeURIComponent(e)}/stream`,n));let o=null,l=null;const c=()=>{o?.stop(),o=null},d=Lo(r,{onOpen:()=>{c(),o=Fl(e,n)},onMessage:u=>{u.data.startsWith(":")},events:{thinking:u=>{try{s.onThinking?.(JSON.parse(u.data))}catch{s.onThinking?.(u.data)}},question:u=>{try{s.onQuestion?.(JSON.parse(u.data))}catch(h){console.error("[milestone-interview] Failed to parse question event:",h)}},summary:u=>{try{s.onSummary?.(JSON.parse(u.data))}catch(h){console.error("[milestone-interview] Failed to parse summary event:",h)}},error:u=>{try{const h=JSON.parse(u.data);s.onError?.(h.message||h)}catch{s.onError?.(u.data||"Stream error")}l?.close()},complete:()=>{s.onComplete?.(),l?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:u=>{c(),s.onError?.(u)}});return l={close:()=>{c(),d.close()},isConnected:d.isConnected},l}function pM(e,n,s){return $(Hl(e,"/apply",s),{method:"POST",body:JSON.stringify({sessionId:e,summary:n})})}function gM(e,n){return $(Hl(e,"/skip",n),{method:"POST"})}function bM(e,n){return $(ql(e,"/start",n),{method:"POST"})}function xM(e,n,s,a){return $(ql(e,"/respond",s),{method:"POST",body:JSON.stringify({sessionId:e,responses:n,tabId:a})})}function vM(e,n,s,a){const r=Xs(ql(e,`/${encodeURIComponent(e)}/stream`,n));let o=null,l=null;const c=()=>{o?.stop(),o=null},d=Lo(r,{onOpen:()=>{c(),o=Fl(e,n)},onMessage:u=>{u.data.startsWith(":")},events:{thinking:u=>{try{s.onThinking?.(JSON.parse(u.data))}catch{s.onThinking?.(u.data)}},question:u=>{try{s.onQuestion?.(JSON.parse(u.data))}catch(h){console.error("[slice-interview] Failed to parse question event:",h)}},summary:u=>{try{s.onSummary?.(JSON.parse(u.data))}catch(h){console.error("[slice-interview] Failed to parse summary event:",h)}},error:u=>{try{const h=JSON.parse(u.data);s.onError?.(h.message||h)}catch{s.onError?.(u.data||"Stream error")}l?.close()},complete:()=>{s.onComplete?.(),l?.close()}}},{maxReconnectAttempts:a?.maxReconnectAttempts,onConnectionStateChange:s.onConnectionStateChange,onFatalError:u=>{c(),s.onError?.(u)}});return l={close:()=>{c(),d.close()},isConnected:d.isConnected},l}function yM(e,n,s){return $(ql(e,"/apply",s),{method:"POST",body:JSON.stringify({sessionId:e,summary:n})})}function wM(e,n){return $(ql(e,"/skip",n),{method:"POST"})}async function kM(e,n){try{return await $(K(`/missions/features/${encodeURIComponent(e)}/preview-description`,n),{method:"POST"})}catch{throw new Error("Preview endpoint not available")}}function Q7(e){return $(K("/todos",e))}function Z7(e,n){const s={title:e};return $(K("/todos",n),{method:"POST",body:JSON.stringify(s)})}function eH(e,n,s){const a={title:n};return $(K(`/todos/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(a)})}function tH(e,n){return $(K(`/todos/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function nH(e,n,s){const a={text:n};return $(K(`/todos/${encodeURIComponent(e)}/items`,s),{method:"POST",body:JSON.stringify(a)})}function sH(e,n,s){const a=n;return $(K(`/todos/items/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(a)})}function iH(e,n){return $(K(`/todos/items/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function aH(e,n,s){return $(K(`/todos/${encodeURIComponent(e)}/items/reorder`,s),{method:"POST",body:JSON.stringify({itemIds:n})})}function Co(e){if(!e)return[];try{const n=JSON.parse(e);return Array.isArray(n)?n:[]}catch{return[]}}async function Ph(e,n){const s=new URLSearchParams;e&&s.set("projectId",e),n?.includeCompleted&&s.set("includeCompleted","1"),n?.includeArchived&&s.set("includeArchived","1");const a=s.toString(),r=await fetch(Xs(`/ai-sessions${a?`?${a}`:""}`),{headers:Gi()});return r.ok?(await r.json()).sessions??[]:[]}async function jM(e){return $(`/ai-sessions/${encodeURIComponent(e)}/archive`,{method:"POST"})}async function NM(e){return $(`/ai-sessions/${encodeURIComponent(e)}/unarchive`,{method:"POST"})}async function ma(e){const n=await fetch(Xs(`/ai-sessions/${encodeURIComponent(e)}`),{headers:Gi()});return n.ok?n.json():null}async function SM(e,n){const s=await $(`/ai-sessions/${encodeURIComponent(e)}/lock`,{method:"POST",body:JSON.stringify({tabId:n})});return{acquired:s.acquired,currentHolder:s.currentHolder??null}}function CM(e,n){return $(`/ai-sessions/${encodeURIComponent(e)}/lock`,{method:"DELETE",body:JSON.stringify({tabId:n})})}function EM(e,n){return $(`/ai-sessions/${encodeURIComponent(e)}/lock/force`,{method:"POST",body:JSON.stringify({tabId:n})})}async function by(e){await fetch(Xs(`/ai-sessions/${encodeURIComponent(e)}`),{method:"DELETE",headers:Gi()})}function _M(e,n){return $(K(`/ai-sessions/${encodeURIComponent(e)}/ping`,n),{method:"POST"})}function MM(e,n,s){return $(K(`/ai-sessions/${encodeURIComponent(e)}/draft`,s),{method:"PATCH",body:JSON.stringify(n)})}function RM(e,n){return $(K(`/planning/${encodeURIComponent(e)}/summarize-draft-title`,n),{method:"POST"})}function AM(e,n){const s=new URLSearchParams;s.set("limit",String(e.limit)),e?.offset!==void 0&&s.set("offset",String(e.offset)),e?.unreadOnly&&s.set("unreadOnly","true"),e?.type&&s.set("type",e.type),n&&s.set("projectId",n);const a=s.size>0?`?${s.toString()}`:"";return $(`/messages/inbox${a}`)}function TM(e,n){const s=new URLSearchParams;s.set("limit",String(e.limit)),e?.offset!==void 0&&s.set("offset",String(e.offset)),e?.type&&s.set("type",e.type),n&&s.set("projectId",n);const a=s.size>0?`?${s.toString()}`:"";return $(`/messages/outbox${a}`)}function xy(e){return $(K("/messages/unread-count",e))}function IM(e,n){return $(K("/messages",n),{method:"POST",body:JSON.stringify(e)})}function PM(e,n){return $(K(`/messages/${encodeURIComponent(e)}/read`,n),{method:"POST"})}function $M(e){return $(K("/messages/read-all",e),{method:"POST"})}function DM(e,n){return $(K(`/messages/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function LM(e,n,s){const a=`/messages/conversation/${encodeURIComponent(n)}/${encodeURIComponent(e)}`;return $(K(a,s))}function OM(e,n){return $(K(`/agents/${encodeURIComponent(e)}/mailbox`,n))}function FM(e){return $(K("/agents/mailbox/all",e))}function ac(e,n){const s=new URLSearchParams;e?.status&&s.set("status",e.status),e?.limit!==void 0&&s.set("limit",String(e.limit)),e?.offset!==void 0&&s.set("offset",String(e.offset)),n&&s.set("projectId",n);const a=s.size>0?`?${s.toString()}`:"";return $(`/approvals${a}`)}function jp(e,n){return $(K(`/approvals/${encodeURIComponent(e)}`,n))}function zM(e,n,s){return $(K(`/approvals/${encodeURIComponent(e)}/decision`,s),{method:"POST",body:JSON.stringify(n)})}function rH(e,n,s){const a=new URLSearchParams;a.set("limit",String(n)),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/reflections${r}`)}function oH(e,n){return $(K(`/agents/${encodeURIComponent(e)}/reflections`,n),{method:"POST"})}function lH(e,n,s){const a=new URLSearchParams;s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/performance${r}`)}function cH(e,n,s){const a=new URLSearchParams;a.set("limit",String(n.limit)),n?.category&&a.set("category",n.category),s&&a.set("projectId",s);const r=a.size>0?`?${a.toString()}`:"";return $(`/agents/${encodeURIComponent(e)}/ratings${r}`)}function dH(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/ratings`,s),{method:"POST",body:JSON.stringify(n)})}function uH(e,n){return $(K(`/agents/${encodeURIComponent(e)}/ratings/summary`,n))}function mH(e,n,s){return $(K(`/agents/${encodeURIComponent(e)}/ratings/${encodeURIComponent(n)}`,s),{method:"DELETE"})}function hH(e,n){return $(K(`/agents/${encodeURIComponent(e)}/budget`,n))}function fH(e,n){return $(K(`/agents/${encodeURIComponent(e)}/budget/reset`,n),{method:"POST"})}async function pH(e){return $(K("/plugins",e))}async function gH(e,n){return $(K("/plugins",n),{method:"POST",body:JSON.stringify({mode:"install",...e})})}async function bH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/enable`,n),{method:"POST"})}async function xH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/disable`,n),{method:"POST"})}async function vH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}`,n),{method:"DELETE"})}async function yH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/settings`,n))}async function wH(e,n,s){return $(K(`/plugins/${encodeURIComponent(e)}/settings`,s),{method:"PUT",body:JSON.stringify({settings:n})})}async function kH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/setup-status`,n))}async function jH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/setup/install`,n),{method:"POST"})}async function NH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/reload`,n),{method:"POST"})}async function SH(e,n,s){return $(K(`/plugins/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}async function CH(e,n){return $(K(`/plugins/${encodeURIComponent(e)}/rescan`,n),{method:"POST"})}async function BM(e){const n=K("/plugins/ui-slots",e);return Zi(n,()=>$(n))}async function UM(e){return $(K("/plugins/dashboard-views",e))}async function EH(e){return $(K("/plugins/runtimes",e))}async function HM(e){return(await $(K("/skills/discovered",e))).skills}async function _H(e,n,s){return $(K("/skills/execution",s),{method:"PATCH",body:JSON.stringify({skillId:e,enabled:n})})}async function MH(e,n,s){const a=new URLSearchParams;e&&a.set("q",e),a.set("limit",String(n));const r=a.size>0?`?${a.toString()}`:"";return $(K(`/skills/catalog${r}`,s))}async function RH(e,n){return(await $(K(`/skills/${encodeURIComponent(e)}/content`,n))).content}function Np(e,n){const s=new URLSearchParams;e&&s.set("projectId",e);const a=s.toString();return $(`/chat/sessions${a?`?${a}`:""}`)}async function qM(e,n){const s=e.agentId.trim();if(!s)throw new Error("agentId is required");const a=e.modelProvider?.trim(),r=e.modelId?.trim();if(a&&!r||!a&&r)throw new Error("Both modelProvider and modelId must be provided together, or neither should be provided");const o=new URLSearchParams;return o.set("lookup","resume"),o.set("agentId",s),n&&o.set("projectId",n),a&&r&&(o.set("modelProvider",a),o.set("modelId",r)),{session:(await $(`/chat/sessions?${o.toString()}`)).sessions[0]??null}}function VM(e,n){return $(K("/chat/sessions",n),{method:"POST",body:JSON.stringify(e)})}function rc(e,n){return $(K(`/chat/sessions/${encodeURIComponent(e)}`,n))}function AH(e,n,s){return $(K(`/chat/sessions/${encodeURIComponent(e)}`,s),{method:"PATCH",body:JSON.stringify(n)})}function TH(e,n){return $(K(`/chat/sessions/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function Wo(e,n,s){const a=new URLSearchParams;n?.limit!==void 0&&a.set("limit",String(n.limit)),n?.offset!==void 0&&a.set("offset",String(n.offset)),n?.before&&a.set("before",n.before),n?.order&&a.set("order",n.order);const r=a.toString();return $(K(`/chat/sessions/${encodeURIComponent(e)}/messages${r?`?${r}`:""}`,s))}function WM(e={},n){const s=new URLSearchParams;n&&s.set("projectId",n),e.status&&s.set("status",e.status),e.agentId&&s.set("agentId",e.agentId);const a=s.toString();return $(`/chat/rooms${a?`?${a}`:""}`)}function GM(e,n){const s={...e,...n?{projectId:n}:{}};return $(K("/chat/rooms",n),{method:"POST",body:JSON.stringify(s)})}function KM(e,n){return $(K(`/chat/rooms/${encodeURIComponent(e)}`,n),{method:"DELETE"})}function JM(e,n){return $(K(`/chat/rooms/${encodeURIComponent(e)}/members`,n))}function nu(e,n,s){const a=new URLSearchParams;n?.limit!==void 0&&a.set("limit",String(n.limit)),n?.offset!==void 0&&a.set("offset",String(n.offset)),n?.before&&a.set("before",n.before),n?.order&&a.set("order",n.order);const r=a.toString();return $(K(`/chat/rooms/${encodeURIComponent(e)}/messages${r?`?${r}`:""}`,s))}async function YM(e,n,s){const a=new FormData;a.append("file",n);const r=await fetch(Xs(K(`/chat/rooms/${encodeURIComponent(e)}/attachments`,s)),{method:"POST",headers:Gi(),body:a}),o=await r.json();if(!r.ok)throw new Error(o.error||"Upload failed");return o}function XM(e,n){return Xs(K(`/chat/rooms/${encodeURIComponent(e)}/attachments/`,n))}function QM(e,n,s){return $(K(`/chat/rooms/${encodeURIComponent(e)}/messages`,s),{method:"POST",body:JSON.stringify(n)})}function ZM(e,n){return $(K(`/chat/rooms/${encodeURIComponent(e)}/messages`,n),{method:"DELETE"})}function eR(e,n){return $(K(`/chat/sessions/${encodeURIComponent(e)}/cancel`,n),{method:"POST"})}function tR(e){if(!e||typeof e!="object")return null;const n=e,s=typeof n.summary=="string"?n.summary.trim():"";if(!s)return null;const a=(()=>{const r=n.reference;if(!r||typeof r!="object")return;const o=r,l=typeof o.kind=="string"?o.kind.trim():"",c=typeof o.id=="string"?o.id.trim():"";if(!(!l||!c))return{kind:l,id:c,...typeof o.label=="string"&&o.label.trim()?{label:o.label.trim()}:{}}})();return{summary:s,...typeof n.errorClass=="string"&&n.errorClass.trim()?{errorClass:n.errorClass.trim()}:{},...typeof n.code=="string"&&n.code.trim()?{code:n.code.trim()}:{},...typeof n.detail=="string"&&n.detail.trim()?{detail:n.detail.trim()}:{},...a?{reference:a}:{}}}function vy(e){try{const n=JSON.parse(e),s=tR(n);return s||(n&&typeof n=="object"&&typeof n.message=="string"?n.message:typeof n=="string"?n:e||"Stream error")}catch{return e||"Stream error"}}function nR(e,n,s,a,r,o){const l=Xs(K(`/chat/sessions/${encodeURIComponent(e)}/messages`,r)),c=new AbortController;let d=!1,u=!1,h=!1;const m=Math.max(1e3,6e4);let f=null;const p=()=>{f&&(clearTimeout(f),f=null)},b=()=>{h||(h=!0,p())},v=(x,y)=>{if(x)switch(b(),x){case"thinking":try{s.onThinking?.(JSON.parse(y))}catch{s.onThinking?.(y)}break;case"text":try{s.onText?.(JSON.parse(y))}catch{s.onText?.(y)}break;case"tool_start":try{s.onToolStart?.(JSON.parse(y))}catch{}break;case"tool_end":try{s.onToolEnd?.(JSON.parse(y))}catch{}break;case"fallback":try{s.onFallback?.(JSON.parse(y))}catch{}break;case"done":u=!0;try{const g=JSON.parse(y);s.onDone?.({messageId:typeof g.messageId=="string"?g.messageId:"",...g.message&&typeof g.message=="object"?{message:g.message}:{}})}catch{s.onDone?.({messageId:""})}break;case"error":u=!0,s.onError?.(vy(y));break}};return(async()=>{try{const x=Array.isArray(a)&&a.length>0,y=x?(()=>{const E=new FormData;return E.append("content",n),a.forEach(M=>E.append("attachments",M)),E})():JSON.stringify({content:n}),g=await fetch(l,{method:"POST",headers:x?Gi():Gi({"Content-Type":"application/json"}),body:y,signal:c.signal});if(!g.ok){const E=await g.text();let M=`Request failed: ${g.status}`;try{M=JSON.parse(E).error||M}catch{}s.onError?.(M);return}if(!g.body){s.onError?.("No response body");return}s.onConnectionStateChange?.("connected"),f=setTimeout(()=>{u||d||h||(u=!0,s.onError?.("Timed out waiting for first response event"),c.abort())},m);const j=g.body.getReader(),N=new TextDecoder;let C="",w="",S=[];const R=(E,M=!1)=>{C+=E;const G=C.split(`
668
668
  `);C=G.pop()||"",M&&C.length>0&&(G.push(C),C="");for(const U of G){const P=U.endsWith("\r")?U.slice(0,-1):U;if(P.startsWith("event:"))w=P.slice(6).trim();else if(P.startsWith("data:")){const T=P.slice(5);S.push(T.startsWith(" ")?T.slice(1):T)}else if(P===""){const T=S.join(`
669
669
  `);v(w,T),w="",S=[]}}if(M&&w&&S.length>0){const U=S.join(`
670
670
  `);v(w,U),w="",S=[]}};for(;;){const{done:E,value:M}=await j.read();if(E){R(N.decode(),!0);break}R(N.decode(M,{stream:!0}))}const I=C.length>0||w.length>0||S.length>0;!u&&!d&&!I&&s.onError?.("Connection closed unexpectedly"),p()}catch(x){if(x instanceof DOMException&&x.name==="AbortError"){!d&&!u&&s.onError?.("Connection aborted"),p();return}if(d){p();return}p(),s.onError?.(x instanceof Error?x.message:"Connection error")}})(),{close:()=>{d=!0,p(),c.abort()},isConnected:()=>!d}}function sR(e,n,s,a){const r=Xs(K(`/chat/sessions/${encodeURIComponent(e)}/stream`,s)),o=new AbortController;let l=!1,c=!1;const d=(u,h)=>{if(u)switch(u){case"thinking":try{n.onThinking?.(JSON.parse(h))}catch{n.onThinking?.(h)}break;case"text":try{n.onText?.(JSON.parse(h))}catch{n.onText?.(h)}break;case"tool_start":try{n.onToolStart?.(JSON.parse(h))}catch{}break;case"tool_end":try{n.onToolEnd?.(JSON.parse(h))}catch{}break;case"fallback":try{n.onFallback?.(JSON.parse(h))}catch{}break;case"done":c=!0;try{const m=JSON.parse(h);n.onDone?.({messageId:typeof m.messageId=="string"?m.messageId:"",...m.message&&typeof m.message=="object"?{message:m.message}:{}})}catch{n.onDone?.({messageId:""})}break;case"error":c=!0,n.onError?.(vy(h));break}};return(async()=>{try{const u=new Headers(Gi());typeof a?.lastEventId=="number"&&u.set("Last-Event-ID",String(a.lastEventId));const h=await fetch(r,{method:"GET",headers:u,signal:o.signal});if(!h.ok){const g=await h.text();let j=`Request failed: ${h.status}`;try{j=JSON.parse(g).error||j}catch{}n.onError?.(j);return}if(!h.body){n.onError?.("No response body");return}n.onConnectionStateChange?.("connected");const m=h.body.getReader(),f=new TextDecoder;let p="",b="",v=[];const x=(g,j=!1)=>{p+=g;const N=p.split(`
@@ -716,7 +716,7 @@ Delete anyway by unlinking these references first?`,danger:!0}))return;try{await
716
716
  `).map((s,a)=>{let r="";return s.startsWith("+")&&!s.startsWith("+++")?r="diff-add":s.startsWith("-")&&!s.startsWith("---")?r="diff-del":s.startsWith("@@")&&(r="diff-hunk"),r?t.jsx("span",{className:r,children:`${s}
717
717
  `},a):t.jsx(Ja.Fragment,{children:`${s}
718
718
  `},a)})}function G4(e){switch(e){case"added":return"A";case"deleted":return"D";case"modified":return"M";default:return"?"}}function K4({isOpen:e,taskId:n,files:s,stats:a,mergeDetails:r,column:o,onClose:l,onRefresh:c}){const[d,u]=i.useState(null),[h,m]=i.useState(!0),f=i.useRef(null);ea(f,e,"fusion:changes-diff-modal-size");const p=Aa(l);i.useEffect(()=>{s.length>0&&d===null&&u(0)},[s,d]);const b=i.useCallback(()=>{u(g=>g!==null&&g>0?g-1:g)},[]),v=i.useCallback(()=>{u(g=>g!==null&&g<s.length-1?g+1:g)},[]);if(i.useEffect(()=>{if(!e)return;const g=j=>{if(j.key==="Escape"){l();return}j.key==="ArrowUp"&&(j.metaKey||j.ctrlKey)&&(j.preventDefault(),b()),j.key==="ArrowDown"&&(j.metaKey||j.ctrlKey)&&(j.preventDefault(),v())};return document.addEventListener("keydown",g),()=>document.removeEventListener("keydown",g)},[e,l,b,v]),!e)return null;const x=d!==null?s[d]:null,y=o==="done";return t.jsx("div",{className:"modal-overlay open",...p,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal changes-diff-modal",ref:f,children:[t.jsxs("div",{className:"modal-header changes-diff-modal-header",children:[t.jsxs("div",{className:"changes-diff-header-title",children:[t.jsx(Yi,{size:18}),t.jsxs("span",{children:["Changes — ",n]}),t.jsxs("span",{className:"changes-stat-summary",children:[t.jsxs("span",{className:"diff-add",children:["+",a.additions]})," ",t.jsxs("span",{className:"diff-del",children:["-",a.deletions]})]})]}),t.jsxs("div",{className:"changes-diff-header-actions",children:[s.length>0&&t.jsxs("div",{className:"changes-nav",children:[t.jsx("button",{className:"btn btn-sm btn-icon",onClick:b,disabled:d===null||d<=0,title:"Previous file (Ctrl+↑)","aria-label":"Previous file",children:t.jsx(wd,{})}),t.jsx("span",{className:"changes-nav-indicator","aria-live":"polite",children:d!==null?`${d+1}/${s.length}`:`—/${s.length}`}),t.jsx("button",{className:"btn btn-sm btn-icon",onClick:v,disabled:d===null||d>=s.length-1,title:"Next file (Ctrl+↓)","aria-label":"Next file",children:t.jsx(ps,{})})]}),t.jsx("button",{className:`btn btn-sm ${h?"btn-primary":""}`,onClick:()=>m(g=>!g),title:h?"Disable word wrap":"Enable word wrap","aria-label":"Toggle word wrap",children:t.jsx(Eh,{size:14})}),c&&t.jsxs("button",{className:"btn btn-sm",onClick:c,children:[t.jsx(Ss,{size:14}),"Refresh"]}),t.jsx("button",{className:"modal-close",onClick:l,"aria-label":"Close",children:t.jsx(Nn,{size:20})})]})]}),t.jsxs("div",{className:"changes-diff-body",children:[t.jsxs("div",{className:"changes-diff-sidebar",children:[y&&r&&t.jsxs("div",{className:"commit-diff-meta",children:[r.commitSha&&t.jsxs("div",{className:"commit-diff-sha",children:[t.jsx(yo,{size:14}),t.jsx("code",{children:r.commitSha.slice(0,7)})]}),r.mergeCommitMessage&&t.jsx("div",{className:"commit-diff-message",children:r.mergeCommitMessage}),r.mergedAt&&t.jsxs("div",{className:"commit-diff-timestamp",children:["Merged ",new Date(r.mergedAt).toLocaleString()]})]}),t.jsx("div",{className:"changes-diff-file-list",children:s.map((g,j)=>t.jsxs("button",{className:`changes-diff-file-item ${d===j?"selected":""}`,onClick:()=>u(j),title:g.path,children:[t.jsx("span",{className:`changes-file-status changes-file-status--${g.status}`,children:G4(g.status)}),t.jsx("span",{className:"changes-diff-file-path",title:g.path,children:t.jsx("bdo",{dir:"ltr",children:g.path})}),t.jsxs("span",{className:"changes-diff-file-stat",children:["+",g.additions," -",g.deletions]})]},g.path))})]}),t.jsx("div",{className:"changes-diff-content",children:x?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"changes-diff-file-header-bar",children:[t.jsx("span",{className:"changes-diff-file-header-name",children:x.path}),t.jsxs("span",{className:"changes-diff-file-header-stats",children:["+",x.additions," -",x.deletions]})]}),x.patch?t.jsx("div",{className:"changes-diff-viewer",children:t.jsx("pre",{className:`changes-diff-patch ${h?"changes-diff-patch--wrap":"changes-diff-patch--nowrap"}`,children:t.jsx("code",{children:pk(x.patch)})})}):t.jsx("div",{className:"changes-diff-empty",children:"No diff available for this file."})]}):t.jsxs("div",{className:"changes-diff-empty",children:[t.jsx(Yi,{size:48,opacity:.3}),t.jsx("p",{children:"Select a file to view its diff"})]})})]})]})})}function gk(e){switch(e){case"added":return"A";case"deleted":return"D";case"modified":return"M";default:return"?"}}function Bu(e,n,s,a="execution"){return t.jsxs("div",{className:"detail-section task-changes-tab",children:[n&&s&&t.jsxs("div",{className:"commit-diff-meta",children:[s.commitSha&&t.jsxs("div",{className:"commit-diff-sha",children:[t.jsx(yo,{size:14}),t.jsx("code",{children:s.commitSha.slice(0,7)})]}),s.mergedAt&&t.jsxs("div",{className:"commit-diff-timestamp",children:["Merged ",new Date(s.mergedAt).toLocaleString()]})]}),t.jsxs("div",{className:"task-changes-state task-changes-state--empty",children:[t.jsx(Yi,{size:24}),t.jsxs("p",{children:[e.length," file",e.length===1?"":"s"," changed."]}),t.jsx("span",{className:"task-changes-state-hint",children:n?a==="landed"?"These are files captured from the merged commit metadata. The lineage-backed diff is unavailable for this task.":"These are files captured from the worktree during execution. They may differ from the files that actually landed on main. The lineage-backed diff is unavailable for this task.":"The live worktree diff is empty. Showing the last file paths captured during execution — patches unavailable."})]}),t.jsx("div",{className:"changes-file-list task-changes-file-list--compact",children:e.map(r=>t.jsx("div",{className:"changes-file-item",children:t.jsxs("div",{className:"changes-file-header changes-file-header--static",children:[t.jsx("span",{className:"changes-file-status changes-file-status--unknown",title:"status unknown",children:gk("unknown")}),t.jsx("span",{className:"changes-file-path",title:r,children:t.jsx("bdo",{dir:"ltr",children:r})})]})},r))})]})}function J4({taskId:e,worktree:n,projectId:s,column:a,mergeDetails:r,modifiedFiles:o}){const[l,c]=i.useState([]),[d,u]=i.useState({filesChanged:0,additions:0,deletions:0}),[h,m]=i.useState(!0),[f,p]=i.useState(null),[b,v]=i.useState([]),[x,y]=i.useState(null),[g,j]=i.useState(new Set),[N,C]=i.useState(null),[w,S]=i.useState(!0),[R,I]=i.useState(!1),E=a==="done",M=E&&!!r?.commitSha,G=a==="in-progress"||a==="in-review"||E,U=i.useCallback(async()=>{if(!G&&!E){m(!1);return}try{m(!0),p(null);const L=await C_(e,s);if(y(L.lineageId),v(L.associations),!G){c([]),u({filesChanged:0,additions:0,deletions:0});return}const _=await fy(e,void 0,s),F=_.files.map(ae=>({path:ae.path,status:ae.status,additions:ae.additions,deletions:ae.deletions,patch:ae.patch}));c(F),u(_.stats),F.length>0&&(j(new Set([F[0].path])),C(0))}catch(L){E&&!r?.commitSha?(c([]),u({filesChanged:0,additions:0,deletions:0}),p(null)):p(Ce(L)||"Failed to load task changes")}finally{m(!1)}},[e,s,G,E,r?.commitSha]);i.useEffect(()=>{U()},[U]);const P=L=>{j(_=>{const F=new Set(_);if(F.has(L))F.delete(L);else{F.add(L);const ae=l.findIndex(k=>k.path===L);ae!==-1&&C(ae)}return F})},T=L=>{if(L<0||L>=l.length)return;const _=l[L].path;j(new Set([_])),C(L)},D=N!==null&&N>0,W=N!==null&&N<l.length-1;if(h)return t.jsx("div",{className:"detail-section",children:t.jsxs("div",{className:"task-changes-state task-changes-state--loading",children:[t.jsx("div",{className:"loading-spinner"}),t.jsx("span",{children:"Loading changes..."})]})});if(f)return t.jsx("div",{className:"detail-section",children:t.jsxs("div",{className:"task-changes-state task-changes-state--error",children:[t.jsx(oi,{size:16}),t.jsxs("span",{children:["Error loading changes: ",f]})]})});if(!E&&!n&&l.length===0)return o&&o.length>0?Bu(o,!1):t.jsx("div",{className:"detail-section",children:t.jsxs("div",{className:"task-changes-state task-changes-state--empty",children:[t.jsx(Yi,{size:24}),t.jsx("p",{children:"No worktree available for this task."}),t.jsx("span",{className:"task-changes-state-hint",children:"Changes will be shown once the task is in progress."})]})});const Y=()=>t.jsxs("section",{className:"task-lineage-associations","aria-label":"Task commit associations",children:[t.jsxs("div",{className:"task-lineage-associations-header",children:[t.jsxs("h4",{children:[t.jsx(yo,{size:16}),"Lineage commit associations"]}),x&&t.jsx("code",{className:"task-lineage-id",children:x})]}),b.length===0?t.jsx("p",{className:"task-lineage-associations-empty",children:"No associated commits recorded yet."}):t.jsx("div",{className:"task-lineage-associations-list",children:b.map(L=>{const _=L.matchedBy.replace(/-/g," ");return t.jsxs("article",{className:`task-lineage-association task-lineage-association--${L.confidence}`,children:[t.jsxs("div",{className:"task-lineage-association-main",children:[t.jsx("code",{className:"task-lineage-sha",children:L.commitSha.slice(0,7)}),t.jsx("span",{className:"task-lineage-subject",children:L.commitSubject})]}),t.jsxs("div",{className:"task-lineage-association-meta",children:[t.jsx("span",{children:new Date(L.authoredAt).toLocaleString()}),t.jsxs("span",{children:["Confidence: ",L.confidence]}),t.jsxs("span",{children:["Match: ",_]}),t.jsxs("span",{children:["Task snapshot: ",L.taskIdSnapshot]})]}),L.note&&t.jsx("p",{className:"task-lineage-note",children:L.note})]},`${L.commitSha}-${L.matchedBy}`)})})]});if(l.length===0){if(E&&!M){const L=r?.landedFiles&&r.landedFiles.length>0?r.landedFiles:o;if(L&&L.length>0)return Bu(L,!0,r,r?.landedFiles?.length?"landed":"execution");const _=r?.filesChanged,F=r?.insertions,ae=r?.deletions,k=_!=null||F!=null||ae!=null;return t.jsx("div",{className:"detail-section",children:t.jsxs("div",{className:"task-changes-state task-changes-state--empty",children:[t.jsx(Yi,{size:24}),t.jsx("p",{children:"Detailed file changes unavailable."}),t.jsx("span",{className:"task-changes-state-hint",children:k?`Final commit summary: ${_??0} file${(_??0)===1?"":"s"} changed, +${F??0} additions, -${ae??0} deletions. Counts only the recorded merge/squash commit, not the full task lineage.`:"No merge commit was recorded for this task."})]})})}return!E&&o&&o.length>0?Bu(o,E,r):t.jsxs("div",{className:"detail-section task-changes-tab",children:[Y(),t.jsxs("div",{className:"task-changes-state task-changes-state--empty",children:[t.jsx(Yi,{size:24}),t.jsx("p",{children:"No files modified."}),t.jsx("span",{className:"task-changes-state-hint",children:E?"No file changes were recorded in the merge commit.":"The agent did not modify any files during execution."})]})]})}return t.jsxs("div",{className:"detail-section task-changes-tab",children:[Y(),E&&r&&t.jsxs("div",{className:"commit-diff-meta",children:[r.commitSha&&t.jsxs("div",{className:"commit-diff-sha",children:[t.jsx(yo,{size:14}),t.jsx("code",{children:r.commitSha.slice(0,7)})]}),r.mergeCommitMessage&&t.jsx("div",{className:"commit-diff-message",children:r.mergeCommitMessage}),r.mergedAt&&t.jsxs("div",{className:"commit-diff-timestamp",children:["Merged ",new Date(r.mergedAt).toLocaleString()]}),r.noOpVerifiedShortCircuit&&t.jsx("div",{className:"text-muted",children:"Verified short-circuit — work was already on main (rebase walked foreign commits)."}),r.landedFilesCaptureFallback==="attribution-failed"&&t.jsx("div",{className:"text-muted",children:"Landed-files set may include foreign commits (attribution unavailable)."})]}),t.jsxs("div",{className:"changes-header",children:[t.jsxs("div",{className:"task-changes-header-title",children:[t.jsxs("h4",{children:[t.jsx(Yi,{size:16}),"Files Changed (",d.filesChanged,")"]}),t.jsxs("span",{className:"task-changes-stats changes-stat-summary",children:[t.jsxs("span",{className:"diff-add",children:["+",d.additions]})," ",t.jsxs("span",{className:"diff-del",children:["-",d.deletions]})]})]}),t.jsxs("div",{className:"changes-header-actions-wrapper",children:[t.jsxs("div",{className:"changes-header-actions",children:[l.length>0&&t.jsxs("div",{className:"changes-nav",children:[t.jsx("button",{className:"btn btn-sm btn-icon",onClick:()=>D&&T(N-1),disabled:!D,title:"Previous file","aria-label":"Previous file",children:t.jsx(wd,{})}),t.jsx("span",{className:"changes-nav-indicator","aria-live":"polite",children:N!==null?`${N+1}/${l.length}`:`—/${l.length}`}),t.jsx("button",{className:"btn btn-sm btn-icon",onClick:()=>W&&T(N+1),disabled:!W,title:"Next file","aria-label":"Next file",children:t.jsx(ps,{})})]}),t.jsx("button",{className:`btn btn-sm ${w?"btn-primary":""}`,onClick:()=>S(L=>!L),title:w?"Disable word wrap":"Enable word wrap","aria-label":"Toggle word wrap",children:t.jsx(Eh,{size:14})})]}),t.jsxs("div",{className:"changes-header-actions-secondary",children:[t.jsx("button",{className:"btn btn-sm",onClick:U,disabled:h,children:"Refresh"}),t.jsx("button",{className:"btn btn-sm btn-icon",onClick:()=>I(!0),title:"Expand to full-screen diff view","aria-label":"Expand diff view",children:t.jsx(Cd,{})})]})]})]}),t.jsx("div",{className:"changes-file-list task-changes-file-list--compact",children:l.map(L=>{const _=g.has(L.path);return t.jsxs("div",{className:`changes-file-item ${_?"expanded":""}`,children:[t.jsxs("button",{className:"changes-file-header",onClick:()=>P(L.path),children:[t.jsx("span",{className:"changes-file-toggle",children:_?t.jsx(Ln,{size:14}):t.jsx(ps,{size:14})}),t.jsx("span",{className:`changes-file-status changes-file-status--${L.status}`,title:L.status,children:gk(L.status)}),t.jsx("span",{className:"changes-file-path",title:L.path,children:t.jsx("bdo",{dir:"ltr",children:L.path})}),t.jsxs("span",{className:"changes-file-stat",title:`+${L.additions} -${L.deletions}`,children:["+",L.additions," -",L.deletions]})]}),_&&L.patch&&t.jsx("div",{className:"changes-file-content",children:t.jsx("pre",{className:`changes-diff-patch ${w?"changes-diff-patch--wrap":"changes-diff-patch--nowrap"}`,children:t.jsx("code",{children:pk(L.patch)})})})]},L.path)})}),t.jsx(K4,{isOpen:R,taskId:e,files:l,stats:d,mergeDetails:r,column:a,onClose:()=>I(!1),onRefresh:U})]})}function vb(e){return{executorValue:e?.executorProvider&&e?.executorModelId?`${e.executorProvider}/${e.executorModelId}`:"",validatorValue:e?.validatorProvider&&e?.validatorModelId?`${e.validatorProvider}/${e.validatorModelId}`:""}}function Y4(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/-+/g,"-").replace(/^[-_]+|[-_]+$/g,"").slice(0,32)||"preset"}function sq(e,n){const s=Y4(e),a=new Set(n.map(c=>c.id));if(!a.has(s))return s;const r=30;let o=s,l=1;for(;a.has(o)&&l<100;){const c=`-${l}`;o=`${s.slice(0,r-c.length)}${c}`,l++}return o}function yb(e){const n=e?.trim()??"";return _d.test(n)?n:""}function bk(e,n){const s=yb(e?.githubTrackingDefaultRepo);return s||yb(n?.githubTrackingDefaultRepo)}function X4(e){return e==="online"?"Online":e==="connecting"?"Connecting":e==="error"?"Error":"Offline"}const wb=["image/png","image/jpeg","image/gif","image/webp"];function Q4(e,n,s){const a=e==="post-merge"?"phase-badge--post-merge":"phase-badge--pre-merge";return t.jsx("span",{className:`phase-badge ${a}`,"data-testid":`${s}-${n}`,children:e==="post-merge"?"Post-merge":"Pre-merge"})}function xk({mode:e,description:n,onDescriptionChange:s,title:a,onTitleChange:r,dependencies:o,onDependenciesChange:l,branch:c,onBranchChange:d,branchMode:u,onBranchModeChange:h,baseBranch:m,onBaseBranchChange:f,nodeId:p,onNodeIdChange:b,nodeOptions:v,nodeOverrideDisabled:x=!1,nodeOverrideDisabledReason:y,priority:g,onPriorityChange:j,executorModel:N,onExecutorModelChange:C,validatorModel:w,onValidatorModelChange:S,planningModel:R,onPlanningModelChange:I,thinkingLevel:E,onThinkingLevelChange:M,presetMode:G,onPresetModeChange:U,selectedPresetId:P,onSelectedPresetIdChange:T,selectedWorkflowSteps:D,onWorkflowStepsChange:W,onDefaultOnApplied:Y,pendingImages:L,onImagesChange:_,tasks:F,projectId:ae,disabled:k=!1,addToast:z,isActive:J=!0,onAutoSaveDescription:oe,onPlanningMode:le,onSubtaskBreakdown:we,onClose:re,renderBelowPrimary:H,renderBelowModelConfiguration:ue,hideDependencies:Q,autoExpandMoreOptionsOnSelection:be=!0,reviewLevel:fe,onReviewLevelChange:O,executionMode:se,onExecutionModeChange:ve,githubTrackingEnabled:A,onGithubTrackingEnabledChange:ne,githubRepoOverride:ye,onGithubRepoOverrideChange:ee}){const ge=(Q?!1:o.length>0)||L.length>0||D.length>0||G!=="default"||(g??di)!==di||N!==""||w!==""||(R||"")!==""||(E||"")!==""||fe!==void 0||se==="fast"||(c||"")!==""||(m||"")!==""||(p||"")!==""||A===!0||(ye||"")!=="",[Ne,He]=i.useState(!1),[Le,de]=i.useState(be?ge:!1),[Re,Pe]=i.useState(""),[rt,qe]=i.useState([]),[Xe,At]=i.useState([]),[at,Se]=i.useState([]),[pe,_e]=i.useState(!1),[et,Ae]=i.useState(null),[it,xt]=i.useState(null),[Nt,Ut]=i.useState([]),[Be,Z]=i.useState("idle"),[Oe,ht]=i.useState(!1),[je,mt]=i.useState(!1),[Et,Te]=i.useState(!1),xe=i.useRef(null),gt=i.useRef(null),_t=i.useRef(null),Ft=i.useRef(null),Dt=i.useRef(null),nt=i.useRef(null),Wt=i.useRef(null),Mt=i.useRef(!1),Kt=i.useRef(ge),xn=i.useRef(n.trim()),Tn=i.useRef(n.trim());i.useEffect(()=>{J&&(_e(!0),Ki().then(ce=>{qe(ce.models),At(ce.favoriteProviders),Se(ce.favoriteModels)}).catch(()=>{}).finally(()=>_e(!1)),Md(ae).then(ce=>Ae(ce)).catch(()=>Ae(null)),Bl(ae).then(ce=>Ut(ce.filter(Ge=>Ge.enabled))).catch(()=>Ut([])),Ra().then(ce=>xt(ce)).catch(()=>xt(null)))},[J,ae]);const Sn=et?.modelPresets||[],is=Sn.find(ce=>ce.id===P),On=bk(et,it),un=(ye||"").trim(),tn=un.length>0&&!_d.test(un),on=(Q?!1:o.length>0)||L.length>0||D.length>0||G!=="default"||(g??di)!==di||N!==""||w!==""||(R||"")!==""||(E||"")!==""||fe!==void 0||se==="fast"||(c||"")!==""||(m||"")!==""||(p||"")!==""||A===!0||(ye||"")!=="";i.useEffect(()=>{if(e!=="create"||!J||!et?.autoSelectModelPreset)return;const ce=(et.defaultPresetBySize,void 0);if(ce){const Ge=vb(ce);T(ce.id),U("preset"),C(Ge.executorValue),S(Ge.validatorValue)}},[J,et,Sn,e]);const pn=i.useRef(!1),mn=i.useRef(!1);i.useEffect(()=>{if(e!=="create"||!J||pn.current||Nt.length===0)return;const ce=Nt.filter(Me=>Me.defaultOn);if(ce.length===0)return;pn.current=!0;const Ge=ce.map(Me=>Me.id);W(Ge),Y?.(Ge)},[e,J,Nt]),i.useEffect(()=>{J||(pn.current=!1)},[J]),i.useEffect(()=>{e!=="create"||!J||ne&&(mn.current||et&&(ne(et.githubTrackingEnabledByDefault??!1),mn.current=!0))},[e,J,et,ne]),i.useEffect(()=>{J||(mn.current=!1)},[J]),i.useEffect(()=>{if(!be){Kt.current=on;return}on&&!Kt.current&&de(!0),Kt.current=on},[on,be]),i.useEffect(()=>{Le||(He(!1),Pe(""))},[Le]),i.useEffect(()=>{e!=="edit"||!J||Ft.current&&(Ft.current.focus(),Ft.current.select())},[e,J]),i.useEffect(()=>{if(!Ne)return;const ce=Ge=>{gt.current&&!gt.current.contains(Ge.target)&&He(!1)};return document.addEventListener("mousedown",ce),()=>document.removeEventListener("mousedown",ce)},[Ne]),i.useEffect(()=>{(e!=="edit"||k)&&Te(!1)},[e,k]),i.useEffect(()=>{if(e!=="edit"){Z("idle");return}const ce=n.trim();xn.current=ce,Tn.current=ce,Z("idle")},[e]),i.useEffect(()=>{if(e!=="edit"||!oe||!J)return;const ce=n.trim(),Ge=xn.current;if(ce===Ge||ce===Tn.current){nt.current&&(clearTimeout(nt.current),nt.current=null),Mt.current||Z("idle");return}return nt.current&&clearTimeout(nt.current),nt.current=setTimeout(async()=>{if(!Mt.current){Mt.current=!0,Z("saving");try{await oe(ce),Tn.current=ce,Z("saved"),Wt.current&&clearTimeout(Wt.current),Wt.current=setTimeout(()=>{Z("idle"),Wt.current=null},2e3)}catch{Z("idle")}finally{Mt.current=!1,nt.current=null}}},1500),()=>{nt.current&&(clearTimeout(nt.current),nt.current=null)}},[e,n,oe,J]),i.useEffect(()=>()=>{nt.current&&clearTimeout(nt.current),Wt.current&&clearTimeout(Wt.current)},[]),i.useEffect(()=>{if(!Oe)return;const ce=Ge=>{xe.current&&!xe.current.contains(Ge.target)&&ht(!1)};return document.addEventListener("mousedown",ce),()=>document.removeEventListener("mousedown",ce)},[Oe]);const Zn=i.useCallback(ce=>{const Ge=ce.clipboardData?.items;if(Ge)for(let Me=0;Me<Ge.length;Me++){const Ke=Ge[Me];if(Ke.type.startsWith("image/")){const Qe=Ke.getAsFile();if(Qe&&wb.includes(Qe.type)){ce.preventDefault(),_([...L,{file:Qe,previewUrl:URL.createObjectURL(Qe)}]);return}}}},[L,_]),In=i.useCallback(ce=>{ce.preventDefault();const Ge=ce.dataTransfer.files;for(let Me=0;Me<Ge.length;Me++){const Ke=Ge[Me];if(wb.includes(Ke.type)){_([...L,{file:Ke,previewUrl:URL.createObjectURL(Ke)}]);return}}},[L,_]),rn=i.useCallback(ce=>{const Ge=L[ce];Ge&&URL.revokeObjectURL(Ge.previewUrl),_(L.filter((Me,Ke)=>Ke!==ce))},[L,_]),hn=i.useCallback(ce=>{l(o.includes(ce)?o.filter(Ge=>Ge!==ce):[...o,ce])},[o,l]),Pn=(ce,Ge)=>ce.length>Ge?ce.slice(0,Ge)+"…":ce,nn=i.useCallback(ce=>{s(ce.target.value);const Ge=ce.target;Ge.style.height="auto",Ge.style.height=Ge.scrollHeight+"px"},[s]),$t=i.useCallback(()=>{Te(ce=>!ce)},[]),Jt=i.useCallback(ce=>{!Et||ce.key!=="Escape"||(ce.preventDefault(),ce.stopPropagation(),Te(!1))},[Et]),Qt=i.useCallback(async ce=>{const Ge=n.trim();if(!(!Ge||je)){mt(!0);try{const Me=await cy(Ge,ce,ae);s(Me),ht(!1),z("Description refined with AI","success"),_t.current&&(_t.current.style.height="auto",_t.current.style.height=_t.current.scrollHeight+"px")}catch(Me){const Ke=dy(Me);z(Ke,"error")}finally{mt(!1)}}},[n,je,z,s,ae]),ie=i.useCallback(async ce=>{const Ge=Xe,Ke=Ge.includes(ce)?Ge.filter(Qe=>Qe!==ce):[ce,...Ge];At(Ke);try{await Cs({favoriteProviders:Ke,favoriteModels:at})}catch{At(Ge)}},[Xe,at]),Fe=i.useCallback(async ce=>{const Ge=at,Ke=Ge.includes(ce)?Ge.filter(Qe=>Qe!==ce):[ce,...Ge];Se(Ke);try{await Cs({favoriteProviders:Xe,favoriteModels:Ke})}catch{Se(Ge)}},[at,Xe]),Je=i.useCallback(ce=>{if(ce<=0)return;const Ge=[...D];[Ge[ce-1],Ge[ce]]=[Ge[ce],Ge[ce-1]],W(Ge)},[D,W]),tt=i.useCallback(ce=>{if(ce>=D.length-1)return;const Ge=[...D];[Ge[ce],Ge[ce+1]]=[Ge[ce+1],Ge[ce]],W(Ge)},[D,W]),Ye=i.useCallback(ce=>{W(D.filter(Ge=>Ge!==ce))},[D,W]),vt=new Map;for(const ce of Nt)vt.set(ce.id,{name:ce.name,description:ce.description});const pt=F.filter(ce=>!o.includes(ce.id)).sort((ce,Ge)=>{const Me=Ge.createdAt.localeCompare(ce.createdAt);if(Me!==0)return Me;const Ke=parseInt(ce.id.slice(ce.id.lastIndexOf("-")+1),10)||0;return(parseInt(Ge.id.slice(Ge.id.lastIndexOf("-")+1),10)||0)-Ke}),Zt=Re?pt.filter(ce=>ce.id.toLowerCase().includes(Re.toLowerCase())||ce.title&&ce.title.toLowerCase().includes(Re.toLowerCase())||ce.description&&ce.description.toLowerCase().includes(Re.toLowerCase())):pt;return t.jsxs("div",{className:"task-form",onDrop:In,onDragOver:ce=>ce.preventDefault(),onPaste:Zn,children:[t.jsxs("div",{className:"task-form-primary-section",children:[e==="edit"&&r&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"task-form-title",children:"Title"}),t.jsx("input",{ref:Ft,autoFocus:!0,id:"task-form-title",type:"text",className:"modal-edit-input",placeholder:"Task title",value:a||"",onChange:ce=>r(ce.target.value),disabled:k})]}),t.jsxs("div",{className:"form-group",children:[t.jsxs("label",{htmlFor:"task-form-description",className:"description-label-row",children:[t.jsx("span",{children:"Description"}),t.jsx("span",{className:`description-auto-save-status${Be==="idle"?"":" is-visible"}`,"aria-live":"polite",children:Be==="saving"?"Saving...":Be==="saved"?"Saved":""})]}),t.jsxs("div",{className:`description-with-refine${Et?" description--fullscreen":""}`,ref:xe,onKeyDown:Jt,children:[Et&&t.jsxs("div",{className:"description-fullscreen-header",children:[t.jsx("span",{children:"Editing Description"}),t.jsx("button",{type:"button",className:"btn btn-sm description-expand-btn",onClick:$t,"aria-label":"Collapse description",title:"Collapse description",children:t.jsx(Ll,{size:14})})]}),t.jsx("textarea",{ref:_t,autoFocus:e==="create",id:"task-form-description",value:n,onChange:nn,placeholder:"What needs to be done?",rows:e==="edit"?8:5,disabled:k||je}),(()=>{const ce=!!n.trim()&&!k;return t.jsxs(t.Fragment,{children:[!Et&&t.jsx("button",{type:"button",className:`btn btn-sm description-expand-btn${ce?" description-expand-btn--offset":" description-expand-btn--flush"}`,onClick:$t,"aria-label":"Expand description",title:"Expand description",children:t.jsx(Cd,{size:14})}),ce&&t.jsxs("button",{type:"button",className:`btn btn-sm refine-button ${je?"refine-button--loading":""}`,onClick:()=>ht(Ge=>!Ge),disabled:je,"data-testid":"refine-button",title:"Refine description with AI",children:[t.jsx(Ls,{size:12,style:{verticalAlign:"middle"}}),je?"Refining...":"Refine"]})]})})(),Oe&&t.jsxs("div",{className:"refine-menu refine-menu--modal",onMouseDown:ce=>ce.preventDefault(),children:[t.jsxs("div",{className:"refine-menu-item",onClick:()=>Qt("clarify"),"data-testid":"refine-clarify",children:[t.jsx("div",{className:"refine-menu-item-title",children:"Clarify"}),t.jsx("div",{className:"refine-menu-item-desc",children:"Make the description clearer and more specific"})]}),t.jsxs("div",{className:"refine-menu-item",onClick:()=>Qt("add-details"),"data-testid":"refine-add-details",children:[t.jsx("div",{className:"refine-menu-item-title",children:"Add details"}),t.jsx("div",{className:"refine-menu-item-desc",children:"Add implementation details and context"})]}),t.jsxs("div",{className:"refine-menu-item",onClick:()=>Qt("expand"),"data-testid":"refine-expand",children:[t.jsx("div",{className:"refine-menu-item-title",children:"Expand"}),t.jsx("div",{className:"refine-menu-item-desc",children:"Expand into a more comprehensive description"})]}),t.jsxs("div",{className:"refine-menu-item",onClick:()=>Qt("simplify"),"data-testid":"refine-simplify",children:[t.jsx("div",{className:"refine-menu-item-title",children:"Simplify"}),t.jsx("div",{className:"refine-menu-item-desc",children:"Simplify and make more concise"})]})]})]})]}),e==="create"&&(le||we)&&t.jsxs("div",{className:"task-form-description-actions","data-testid":"task-form-description-actions",children:[le&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>{const ce=n.trim();if(!ce){z("Enter a description first","error");return}re?.(),le(ce)},disabled:k||!n.trim(),"data-testid":"task-form-plan-button",children:"Plan"}),we&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>{const ce=n.trim();if(!ce){z("Enter a description first","error");return}re?.(),we(ce)},disabled:k||!n.trim(),"data-testid":"task-form-subtask-button",children:"Subtask"})]})]}),H,t.jsxs("button",{type:"button",className:"task-form-more-options-toggle",onClick:()=>de(ce=>!ce),"aria-expanded":Le,"aria-controls":"task-form-more-options",disabled:k,"data-testid":"task-form-more-options-toggle",children:[t.jsx("span",{children:"More options"}),Le?t.jsx(Pi,{size:14}):t.jsx(Ln,{size:14})]}),t.jsxs("div",{id:"task-form-more-options",className:`task-form-more-options${Le?"":" collapsed"}`,"aria-hidden":!Le,hidden:!Le,"data-testid":"task-form-more-options",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Attachments"}),L.length>0&&t.jsx("div",{className:"inline-create-previews",children:L.map((ce,Ge)=>t.jsxs("div",{className:"inline-create-preview",children:[t.jsx("img",{src:ce.previewUrl,alt:ce.file.name}),t.jsx("button",{type:"button",className:"inline-create-preview-remove",onClick:()=>rn(Ge),disabled:k,title:"Remove image",children:"×"})]},ce.previewUrl))}),t.jsx("input",{ref:Dt,type:"file",accept:"image/*",onChange:ce=>{const Ge=ce.target.files?.[0];Ge&&(_([...L,{file:Ge,previewUrl:URL.createObjectURL(Ge)}]),ce.target.value="")},style:{display:"none"}}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>Dt.current?.click(),disabled:k,children:"Attach Screenshot"}),t.jsx("small",{children:"You can also paste images or drag & drop"})]}),b&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"task-node-select",children:"Execution Node Override"}),t.jsxs("select",{id:"task-node-select",className:"select",value:p??"",onChange:ce=>b(ce.target.value||void 0),disabled:k||x,children:[t.jsx("option",{value:"",children:"Use project default / local"}),(v??[]).map(ce=>t.jsxs("option",{value:ce.id,children:[ce.name," (",X4(ce.status),")"]},ce.id))]}),(()=>{const ce=(v??[]).find(Ge=>Ge.id===p);return ce?t.jsx("div",{className:"task-form-node-status",children:t.jsx(Cr,{status:ce.status,showLabel:!0})}):null})(),t.jsx("small",{children:y??"Task override takes priority over project default node routing."})]}),!Q&&t.jsx(t.Fragment,{children:t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Dependencies"}),t.jsxs("div",{className:"dep-trigger-wrap",ref:gt,children:[t.jsx("button",{type:"button",className:"btn btn-sm dep-trigger",onClick:()=>He(ce=>!ce),disabled:k,children:o.length>0?`${o.length} selected`:"Add dependencies"}),Ne&&t.jsxs("div",{className:"dep-dropdown",children:[t.jsx("input",{className:"dep-dropdown-search",placeholder:"Search tasks…",autoFocus:!0,value:Re,onChange:ce=>Pe(ce.target.value),onClick:ce=>ce.stopPropagation()}),Zt.length===0?t.jsx("div",{className:"dep-dropdown-empty",children:"No available tasks"}):Zt.map(ce=>t.jsxs("div",{className:`dep-dropdown-item${o.includes(ce.id)?" selected":""}`,onClick:()=>hn(ce.id),onMouseDown:Ge=>Ge.preventDefault(),children:[t.jsx("span",{className:"dep-dropdown-id",children:ce.id}),t.jsx("span",{className:"dep-dropdown-title",children:Pn(ce.title||ce.description||ce.id,30)})]},ce.id))]})]}),o.length>0&&t.jsx("div",{className:"selected-deps",children:o.map(ce=>t.jsxs("span",{className:"dep-chip",children:[ce,t.jsx("button",{type:"button",className:"dep-chip-remove",onClick:()=>hn(ce),disabled:k,children:"×"})]},ce))})]})}),(d||f||h)&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Branch Settings"}),h?t.jsxs(t.Fragment,{children:[t.jsx("label",{htmlFor:"task-branch-mode",className:"model-select-label",children:"Branch strategy"}),t.jsxs("select",{id:"task-branch-mode",className:"input",value:u??"project-default",onChange:ce=>h(ce.target.value),disabled:k,children:[t.jsx("option",{value:"project-default",children:"Use project/default branch"}),t.jsx("option",{value:"auto-new",children:"Create auto-named branch per task"}),t.jsx("option",{value:"existing",children:"Use existing branch"}),t.jsx("option",{value:"custom-new",children:"Create custom new branch"})]})]}):null,d&&(!h||u==="existing"||u==="custom-new")&&t.jsxs(t.Fragment,{children:[t.jsx("label",{htmlFor:"task-working-branch",className:"model-select-label",children:h?"Branch name":"Working branch"}),t.jsx("input",{id:"task-working-branch",className:"input",value:c||"",onChange:ce=>d(ce.target.value),placeholder:"e.g. feature/my-task",disabled:k})]}),f&&t.jsxs(t.Fragment,{children:[t.jsx("label",{htmlFor:"task-base-branch",className:"model-select-label",children:"Merge target / base branch"}),t.jsx("input",{id:"task-base-branch",className:"input",value:m||"",onChange:ce=>f(ce.target.value),placeholder:"e.g. main",disabled:k})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Model Configuration"}),j&&t.jsxs("div",{className:"model-select-row",children:[t.jsx("label",{htmlFor:"task-priority",className:"model-select-label",children:"Priority"}),t.jsx("select",{id:"task-priority","data-testid":"task-priority-select",value:g??di,onChange:ce=>j(ce.target.value),disabled:k,children:nr.map(ce=>t.jsx("option",{value:ce,children:ce[0].toUpperCase()+ce.slice(1)},ce))})]}),ve&&se!==void 0&&t.jsxs("div",{className:"model-select-row",children:[t.jsx("label",{htmlFor:"task-execution-mode",className:"model-select-label",children:"Execution mode"}),t.jsxs("select",{id:"task-execution-mode","data-testid":"task-form-execution-mode-select",value:se,onChange:ce=>ve(ce.target.value),disabled:k,children:[t.jsx("option",{value:"standard",children:"Standard"}),t.jsx("option",{value:"fast",children:"Fast"})]})]}),pe?t.jsx("div",{className:"model-selector-loading",children:"Loading models…"}):rt.length===0?t.jsx("small",{children:"No models available. Configure authentication in Settings."}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"model-select-row",children:[t.jsx("label",{htmlFor:"model-preset",className:"model-select-label",children:"Preset"}),t.jsxs("select",{id:"model-preset",value:G==="preset"?P:G,onChange:ce=>{const Ge=ce.target.value;if(Ge==="default"){U("default"),T(""),C(""),S("");return}if(Ge==="custom"){U("custom"),T("");return}const Me=Sn.find(Qe=>Qe.id===Ge),Ke=vb(Me);U("preset"),T(Ge),C(Ke.executorValue),S(Ke.validatorValue)},disabled:k,children:[t.jsx("option",{value:"default",children:"Use default"}),Sn.length>0?t.jsx("option",{disabled:!0,children:"──────────"}):null,Sn.map(ce=>t.jsx("option",{value:ce.id,children:ce.name},ce.id)),t.jsx("option",{value:"custom",children:"Custom"})]})]}),G==="preset"&&is?t.jsxs("small",{children:["Using preset: ",is.name]}):null,G==="preset"?t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>U("custom"),disabled:k,children:"Override"}):null,t.jsxs("div",{className:"model-select-row",children:[t.jsx("label",{htmlFor:"executor-model",className:"model-select-label",children:"Executor"}),t.jsx(ri,{id:"executor-model",label:"Executor Model",value:N,onChange:ce=>{U("custom"),T(""),C(ce)},models:rt,disabled:k||G==="preset",favoriteProviders:Xe,onToggleFavorite:ie,favoriteModels:at,onToggleModelFavorite:Fe})]}),t.jsxs("div",{className:"model-select-row",children:[t.jsx("label",{htmlFor:"validator-model",className:"model-select-label",children:"Reviewer"}),t.jsx(ri,{id:"validator-model",label:"Reviewer Model",value:w,onChange:ce=>{U("custom"),T(""),S(ce)},models:rt,disabled:k||G==="preset",favoriteProviders:Xe,onToggleFavorite:ie,favoriteModels:at,onToggleModelFavorite:Fe})]}),I&&t.jsxs("div",{className:"model-select-row",children:[t.jsx("label",{htmlFor:"planning-model",className:"model-select-label",children:"Planning"}),t.jsx(ri,{id:"planning-model",label:"Planning Model",value:R||"",onChange:ce=>{U("custom"),T(""),I(ce)},models:rt,disabled:k||G==="preset",favoriteProviders:Xe,onToggleFavorite:ie,favoriteModels:at,onToggleModelFavorite:Fe})]}),M&&t.jsxs("div",{className:"model-select-row",children:[t.jsx("label",{htmlFor:"thinking-level",className:"model-select-label",children:"Thinking"}),t.jsxs("select",{id:"thinking-level",value:E||"",onChange:ce=>M(ce.target.value),disabled:k||G==="preset",children:[t.jsxs("option",{value:"",children:["Default (",et?.defaultThinkingLevel??"off",")"]}),t.jsx("option",{value:"off",children:"Off"}),t.jsx("option",{value:"minimal",children:"Minimal"}),t.jsx("option",{value:"low",children:"Low"}),t.jsx("option",{value:"medium",children:"Medium"}),t.jsx("option",{value:"high",children:"High"})]})]}),O&&t.jsxs("div",{className:"model-select-row",children:[t.jsx("label",{htmlFor:"review-level",className:"model-select-label",children:"Review"}),t.jsxs("select",{id:"review-level",value:fe??"",onChange:ce=>O(ce.target.value===""?void 0:parseInt(ce.target.value,10)),disabled:k,children:[t.jsx("option",{value:"",children:"Default (Auto — triage decides)"}),t.jsx("option",{value:"0",children:"0 — None"}),t.jsx("option",{value:"1",children:"1 — Plan Only"}),t.jsx("option",{value:"2",children:"2 — Plan and Code"}),t.jsx("option",{value:"3",children:"3 — Full"})]})]})]})]}),ue,t.jsxs("div",{className:"form-group","data-testid":"workflow-steps-section",children:[t.jsx("label",{children:"Workflow Steps"}),t.jsxs("div",{className:"workflow-steps-section",children:[t.jsx("small",{className:"workflow-steps-description",children:"Select steps to run after task implementation completes"}),t.jsx("div",{className:"workflow-steps-list",children:Nt.length>0&&Nt.map(ce=>t.jsxs("label",{className:"checkbox-label workflow-step-item","data-testid":`workflow-step-checkbox-${ce.id}`,children:[t.jsx("input",{type:"checkbox",checked:D.includes(ce.id),onChange:Ge=>{W(Ge.target.checked?[...D,ce.id]:D.filter(Me=>Me!==ce.id))},disabled:k}),t.jsxs("div",{children:[t.jsxs("span",{className:"workflow-step-name",children:[ce.name,Q4(ce.phase||"pre-merge",ce.id,"workflow-step-phase")]}),t.jsx("div",{className:"workflow-step-description",children:ce.description})]})]},ce.id))})]}),D.length>1&&t.jsxs("div",{className:"workflow-step-order","data-testid":"workflow-step-order",children:[t.jsx("small",{className:"workflow-step-order-label",children:"Execution order:"}),D.map((ce,Ge)=>{const Me=vt.get(ce);return t.jsxs("div",{className:"workflow-step-order-item","data-testid":`workflow-step-order-item-${ce}`,children:[t.jsx("span",{className:"workflow-step-order-number",children:Ge+1}),t.jsx("span",{className:"workflow-step-order-name",children:Me?.name||ce}),t.jsxs("div",{className:"workflow-step-order-actions",children:[t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>Je(Ge),disabled:k||Ge===0,"data-testid":`workflow-step-move-up-${ce}`,title:"Move up",children:t.jsx(Pi,{})}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>tt(Ge),disabled:k||Ge===D.length-1,"data-testid":`workflow-step-move-down-${ce}`,title:"Move down",children:t.jsx(Ln,{})}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>Ye(ce),disabled:k,"data-testid":`workflow-step-remove-${ce}`,title:"Remove",children:t.jsx(Nn,{})})]})]},ce)})]})]}),(ne||ee)&&t.jsxs("div",{className:"form-group","data-testid":"task-form-github-tracking",children:[t.jsx("label",{children:"GitHub Tracking"}),ne&&t.jsxs("label",{className:"checkbox-label",htmlFor:"task-github-tracking-enabled",children:[t.jsx("input",{id:"task-github-tracking-enabled",type:"checkbox",checked:A===!0,onChange:ce=>{mn.current=!0,ne(ce.target.checked)},disabled:k}),"Enable GitHub issue tracking for this task"]}),ee&&t.jsxs(t.Fragment,{children:[t.jsx("label",{htmlFor:"task-github-repo-override",className:"model-select-label",children:"Repository (owner/repo)"}),t.jsx("input",{id:"task-github-repo-override",className:"input",value:ye||"",onChange:ce=>ee(ce.target.value),placeholder:On||"owner/repo",disabled:k}),tn?t.jsx("div",{className:"form-error",children:"Repository must be in owner/repo format."}):null]})]})]})]})}const Uu={p:({children:e,...n})=>t.jsx("p",{...n,children:ai(e)}),li:({children:e,...n})=>t.jsx("li",{...n,children:ai(e)}),code:({children:e,...n})=>t.jsx("code",{...n,children:ai(e)}),pre:({children:e,className:n,...s})=>t.jsx("pre",{...s,className:["workflow-markdown-pre",n].filter(Boolean).join(" "),children:ai(e)}),table:({children:e,className:n,...s})=>t.jsx("table",{...s,className:["workflow-markdown-table",n].filter(Boolean).join(" "),children:e})};function Z4(e){switch(e){case"passed":return"Passed";case"failed":return"Failed";case"advisory_failure":return"Advisory failure";case"skipped":return"Skipped";case"pending":return"Running…";default:return e}}function eO(e,n){if(!e||!n)return null;const s=new Date(e).getTime(),r=new Date(n).getTime()-s;if(r<1e3)return`${r}ms`;const o=Math.round(r/1e3);if(o<60)return`${o}s`;const l=Math.floor(o/60),c=o%60;return`${l}m ${c}s`}function tO(e){return e?new Date(e).toLocaleString():null}function nO(e){const n=e.split(`
719
- `);return n.length<=1?e:`${n.length} lines`}function xc(e,n,s){const a=e==="post-merge"?"phase-badge--post-merge":"phase-badge--pre-merge";return t.jsx("span",{className:`phase-badge ${a}`,"data-testid":`${s}-${n}`,children:e==="post-merge"?"Post-merge":"Pre-merge"})}function sO({entries:e,startedAt:n,stepId:s}){const a=i.useRef(null),r=new Date(n).getTime(),o=e.filter(l=>new Date(l.timestamp).getTime()>=r);return i.useEffect(()=>{const l=a.current;l&&(l.scrollTop=l.scrollHeight)},[o.length]),o.length===0?t.jsx("div",{className:"workflow-live-log","data-testid":`workflow-live-log-${s}`,children:t.jsx("div",{className:"workflow-live-log-empty",children:"Waiting for agent output…"})}):t.jsx("div",{ref:a,className:"workflow-live-log","data-testid":`workflow-live-log-${s}`,children:o.map((l,c)=>l.type==="tool"?t.jsxs("div",{className:"workflow-live-log-tool",children:["⚡ ",zs(l.text),l.detail&&t.jsxs("span",{className:"workflow-live-log-detail",children:[" — ",zs(l.detail)]})]},c):l.type==="tool_result"?t.jsxs("div",{className:"workflow-live-log-tool-result",children:["✓ ",zs(l.text),l.detail&&t.jsxs("span",{className:"workflow-live-log-detail",children:[" — ",zs(l.detail)]})]},c):l.type==="tool_error"?t.jsxs("div",{className:"workflow-live-log-tool-error",children:["✗ ",zs(l.text),l.detail&&t.jsxs("span",{className:"workflow-live-log-detail",children:[" — ",zs(l.detail)]})]},c):l.type==="thinking"?t.jsx("div",{className:"workflow-live-log-thinking",children:zs(l.text)},c):t.jsx("span",{className:"workflow-live-log-text",children:zs(l.text)},c))})}function iO({taskId:e,results:n,loading:s,enabledWorkflowSteps:a,canEdit:r,projectId:o,isTaskInProgress:l,onWorkflowStepsChange:c}){const[d,u]=i.useState({}),[h,m]=i.useState({}),[f,p]=i.useState(null),[b,v]=i.useState([]),[x,y]=i.useState(!1),g=n.some(k=>k.status==="pending"),{entries:j}=rk(e,!!l&&g,o);i.useEffect(()=>{let k=!1;return Bl(o).then(z=>{k||v(z.filter(J=>J.enabled))}).catch(()=>{k||v([])}),()=>{k=!0}},[o]);const N=a??[],C=i.useMemo(()=>b.map(k=>({id:k.id,name:k.name,description:k.description,phase:k.phase||"pre-merge"})),[b]),w=i.useMemo(()=>new Map(C.map(k=>[k.id,k])),[C]),S=k=>{u(z=>({...z,[k]:!z[k]}))},R=k=>{m(z=>{const J=z[k]??"markdown";return{...z,[k]:J==="markdown"?"plain":"markdown"}})},I=k=>{p(k)},E=()=>{p(null)};i.useEffect(()=>{if(!f)return;const k=z=>{z.key==="Escape"&&E()};return document.addEventListener("keydown",k),()=>{document.removeEventListener("keydown",k)}},[f]);const M=i.useCallback((k,z)=>{if(c){if(z){if(N.includes(k)){c(N);return}c([...N,k]);return}c(N.filter(J=>J!==k))}},[c,N]),G=i.useCallback(k=>{if(!c||k<=0)return;const z=[...N];[z[k-1],z[k]]=[z[k],z[k-1]],c(z)},[c,N]),U=i.useCallback(k=>{if(!c||k>=N.length-1)return;const z=[...N];[z[k],z[k+1]]=[z[k+1],z[k]],c(z)},[c,N]),P=i.useCallback(k=>{c&&c(N.filter(z=>z!==k))},[c,N]),T=n.length>0,D=N.length>0;i.useEffect(()=>{r||y(!1)},[r]);const W=i.useMemo(()=>N.map(k=>{const z=w.get(k);return{id:k,name:z?.name||k,description:z?.description||"Step definition not found.",phase:z?.phase||"pre-merge"}}),[N,w]),Y=()=>!r||!x||s?null:t.jsxs("div",{className:"workflow-results-editor","data-testid":"workflow-steps-editor",children:[t.jsxs("div",{className:"workflow-steps-section",children:[t.jsx("small",{className:"workflow-steps-description",children:"Select steps to run after task implementation completes"}),t.jsx("div",{className:"workflow-steps-list",children:C.map(k=>t.jsxs("label",{className:"checkbox-label workflow-step-item","data-testid":`workflow-step-checkbox-${k.id}`,children:[t.jsx("input",{type:"checkbox",checked:N.includes(k.id),onChange:z=>M(k.id,z.target.checked)}),t.jsxs("div",{children:[t.jsxs("span",{className:"workflow-step-name",children:[k.name,xc(k.phase,k.id,"workflow-step-phase")]}),t.jsx("div",{className:"workflow-step-description",children:k.description})]})]},k.id))})]}),N.length>1&&t.jsxs("div",{className:"workflow-step-order","data-testid":"workflow-step-order",children:[t.jsx("small",{className:"workflow-step-order-label",children:"Execution order:"}),N.map((k,z)=>{const J=w.get(k);return t.jsxs("div",{className:"workflow-step-order-item","data-testid":`workflow-step-order-item-${k}`,children:[t.jsx("span",{className:"workflow-step-order-number",children:z+1}),t.jsx("span",{className:"workflow-step-order-name",children:J?.name||k}),t.jsxs("div",{className:"workflow-step-order-actions",children:[t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>G(z),disabled:z===0,"data-testid":`workflow-step-move-up-${k}`,title:"Move up",children:t.jsx(Pi,{})}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>U(z),disabled:z===N.length-1,"data-testid":`workflow-step-move-down-${k}`,title:"Move down",children:t.jsx(Ln,{})}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>P(k),"data-testid":`workflow-step-remove-${k}`,title:"Remove",children:t.jsx(Nn,{})})]})]},k)})]})]}),L=()=>{if(s)return t.jsxs("div",{className:"workflow-results-loading","data-testid":"workflow-results-loading",children:[t.jsx("div",{className:"workflow-results-spinner"}),t.jsx("span",{children:"Loading workflow results…"})]});if(!T)return t.jsxs("div",{className:"workflow-results-empty","data-testid":"workflow-results-empty",children:[t.jsx("p",{children:"No workflow steps configured for this task."}),t.jsx("p",{className:"workflow-results-empty-hint",children:"Pre-merge steps run after implementation, before merge. Post-merge steps run after merge succeeds."})]});const k=n.filter(re=>re.status==="passed").length,z=n.filter(re=>re.status==="failed").length,J=n.filter(re=>re.status==="advisory_failure"),oe=n.filter(re=>re.status==="skipped").length,le=n.filter(re=>re.status==="pending").length,we=[`${n.length} step${n.length!==1?"s":""}`];return k>0&&we.push(`${k} passed`),z>0&&we.push(`${z} failed`),J.length>0&&we.push(`${J.length} advisory`),oe>0&&we.push(`${oe} skipped`),le>0&&we.push(`${le} running`),t.jsxs("div",{className:"workflow-results-list","data-testid":"workflow-results-list",children:[t.jsx("div",{className:"workflow-results-summary-bar","data-testid":"workflow-results-summary",children:we.join(" · ")}),J.length>0&&t.jsxs("div",{className:"workflow-polish-notes","data-testid":"workflow-polish-notes",children:[t.jsx("h4",{children:"Polish notes"}),t.jsx("p",{children:"Advisory workflow steps flagged non-blocking improvements:"}),t.jsx("ul",{children:J.map((re,H)=>t.jsxs("li",{children:[t.jsxs("strong",{children:[re.workflowStepName,":"]})," ",re.output||"Needs follow-up review."]},`advisory-${re.workflowStepId}-${H}`))})]}),n.map((re,H)=>{const ue=re.phase||"pre-merge",Q=d[re.workflowStepId]??!1;return t.jsxs("div",{className:`workflow-result-item workflow-result-item--${re.status}`,"data-testid":`workflow-result-item-${re.workflowStepId}`,children:[t.jsxs("div",{className:"workflow-result-header",children:[t.jsxs("div",{className:"workflow-result-name",children:[re.workflowStepName,xc(ue,re.workflowStepId,"workflow-result-phase")]}),t.jsxs("div",{className:"workflow-result-badges",children:[re.verdict&&t.jsx("span",{className:`workflow-verdict-badge workflow-verdict-badge--${re.verdict}`,"data-testid":`workflow-verdict-badge-${re.workflowStepId}`,children:re.verdict}),t.jsx("span",{className:`workflow-result-badge workflow-result-badge--${re.status}`,"data-testid":`workflow-result-badge-${re.workflowStepId}`,children:Z4(re.status)})]})]}),re.notes&&re.status!=="pending"&&t.jsxs("div",{className:"workflow-result-notes","data-testid":`workflow-result-notes-${re.workflowStepId}`,children:[t.jsx("span",{className:"workflow-result-notes-label",children:"Notes:"}),t.jsx(ji,{remarkPlugins:[Ni],components:Uu,children:re.notes})]}),t.jsxs("div",{className:"workflow-result-meta",children:[re.startedAt&&t.jsxs("span",{className:"workflow-result-timestamp",children:["Started: ",tO(re.startedAt)]}),re.completedAt&&t.jsx("span",{className:"workflow-result-duration",children:eO(re.startedAt,re.completedAt)})]}),re.status==="pending"&&re.startedAt?t.jsx(sO,{entries:j,startedAt:re.startedAt,stepId:re.workflowStepId}):re.output?t.jsxs("div",{className:"workflow-result-output-section",children:[t.jsxs("div",{className:"workflow-result-output-header",children:[t.jsx("span",{className:"workflow-result-output-label",children:"Output:"}),t.jsx("button",{type:"button",className:"btn btn-sm workflow-result-toggle",onClick:()=>S(re.workflowStepId),"data-testid":`workflow-result-toggle-${re.workflowStepId}`,children:Q?"Hide output":"Show output"}),!Q&&t.jsx("span",{className:"workflow-result-output-preview","data-testid":`workflow-result-preview-${re.workflowStepId}`,children:nO(re.output)}),Q&&t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"btn btn-sm workflow-result-mode-toggle",onClick:()=>R(re.workflowStepId),"data-testid":`workflow-result-mode-toggle-${re.workflowStepId}`,title:(h[re.workflowStepId]??"markdown")==="markdown"?"Switch to plain text":"Switch to markdown",children:(h[re.workflowStepId]??"markdown")==="markdown"?"Markdown":"Plain"}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm workflow-result-expand-toggle",onClick:()=>I(re.workflowStepId),"data-testid":`workflow-result-expand-${re.workflowStepId}`,title:"Expand output",children:t.jsx(Cd,{size:12})})]})]}),Q&&t.jsx("div",{className:`workflow-result-output${(h[re.workflowStepId]??"markdown")==="markdown"?" workflow-result-output--markdown":""}`,"data-testid":`workflow-result-output-${re.workflowStepId}`,children:(h[re.workflowStepId]??"markdown")==="markdown"?t.jsx("div",{className:"markdown-body",children:t.jsx(ji,{remarkPlugins:[Ni],components:Uu,children:re.output})}):t.jsx("pre",{className:"workflow-result-output-text",children:zs(re.output??"")})})]}):null]},`${re.workflowStepId}-${H}`)})]})},_=r?t.jsx("button",{type:"button",className:"btn btn-sm workflow-results-edit-toggle",onClick:()=>y(k=>!k),"data-testid":"workflow-steps-edit-toggle","aria-label":x?"Done editing workflow steps":"Edit workflow steps",title:x?"Done":"Edit",children:x?t.jsxs(t.Fragment,{children:[t.jsx(Js,{size:14}),"Done"]}):t.jsxs(t.Fragment,{children:[t.jsx(xi,{size:14}),"Edit"]})}):null,F=!s&&!T&&D,ae=r&&T;return t.jsxs("div",{className:"workflow-results-tab","data-task-id":e,children:[F?t.jsxs("div",{className:"workflow-configured-steps","data-testid":"workflow-configured-steps",children:[t.jsxs("div",{className:"workflow-configured-header","data-testid":"workflow-configured-header",children:[t.jsxs("div",{className:"workflow-configured-title-row",children:[t.jsx("h4",{children:"Configured Workflow Steps"}),t.jsxs("span",{className:"workflow-configured-count","data-testid":"workflow-configured-count",children:[W.length," step",W.length===1?"":"s"]})]}),_]}),t.jsx("div",{className:"workflow-configured-list","data-testid":"workflow-configured-list",children:W.map(k=>t.jsxs("div",{className:"workflow-configured-item","data-testid":`workflow-configured-step-${k.id}`,children:[t.jsxs("div",{className:"workflow-configured-name",children:[t.jsx("span",{className:"workflow-configured-name-text",children:k.name}),xc(k.phase,k.id,"workflow-configured-phase")]}),t.jsx("p",{className:"workflow-configured-description",children:k.description})]},k.id))}),t.jsx("p",{className:"workflow-results-empty-hint",children:"Pre-merge steps run after implementation, before merge. Post-merge steps run after merge succeeds."}),Y()]}):t.jsxs(t.Fragment,{children:[ae&&t.jsxs("div",{className:"workflow-results-edit-header","data-testid":"workflow-results-edit-header",children:[t.jsx("h4",{children:"Workflow Steps"}),_]}),L(),Y()]}),f&&(()=>{const k=n.find(oe=>oe.workflowStepId===f);if(!k)return null;const z=h[k.workflowStepId]??"markdown",J=k.phase||"pre-merge";return t.jsx("div",{className:"workflow-output-modal-overlay",onClick:oe=>{oe.target===oe.currentTarget&&E()},"data-testid":"workflow-output-modal",children:t.jsxs("div",{className:"workflow-output-modal",role:"dialog","aria-modal":"true",children:[t.jsxs("div",{className:"workflow-output-modal-header",children:[t.jsxs("div",{className:"workflow-output-modal-title",children:[t.jsx("span",{className:"workflow-output-modal-name",children:k.workflowStepName}),xc(J,k.workflowStepId,"workflow-output-modal-phase")]}),t.jsxs("div",{className:"workflow-output-modal-controls",children:[t.jsx("button",{type:"button",className:"btn btn-sm workflow-result-mode-toggle",onClick:()=>R(k.workflowStepId),"data-testid":"workflow-output-modal-mode-toggle",title:z==="markdown"?"Switch to plain text":"Switch to markdown",children:z==="markdown"?"Markdown":"Plain"}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm workflow-output-modal-close",onClick:E,"data-testid":"workflow-output-modal-close","aria-label":"Close",children:t.jsx(Nn,{size:16})})]})]}),t.jsx("div",{className:"workflow-output-modal-body",children:t.jsx("div",{className:`workflow-result-output workflow-result-output--expanded${z==="markdown"?" workflow-result-output--markdown":""}`,"data-testid":"workflow-output-modal-content",children:z==="markdown"?t.jsx("div",{className:"markdown-body",children:t.jsx(ji,{remarkPlugins:[Ni],components:Uu,children:k.output})}):t.jsx("pre",{className:"workflow-result-output-text",children:zs(k.output??"")})})})]})})})()]})}function aO(e){return e==="block"?"Block execution":e==="fallback-local"?"Fall back to local":"Not configured"}const rO=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function oO(e){return e!==void 0&&e!=="online"}function lO({task:e,settings:n,addToast:s,onTaskUpdated:a}){const[r,o]=i.useState([]),[l,c]=i.useState(!1),[d,u]=i.useState(null),[h,m]=i.useState(e.nodeId??""),[f,p]=i.useState(!1),b=i.useRef(e.id);i.useEffect(()=>{b.current=e.id,m(e.nodeId??""),p(!1)},[e.id,e.nodeId]),i.useEffect(()=>{c(!0),u(null),sd().then(E=>{o(E)}).catch(E=>{u(Ce(E)||"Failed to load nodes")}).finally(()=>{c(!1)})},[]);const v=i.useMemo(()=>new Map(r.map(E=>[E.id,E])),[r]),x=i.useMemo(()=>[...r].sort((E,M)=>E.name.localeCompare(M.name)),[r]),y=n,g=e.nodeId??y?.defaultNodeId??null,j=e.nodeId?"Per-task override":y?.defaultNodeId?"Project default":"No routing",N=g?v.get(g):void 0,C=N?`${N.name} (${N.type})`:g?`${g} (node unavailable or unknown)`:"Local (no routing configured)",w=e.column==="in-progress"||rO.has(e.status),S=w||f||l,R=i.useCallback(async E=>{if(E===h)return;const M=e.id,G=h;m(E),p(!0);try{const U=await ni(M,{nodeId:E||null});if(b.current!==M)return;m(U.nodeId??""),a?.(U),s(E?"Node override updated":"Node override cleared","success")}catch(U){if(b.current!==M)return;m(G),s(Ce(U)||"Failed to update node override","error")}finally{b.current===M&&p(!1)}},[s,a,h,e.id]),I=i.useCallback(()=>{R("")},[R]);return t.jsxs("div",{className:"routing-tab",children:[t.jsx("h4",{children:"Task Routing"}),t.jsx("p",{className:"routing-tab__intro",children:"View the effective execution node and control per-task node override."}),t.jsxs("section",{className:"routing-tab__section",children:[t.jsx("h5",{children:"Routing Summary"}),t.jsxs("div",{className:"routing-summary-grid",role:"list",children:[t.jsxs("div",{className:"routing-summary-row",role:"listitem",children:[t.jsx("span",{className:"routing-summary-label",children:"Effective node"}),t.jsxs("span",{className:"routing-summary-value",children:[N?t.jsx(Cr,{status:N.status,compact:!0}):null,C,oO(N?.status)?t.jsx("span",{className:"routing-summary-warning",children:"Unhealthy"}):null]})]}),t.jsxs("div",{className:"routing-summary-row",role:"listitem",children:[t.jsx("span",{className:"routing-summary-label",children:"Routing source"}),t.jsx("span",{className:"routing-summary-value",children:j})]}),t.jsxs("div",{className:"routing-summary-row",role:"listitem",children:[t.jsx("span",{className:"routing-summary-label",children:"Unavailable-node policy"}),t.jsx("span",{className:"routing-summary-value",children:aO(y?.unavailableNodePolicy)})]})]}),w&&g?t.jsx("div",{className:"routing-tab__info-banner",children:"Routing is locked while this task is active. Node override cannot be changed until the task is no longer active."}):null]}),t.jsxs("section",{className:"routing-tab__section",children:[t.jsx("h5",{children:"Node Override"}),w?t.jsx("div",{className:"routing-tab__warning-banner",children:"Node override cannot be changed while the task is active."}):null,t.jsx("label",{className:"routing-tab__selector-label",htmlFor:`routing-node-${e.id}`,children:"Select execution node"}),t.jsxs("select",{id:`routing-node-${e.id}`,className:"select routing-tab__selector",value:h,disabled:S,onChange:E=>{R(E.target.value)},children:[t.jsx("option",{value:"",children:"Use project default"}),x.map(E=>t.jsxs("option",{value:E.id,title:`Status: ${E.status}`,children:[E.name," (",E.type,") — ",E.status]},E.id))]}),d?t.jsx("div",{className:"routing-tab__error",children:d}):null,e.nodeId?t.jsxs("div",{className:"routing-tab__override-row",children:[t.jsxs("span",{className:"routing-tab__override-text",children:["Override set to: ",v.get(e.nodeId)?.name??e.nodeId]}),t.jsx("button",{type:"button",className:"btn btn-sm",disabled:w||f,onClick:I,children:"Clear override"})]}):null]})]})}const cO=/^[a-zA-Z0-9_-]{1,64}$/,dO=200;function kb(e){return e?new Date(e).toLocaleString():""}function uO(e,n=dO){return e.length<=n?e:e.substring(0,n)+"…"}function mO({taskId:e,addToast:n,onTaskUpdated:s,projectId:a,canEdit:r=!1}){const[o,l]=i.useState([]),[c,d]=i.useState(!0),[u,h]=i.useState(null),[m,f]=i.useState(""),[p,b]=i.useState(null),[v,x]=i.useState(""),[y,g]=i.useState(null),[j,N]=i.useState([]),[C,w]=i.useState(!1),[S,R]=i.useState(!1),[I,E]=i.useState(""),[M,G]=i.useState(""),[U,P]=i.useState(!1),[T,D]=i.useState(null),[W,Y]=i.useState(null),[L,_]=i.useState(!1),F=i.useCallback(async()=>{try{const H=await ZC(e,a);l(H)}catch(H){n(Ce(H)||"Failed to load documents","error")}finally{d(!1)}},[e,a,n]);i.useEffect(()=>{F()},[F]);async function ae(H){u===H.key?(h(null),f(""),b(null),x(""),g(null),N([]),_(!1)):(h(H.key),f(H.content),b(null),x(""),g(null),N([]),_(!1))}async function k(H){if(y===H)g(null),N([]);else{g(H),w(!0);try{const ue=await e1(e,H,a);N(ue)}catch(ue){n(Ce(ue)||"Failed to load revisions","error")}finally{w(!1)}}}function z(){u&&(b(u),x(m))}function J(){b(null),x("")}async function oe(){if(!(!p||!v.trim())){P(!0);try{await ep(e,p,v,{},a),b(null),x(""),await F();const H=o.find(ue=>ue.key===p);H&&f(H.content),n("Document saved","success")}catch(H){n(Ce(H)||"Failed to save document","error")}finally{P(!1)}}}async function le(){const H=I.trim(),ue=M.trim();if(!H){n("Document key is required","error");return}if(!cO.test(H)){n("Invalid key format. Use 1-64 alphanumeric characters, hyphens, or underscores.","error");return}if(!ue){n("Content is required","error");return}P(!0);try{await ep(e,H,ue,{},a),R(!1),E(""),G(""),await F(),n("Document created","success")}catch(Q){n(Ce(Q)||"Failed to create document","error")}finally{P(!1)}}async function we(H){D(H);try{await t1(e,H,a),Y(null),D(null),u===H&&(h(null),f("")),y===H&&(g(null),N([])),await F(),n("Document deleted","success")}catch(ue){n(Ce(ue)||"Failed to delete document","error")}finally{D(null)}}function re(H){f(H.content),b(null),x("")}return c?t.jsxs("div",{className:"detail-section",children:[t.jsx("h4",{children:"Documents"}),t.jsx("div",{className:"detail-log-empty",children:"Loading documents…"})]}):t.jsxs("div",{className:"detail-section",children:[t.jsx("h4",{children:"Documents"}),S&&t.jsxs("div",{className:"task-document-create-form",children:[t.jsx("h5",{children:"New Document"}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"doc-key",children:"Key"}),t.jsx("input",{id:"doc-key",type:"text",className:"task-document-key-input",value:I,onChange:H=>E(H.target.value),placeholder:"e.g., plan, notes, research",disabled:U}),t.jsx("span",{className:"form-hint",children:"Alphanumeric, hyphens, underscores (1-64 chars)"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"doc-content",children:"Content"}),t.jsx("textarea",{id:"doc-content",value:M,onChange:H=>G(H.target.value),rows:6,placeholder:"Enter document content…",disabled:U})]}),t.jsxs("div",{className:"form-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>{R(!1),E(""),G("")},disabled:U,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void le(),disabled:U||!I.trim()||!M.trim(),children:U?"Creating…":"Create"})]})]}),o.length===0&&!S?t.jsx("div",{className:"detail-log-empty",children:"No documents yet."}):t.jsx("div",{className:"task-documents-list",children:o.map(H=>t.jsxs("div",{className:"task-document-card",children:[t.jsxs("div",{className:"task-document-card-header",children:[t.jsxs("div",{className:"task-document-card-title",children:[t.jsx(Ya,{size:14}),t.jsx("span",{className:"task-document-key",children:H.key}),t.jsxs("span",{className:"task-document-revision-badge",children:["v",H.revision]})]}),t.jsxs("div",{className:"task-document-meta",children:[t.jsx("span",{className:"task-document-author",children:H.author}),t.jsx("span",{className:"task-document-timestamp",children:kb(H.updatedAt||H.createdAt)})]})]}),u===H.key&&p!==H.key&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"task-document-content-header",children:t.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>_(ue=>!ue),"aria-label":L?"Switch to plain text":"Switch to markdown","aria-pressed":L,title:L?"Switch to plain text":"Switch to markdown",children:L?"Markdown":"Plain"})}),t.jsx("div",{className:"task-document-content",children:L?t.jsx("div",{className:"task-document-content-markdown",children:t.jsx("div",{className:"markdown-body",children:t.jsx(ji,{remarkPlugins:[Ni],children:m})})}):t.jsx("pre",{className:"task-document-content-text",children:m})}),y===H.key&&t.jsxs("div",{className:"task-document-revisions",children:[t.jsx("h5",{children:"Revision History"}),C?t.jsx("div",{className:"detail-log-empty",children:"Loading…"}):j.length<=1?t.jsx("div",{className:"detail-log-empty",children:"No previous revisions."}):t.jsx("div",{className:"task-document-revision-list",children:j.filter(ue=>ue.revision<H.revision).sort((ue,Q)=>Q.revision-ue.revision).map(ue=>t.jsxs("div",{className:"task-document-revision-item",onClick:()=>re(ue),children:[t.jsxs("div",{className:"revision-header",children:[t.jsxs("span",{className:"revision-badge",children:["v",ue.revision]}),t.jsx("span",{className:"revision-author",children:ue.author}),t.jsx("span",{className:"revision-timestamp",children:kb(ue.createdAt)})]}),t.jsx("div",{className:"revision-preview",children:uO(ue.content,100)})]},ue.id))})]})]}),p===H.key&&t.jsxs("div",{className:"task-document-edit-form",children:[t.jsx("textarea",{value:v,onChange:ue=>x(ue.target.value),rows:10,disabled:U}),t.jsxs("div",{className:"form-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:J,disabled:U,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void oe(),disabled:U||!v.trim(),children:U?"Saving…":"Save"})]})]}),t.jsxs("div",{className:"task-document-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>void ae(H),children:u===H.key?t.jsxs(t.Fragment,{children:[t.jsx(Pi,{size:14})," Collapse"]}):t.jsxs(t.Fragment,{children:[t.jsx(Ln,{size:14})," Expand"]})}),u===H.key&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn-sm",onClick:()=>void k(H.key),children:[t.jsx(wr,{size:14})," History"]}),r&&p!==H.key&&t.jsx("button",{className:"btn btn-sm",onClick:z,children:"Edit"}),r&&(W===H.key?t.jsxs("div",{className:"confirm-delete-actions",children:[t.jsx("span",{children:"Delete?"}),t.jsx("button",{className:"btn btn-danger btn-sm",onClick:()=>void we(H.key),disabled:T===H.key,children:T===H.key?"…":"Yes"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>Y(null),disabled:T===H.key,children:"No"})]}):t.jsx("button",{className:"btn btn-danger btn-sm",onClick:()=>Y(H.key),children:t.jsx(es,{size:14})}))]})]})]},H.key))}),r&&!S&&t.jsxs("button",{className:"btn btn-sm task-document-new-btn",onClick:()=>R(!0),children:[t.jsx(os,{size:14})," New Document"]})]})}function Ba(e){return e.toLocaleString()}function hO(e){return`${(e*100).toFixed(1)}%`}function Hu(e){const n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleString()}function to(e){if(e<1e3)return`${Math.round(e)} ms`;const n=e/1e3;if(n<60)return`${n.toFixed(1)} s`;const s=Math.floor(n/60),a=Math.round(n%60);return`${s}m ${a}s`}function fO(e){const n=Date.now(),s=e.map(o=>{if(!o.startedAt)return null;const l=new Date(o.startedAt).getTime();if(Number.isNaN(l))return null;let c;if(o.completedAt){const d=new Date(o.completedAt).getTime();if(Number.isNaN(d)||d<l)return null;c=d}else c=Math.max(l,n);return{name:o.workflowStepName||o.workflowStepId,durationMs:c-l}}).filter(o=>o!==null),a=zy(e,n)??0,r=s.reduce((o,l)=>!o||l.durationMs>o.durationMs?l:o,void 0);return{timedStepCount:s.length,totalDurationMs:a,longestStep:r}}function pO({tokenUsage:e,loading:n,task:s}){const a=Date.now(),r=Oy(s?.log??[]),o=r.filter(y=>typeof y.durationMs=="number"),l=o.reduce((y,g)=>y+(g.durationMs??0),0),c=Fy(s?.log)??0,d=typeof s?.timedExecutionMs=="number"?s.timedExecutionMs:Math.max(l,c),u=o.reduce((y,g)=>!y||(g.durationMs??0)>(y.durationMs??0)?g:y,void 0),h=fO(s?.workflowStepResults??[]),m=s?Uy(s,a):null,f=By(s?.executionStartedAt,s?.executionCompletedAt,a),p=vA(s?.firstExecutionAt,s?.executionCompletedAt,a),b=m??f??(typeof s?.timedExecutionMs=="number"?s.timedExecutionMs:d+h.totalDurationMs),v=p!=null&&p!==b,x=s?.steps?.length??0;return t.jsxs("section",{className:"task-token-stats-panel","aria-label":"Task execution statistics",children:[t.jsx("h4",{children:"Execution & Token Stats"}),t.jsxs("div",{className:"task-token-stats-panel__section",children:[t.jsx("h5",{children:"Execution Timing"}),t.jsxs("div",{className:"task-token-stats-panel__grid",role:"list","aria-label":"Execution timing metrics",children:[t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Timing events"}),t.jsx("span",{className:"task-token-stats-panel__value",children:r.length.toLocaleString()})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Timed duration"}),t.jsx("span",{className:"task-token-stats-panel__value",children:to(d)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Workflow timed steps"}),t.jsx("span",{className:"task-token-stats-panel__value",children:h.timedStepCount.toLocaleString()})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Workflow runtime"}),t.jsx("span",{className:"task-token-stats-panel__value",children:to(h.totalDurationMs)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Total execution time"}),t.jsx("span",{className:"task-token-stats-panel__value",children:to(b)})]}),v?t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Wall-clock since first execution"}),t.jsx("span",{className:"task-token-stats-panel__value",children:to(p)})]}):null]}),t.jsxs("dl",{className:"task-token-stats-panel__timestamps",children:[t.jsxs("div",{className:"task-token-stats-panel__timestamp-row",children:[t.jsx("dt",{children:"Longest timing event"}),t.jsx("dd",{children:u?.durationMs?`${u.summary} (${to(u.durationMs)})`:"No timed events recorded yet."})]}),t.jsxs("div",{className:"task-token-stats-panel__timestamp-row",children:[t.jsx("dt",{children:"Longest workflow step"}),t.jsx("dd",{children:h.longestStep?`${h.longestStep.name} (${to(h.longestStep.durationMs)})`:"No completed workflow step timings yet."})]})]})]}),t.jsxs("div",{className:"task-token-stats-panel__section",children:[t.jsx("h5",{children:"Execution Details"}),t.jsxs("dl",{className:"task-token-stats-panel__details",children:[t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Execution mode"}),t.jsx("dd",{children:s?.executionMode==="fast"?"Fast":"Standard"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Runtime status"}),t.jsx("dd",{children:s?.status??"Not set"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Paused"}),t.jsx("dd",{children:s?.paused?"Yes":"No"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Step progress"}),t.jsx("dd",{children:x>0?`${Math.min((s?.currentStep??0)+1,x)} / ${x}`:"No steps"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Retries (recovery / workflow / merge / task_done)"}),t.jsx("dd",{children:`${s?.recoveryRetryCount??0} / ${s?.workflowStepRetries??0} / ${s?.mergeRetries??0} / ${s?.taskDoneRetryCount??0}`})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Recovery state"}),t.jsx("dd",{children:s?.nextRecoveryAt?`Next recovery at ${Hu(s.nextRecoveryAt)}`:"No scheduled recovery"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Self-heal counters"}),t.jsx("dd",{children:`stuck kills: ${s?.stuckKillCount??0}, post-review fixes: ${s?.postReviewFixCount??0}`})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Runtime links"}),t.jsx("dd",{children:[s?.assignedAgentId?`agent ${s.assignedAgentId}`:null,s?.checkedOutBy?`checkout ${s.checkedOutBy}`:null,s?.blockedBy?`blocked by ${s.blockedBy}`:null,s?.sessionFile?"has session":null].filter(Boolean).join(", ")||"No runtime links"})]})]})]}),t.jsxs("div",{className:"task-token-stats-panel__section",children:[t.jsx("h5",{children:"Token Usage"}),!e&&n?t.jsx("div",{className:"task-token-stats-panel__loading",role:"status","aria-live":"polite",children:"Loading token statistics…"}):e?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"task-token-stats-panel__grid",role:"list","aria-label":"Task token totals",children:[t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Input"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.inputTokens)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Output"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.outputTokens)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Cache read"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.cachedTokens)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Cache write"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.cacheWriteTokens??0)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Total"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.totalTokens)})]})]}),t.jsxs("div",{className:"task-token-stats-panel__cache-ratio",children:[t.jsx("span",{className:"task-token-stats-panel__cache-ratio-label",children:"Cache hit ratio:"})," ",t.jsx("span",{className:"task-token-stats-panel__cache-ratio-value",children:e.inputTokens+e.cachedTokens>0?hO(e.cachedTokens/(e.inputTokens+e.cachedTokens)):"—"})]}),t.jsxs("div",{className:"task-token-stats-panel__cache-breakdown",children:["(read ",Ba(e.cachedTokens)," / write ",Ba(e.cacheWriteTokens??0)," / input ",Ba(e.inputTokens),")"]}),t.jsxs("dl",{className:"task-token-stats-panel__timestamps",children:[t.jsxs("div",{className:"task-token-stats-panel__timestamp-row",children:[t.jsx("dt",{children:"First used"}),t.jsx("dd",{children:t.jsx("time",{dateTime:e.firstUsedAt,children:Hu(e.firstUsedAt)})})]}),t.jsxs("div",{className:"task-token-stats-panel__timestamp-row",children:[t.jsx("dt",{children:"Last used"}),t.jsx("dd",{children:t.jsx("time",{dateTime:e.lastUsedAt,children:Hu(e.lastUsedAt)})})]})]})]}):t.jsx("div",{className:"task-token-stats-panel__empty",role:"status",children:"No token usage recorded for this task yet."})]})]})}const vk=/^In-review stall surfaced \[([^\]]+)\]/;function gO(e,n){if(!e.log?.length)return;const s=[...e.log].reverse();for(const[a,r]of s.entries()){const o=r.action.match(vk);if(!(!o||o[1]!==n))return{entry:r,reversedIndex:a,code:n}}}const hf=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]),jb=/^Stale paused review surfaced \[([^\]]+)\]/,Nb={p:({children:e,...n})=>t.jsx("p",{...n,children:ai(e)}),li:({children:e,...n})=>t.jsx("li",{...n,children:ai(e)}),code:({children:e,...n})=>{const s=typeof e=="string"?e:Ja.Children.toArray(e).join(""),a=zs(s);return a.length===1&&typeof a[0]=="string"?t.jsx("code",{...n,children:e}):t.jsx("code",{...n,children:a})}};function bO(e){let n=null;for(const s of e){if(s.agent!=="executor"||s.type!=="text")continue;const a=s.text.match(/^Executor using model: (.+?)\/(.+)$/);a&&(n={provider:a[1],modelId:a[2]})}return n}function xO(e){let n=null;for(const s of e){if(s.agent!=="reviewer"||s.type!=="text")continue;const a=s.text.match(/^Reviewer using model: (.+?)\/(.+)$/);a&&(n={provider:a[1],modelId:a[2]})}return n}function Sb(e){return(e.title??"").trim().length>0?!0:!!(e.description??"").split(/\r?\n/).map(s=>s.trim()).find(s=>s.length>0)}function yk(e){const n=e?.runtimeConfig??void 0,s=typeof n?.model=="string"?n.model.trim():"";if(s){const o=s.indexOf("/");if(o>0&&o<s.length-1)return{provider:s.slice(0,o),modelId:s.slice(o+1)}}const a=typeof n?.modelProvider=="string"?n.modelProvider.trim():"",r=typeof n?.modelId=="string"?n.modelId.trim():"";return{provider:a||void 0,modelId:r||void 0}}function vO(e,n,s,a){const r=bO(n);if(r)return r;if(hf.has(e.status??"")||e.column==="in-progress"){const o=yk(s);if(o.provider&&o.modelId)return o}return Kv(e,a)}function yO(e,n,s,a){const r=xO(n);if(r)return r;if(hf.has(e.status??"")||e.column==="in-progress"){const o=yk(s);if(o.provider&&o.modelId)return o}return Jv(e,a)}function wO(e){let n=null;for(const s of e){if(s.agent!=="triage"||s.type!=="text")continue;const a=s.text.match(/^Triage using model: (.+?)\/(.+)$/);a&&(n={provider:a[1],modelId:a[2]})}return n}function kO(e,n,s){if(e.planningModelProvider&&e.planningModelId)return{provider:e.planningModelProvider,modelId:e.planningModelId};const a=wO(n);return a||Yv(e,s)}function jO(e){switch(e){case"done":return"var(--color-success)";case"in-progress":return"var(--in-progress)";case"skipped":return"var(--text-dim)";case"pending":default:return"var(--border)"}}function no(e){const n=new Date(e),a=new Date().getTime()-n.getTime(),r=Math.floor(a/6e4),o=Math.floor(r/60),l=Math.floor(o/24);return r<1?"just now":r<60?`${r}m ago`:o<24?`${o}h ago`:l<7?`${l}d ago`:n.toLocaleDateString(void 0,{month:"short",day:"numeric"})}function NO(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function el(e){const n=Math.max(1,Math.floor(e/6e4)),s=Math.floor(n/1440),a=Math.floor(n%1440/60),r=n%60;return s>0?`${s}d ${a}h`:a>0?`${a}h ${r}m`:`${r}m`}function qu(e,n){return e.length>n?e.slice(0,n)+"…":e}function Cb(e=[],n=[]){return e.length===n.length&&e.every((s,a)=>s===n[a])}function Vu(e){const n=e.indexOf("/");return!e||n===-1?null:{provider:e.slice(0,n),modelId:e.slice(n+1)}}function Wu(e){return e.trim()}function SO(e){const n=e.trim();return n.length>0?n:void 0}function ja(e){return typeof e=="string"&&nr.includes(e)?e:di}function Na(e){return e==="fast"?"fast":"standard"}function CO(e){const n=e?.issueUrl;return typeof n=="string"&&n.length>0?n:void 0}function EO(e){const n=e.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/(issues|pull)\/(\d+)(?:$|[/?#])/);if(!n)return null;const[,s,a,,r]=n;return{label:`${s}/${a}#${r}`,href:e}}function _O(e){const n=e?.findingLabel;if(typeof n=="string"&&n.length>0)return n;const s=e?.runId;return typeof s=="string"&&s.length>0?s:void 0}const MO=i.lazy(()=>qn(()=>import("./AgentDetailView-CquLtIia.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])).then(e=>({default:e.AgentDetailView})));function RO(e,n={}){switch(e.sourceType){case"dashboard_ui":return{label:"Dashboard"};case"quick_chat":return{label:"Quick Chat"};case"chat_session":return{label:"Chat Session"};case"agent_heartbeat":return{label:n.sourceAgentName??e.sourceAgentId??"agent",sourceAgentId:e.sourceAgentId};case"automation":return{label:"Automation"};case"cron":return{label:"Scheduled Task"};case"workflow_step":return{label:"Workflow Step"};case"github_import":{const s=CO(e.sourceMetadata),a=s?EO(s):null;return{label:"GitHub Import",contextInfo:s?a?.label??"Open issue":void 0,contextHref:s,contextInfoFull:s}}case"research":{const s=_O(e.sourceMetadata);return{label:"Research",contextInfo:s,contextInfoFull:s}}case"task_refine":return{label:"Refinement",parentTaskId:e.sourceParentTaskId};case"task_duplicate":return{label:"Duplicate",parentTaskId:e.sourceParentTaskId};case"cli":return{label:"CLI"};case"api":return{label:"API"};case"recovery":return{label:"Recovery"};case"unknown":default:return null}}const Gu=200,AO=new Set(["triage","todo"]),TO=new Set(["triage","todo","in-progress","in-review"]);function wk({task:e,projectId:n,tasks:s=[],onOpenDetail:a,onMoveTask:r,onDeleteTask:o,onArchiveTask:l,onMergeTask:c,onRetryTask:d,onResetTask:u,onDuplicateTask:h,onTaskUpdated:m,addToast:f,prAuthAvailable:p,initialTab:b="definition",mobileHeaderMode:v="close",embedded:x=!1,onRequestClose:y}){const[g,j]=i.useState(b==="retries"?"definition":b),[N,C]=i.useState(()=>"prompt"in e?e:null),[w,S]=i.useState(()=>!("prompt"in e));i.useEffect(()=>{if("prompt"in e){C(e),S(!1);return}let q=!1;return S(!0),C(null),Sr(e.id,n).then(ke=>{q||(C(ke),S(!1))}).catch(()=>{q||S(!1)}),()=>{q=!0}},[e.id,n]);const R=N?{...N,...e,prompt:N.prompt,log:N.log,githubTracking:e.githubTracking??N.githubTracking}:{...e,prompt:""},I=e.status==="failed"||e.status==="stuck-killed"||e.status==="planning"||e.status==="needs-replan"||(e.stuckKillCount??0)>0||(e.recoveryRetryCount??0)>0||!!e.nextRecoveryAt,[E,M]=i.useState(null),[G,U]=i.useState(null),P=RO(R,{sourceAgentName:E?.name});i.useEffect(()=>{j(b==="retries"?"definition":b),b==="retries"&&kn(!0)},[b]),i.useEffect(()=>{g==="pr"&&e.column!=="in-review"&&j("definition")},[g,e.column]),i.useEffect(()=>{_(!1)},[e.id]);const[T,D]=i.useState("activity"),[W,Y]=i.useState(null),[L,_]=i.useState(!1),[F,ae]=i.useState(e.attachments||[]),[k,z]=i.useState(!1),[J,oe]=i.useState(e.dependencies||[]),[le,we]=i.useState(!1),[re,H]=i.useState(""),[ue,Q]=i.useState(null),[be,fe]=i.useState([]),[O,se]=i.useState(!1),[ve,A]=i.useState(!1),[ne,ye]=i.useState(!1),[ee,ge]=i.useState(!1),[Ne,He]=i.useState(!1),[Le,de]=i.useState(R.prompt||""),[Re,Pe]=i.useState(""),[rt,qe]=i.useState(!1),[Xe,At]=i.useState(!1);i.useEffect(()=>{if(g!=="logs"||T!=="activity"){Y(null);return}if(!W)return;const q=Dn.current?.querySelector('[data-stall-highlight="true"]');q&&typeof q.scrollIntoView=="function"&&q.scrollIntoView({block:"nearest",behavior:"smooth"})},[g,T,W]);const[at,Se]=i.useState(""),[pe,_e]=i.useState(!1),[et,Ae]=i.useState(!1),[it,xt]=i.useState(e.title||""),[Nt,Ut]=i.useState(e.description||""),[Be,Z]=i.useState(e.dependencies||[]),[Oe,ht]=i.useState(e.branch??""),[je,mt]=i.useState(e.baseBranch??""),[Et,Te]=i.useState(""),[xe,gt]=i.useState(""),[_t,Ft]=i.useState(""),[Dt,nt]=i.useState(""),[Wt,Mt]=i.useState("default"),[Kt,xn]=i.useState(void 0),[Tn,Sn]=i.useState(di),[is,On]=i.useState(e.nodeId),[un,tn]=i.useState(Na(e.executionMode)),[on,pn]=i.useState(""),[mn,Zn]=i.useState(e.enabledWorkflowSteps||[]),[In,rn]=i.useState(e.sourceIssue?.provider??""),[hn,Pn]=i.useState(e.sourceIssue?.repository??""),[nn,$t]=i.useState(e.sourceIssue?.externalIssueId??""),[Jt,Qt]=i.useState(e.sourceIssue?.url??""),[ie,Fe]=i.useState([]),[Je,tt]=i.useState(!1),[Ye,vt]=i.useState(ja(e.priority)),[pt,Zt]=i.useState(!1),[ce,Ge]=i.useState(Na(e.executionMode)),[Me,Ke]=i.useState(!1),[Qe,Lt]=i.useState(e.noCommitsExpected===!0),[gn,Bn]=i.useState(!1),wn=i.useRef(!1),Yt=i.useRef(e.id),[$n,dn]=i.useState(!1),[me,jt]=i.useState(!1),[Cn,bs]=i.useState(!1),[Ts,kn]=i.useState(b==="retries"),[ls,cs]=i.useState(!1),[ys,xs]=i.useState(e.githubTracking?.repoOverride??""),[he,bt]=i.useState(null),[ot,St]=i.useState(null),[lt,Tt]=i.useState(!1),[Xt,zt]=i.useState(!1),[Ee,yt]=i.useState(!1),[Rt,yn]=i.useState(null),_n=i.useRef(null),Dn=i.useRef(null),an=i.useRef(null),En=i.useRef(null),{getSlotsForId:ws}=wy(n),ks=ws("task-detail-tab").map((q,ke)=>({entry:q,tabId:`plugin-${q.pluginId}-${ke}`})),V=typeof g=="string"&&g.startsWith("plugin-")?ks.find(q=>q.tabId===g)??null:null;i.useEffect(()=>(wn.current=!0,()=>{wn.current=!1}),[]),i.useEffect(()=>{Yt.current=e.id},[e.id]);const[We,wt]=i.useState(void 0),[ut,Bt]=i.useState(null),[en,jn]=i.useState([]),[ts,vs]=i.useState(!1),[Ps,te]=i.useState(e.enabledWorkflowSteps||[]),Ie=e.column==="in-progress"||hf.has(e.status);i.useEffect(()=>{xt(e.title||""),Ut(e.description||""),ht(e.branch??""),mt(e.baseBranch??""),rn(e.sourceIssue?.provider??""),Pn(e.sourceIssue?.repository??""),$t(e.sourceIssue?.externalIssueId??""),Qt(e.sourceIssue?.url??""),tn(Na(e.executionMode)),bs(!1),cs(!1),xs(R.githubTracking?.repoOverride??""),bt(null),St(null),Ae(!1),yn(null),zt(!1)},[e.id,e.title,e.description,e.branch,e.baseBranch,e.sourceIssue,e.executionMode,R.githubTracking]),i.useEffect(()=>{te(e.enabledWorkflowSteps||[])},[e.id,e.enabledWorkflowSteps]),i.useEffect(()=>{vt(ja(e.priority))},[e.id,e.priority]),i.useEffect(()=>{Ge(Na(e.executionMode))},[e.id,e.executionMode]),i.useEffect(()=>{Lt(e.noCommitsExpected===!0)},[e.id,e.noCommitsExpected]),i.useEffect(()=>{he!==null&&R.githubTracking?.enabled===!0===he&&bt(null)},[he,R.githubTracking?.enabled]),i.useEffect(()=>{let q=!1;return Md(n).then(ke=>{q||wt(ke)}).catch(()=>{}),Ra().then(ke=>{q||Bt(ke)}).catch(()=>{q||Bt(null)}),()=>{q=!0}},[n]),i.useEffect(()=>{if(g!=="workflow")return;let q=!1;return vs(!0),VE(e.id,n).then(ke=>{q||jn(ke)}).catch(ke=>{q||f(`Failed to load workflow results: ${Ce(ke)}`,"error")}).finally(()=>{q||vs(!1)}),()=>{q=!0}},[g,e.id,n,f]),i.useEffect(()=>{if(g!=="workflow")return;const q=n?`?projectId=${encodeURIComponent(n)}`:"",ke=st=>{try{const It=JSON.parse(st.data);It.id===e.id&&Array.isArray(It.workflowStepResults)&&jn(It.workflowStepResults)}catch{}};return Si(`/api/events${q}`,{events:{"task:updated":ke}})},[g,e.id,n]),i.useEffect(()=>{le||H("")},[le]),i.useEffect(()=>{if(!e.assignedAgentId){Q(null);return}const q=be.find(st=>st.id===e.assignedAgentId);if(q){Q(q);return}let ke=!1;return Dm(e.assignedAgentId,n).then(st=>{ke||Q(st)}).catch(()=>{ke||Q(null)}),()=>{ke=!0}},[e.assignedAgentId,n,be]),i.useEffect(()=>{if(!e.sourceAgentId){M(null);return}const q=be.find(st=>st.id===e.sourceAgentId);if(q){M(q);return}let ke=!1;return Promise.resolve(Dm(e.sourceAgentId,n)).then(st=>{ke||M(st??null)}).catch(()=>{ke||M(null)}),()=>{ke=!0}},[e.sourceAgentId,n,be]),i.useEffect(()=>{se(!1)},[e.id]),i.useEffect(()=>{if(!($n||me))return;const ke=st=>{const It=st.target,An=_n.current?.contains(It),mi=En.current?.contains(It);!An&&$n&&dn(!1),!mi&&me&&jt(!1)};return document.addEventListener("mousedown",ke),()=>document.removeEventListener("mousedown",ke)},[$n,me]),i.useEffect(()=>{if(!($n||me))return;const ke=st=>{st.key==="Escape"&&(st.stopPropagation(),$n&&dn(!1),me&&jt(!1))};return document.addEventListener("keydown",ke),()=>document.removeEventListener("keydown",ke)},[$n,me]),i.useEffect(()=>{He(!1),de(R.prompt||""),Pe("")},[e.id,R.prompt]);const ft=AO.has(e.column)&&!Je,Vt=TO.has(e.column)&&!Je,qt=he??R.githubTracking?.enabled===!0,ln=R.githubTracking?.issue,Mn=w&&typeof e.githubTracking>"u",Rn=Sb(e),Kn=Vt&&!ln&&!Mn&&(!qt||lt&&R.githubTracking?.enabled!==!0),ds=Vt||qt||!!ln,Jn=e.retrySummary,Us=[{key:"stuckKill",label:"Stuck kills",title:"Stuck-task detector forced agent kill retries",value:Jn?.stuckKill??0},{key:"recovery",label:"Recovery retries",title:"Transient executor recovery retries",value:Jn?.recovery??0},{key:"taskDone",label:"task_done retries",title:"Agent exited without task_done and task was retried",value:Jn?.taskDone??0},{key:"workflowStep",label:"Workflow retries",title:"Workflow step failure retries",value:Jn?.workflowStep??0},{key:"verification",label:"Verification bounces",title:"Verification failure bounce retries",value:Jn?.verification??0},{key:"postReviewFix",label:"Post-review fixes",title:"Post-review remediation retries",value:Jn?.postReviewFix??0},{key:"mergeConflict",label:"Merge conflict bounces",title:"Merge conflict bounce retries",value:Jn?.mergeConflict??0},{key:"branchConflict",label:"Branch conflict recovery",title:"FN-4068 branch-conflict recovery retries",value:Jn?.branchConflict??0},{key:"reviewerContext",label:"Reviewer context retries",title:"FN-4082 compact reviewer retry",value:Jn?.reviewerContext??0},{key:"reviewerFallback",label:"Reviewer fallback retries",title:"FN-4092 fallback-model retry",value:Jn?.reviewerFallback??0}].filter(q=>q.value>0),X=Mn?"Loading":ln?"Linked":qt?"Enabled":"Disabled",$e=!ln&&(lt||Mn),Ue=bk(We??null,ut),Ht=ys.trim(),cn=i.useCallback(async()=>{if(!Vt||lt)return;const q=e.id,ke=!qt;bt(ke),Tt(!0);try{const st=await ni(e.id,{githubTracking:{enabled:ke}},n);if(Yt.current!==q)return;C(It=>It?{...It,...st,githubTracking:st.githubTracking}:st),m?.(st)}catch(st){if(Yt.current!==q)return;bt(R.githubTracking?.enabled===!0),f(`Failed to update ${e.id}: ${Ce(st)}`,"error")}finally{wn.current&&Yt.current===q&&Tt(!1)}},[f,Vt,qt,lt,m,n,R.githubTracking?.enabled,e.id]),Un=i.useCallback(async()=>{if(!Vt||lt)return;const q=e.id;if(Ht.length>0&&!_d.test(Ht)){St("Repository override must be in owner/repo format");return}St(null),Tt(!0);try{const ke=await ni(e.id,{githubTracking:{repoOverride:Ht.length>0?Ht:null}},n);if(Yt.current!==q)return;C(st=>st?{...st,...ke,githubTracking:ke.githubTracking}:ke),m?.(ke)}catch(ke){if(Yt.current!==q)return;f(`Failed to update ${e.id}: ${Ce(ke)}`,"error")}finally{wn.current&&Yt.current===q&&Tt(!1)}},[f,Vt,Ht,lt,m,n,e.id]),as=i.useCallback(async()=>{if(!qt||ln||lt)return;if(!Sb(e)){f("Add a title before creating a tracking issue","info");return}const q=e.id;Tt(!0);try{const ke=await ni(e.id,{githubTracking:{enabled:!0}},n);if(Yt.current!==q)return;C(st=>st?{...st,...ke,githubTracking:ke.githubTracking}:ke),m?.(ke),f("Requested GitHub tracking issue creation","info")}catch(ke){if(Yt.current!==q)return;f(`Failed to update ${e.id}: ${Ce(ke)}`,"error")}finally{wn.current&&Yt.current===q&&Tt(!1)}},[f,ln,qt,lt,m,n,e]),$s=i.useCallback(()=>{if(!ft)return;Ae(!0),xt(e.title||""),Ut(e.description||""),Z(e.dependencies||[]),ht(e.branch??""),mt(e.baseBranch??"");const q=e.modelProvider&&e.modelId?`${e.modelProvider}/${e.modelId}`:"",ke=e.validatorModelProvider&&e.validatorModelId?`${e.validatorModelProvider}/${e.validatorModelId}`:"",st=e.planningModelProvider&&e.planningModelId?`${e.planningModelProvider}/${e.planningModelId}`:"";Te(q),gt(ke),Ft(st),nt(e.thinkingLevel??""),On(e.nodeId),Mt(q||ke||st?"custom":"default"),pn(""),Zn(e.enabledWorkflowSteps||[]),tn(Na(e.executionMode)),rn(e.sourceIssue?.provider??""),Pn(e.sourceIssue?.repository??""),$t(e.sourceIssue?.externalIssueId??""),Qt(e.sourceIssue?.url??""),Fe([]),xn(e.reviewLevel),Sn(ja(e.priority))},[ft,e]),Fs=i.useCallback(()=>{Ae(!1),xt(e.title||""),Ut(e.description||""),Z(e.dependencies||[]),ht(e.branch??""),mt(e.baseBranch??""),On(e.nodeId),rn(e.sourceIssue?.provider??""),Pn(e.sourceIssue?.repository??""),$t(e.sourceIssue?.externalIssueId??""),Qt(e.sourceIssue?.url??""),Sn(ja(e.priority)),tn(Na(e.executionMode)),ie.forEach(q=>URL.revokeObjectURL(q.previewUrl)),Fe([])},[e.title,e.description,e.dependencies,e.nodeId,e.priority,e.executionMode,ie]),[js,Zs]=i.useState("idle"),ei=i.useRef(null),ti=i.useRef(0),Ei=i.useCallback(q=>{const ke={},st=it.trim(),It=Nt.trim();st&&st!==(e.title??"")&&(ke.title=st),q&&It&&It!==(e.description??"")&&(ke.description=It),Cb(Be,e.dependencies??[])||(ke.dependencies=Be),Cb(mn,e.enabledWorkflowSteps??[])||(ke.enabledWorkflowSteps=mn);const An=Oe.trim()||null,mi=e.branch??null;An!==mi&&(ke.branch=An);const Yl=je.trim()||null,ur=e.baseBranch??null;Yl!==ur&&(ke.baseBranch=Yl);const qd=Vu(Et),Xl=e.modelProvider&&e.modelId?`${e.modelProvider}/${e.modelId}`:"";Et!==Xl&&(ke.modelProvider=qd?.provider??null,ke.modelId=qd?.modelId??null);const Gr=Vu(xe),Af=e.validatorModelProvider&&e.validatorModelId?`${e.validatorModelProvider}/${e.validatorModelId}`:"";xe!==Af&&(ke.validatorModelProvider=Gr?.provider??null,ke.validatorModelId=Gr?.modelId??null);const Ql=Vu(_t),Rj=e.planningModelProvider&&e.planningModelId?`${e.planningModelProvider}/${e.planningModelId}`:"";_t!==Rj&&(ke.planningModelProvider=Ql?.provider??null,ke.planningModelId=Ql?.modelId??null);const Aj=e.thinkingLevel??"";Dt!==Aj&&(ke.thinkingLevel=Dt!==""?Dt:null),(e.nodeId??void 0)!==is&&(ke.nodeId=is??null),Kt!==e.reviewLevel&&(ke.reviewLevel=Kt),Tn!==ja(e.priority)&&(ke.priority=Tn),un!==Na(e.executionMode)&&(ke.executionMode=un==="fast"?"fast":null);const Vd=Wu(In),Wd=Wu(hn),Zl=Wu(nn),Gd=SO(Jt);if(Vd.length===0&&Wd.length===0&&Zl.length===0&&!Gd)e.sourceIssue&&(ke.sourceIssue=null);else{if(!Vd||!Wd||!Zl)return{updates:null,error:"Source issue provider, repository, and issue identifier are required"};const Tj=Number.parseInt(Zl,10),Kd=e.sourceIssue?.issueNumber??Tj;if(!Number.isFinite(Kd)||Kd<=0)return{updates:null,error:"Source issue identifier must be numeric for new metadata"};const Kr={provider:Vd,repository:Wd,externalIssueId:Zl,issueNumber:Kd,...Gd?{url:Gd}:{}},Jr=e.sourceIssue;(!Jr||Jr.provider!==Kr.provider||Jr.repository!==Kr.repository||Jr.externalIssueId!==Kr.externalIssueId||Jr.issueNumber!==Kr.issueNumber||(Jr.url??void 0)!==Kr.url)&&(ke.sourceIssue=Kr)}return{updates:ke,error:null}},[je,Oe,Be,Nt,un,Et,is,_t,Tn,Kt,mn,nn,In,hn,Jt,Dt,it,xe,e]),_i=i.useCallback(async q=>{const{updates:ke,error:st}=Ei(q);if(!ke)return Zs("error"),st&&f(`Failed to update ${e.id}: ${st}`,"error"),!1;if(Object.keys(ke).length===0)return!0;const It=++ti.current;tt(!0),Zs("saving");try{const An=await ni(e.id,ke,n);return It!==ti.current?void 0:(m?.(An),Zs("saved"),!0)}catch(An){return It===ti.current&&(Zs("error"),f(`Failed to update ${e.id}: ${Ce(An)}`,"error")),!1}finally{wn.current&&It===ti.current&&tt(!1)}},[f,Ei,m,n,e.id]),$r=i.useCallback(async q=>{await _i(!0)},[_i]),Pa=i.useCallback(async()=>{await _i(!0)&&(f(`Updated ${e.id}`,"success"),wn.current&&Ae(!1))},[f,_i,e.id]);i.useEffect(()=>{if(et)return ei.current&&clearTimeout(ei.current),ei.current=setTimeout(()=>{_i(!1)},700),()=>{ei.current&&(clearTimeout(ei.current),ei.current=null)}},[et,it,Be,Oe,je,Et,xe,_t,Dt,is,Kt,Tn,un,mn,In,hn,nn,Jt,_i]);const Uo=i.useCallback(async q=>{const ke=ja(q),st=ja(e.priority);if(ke===st){vt(st);return}const It=Ye;vt(ke),Zt(!0);try{const An=await ni(e.id,{priority:ke},n);vt(ja(An.priority)),m?.(An),f(`Priority updated to ${ja(An.priority)}`,"success")}catch(An){vt(It),f(`Failed to update ${e.id}: ${Ce(An)}`,"error")}finally{wn.current&&Zt(!1)}},[e.id,e.priority,n,Ye,m,f]),Dr=i.useCallback(async()=>{const ke=Na(e.executionMode)==="fast"?"standard":"fast",st=ce;Ge(ke),Ke(!0);try{const It=await ni(e.id,{executionMode:ke==="fast"?"fast":null},n),An=Na(It.executionMode);Ge(An),m?.(It),f(`Execution mode updated to ${An}`,"success")}catch(It){Ge(st),f(`Failed to update ${e.id}: ${Ce(It)}`,"error")}finally{wn.current&&Ke(!1)}},[e.id,e.executionMode,n,ce,m,f]),Lr=i.useCallback(async()=>{const q=!Qe,ke=Qe;Lt(q),Bn(!0);try{const st=await ni(e.id,{noCommitsExpected:q},n),It=st.noCommitsExpected===!0;Lt(It),m?.(st),f(`No-commits expectation ${It?"enabled":"disabled"}`,"success")}catch(st){Lt(ke),f(`Failed to update ${e.id}: ${Ce(st)}`,"error")}finally{wn.current&&Bn(!1)}},[e.id,n,Qe,m,f]),$a=i.useCallback(q=>{et&&(q.key==="Escape"?(q.preventDefault(),Fs()):q.key==="Enter"&&(q.ctrlKey||q.metaKey)&&(q.preventDefault(),Pa()))},[et,Fs,Pa]);i.useEffect(()=>{if(et)return document.addEventListener("keydown",$a),()=>document.removeEventListener("keydown",$a)},[et,$a]);const Da=i.useRef(null),{nodes:La}=Td(),{confirm:_s,confirmWithChoice:na,confirmWithCheckbox:Li}=Di(),Or=i.useCallback(async()=>{if(!(!ft||!ln||lt||!await _s({title:"Unlink GitHub issue?",message:"This stops Fusion from syncing with the linked GitHub issue. The issue itself will not be modified.",confirmLabel:"Unlink",danger:!0}))){Tt(!0);try{const ke=await ni(e.id,{githubTracking:{issue:null}},n);m?.(ke),f("GitHub issue unlinked","success")}catch(ke){f(`Failed to update ${e.id}: ${Ce(ke)}`,"error")}finally{wn.current&&Tt(!1)}}},[f,ft,_s,ln,lt,m,n,e.id]),{entries:sa,loading:Oi,loadMore:ya,hasMore:Fr,total:zr,loadingMore:Br}=rk(e.id,g==="logs"&&T==="agent-log",n),Vn=i.useCallback(()=>{y?.()},[y]);i.useEffect(()=>{if(x)return;const q=ke=>{ke.key==="Escape"&&!et&&Vn()};return document.addEventListener("keydown",q),()=>document.removeEventListener("keydown",q)},[x,Vn,et]);const ir=i.useCallback(async q=>{try{const ke=e.steps.some(An=>An.status!=="pending"),st=(q==="todo"||q==="triage")&&ke;let It;if(st){if(await _s({title:"Preserve Progress?",message:"This task has completed steps. Keep progress before moving?",confirmLabel:"Keep Progress",cancelLabel:"Reset Progress"}))It={preserveProgress:!0};else if(!await _s({title:"Reset Progress?",message:"Reset all step progress before moving this task?",confirmLabel:"Reset Progress",cancelLabel:"Cancel Move",danger:!0}))return}await r(e.id,q,It),Vn(),f(`Moved to ${Hs[q]}`,"success")}catch(ke){f(Ce(ke),"error")}},[e.id,e.steps,r,Vn,f,_s]),Oa=i.useCallback(async()=>{let q=!1;if(e.column==="done"&&l){const It=await na({title:"Delete Task",message:`Delete ${e.id}?`,confirmLabel:"Delete",cancelLabel:"Cancel",tertiaryLabel:"Archive Instead",danger:!0});if(It==="tertiary"){try{await l(e.id),f(`Archived ${e.id}`,"success"),Vn()}catch(An){const mi=ha(An);if(!mi||mi.lineageChildIds.length===0){f(Ce(An),"error");return}if(!await _s({title:"Force Delete Task",message:`${e.id} has lineage children (${mi.lineageChildIds.join(", ")}) that reference it as a source parent.
719
+ `);return n.length<=1?e:`${n.length} lines`}function xc(e,n,s){const a=e==="post-merge"?"phase-badge--post-merge":"phase-badge--pre-merge";return t.jsx("span",{className:`phase-badge ${a}`,"data-testid":`${s}-${n}`,children:e==="post-merge"?"Post-merge":"Pre-merge"})}function sO({entries:e,startedAt:n,stepId:s}){const a=i.useRef(null),r=new Date(n).getTime(),o=e.filter(l=>new Date(l.timestamp).getTime()>=r);return i.useEffect(()=>{const l=a.current;l&&(l.scrollTop=l.scrollHeight)},[o.length]),o.length===0?t.jsx("div",{className:"workflow-live-log","data-testid":`workflow-live-log-${s}`,children:t.jsx("div",{className:"workflow-live-log-empty",children:"Waiting for agent output…"})}):t.jsx("div",{ref:a,className:"workflow-live-log","data-testid":`workflow-live-log-${s}`,children:o.map((l,c)=>l.type==="tool"?t.jsxs("div",{className:"workflow-live-log-tool",children:["⚡ ",zs(l.text),l.detail&&t.jsxs("span",{className:"workflow-live-log-detail",children:[" — ",zs(l.detail)]})]},c):l.type==="tool_result"?t.jsxs("div",{className:"workflow-live-log-tool-result",children:["✓ ",zs(l.text),l.detail&&t.jsxs("span",{className:"workflow-live-log-detail",children:[" — ",zs(l.detail)]})]},c):l.type==="tool_error"?t.jsxs("div",{className:"workflow-live-log-tool-error",children:["✗ ",zs(l.text),l.detail&&t.jsxs("span",{className:"workflow-live-log-detail",children:[" — ",zs(l.detail)]})]},c):l.type==="thinking"?t.jsx("div",{className:"workflow-live-log-thinking",children:zs(l.text)},c):t.jsx("span",{className:"workflow-live-log-text",children:zs(l.text)},c))})}function iO({taskId:e,results:n,loading:s,enabledWorkflowSteps:a,canEdit:r,projectId:o,isTaskInProgress:l,onWorkflowStepsChange:c}){const[d,u]=i.useState({}),[h,m]=i.useState({}),[f,p]=i.useState(null),[b,v]=i.useState([]),[x,y]=i.useState(!1),g=n.some(k=>k.status==="pending"),{entries:j}=rk(e,!!l&&g,o);i.useEffect(()=>{let k=!1;return Bl(o).then(z=>{k||v(z.filter(J=>J.enabled))}).catch(()=>{k||v([])}),()=>{k=!0}},[o]);const N=a??[],C=i.useMemo(()=>b.map(k=>({id:k.id,name:k.name,description:k.description,phase:k.phase||"pre-merge"})),[b]),w=i.useMemo(()=>new Map(C.map(k=>[k.id,k])),[C]),S=k=>{u(z=>({...z,[k]:!z[k]}))},R=k=>{m(z=>{const J=z[k]??"markdown";return{...z,[k]:J==="markdown"?"plain":"markdown"}})},I=k=>{p(k)},E=()=>{p(null)};i.useEffect(()=>{if(!f)return;const k=z=>{z.key==="Escape"&&E()};return document.addEventListener("keydown",k),()=>{document.removeEventListener("keydown",k)}},[f]);const M=i.useCallback((k,z)=>{if(c){if(z){if(N.includes(k)){c(N);return}c([...N,k]);return}c(N.filter(J=>J!==k))}},[c,N]),G=i.useCallback(k=>{if(!c||k<=0)return;const z=[...N];[z[k-1],z[k]]=[z[k],z[k-1]],c(z)},[c,N]),U=i.useCallback(k=>{if(!c||k>=N.length-1)return;const z=[...N];[z[k],z[k+1]]=[z[k+1],z[k]],c(z)},[c,N]),P=i.useCallback(k=>{c&&c(N.filter(z=>z!==k))},[c,N]),T=n.length>0,D=N.length>0;i.useEffect(()=>{r||y(!1)},[r]);const W=i.useMemo(()=>N.map(k=>{const z=w.get(k);return{id:k,name:z?.name||k,description:z?.description||"Step definition not found.",phase:z?.phase||"pre-merge"}}),[N,w]),Y=()=>!r||!x||s?null:t.jsxs("div",{className:"workflow-results-editor","data-testid":"workflow-steps-editor",children:[t.jsxs("div",{className:"workflow-steps-section",children:[t.jsx("small",{className:"workflow-steps-description",children:"Select steps to run after task implementation completes"}),t.jsx("div",{className:"workflow-steps-list",children:C.map(k=>t.jsxs("label",{className:"checkbox-label workflow-step-item","data-testid":`workflow-step-checkbox-${k.id}`,children:[t.jsx("input",{type:"checkbox",checked:N.includes(k.id),onChange:z=>M(k.id,z.target.checked)}),t.jsxs("div",{children:[t.jsxs("span",{className:"workflow-step-name",children:[k.name,xc(k.phase,k.id,"workflow-step-phase")]}),t.jsx("div",{className:"workflow-step-description",children:k.description})]})]},k.id))})]}),N.length>1&&t.jsxs("div",{className:"workflow-step-order","data-testid":"workflow-step-order",children:[t.jsx("small",{className:"workflow-step-order-label",children:"Execution order:"}),N.map((k,z)=>{const J=w.get(k);return t.jsxs("div",{className:"workflow-step-order-item","data-testid":`workflow-step-order-item-${k}`,children:[t.jsx("span",{className:"workflow-step-order-number",children:z+1}),t.jsx("span",{className:"workflow-step-order-name",children:J?.name||k}),t.jsxs("div",{className:"workflow-step-order-actions",children:[t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>G(z),disabled:z===0,"data-testid":`workflow-step-move-up-${k}`,title:"Move up",children:t.jsx(Pi,{})}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>U(z),disabled:z===N.length-1,"data-testid":`workflow-step-move-down-${k}`,title:"Move down",children:t.jsx(Ln,{})}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>P(k),"data-testid":`workflow-step-remove-${k}`,title:"Remove",children:t.jsx(Nn,{})})]})]},k)})]})]}),L=()=>{if(s)return t.jsxs("div",{className:"workflow-results-loading","data-testid":"workflow-results-loading",children:[t.jsx("div",{className:"workflow-results-spinner"}),t.jsx("span",{children:"Loading workflow results…"})]});if(!T)return t.jsxs("div",{className:"workflow-results-empty","data-testid":"workflow-results-empty",children:[t.jsx("p",{children:"No workflow steps configured for this task."}),t.jsx("p",{className:"workflow-results-empty-hint",children:"Pre-merge steps run after implementation, before merge. Post-merge steps run after merge succeeds."})]});const k=n.filter(re=>re.status==="passed").length,z=n.filter(re=>re.status==="failed").length,J=n.filter(re=>re.status==="advisory_failure"),oe=n.filter(re=>re.status==="skipped").length,le=n.filter(re=>re.status==="pending").length,we=[`${n.length} step${n.length!==1?"s":""}`];return k>0&&we.push(`${k} passed`),z>0&&we.push(`${z} failed`),J.length>0&&we.push(`${J.length} advisory`),oe>0&&we.push(`${oe} skipped`),le>0&&we.push(`${le} running`),t.jsxs("div",{className:"workflow-results-list","data-testid":"workflow-results-list",children:[t.jsx("div",{className:"workflow-results-summary-bar","data-testid":"workflow-results-summary",children:we.join(" · ")}),J.length>0&&t.jsxs("div",{className:"workflow-polish-notes","data-testid":"workflow-polish-notes",children:[t.jsx("h4",{children:"Polish notes"}),t.jsx("p",{children:"Advisory workflow steps flagged non-blocking improvements:"}),t.jsx("ul",{children:J.map((re,H)=>t.jsxs("li",{children:[t.jsxs("strong",{children:[re.workflowStepName,":"]})," ",re.output||"Needs follow-up review."]},`advisory-${re.workflowStepId}-${H}`))})]}),n.map((re,H)=>{const ue=re.phase||"pre-merge",Q=d[re.workflowStepId]??!1;return t.jsxs("div",{className:`workflow-result-item workflow-result-item--${re.status}`,"data-testid":`workflow-result-item-${re.workflowStepId}`,children:[t.jsxs("div",{className:"workflow-result-header",children:[t.jsxs("div",{className:"workflow-result-name",children:[re.workflowStepName,xc(ue,re.workflowStepId,"workflow-result-phase")]}),t.jsxs("div",{className:"workflow-result-badges",children:[re.verdict&&t.jsx("span",{className:`workflow-verdict-badge workflow-verdict-badge--${re.verdict}`,"data-testid":`workflow-verdict-badge-${re.workflowStepId}`,children:re.verdict}),t.jsx("span",{className:`workflow-result-badge workflow-result-badge--${re.status}`,"data-testid":`workflow-result-badge-${re.workflowStepId}`,children:Z4(re.status)})]})]}),re.notes&&re.status!=="pending"&&t.jsxs("div",{className:"workflow-result-notes","data-testid":`workflow-result-notes-${re.workflowStepId}`,children:[t.jsx("span",{className:"workflow-result-notes-label",children:"Notes:"}),t.jsx(ji,{remarkPlugins:[Ni],components:Uu,children:re.notes})]}),t.jsxs("div",{className:"workflow-result-meta",children:[re.startedAt&&t.jsxs("span",{className:"workflow-result-timestamp",children:["Started: ",tO(re.startedAt)]}),re.completedAt&&t.jsx("span",{className:"workflow-result-duration",children:eO(re.startedAt,re.completedAt)})]}),re.status==="pending"&&re.startedAt?t.jsx(sO,{entries:j,startedAt:re.startedAt,stepId:re.workflowStepId}):re.output?t.jsxs("div",{className:"workflow-result-output-section",children:[t.jsxs("div",{className:"workflow-result-output-header",children:[t.jsx("span",{className:"workflow-result-output-label",children:"Output:"}),t.jsx("button",{type:"button",className:"btn btn-sm workflow-result-toggle",onClick:()=>S(re.workflowStepId),"data-testid":`workflow-result-toggle-${re.workflowStepId}`,children:Q?"Hide output":"Show output"}),!Q&&t.jsx("span",{className:"workflow-result-output-preview","data-testid":`workflow-result-preview-${re.workflowStepId}`,children:nO(re.output)}),Q&&t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"btn btn-sm workflow-result-mode-toggle",onClick:()=>R(re.workflowStepId),"data-testid":`workflow-result-mode-toggle-${re.workflowStepId}`,title:(h[re.workflowStepId]??"markdown")==="markdown"?"Switch to plain text":"Switch to markdown",children:(h[re.workflowStepId]??"markdown")==="markdown"?"Markdown":"Plain"}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm workflow-result-expand-toggle",onClick:()=>I(re.workflowStepId),"data-testid":`workflow-result-expand-${re.workflowStepId}`,title:"Expand output",children:t.jsx(Cd,{size:12})})]})]}),Q&&t.jsx("div",{className:`workflow-result-output${(h[re.workflowStepId]??"markdown")==="markdown"?" workflow-result-output--markdown":""}`,"data-testid":`workflow-result-output-${re.workflowStepId}`,children:(h[re.workflowStepId]??"markdown")==="markdown"?t.jsx("div",{className:"markdown-body",children:t.jsx(ji,{remarkPlugins:[Ni],components:Uu,children:re.output})}):t.jsx("pre",{className:"workflow-result-output-text",children:zs(re.output??"")})})]}):null]},`${re.workflowStepId}-${H}`)})]})},_=r?t.jsx("button",{type:"button",className:"btn btn-sm workflow-results-edit-toggle",onClick:()=>y(k=>!k),"data-testid":"workflow-steps-edit-toggle","aria-label":x?"Done editing workflow steps":"Edit workflow steps",title:x?"Done":"Edit",children:x?t.jsxs(t.Fragment,{children:[t.jsx(Js,{size:14}),"Done"]}):t.jsxs(t.Fragment,{children:[t.jsx(xi,{size:14}),"Edit"]})}):null,F=!s&&!T&&D,ae=r&&T;return t.jsxs("div",{className:"workflow-results-tab","data-task-id":e,children:[F?t.jsxs("div",{className:"workflow-configured-steps","data-testid":"workflow-configured-steps",children:[t.jsxs("div",{className:"workflow-configured-header","data-testid":"workflow-configured-header",children:[t.jsxs("div",{className:"workflow-configured-title-row",children:[t.jsx("h4",{children:"Configured Workflow Steps"}),t.jsxs("span",{className:"workflow-configured-count","data-testid":"workflow-configured-count",children:[W.length," step",W.length===1?"":"s"]})]}),_]}),t.jsx("div",{className:"workflow-configured-list","data-testid":"workflow-configured-list",children:W.map(k=>t.jsxs("div",{className:"workflow-configured-item","data-testid":`workflow-configured-step-${k.id}`,children:[t.jsxs("div",{className:"workflow-configured-name",children:[t.jsx("span",{className:"workflow-configured-name-text",children:k.name}),xc(k.phase,k.id,"workflow-configured-phase")]}),t.jsx("p",{className:"workflow-configured-description",children:k.description})]},k.id))}),t.jsx("p",{className:"workflow-results-empty-hint",children:"Pre-merge steps run after implementation, before merge. Post-merge steps run after merge succeeds."}),Y()]}):t.jsxs(t.Fragment,{children:[ae&&t.jsxs("div",{className:"workflow-results-edit-header","data-testid":"workflow-results-edit-header",children:[t.jsx("h4",{children:"Workflow Steps"}),_]}),L(),Y()]}),f&&(()=>{const k=n.find(oe=>oe.workflowStepId===f);if(!k)return null;const z=h[k.workflowStepId]??"markdown",J=k.phase||"pre-merge";return t.jsx("div",{className:"workflow-output-modal-overlay",onClick:oe=>{oe.target===oe.currentTarget&&E()},"data-testid":"workflow-output-modal",children:t.jsxs("div",{className:"workflow-output-modal",role:"dialog","aria-modal":"true",children:[t.jsxs("div",{className:"workflow-output-modal-header",children:[t.jsxs("div",{className:"workflow-output-modal-title",children:[t.jsx("span",{className:"workflow-output-modal-name",children:k.workflowStepName}),xc(J,k.workflowStepId,"workflow-output-modal-phase")]}),t.jsxs("div",{className:"workflow-output-modal-controls",children:[t.jsx("button",{type:"button",className:"btn btn-sm workflow-result-mode-toggle",onClick:()=>R(k.workflowStepId),"data-testid":"workflow-output-modal-mode-toggle",title:z==="markdown"?"Switch to plain text":"Switch to markdown",children:z==="markdown"?"Markdown":"Plain"}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm workflow-output-modal-close",onClick:E,"data-testid":"workflow-output-modal-close","aria-label":"Close",children:t.jsx(Nn,{size:16})})]})]}),t.jsx("div",{className:"workflow-output-modal-body",children:t.jsx("div",{className:`workflow-result-output workflow-result-output--expanded${z==="markdown"?" workflow-result-output--markdown":""}`,"data-testid":"workflow-output-modal-content",children:z==="markdown"?t.jsx("div",{className:"markdown-body",children:t.jsx(ji,{remarkPlugins:[Ni],components:Uu,children:k.output})}):t.jsx("pre",{className:"workflow-result-output-text",children:zs(k.output??"")})})})]})})})()]})}function aO(e){return e==="block"?"Block execution":e==="fallback-local"?"Fall back to local":"Not configured"}const rO=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function oO(e){return e!==void 0&&e!=="online"}function lO({task:e,settings:n,addToast:s,onTaskUpdated:a}){const[r,o]=i.useState([]),[l,c]=i.useState(!1),[d,u]=i.useState(null),[h,m]=i.useState(e.nodeId??""),[f,p]=i.useState(!1),b=i.useRef(e.id);i.useEffect(()=>{b.current=e.id,m(e.nodeId??""),p(!1)},[e.id,e.nodeId]),i.useEffect(()=>{c(!0),u(null),sd().then(E=>{o(E)}).catch(E=>{u(Ce(E)||"Failed to load nodes")}).finally(()=>{c(!1)})},[]);const v=i.useMemo(()=>new Map(r.map(E=>[E.id,E])),[r]),x=i.useMemo(()=>[...r].sort((E,M)=>E.name.localeCompare(M.name)),[r]),y=n,g=e.nodeId??y?.defaultNodeId??null,j=e.nodeId?"Per-task override":y?.defaultNodeId?"Project default":"No routing",N=g?v.get(g):void 0,C=N?`${N.name} (${N.type})`:g?`${g} (node unavailable or unknown)`:"Local (no routing configured)",w=e.column==="in-progress"||rO.has(e.status),S=w||f||l,R=i.useCallback(async E=>{if(E===h)return;const M=e.id,G=h;m(E),p(!0);try{const U=await ni(M,{nodeId:E||null});if(b.current!==M)return;m(U.nodeId??""),a?.(U),s(E?"Node override updated":"Node override cleared","success")}catch(U){if(b.current!==M)return;m(G),s(Ce(U)||"Failed to update node override","error")}finally{b.current===M&&p(!1)}},[s,a,h,e.id]),I=i.useCallback(()=>{R("")},[R]);return t.jsxs("div",{className:"routing-tab",children:[t.jsx("h4",{children:"Task Routing"}),t.jsx("p",{className:"routing-tab__intro",children:"View the effective execution node and control per-task node override."}),t.jsxs("section",{className:"routing-tab__section",children:[t.jsx("h5",{children:"Routing Summary"}),t.jsxs("div",{className:"routing-summary-grid",role:"list",children:[t.jsxs("div",{className:"routing-summary-row",role:"listitem",children:[t.jsx("span",{className:"routing-summary-label",children:"Effective node"}),t.jsxs("span",{className:"routing-summary-value",children:[N?t.jsx(Cr,{status:N.status,compact:!0}):null,C,oO(N?.status)?t.jsx("span",{className:"routing-summary-warning",children:"Unhealthy"}):null]})]}),t.jsxs("div",{className:"routing-summary-row",role:"listitem",children:[t.jsx("span",{className:"routing-summary-label",children:"Routing source"}),t.jsx("span",{className:"routing-summary-value",children:j})]}),t.jsxs("div",{className:"routing-summary-row",role:"listitem",children:[t.jsx("span",{className:"routing-summary-label",children:"Unavailable-node policy"}),t.jsx("span",{className:"routing-summary-value",children:aO(y?.unavailableNodePolicy)})]})]}),w&&g?t.jsx("div",{className:"routing-tab__info-banner",children:"Routing is locked while this task is active. Node override cannot be changed until the task is no longer active."}):null]}),t.jsxs("section",{className:"routing-tab__section",children:[t.jsx("h5",{children:"Node Override"}),w?t.jsx("div",{className:"routing-tab__warning-banner",children:"Node override cannot be changed while the task is active."}):null,t.jsx("label",{className:"routing-tab__selector-label",htmlFor:`routing-node-${e.id}`,children:"Select execution node"}),t.jsxs("select",{id:`routing-node-${e.id}`,className:"select routing-tab__selector",value:h,disabled:S,onChange:E=>{R(E.target.value)},children:[t.jsx("option",{value:"",children:"Use project default"}),x.map(E=>t.jsxs("option",{value:E.id,title:`Status: ${E.status}`,children:[E.name," (",E.type,") — ",E.status]},E.id))]}),d?t.jsx("div",{className:"routing-tab__error",children:d}):null,e.nodeId?t.jsxs("div",{className:"routing-tab__override-row",children:[t.jsxs("span",{className:"routing-tab__override-text",children:["Override set to: ",v.get(e.nodeId)?.name??e.nodeId]}),t.jsx("button",{type:"button",className:"btn btn-sm",disabled:w||f,onClick:I,children:"Clear override"})]}):null]})]})}const cO=/^[a-zA-Z0-9_-]{1,64}$/,dO=200;function kb(e){return e?new Date(e).toLocaleString():""}function uO(e,n=dO){return e.length<=n?e:e.substring(0,n)+"…"}function mO({taskId:e,addToast:n,onTaskUpdated:s,projectId:a,canEdit:r=!1}){const[o,l]=i.useState([]),[c,d]=i.useState(!0),[u,h]=i.useState(null),[m,f]=i.useState(""),[p,b]=i.useState(null),[v,x]=i.useState(""),[y,g]=i.useState(null),[j,N]=i.useState([]),[C,w]=i.useState(!1),[S,R]=i.useState(!1),[I,E]=i.useState(""),[M,G]=i.useState(""),[U,P]=i.useState(!1),[T,D]=i.useState(null),[W,Y]=i.useState(null),[L,_]=i.useState(!1),F=i.useCallback(async()=>{try{const H=await ZC(e,a);l(H)}catch(H){n(Ce(H)||"Failed to load documents","error")}finally{d(!1)}},[e,a,n]);i.useEffect(()=>{F()},[F]);async function ae(H){u===H.key?(h(null),f(""),b(null),x(""),g(null),N([]),_(!1)):(h(H.key),f(H.content),b(null),x(""),g(null),N([]),_(!1))}async function k(H){if(y===H)g(null),N([]);else{g(H),w(!0);try{const ue=await e1(e,H,a);N(ue)}catch(ue){n(Ce(ue)||"Failed to load revisions","error")}finally{w(!1)}}}function z(){u&&(b(u),x(m))}function J(){b(null),x("")}async function oe(){if(!(!p||!v.trim())){P(!0);try{await ep(e,p,v,{},a),b(null),x(""),await F();const H=o.find(ue=>ue.key===p);H&&f(H.content),n("Document saved","success")}catch(H){n(Ce(H)||"Failed to save document","error")}finally{P(!1)}}}async function le(){const H=I.trim(),ue=M.trim();if(!H){n("Document key is required","error");return}if(!cO.test(H)){n("Invalid key format. Use 1-64 alphanumeric characters, hyphens, or underscores.","error");return}if(!ue){n("Content is required","error");return}P(!0);try{await ep(e,H,ue,{},a),R(!1),E(""),G(""),await F(),n("Document created","success")}catch(Q){n(Ce(Q)||"Failed to create document","error")}finally{P(!1)}}async function we(H){D(H);try{await t1(e,H,a),Y(null),D(null),u===H&&(h(null),f("")),y===H&&(g(null),N([])),await F(),n("Document deleted","success")}catch(ue){n(Ce(ue)||"Failed to delete document","error")}finally{D(null)}}function re(H){f(H.content),b(null),x("")}return c?t.jsxs("div",{className:"detail-section",children:[t.jsx("h4",{children:"Documents"}),t.jsx("div",{className:"detail-log-empty",children:"Loading documents…"})]}):t.jsxs("div",{className:"detail-section",children:[t.jsx("h4",{children:"Documents"}),S&&t.jsxs("div",{className:"task-document-create-form",children:[t.jsx("h5",{children:"New Document"}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"doc-key",children:"Key"}),t.jsx("input",{id:"doc-key",type:"text",className:"task-document-key-input",value:I,onChange:H=>E(H.target.value),placeholder:"e.g., plan, notes, research",disabled:U}),t.jsx("span",{className:"form-hint",children:"Alphanumeric, hyphens, underscores (1-64 chars)"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"doc-content",children:"Content"}),t.jsx("textarea",{id:"doc-content",value:M,onChange:H=>G(H.target.value),rows:6,placeholder:"Enter document content…",disabled:U})]}),t.jsxs("div",{className:"form-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>{R(!1),E(""),G("")},disabled:U,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void le(),disabled:U||!I.trim()||!M.trim(),children:U?"Creating…":"Create"})]})]}),o.length===0&&!S?t.jsx("div",{className:"detail-log-empty",children:"No documents yet."}):t.jsx("div",{className:"task-documents-list",children:o.map(H=>t.jsxs("div",{className:"task-document-card",children:[t.jsxs("div",{className:"task-document-card-header",children:[t.jsxs("div",{className:"task-document-card-title",children:[t.jsx(Ya,{size:14}),t.jsx("span",{className:"task-document-key",children:H.key}),t.jsxs("span",{className:"task-document-revision-badge",children:["v",H.revision]})]}),t.jsxs("div",{className:"task-document-meta",children:[t.jsx("span",{className:"task-document-author",children:H.author}),t.jsx("span",{className:"task-document-timestamp",children:kb(H.updatedAt||H.createdAt)})]})]}),u===H.key&&p!==H.key&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"task-document-content-header",children:t.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>_(ue=>!ue),"aria-label":L?"Switch to plain text":"Switch to markdown","aria-pressed":L,title:L?"Switch to plain text":"Switch to markdown",children:L?"Markdown":"Plain"})}),t.jsx("div",{className:"task-document-content",children:L?t.jsx("div",{className:"task-document-content-markdown",children:t.jsx("div",{className:"markdown-body",children:t.jsx(ji,{remarkPlugins:[Ni],children:m})})}):t.jsx("pre",{className:"task-document-content-text",children:m})}),y===H.key&&t.jsxs("div",{className:"task-document-revisions",children:[t.jsx("h5",{children:"Revision History"}),C?t.jsx("div",{className:"detail-log-empty",children:"Loading…"}):j.length<=1?t.jsx("div",{className:"detail-log-empty",children:"No previous revisions."}):t.jsx("div",{className:"task-document-revision-list",children:j.filter(ue=>ue.revision<H.revision).sort((ue,Q)=>Q.revision-ue.revision).map(ue=>t.jsxs("div",{className:"task-document-revision-item",onClick:()=>re(ue),children:[t.jsxs("div",{className:"revision-header",children:[t.jsxs("span",{className:"revision-badge",children:["v",ue.revision]}),t.jsx("span",{className:"revision-author",children:ue.author}),t.jsx("span",{className:"revision-timestamp",children:kb(ue.createdAt)})]}),t.jsx("div",{className:"revision-preview",children:uO(ue.content,100)})]},ue.id))})]})]}),p===H.key&&t.jsxs("div",{className:"task-document-edit-form",children:[t.jsx("textarea",{value:v,onChange:ue=>x(ue.target.value),rows:10,disabled:U}),t.jsxs("div",{className:"form-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:J,disabled:U,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void oe(),disabled:U||!v.trim(),children:U?"Saving…":"Save"})]})]}),t.jsxs("div",{className:"task-document-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>void ae(H),children:u===H.key?t.jsxs(t.Fragment,{children:[t.jsx(Pi,{size:14})," Collapse"]}):t.jsxs(t.Fragment,{children:[t.jsx(Ln,{size:14})," Expand"]})}),u===H.key&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn-sm",onClick:()=>void k(H.key),children:[t.jsx(wr,{size:14})," History"]}),r&&p!==H.key&&t.jsx("button",{className:"btn btn-sm",onClick:z,children:"Edit"}),r&&(W===H.key?t.jsxs("div",{className:"confirm-delete-actions",children:[t.jsx("span",{children:"Delete?"}),t.jsx("button",{className:"btn btn-danger btn-sm",onClick:()=>void we(H.key),disabled:T===H.key,children:T===H.key?"…":"Yes"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>Y(null),disabled:T===H.key,children:"No"})]}):t.jsx("button",{className:"btn btn-danger btn-sm",onClick:()=>Y(H.key),children:t.jsx(es,{size:14})}))]})]})]},H.key))}),r&&!S&&t.jsxs("button",{className:"btn btn-sm task-document-new-btn",onClick:()=>R(!0),children:[t.jsx(os,{size:14})," New Document"]})]})}function Ba(e){return e.toLocaleString()}function hO(e){return`${(e*100).toFixed(1)}%`}function Hu(e){const n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleString()}function to(e){if(e<1e3)return`${Math.round(e)} ms`;const n=e/1e3;if(n<60)return`${n.toFixed(1)} s`;const s=Math.floor(n/60),a=Math.round(n%60);return`${s}m ${a}s`}function fO(e){const n=Date.now(),s=e.map(o=>{if(!o.startedAt)return null;const l=new Date(o.startedAt).getTime();if(Number.isNaN(l))return null;let c;if(o.completedAt){const d=new Date(o.completedAt).getTime();if(Number.isNaN(d)||d<l)return null;c=d}else c=Math.max(l,n);return{name:o.workflowStepName||o.workflowStepId,durationMs:c-l}}).filter(o=>o!==null),a=zy(e,n)??0,r=s.reduce((o,l)=>!o||l.durationMs>o.durationMs?l:o,void 0);return{timedStepCount:s.length,totalDurationMs:a,longestStep:r}}function pO({tokenUsage:e,loading:n,task:s}){const a=Date.now(),r=Oy(s?.log??[]),o=r.filter(y=>typeof y.durationMs=="number"),l=o.reduce((y,g)=>y+(g.durationMs??0),0),c=Fy(s?.log)??0,d=typeof s?.timedExecutionMs=="number"?s.timedExecutionMs:Math.max(l,c),u=o.reduce((y,g)=>!y||(g.durationMs??0)>(y.durationMs??0)?g:y,void 0),h=fO(s?.workflowStepResults??[]),m=s?Uy(s,a):null,f=By(s?.executionStartedAt,s?.executionCompletedAt,a),p=vA(s?.firstExecutionAt,s?.executionCompletedAt,a),b=m??f??(typeof s?.timedExecutionMs=="number"?s.timedExecutionMs:d+h.totalDurationMs),v=p!=null&&p!==b,x=s?.steps?.length??0;return t.jsxs("section",{className:"task-token-stats-panel","aria-label":"Task execution statistics",children:[t.jsx("h4",{children:"Execution & Token Stats"}),t.jsxs("div",{className:"task-token-stats-panel__section",children:[t.jsx("h5",{children:"Execution Timing"}),t.jsxs("div",{className:"task-token-stats-panel__grid",role:"list","aria-label":"Execution timing metrics",children:[t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Timing events"}),t.jsx("span",{className:"task-token-stats-panel__value",children:r.length.toLocaleString()})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Timed duration"}),t.jsx("span",{className:"task-token-stats-panel__value",children:to(d)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Workflow timed steps"}),t.jsx("span",{className:"task-token-stats-panel__value",children:h.timedStepCount.toLocaleString()})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Workflow runtime"}),t.jsx("span",{className:"task-token-stats-panel__value",children:to(h.totalDurationMs)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Total execution time"}),t.jsx("span",{className:"task-token-stats-panel__value",children:to(b)})]}),v?t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Wall-clock since first execution"}),t.jsx("span",{className:"task-token-stats-panel__value",children:to(p)})]}):null]}),t.jsxs("dl",{className:"task-token-stats-panel__timestamps",children:[t.jsxs("div",{className:"task-token-stats-panel__timestamp-row",children:[t.jsx("dt",{children:"Longest timing event"}),t.jsx("dd",{children:u?.durationMs?`${u.summary} (${to(u.durationMs)})`:"No timed events recorded yet."})]}),t.jsxs("div",{className:"task-token-stats-panel__timestamp-row",children:[t.jsx("dt",{children:"Longest workflow step"}),t.jsx("dd",{children:h.longestStep?`${h.longestStep.name} (${to(h.longestStep.durationMs)})`:"No completed workflow step timings yet."})]})]})]}),t.jsxs("div",{className:"task-token-stats-panel__section",children:[t.jsx("h5",{children:"Execution Details"}),t.jsxs("dl",{className:"task-token-stats-panel__details",children:[t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Execution mode"}),t.jsx("dd",{children:s?.executionMode==="fast"?"Fast":"Standard"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Runtime status"}),t.jsx("dd",{children:s?.status??"Not set"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Paused"}),t.jsx("dd",{children:s?.paused?"Yes":"No"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Step progress"}),t.jsx("dd",{children:x>0?`${Math.min((s?.currentStep??0)+1,x)} / ${x}`:"No steps"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Retries (recovery / workflow / merge / task_done)"}),t.jsx("dd",{children:`${s?.recoveryRetryCount??0} / ${s?.workflowStepRetries??0} / ${s?.mergeRetries??0} / ${s?.taskDoneRetryCount??0}`})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Recovery state"}),t.jsx("dd",{children:s?.nextRecoveryAt?`Next recovery at ${Hu(s.nextRecoveryAt)}`:"No scheduled recovery"})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Self-heal counters"}),t.jsx("dd",{children:`stuck kills: ${s?.stuckKillCount??0}, post-review fixes: ${s?.postReviewFixCount??0}`})]}),t.jsxs("div",{className:"task-token-stats-panel__detail-row",children:[t.jsx("dt",{children:"Runtime links"}),t.jsx("dd",{children:[s?.assignedAgentId?`agent ${s.assignedAgentId}`:null,s?.checkedOutBy?`checkout ${s.checkedOutBy}`:null,s?.blockedBy?`blocked by ${s.blockedBy}`:null,s?.sessionFile?"has session":null].filter(Boolean).join(", ")||"No runtime links"})]})]})]}),t.jsxs("div",{className:"task-token-stats-panel__section",children:[t.jsx("h5",{children:"Token Usage"}),!e&&n?t.jsx("div",{className:"task-token-stats-panel__loading",role:"status","aria-live":"polite",children:"Loading token statistics…"}):e?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"task-token-stats-panel__grid",role:"list","aria-label":"Task token totals",children:[t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Input"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.inputTokens)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Output"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.outputTokens)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Cache read"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.cachedTokens)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Cache write"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.cacheWriteTokens??0)})]}),t.jsxs("div",{className:"task-token-stats-panel__metric",role:"listitem",children:[t.jsx("span",{className:"task-token-stats-panel__label",children:"Total"}),t.jsx("span",{className:"task-token-stats-panel__value",children:Ba(e.totalTokens)})]})]}),t.jsxs("div",{className:"task-token-stats-panel__cache-ratio",children:[t.jsx("span",{className:"task-token-stats-panel__cache-ratio-label",children:"Cache hit ratio:"})," ",t.jsx("span",{className:"task-token-stats-panel__cache-ratio-value",children:e.inputTokens+e.cachedTokens>0?hO(e.cachedTokens/(e.inputTokens+e.cachedTokens)):"—"})]}),t.jsxs("div",{className:"task-token-stats-panel__cache-breakdown",children:["(read ",Ba(e.cachedTokens)," / write ",Ba(e.cacheWriteTokens??0)," / input ",Ba(e.inputTokens),")"]}),t.jsxs("dl",{className:"task-token-stats-panel__timestamps",children:[t.jsxs("div",{className:"task-token-stats-panel__timestamp-row",children:[t.jsx("dt",{children:"First used"}),t.jsx("dd",{children:t.jsx("time",{dateTime:e.firstUsedAt,children:Hu(e.firstUsedAt)})})]}),t.jsxs("div",{className:"task-token-stats-panel__timestamp-row",children:[t.jsx("dt",{children:"Last used"}),t.jsx("dd",{children:t.jsx("time",{dateTime:e.lastUsedAt,children:Hu(e.lastUsedAt)})})]})]})]}):t.jsx("div",{className:"task-token-stats-panel__empty",role:"status",children:"No token usage recorded for this task yet."})]})]})}const vk=/^In-review stall surfaced \[([^\]]+)\]/;function gO(e,n){if(!e.log?.length)return;const s=[...e.log].reverse();for(const[a,r]of s.entries()){const o=r.action.match(vk);if(!(!o||o[1]!==n))return{entry:r,reversedIndex:a,code:n}}}const hf=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]),jb=/^Stale paused review surfaced \[([^\]]+)\]/,Nb={p:({children:e,...n})=>t.jsx("p",{...n,children:ai(e)}),li:({children:e,...n})=>t.jsx("li",{...n,children:ai(e)}),code:({children:e,...n})=>{const s=typeof e=="string"?e:Ja.Children.toArray(e).join(""),a=zs(s);return a.length===1&&typeof a[0]=="string"?t.jsx("code",{...n,children:e}):t.jsx("code",{...n,children:a})}};function bO(e){let n=null;for(const s of e){if(s.agent!=="executor"||s.type!=="text")continue;const a=s.text.match(/^Executor using model: (.+?)\/(.+)$/);a&&(n={provider:a[1],modelId:a[2]})}return n}function xO(e){let n=null;for(const s of e){if(s.agent!=="reviewer"||s.type!=="text")continue;const a=s.text.match(/^Reviewer using model: (.+?)\/(.+)$/);a&&(n={provider:a[1],modelId:a[2]})}return n}function Sb(e){return(e.title??"").trim().length>0?!0:!!(e.description??"").split(/\r?\n/).map(s=>s.trim()).find(s=>s.length>0)}function yk(e){const n=e?.runtimeConfig??void 0,s=typeof n?.model=="string"?n.model.trim():"";if(s){const o=s.indexOf("/");if(o>0&&o<s.length-1)return{provider:s.slice(0,o),modelId:s.slice(o+1)}}const a=typeof n?.modelProvider=="string"?n.modelProvider.trim():"",r=typeof n?.modelId=="string"?n.modelId.trim():"";return{provider:a||void 0,modelId:r||void 0}}function vO(e,n,s,a){const r=bO(n);if(r)return r;if(hf.has(e.status??"")||e.column==="in-progress"){const o=yk(s);if(o.provider&&o.modelId)return o}return Kv(e,a)}function yO(e,n,s,a){const r=xO(n);if(r)return r;if(hf.has(e.status??"")||e.column==="in-progress"){const o=yk(s);if(o.provider&&o.modelId)return o}return Jv(e,a)}function wO(e){let n=null;for(const s of e){if(s.agent!=="triage"||s.type!=="text")continue;const a=s.text.match(/^Triage using model: (.+?)\/(.+)$/);a&&(n={provider:a[1],modelId:a[2]})}return n}function kO(e,n,s){if(e.planningModelProvider&&e.planningModelId)return{provider:e.planningModelProvider,modelId:e.planningModelId};const a=wO(n);return a||Yv(e,s)}function jO(e){switch(e){case"done":return"var(--color-success)";case"in-progress":return"var(--in-progress)";case"skipped":return"var(--text-dim)";case"pending":default:return"var(--border)"}}function no(e){const n=new Date(e),a=new Date().getTime()-n.getTime(),r=Math.floor(a/6e4),o=Math.floor(r/60),l=Math.floor(o/24);return r<1?"just now":r<60?`${r}m ago`:o<24?`${o}h ago`:l<7?`${l}d ago`:n.toLocaleDateString(void 0,{month:"short",day:"numeric"})}function NO(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function el(e){const n=Math.max(1,Math.floor(e/6e4)),s=Math.floor(n/1440),a=Math.floor(n%1440/60),r=n%60;return s>0?`${s}d ${a}h`:a>0?`${a}h ${r}m`:`${r}m`}function qu(e,n){return e.length>n?e.slice(0,n)+"…":e}function Cb(e=[],n=[]){return e.length===n.length&&e.every((s,a)=>s===n[a])}function Vu(e){const n=e.indexOf("/");return!e||n===-1?null:{provider:e.slice(0,n),modelId:e.slice(n+1)}}function Wu(e){return e.trim()}function SO(e){const n=e.trim();return n.length>0?n:void 0}function ja(e){return typeof e=="string"&&nr.includes(e)?e:di}function Na(e){return e==="fast"?"fast":"standard"}function CO(e){const n=e?.issueUrl;return typeof n=="string"&&n.length>0?n:void 0}function EO(e){const n=e.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/(issues|pull)\/(\d+)(?:$|[/?#])/);if(!n)return null;const[,s,a,,r]=n;return{label:`${s}/${a}#${r}`,href:e}}function _O(e){const n=e?.findingLabel;if(typeof n=="string"&&n.length>0)return n;const s=e?.runId;return typeof s=="string"&&s.length>0?s:void 0}const MO=i.lazy(()=>qn(()=>import("./AgentDetailView-DuRYmHK3.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])).then(e=>({default:e.AgentDetailView})));function RO(e,n={}){switch(e.sourceType){case"dashboard_ui":return{label:"Dashboard"};case"quick_chat":return{label:"Quick Chat"};case"chat_session":return{label:"Chat Session"};case"agent_heartbeat":return{label:n.sourceAgentName??e.sourceAgentId??"agent",sourceAgentId:e.sourceAgentId};case"automation":return{label:"Automation"};case"cron":return{label:"Scheduled Task"};case"workflow_step":return{label:"Workflow Step"};case"github_import":{const s=CO(e.sourceMetadata),a=s?EO(s):null;return{label:"GitHub Import",contextInfo:s?a?.label??"Open issue":void 0,contextHref:s,contextInfoFull:s}}case"research":{const s=_O(e.sourceMetadata);return{label:"Research",contextInfo:s,contextInfoFull:s}}case"task_refine":return{label:"Refinement",parentTaskId:e.sourceParentTaskId};case"task_duplicate":return{label:"Duplicate",parentTaskId:e.sourceParentTaskId};case"cli":return{label:"CLI"};case"api":return{label:"API"};case"recovery":return{label:"Recovery"};case"unknown":default:return null}}const Gu=200,AO=new Set(["triage","todo"]),TO=new Set(["triage","todo","in-progress","in-review"]);function wk({task:e,projectId:n,tasks:s=[],onOpenDetail:a,onMoveTask:r,onDeleteTask:o,onArchiveTask:l,onMergeTask:c,onRetryTask:d,onResetTask:u,onDuplicateTask:h,onTaskUpdated:m,addToast:f,prAuthAvailable:p,initialTab:b="definition",mobileHeaderMode:v="close",embedded:x=!1,onRequestClose:y}){const[g,j]=i.useState(b==="retries"?"definition":b),[N,C]=i.useState(()=>"prompt"in e?e:null),[w,S]=i.useState(()=>!("prompt"in e));i.useEffect(()=>{if("prompt"in e){C(e),S(!1);return}let q=!1;return S(!0),C(null),Sr(e.id,n).then(ke=>{q||(C(ke),S(!1))}).catch(()=>{q||S(!1)}),()=>{q=!0}},[e.id,n]);const R=N?{...N,...e,prompt:N.prompt,log:N.log,githubTracking:e.githubTracking??N.githubTracking}:{...e,prompt:""},I=e.status==="failed"||e.status==="stuck-killed"||e.status==="planning"||e.status==="needs-replan"||(e.stuckKillCount??0)>0||(e.recoveryRetryCount??0)>0||!!e.nextRecoveryAt,[E,M]=i.useState(null),[G,U]=i.useState(null),P=RO(R,{sourceAgentName:E?.name});i.useEffect(()=>{j(b==="retries"?"definition":b),b==="retries"&&kn(!0)},[b]),i.useEffect(()=>{g==="pr"&&e.column!=="in-review"&&j("definition")},[g,e.column]),i.useEffect(()=>{_(!1)},[e.id]);const[T,D]=i.useState("activity"),[W,Y]=i.useState(null),[L,_]=i.useState(!1),[F,ae]=i.useState(e.attachments||[]),[k,z]=i.useState(!1),[J,oe]=i.useState(e.dependencies||[]),[le,we]=i.useState(!1),[re,H]=i.useState(""),[ue,Q]=i.useState(null),[be,fe]=i.useState([]),[O,se]=i.useState(!1),[ve,A]=i.useState(!1),[ne,ye]=i.useState(!1),[ee,ge]=i.useState(!1),[Ne,He]=i.useState(!1),[Le,de]=i.useState(R.prompt||""),[Re,Pe]=i.useState(""),[rt,qe]=i.useState(!1),[Xe,At]=i.useState(!1);i.useEffect(()=>{if(g!=="logs"||T!=="activity"){Y(null);return}if(!W)return;const q=Dn.current?.querySelector('[data-stall-highlight="true"]');q&&typeof q.scrollIntoView=="function"&&q.scrollIntoView({block:"nearest",behavior:"smooth"})},[g,T,W]);const[at,Se]=i.useState(""),[pe,_e]=i.useState(!1),[et,Ae]=i.useState(!1),[it,xt]=i.useState(e.title||""),[Nt,Ut]=i.useState(e.description||""),[Be,Z]=i.useState(e.dependencies||[]),[Oe,ht]=i.useState(e.branch??""),[je,mt]=i.useState(e.baseBranch??""),[Et,Te]=i.useState(""),[xe,gt]=i.useState(""),[_t,Ft]=i.useState(""),[Dt,nt]=i.useState(""),[Wt,Mt]=i.useState("default"),[Kt,xn]=i.useState(void 0),[Tn,Sn]=i.useState(di),[is,On]=i.useState(e.nodeId),[un,tn]=i.useState(Na(e.executionMode)),[on,pn]=i.useState(""),[mn,Zn]=i.useState(e.enabledWorkflowSteps||[]),[In,rn]=i.useState(e.sourceIssue?.provider??""),[hn,Pn]=i.useState(e.sourceIssue?.repository??""),[nn,$t]=i.useState(e.sourceIssue?.externalIssueId??""),[Jt,Qt]=i.useState(e.sourceIssue?.url??""),[ie,Fe]=i.useState([]),[Je,tt]=i.useState(!1),[Ye,vt]=i.useState(ja(e.priority)),[pt,Zt]=i.useState(!1),[ce,Ge]=i.useState(Na(e.executionMode)),[Me,Ke]=i.useState(!1),[Qe,Lt]=i.useState(e.noCommitsExpected===!0),[gn,Bn]=i.useState(!1),wn=i.useRef(!1),Yt=i.useRef(e.id),[$n,dn]=i.useState(!1),[me,jt]=i.useState(!1),[Cn,bs]=i.useState(!1),[Ts,kn]=i.useState(b==="retries"),[ls,cs]=i.useState(!1),[ys,xs]=i.useState(e.githubTracking?.repoOverride??""),[he,bt]=i.useState(null),[ot,St]=i.useState(null),[lt,Tt]=i.useState(!1),[Xt,zt]=i.useState(!1),[Ee,yt]=i.useState(!1),[Rt,yn]=i.useState(null),_n=i.useRef(null),Dn=i.useRef(null),an=i.useRef(null),En=i.useRef(null),{getSlotsForId:ws}=wy(n),ks=ws("task-detail-tab").map((q,ke)=>({entry:q,tabId:`plugin-${q.pluginId}-${ke}`})),V=typeof g=="string"&&g.startsWith("plugin-")?ks.find(q=>q.tabId===g)??null:null;i.useEffect(()=>(wn.current=!0,()=>{wn.current=!1}),[]),i.useEffect(()=>{Yt.current=e.id},[e.id]);const[We,wt]=i.useState(void 0),[ut,Bt]=i.useState(null),[en,jn]=i.useState([]),[ts,vs]=i.useState(!1),[Ps,te]=i.useState(e.enabledWorkflowSteps||[]),Ie=e.column==="in-progress"||hf.has(e.status);i.useEffect(()=>{xt(e.title||""),Ut(e.description||""),ht(e.branch??""),mt(e.baseBranch??""),rn(e.sourceIssue?.provider??""),Pn(e.sourceIssue?.repository??""),$t(e.sourceIssue?.externalIssueId??""),Qt(e.sourceIssue?.url??""),tn(Na(e.executionMode)),bs(!1),cs(!1),xs(R.githubTracking?.repoOverride??""),bt(null),St(null),Ae(!1),yn(null),zt(!1)},[e.id,e.title,e.description,e.branch,e.baseBranch,e.sourceIssue,e.executionMode,R.githubTracking]),i.useEffect(()=>{te(e.enabledWorkflowSteps||[])},[e.id,e.enabledWorkflowSteps]),i.useEffect(()=>{vt(ja(e.priority))},[e.id,e.priority]),i.useEffect(()=>{Ge(Na(e.executionMode))},[e.id,e.executionMode]),i.useEffect(()=>{Lt(e.noCommitsExpected===!0)},[e.id,e.noCommitsExpected]),i.useEffect(()=>{he!==null&&R.githubTracking?.enabled===!0===he&&bt(null)},[he,R.githubTracking?.enabled]),i.useEffect(()=>{let q=!1;return Md(n).then(ke=>{q||wt(ke)}).catch(()=>{}),Ra().then(ke=>{q||Bt(ke)}).catch(()=>{q||Bt(null)}),()=>{q=!0}},[n]),i.useEffect(()=>{if(g!=="workflow")return;let q=!1;return vs(!0),VE(e.id,n).then(ke=>{q||jn(ke)}).catch(ke=>{q||f(`Failed to load workflow results: ${Ce(ke)}`,"error")}).finally(()=>{q||vs(!1)}),()=>{q=!0}},[g,e.id,n,f]),i.useEffect(()=>{if(g!=="workflow")return;const q=n?`?projectId=${encodeURIComponent(n)}`:"",ke=st=>{try{const It=JSON.parse(st.data);It.id===e.id&&Array.isArray(It.workflowStepResults)&&jn(It.workflowStepResults)}catch{}};return Si(`/api/events${q}`,{events:{"task:updated":ke}})},[g,e.id,n]),i.useEffect(()=>{le||H("")},[le]),i.useEffect(()=>{if(!e.assignedAgentId){Q(null);return}const q=be.find(st=>st.id===e.assignedAgentId);if(q){Q(q);return}let ke=!1;return Dm(e.assignedAgentId,n).then(st=>{ke||Q(st)}).catch(()=>{ke||Q(null)}),()=>{ke=!0}},[e.assignedAgentId,n,be]),i.useEffect(()=>{if(!e.sourceAgentId){M(null);return}const q=be.find(st=>st.id===e.sourceAgentId);if(q){M(q);return}let ke=!1;return Promise.resolve(Dm(e.sourceAgentId,n)).then(st=>{ke||M(st??null)}).catch(()=>{ke||M(null)}),()=>{ke=!0}},[e.sourceAgentId,n,be]),i.useEffect(()=>{se(!1)},[e.id]),i.useEffect(()=>{if(!($n||me))return;const ke=st=>{const It=st.target,An=_n.current?.contains(It),mi=En.current?.contains(It);!An&&$n&&dn(!1),!mi&&me&&jt(!1)};return document.addEventListener("mousedown",ke),()=>document.removeEventListener("mousedown",ke)},[$n,me]),i.useEffect(()=>{if(!($n||me))return;const ke=st=>{st.key==="Escape"&&(st.stopPropagation(),$n&&dn(!1),me&&jt(!1))};return document.addEventListener("keydown",ke),()=>document.removeEventListener("keydown",ke)},[$n,me]),i.useEffect(()=>{He(!1),de(R.prompt||""),Pe("")},[e.id,R.prompt]);const ft=AO.has(e.column)&&!Je,Vt=TO.has(e.column)&&!Je,qt=he??R.githubTracking?.enabled===!0,ln=R.githubTracking?.issue,Mn=w&&typeof e.githubTracking>"u",Rn=Sb(e),Kn=Vt&&!ln&&!Mn&&(!qt||lt&&R.githubTracking?.enabled!==!0),ds=Vt||qt||!!ln,Jn=e.retrySummary,Us=[{key:"stuckKill",label:"Stuck kills",title:"Stuck-task detector forced agent kill retries",value:Jn?.stuckKill??0},{key:"recovery",label:"Recovery retries",title:"Transient executor recovery retries",value:Jn?.recovery??0},{key:"taskDone",label:"task_done retries",title:"Agent exited without task_done and task was retried",value:Jn?.taskDone??0},{key:"workflowStep",label:"Workflow retries",title:"Workflow step failure retries",value:Jn?.workflowStep??0},{key:"verification",label:"Verification bounces",title:"Verification failure bounce retries",value:Jn?.verification??0},{key:"postReviewFix",label:"Post-review fixes",title:"Post-review remediation retries",value:Jn?.postReviewFix??0},{key:"mergeConflict",label:"Merge conflict bounces",title:"Merge conflict bounce retries",value:Jn?.mergeConflict??0},{key:"branchConflict",label:"Branch conflict recovery",title:"FN-4068 branch-conflict recovery retries",value:Jn?.branchConflict??0},{key:"reviewerContext",label:"Reviewer context retries",title:"FN-4082 compact reviewer retry",value:Jn?.reviewerContext??0},{key:"reviewerFallback",label:"Reviewer fallback retries",title:"FN-4092 fallback-model retry",value:Jn?.reviewerFallback??0}].filter(q=>q.value>0),X=Mn?"Loading":ln?"Linked":qt?"Enabled":"Disabled",$e=!ln&&(lt||Mn),Ue=bk(We??null,ut),Ht=ys.trim(),cn=i.useCallback(async()=>{if(!Vt||lt)return;const q=e.id,ke=!qt;bt(ke),Tt(!0);try{const st=await ni(e.id,{githubTracking:{enabled:ke}},n);if(Yt.current!==q)return;C(It=>It?{...It,...st,githubTracking:st.githubTracking}:st),m?.(st)}catch(st){if(Yt.current!==q)return;bt(R.githubTracking?.enabled===!0),f(`Failed to update ${e.id}: ${Ce(st)}`,"error")}finally{wn.current&&Yt.current===q&&Tt(!1)}},[f,Vt,qt,lt,m,n,R.githubTracking?.enabled,e.id]),Un=i.useCallback(async()=>{if(!Vt||lt)return;const q=e.id;if(Ht.length>0&&!_d.test(Ht)){St("Repository override must be in owner/repo format");return}St(null),Tt(!0);try{const ke=await ni(e.id,{githubTracking:{repoOverride:Ht.length>0?Ht:null}},n);if(Yt.current!==q)return;C(st=>st?{...st,...ke,githubTracking:ke.githubTracking}:ke),m?.(ke)}catch(ke){if(Yt.current!==q)return;f(`Failed to update ${e.id}: ${Ce(ke)}`,"error")}finally{wn.current&&Yt.current===q&&Tt(!1)}},[f,Vt,Ht,lt,m,n,e.id]),as=i.useCallback(async()=>{if(!qt||ln||lt)return;if(!Sb(e)){f("Add a title before creating a tracking issue","info");return}const q=e.id;Tt(!0);try{const ke=await ni(e.id,{githubTracking:{enabled:!0}},n);if(Yt.current!==q)return;C(st=>st?{...st,...ke,githubTracking:ke.githubTracking}:ke),m?.(ke),f("Requested GitHub tracking issue creation","info")}catch(ke){if(Yt.current!==q)return;f(`Failed to update ${e.id}: ${Ce(ke)}`,"error")}finally{wn.current&&Yt.current===q&&Tt(!1)}},[f,ln,qt,lt,m,n,e]),$s=i.useCallback(()=>{if(!ft)return;Ae(!0),xt(e.title||""),Ut(e.description||""),Z(e.dependencies||[]),ht(e.branch??""),mt(e.baseBranch??"");const q=e.modelProvider&&e.modelId?`${e.modelProvider}/${e.modelId}`:"",ke=e.validatorModelProvider&&e.validatorModelId?`${e.validatorModelProvider}/${e.validatorModelId}`:"",st=e.planningModelProvider&&e.planningModelId?`${e.planningModelProvider}/${e.planningModelId}`:"";Te(q),gt(ke),Ft(st),nt(e.thinkingLevel??""),On(e.nodeId),Mt(q||ke||st?"custom":"default"),pn(""),Zn(e.enabledWorkflowSteps||[]),tn(Na(e.executionMode)),rn(e.sourceIssue?.provider??""),Pn(e.sourceIssue?.repository??""),$t(e.sourceIssue?.externalIssueId??""),Qt(e.sourceIssue?.url??""),Fe([]),xn(e.reviewLevel),Sn(ja(e.priority))},[ft,e]),Fs=i.useCallback(()=>{Ae(!1),xt(e.title||""),Ut(e.description||""),Z(e.dependencies||[]),ht(e.branch??""),mt(e.baseBranch??""),On(e.nodeId),rn(e.sourceIssue?.provider??""),Pn(e.sourceIssue?.repository??""),$t(e.sourceIssue?.externalIssueId??""),Qt(e.sourceIssue?.url??""),Sn(ja(e.priority)),tn(Na(e.executionMode)),ie.forEach(q=>URL.revokeObjectURL(q.previewUrl)),Fe([])},[e.title,e.description,e.dependencies,e.nodeId,e.priority,e.executionMode,ie]),[js,Zs]=i.useState("idle"),ei=i.useRef(null),ti=i.useRef(0),Ei=i.useCallback(q=>{const ke={},st=it.trim(),It=Nt.trim();st&&st!==(e.title??"")&&(ke.title=st),q&&It&&It!==(e.description??"")&&(ke.description=It),Cb(Be,e.dependencies??[])||(ke.dependencies=Be),Cb(mn,e.enabledWorkflowSteps??[])||(ke.enabledWorkflowSteps=mn);const An=Oe.trim()||null,mi=e.branch??null;An!==mi&&(ke.branch=An);const Yl=je.trim()||null,ur=e.baseBranch??null;Yl!==ur&&(ke.baseBranch=Yl);const qd=Vu(Et),Xl=e.modelProvider&&e.modelId?`${e.modelProvider}/${e.modelId}`:"";Et!==Xl&&(ke.modelProvider=qd?.provider??null,ke.modelId=qd?.modelId??null);const Gr=Vu(xe),Af=e.validatorModelProvider&&e.validatorModelId?`${e.validatorModelProvider}/${e.validatorModelId}`:"";xe!==Af&&(ke.validatorModelProvider=Gr?.provider??null,ke.validatorModelId=Gr?.modelId??null);const Ql=Vu(_t),Rj=e.planningModelProvider&&e.planningModelId?`${e.planningModelProvider}/${e.planningModelId}`:"";_t!==Rj&&(ke.planningModelProvider=Ql?.provider??null,ke.planningModelId=Ql?.modelId??null);const Aj=e.thinkingLevel??"";Dt!==Aj&&(ke.thinkingLevel=Dt!==""?Dt:null),(e.nodeId??void 0)!==is&&(ke.nodeId=is??null),Kt!==e.reviewLevel&&(ke.reviewLevel=Kt),Tn!==ja(e.priority)&&(ke.priority=Tn),un!==Na(e.executionMode)&&(ke.executionMode=un==="fast"?"fast":null);const Vd=Wu(In),Wd=Wu(hn),Zl=Wu(nn),Gd=SO(Jt);if(Vd.length===0&&Wd.length===0&&Zl.length===0&&!Gd)e.sourceIssue&&(ke.sourceIssue=null);else{if(!Vd||!Wd||!Zl)return{updates:null,error:"Source issue provider, repository, and issue identifier are required"};const Tj=Number.parseInt(Zl,10),Kd=e.sourceIssue?.issueNumber??Tj;if(!Number.isFinite(Kd)||Kd<=0)return{updates:null,error:"Source issue identifier must be numeric for new metadata"};const Kr={provider:Vd,repository:Wd,externalIssueId:Zl,issueNumber:Kd,...Gd?{url:Gd}:{}},Jr=e.sourceIssue;(!Jr||Jr.provider!==Kr.provider||Jr.repository!==Kr.repository||Jr.externalIssueId!==Kr.externalIssueId||Jr.issueNumber!==Kr.issueNumber||(Jr.url??void 0)!==Kr.url)&&(ke.sourceIssue=Kr)}return{updates:ke,error:null}},[je,Oe,Be,Nt,un,Et,is,_t,Tn,Kt,mn,nn,In,hn,Jt,Dt,it,xe,e]),_i=i.useCallback(async q=>{const{updates:ke,error:st}=Ei(q);if(!ke)return Zs("error"),st&&f(`Failed to update ${e.id}: ${st}`,"error"),!1;if(Object.keys(ke).length===0)return!0;const It=++ti.current;tt(!0),Zs("saving");try{const An=await ni(e.id,ke,n);return It!==ti.current?void 0:(m?.(An),Zs("saved"),!0)}catch(An){return It===ti.current&&(Zs("error"),f(`Failed to update ${e.id}: ${Ce(An)}`,"error")),!1}finally{wn.current&&It===ti.current&&tt(!1)}},[f,Ei,m,n,e.id]),$r=i.useCallback(async q=>{await _i(!0)},[_i]),Pa=i.useCallback(async()=>{await _i(!0)&&(f(`Updated ${e.id}`,"success"),wn.current&&Ae(!1))},[f,_i,e.id]);i.useEffect(()=>{if(et)return ei.current&&clearTimeout(ei.current),ei.current=setTimeout(()=>{_i(!1)},700),()=>{ei.current&&(clearTimeout(ei.current),ei.current=null)}},[et,it,Be,Oe,je,Et,xe,_t,Dt,is,Kt,Tn,un,mn,In,hn,nn,Jt,_i]);const Uo=i.useCallback(async q=>{const ke=ja(q),st=ja(e.priority);if(ke===st){vt(st);return}const It=Ye;vt(ke),Zt(!0);try{const An=await ni(e.id,{priority:ke},n);vt(ja(An.priority)),m?.(An),f(`Priority updated to ${ja(An.priority)}`,"success")}catch(An){vt(It),f(`Failed to update ${e.id}: ${Ce(An)}`,"error")}finally{wn.current&&Zt(!1)}},[e.id,e.priority,n,Ye,m,f]),Dr=i.useCallback(async()=>{const ke=Na(e.executionMode)==="fast"?"standard":"fast",st=ce;Ge(ke),Ke(!0);try{const It=await ni(e.id,{executionMode:ke==="fast"?"fast":null},n),An=Na(It.executionMode);Ge(An),m?.(It),f(`Execution mode updated to ${An}`,"success")}catch(It){Ge(st),f(`Failed to update ${e.id}: ${Ce(It)}`,"error")}finally{wn.current&&Ke(!1)}},[e.id,e.executionMode,n,ce,m,f]),Lr=i.useCallback(async()=>{const q=!Qe,ke=Qe;Lt(q),Bn(!0);try{const st=await ni(e.id,{noCommitsExpected:q},n),It=st.noCommitsExpected===!0;Lt(It),m?.(st),f(`No-commits expectation ${It?"enabled":"disabled"}`,"success")}catch(st){Lt(ke),f(`Failed to update ${e.id}: ${Ce(st)}`,"error")}finally{wn.current&&Bn(!1)}},[e.id,n,Qe,m,f]),$a=i.useCallback(q=>{et&&(q.key==="Escape"?(q.preventDefault(),Fs()):q.key==="Enter"&&(q.ctrlKey||q.metaKey)&&(q.preventDefault(),Pa()))},[et,Fs,Pa]);i.useEffect(()=>{if(et)return document.addEventListener("keydown",$a),()=>document.removeEventListener("keydown",$a)},[et,$a]);const Da=i.useRef(null),{nodes:La}=Td(),{confirm:_s,confirmWithChoice:na,confirmWithCheckbox:Li}=Di(),Or=i.useCallback(async()=>{if(!(!ft||!ln||lt||!await _s({title:"Unlink GitHub issue?",message:"This stops Fusion from syncing with the linked GitHub issue. The issue itself will not be modified.",confirmLabel:"Unlink",danger:!0}))){Tt(!0);try{const ke=await ni(e.id,{githubTracking:{issue:null}},n);m?.(ke),f("GitHub issue unlinked","success")}catch(ke){f(`Failed to update ${e.id}: ${Ce(ke)}`,"error")}finally{wn.current&&Tt(!1)}}},[f,ft,_s,ln,lt,m,n,e.id]),{entries:sa,loading:Oi,loadMore:ya,hasMore:Fr,total:zr,loadingMore:Br}=rk(e.id,g==="logs"&&T==="agent-log",n),Vn=i.useCallback(()=>{y?.()},[y]);i.useEffect(()=>{if(x)return;const q=ke=>{ke.key==="Escape"&&!et&&Vn()};return document.addEventListener("keydown",q),()=>document.removeEventListener("keydown",q)},[x,Vn,et]);const ir=i.useCallback(async q=>{try{const ke=e.steps.some(An=>An.status!=="pending"),st=(q==="todo"||q==="triage")&&ke;let It;if(st){if(await _s({title:"Preserve Progress?",message:"This task has completed steps. Keep progress before moving?",confirmLabel:"Keep Progress",cancelLabel:"Reset Progress"}))It={preserveProgress:!0};else if(!await _s({title:"Reset Progress?",message:"Reset all step progress before moving this task?",confirmLabel:"Reset Progress",cancelLabel:"Cancel Move",danger:!0}))return}await r(e.id,q,It),Vn(),f(`Moved to ${Hs[q]}`,"success")}catch(ke){f(Ce(ke),"error")}},[e.id,e.steps,r,Vn,f,_s]),Oa=i.useCallback(async()=>{let q=!1;if(e.column==="done"&&l){const It=await na({title:"Delete Task",message:`Delete ${e.id}?`,confirmLabel:"Delete",cancelLabel:"Cancel",tertiaryLabel:"Archive Instead",danger:!0});if(It==="tertiary"){try{await l(e.id),f(`Archived ${e.id}`,"success"),Vn()}catch(An){const mi=ha(An);if(!mi||mi.lineageChildIds.length===0){f(Ce(An),"error");return}if(!await _s({title:"Force Delete Task",message:`${e.id} has lineage children (${mi.lineageChildIds.join(", ")}) that reference it as a source parent.
720
720
 
721
721
  Archive anyway by unlinking these references first?`,danger:!0}))return;try{await l(e.id,{removeLineageReferences:!0}),f(`Archived ${e.id} after unlinking lineage references`,"success"),Vn()}catch(ur){f(Ce(ur),"error")}}return}if(It!=="primary")return}else{const{choice:It,checkboxValue:An}=await Li({title:"Delete Task",message:`Delete ${e.id}?`,danger:!0,checkbox:{label:"Allow re-creation later (operator unlock)",description:"Lets agents recreate this task ID without --force-resurrect. Leave unchecked to keep this task tombstoned.",defaultChecked:!1}});if(It!=="primary")return;q=An===!0}const ke=e.githubTracking?.enabled===!0?e.githubTracking.issue:void 0;let st;if(ke?.owner&&ke.repo&&ke.number){const It=`${ke.owner}/${ke.repo}#${ke.number}`;await _s({title:"Linked GitHub Issue",message:`Choose what to do with ${It} when deleting ${e.id}.
722
722
 
@@ -737,6 +737,6 @@ Delete anyway by unlinking these references first?`,confirmLabel:"Force Delete",
737
737
  Archive anyway by unlinking these references first?`,confirmLabel:"Archive",cancelLabel:"Skip",danger:!0})){vt.push(pt.id);continue}try{await l(pt.id,{removeLineageReferences:!0}),Ye.push(pt.id)}catch{vt.push(pt.id)}}}finally{Kt(!1)}Ye.length>0&&ge(pt=>{const Zt=new Set(pt);for(const ce of Ye)Zt.delete(ce);return Zt}),m(`Archived ${Ye.length} · ${Je} skipped · ${vt.length} failed`,vt.length>0?"error":"success")},[m,J,l,ee,e]),On=i.useCallback(async()=>{if(ee.size===0)return;const ie=Array.from(ee).filter(Je=>{const tt=e.find(Ye=>Ye.id===Je);return tt&&tt.column!=="archived"});if(ie.length===0){m("No valid tasks to update (archived tasks cannot be modified)","error");return}const Fe={taskIds:ie};if(je!=="__no_change__")if(je==="")Fe.modelProvider=null,Fe.modelId=null;else{const Je=je.indexOf("/");Je!==-1&&(Fe.modelProvider=je.slice(0,Je),Fe.modelId=je.slice(Je+1))}if(Et!=="__no_change__")if(Et==="")Fe.validatorModelProvider=null,Fe.validatorModelId=null;else{const Je=Et.indexOf("/");Je!==-1&&(Fe.validatorModelProvider=Et.slice(0,Je),Fe.validatorModelId=Et.slice(Je+1))}if(xe!=="__no_change__"&&(xe===""?Fe.nodeId=null:Fe.nodeId=xe),Object.keys(Fe).length===1){m("No changes to apply","info");return}Kt(!0);try{const Je=await DC(Fe.taskIds,Fe.modelProvider,Fe.modelId,Fe.validatorModelProvider,Fe.validatorModelId,void 0,void 0,Fe.nodeId,S);w&&w(Je.updated),m(`Updated ${ie.length} task${ie.length===1?"":"s"}`,"success"),at(),mt("__no_change__"),Te("__no_change__"),gt("__no_change__")}catch(Je){m(Ce(Je)||"Failed to update models","error")}finally{Kt(!1)}},[ee,e,je,Et,xe,S,m,at,w]),un=i.useCallback(ie=>{if(z){h(ie,{origin:"list-mobile"});return}He(ie.id),de(ie)},[z,h]),tn=i.useRef(null),on=i.useRef(null);i.useEffect(()=>()=>{tn.current&&clearTimeout(tn.current)},[]);const pn=i.useCallback(ie=>{if(He(ie.id),de(ie),"prompt"in ie){on.current=null,tn.current&&(clearTimeout(tn.current),tn.current=null);return}on.current=ie.id,tn.current&&clearTimeout(tn.current),tn.current=setTimeout(()=>{tn.current=null,on.current===ie.id&&Sr(ie.id,S).then(Je=>{on.current===Je.id&&de(tt=>!tt||tt.id!==Je.id?tt:{...tt,...Je})}).catch(()=>{})},200)},[S]),mn=i.useCallback((ie,Fe)=>{if(Fe.paused){ie.preventDefault();return}ie.dataTransfer.setData("text/plain",Fe.id),ie.dataTransfer.effectAllowed="move",Y(Fe.id)},[]),Zn=i.useCallback(()=>{Y(null),_(null)},[]),In=i.useCallback(ie=>{if(z)return;ie.preventDefault();const Fe=rt.current;if(!Fe)return;const Je=Fe.getBoundingClientRect(),tt=vt=>{const pt=vt.clientX-Je.left;Pe(wc(pt,Je.width))},Ye=()=>{window.removeEventListener("mousemove",tt),window.removeEventListener("mouseup",Ye)};window.addEventListener("mousemove",tt),window.addEventListener("mouseup",Ye)},[z]),rn=i.useCallback(ie=>{if(z)return;const Fe=rt.current?.clientWidth??0,Je=Re/ah+yc,tt=Math.max(Fe,Je),Ye=rh(tt);if(ie.key==="ArrowLeft"||ie.key==="ArrowRight"){ie.preventDefault();const vt=ie.key==="ArrowLeft"?-yc:yc;Pe(pt=>wc(pt+vt,tt));return}if(ie.key==="Home"){ie.preventDefault(),Pe(ud);return}ie.key==="End"&&(ie.preventDefault(),Pe(Ye))},[z,Re]),hn=i.useCallback((ie,Fe)=>{ie.preventDefault(),ie.dataTransfer.dropEffect="move",_(Fe)},[]),Pn=i.useCallback(()=>{_(null)},[]),nn=i.useCallback(async(ie,Fe)=>{ie.preventDefault(),_(null);const Je=ie.dataTransfer.getData("text/plain");if(Je){if(Fe==="archived"){m("Tasks can only be archived via the archive button","error");return}try{const Ye=e.find(Zt=>Zt.id===Je)?.steps.some(Zt=>Zt.status!=="pending")??!1,vt=(Fe==="todo"||Fe==="triage")&&Ye;let pt;if(vt){if(await J({title:"Preserve Progress?",message:"This task has completed steps. Keep progress before moving?",confirmLabel:"Keep Progress",cancelLabel:"Reset Progress"}))pt={preserveProgress:!0};else if(!await J({title:"Reset Progress?",message:"Reset all step progress before moving this task?",confirmLabel:"Reset Progress",cancelLabel:"Cancel Move",danger:!0}))return}await n(Je,Fe,pt)}catch(tt){m(Ce(tt),"error")}}},[n,m,e,J]),$t=ie=>!U||U!==ie?t.jsx(Dv,{size:14,className:"sort-icon"}):T==="asc"?t.jsx(ua,{size:14,className:"sort-icon active"}):t.jsx(Wa,{size:14,className:"sort-icon active"}),Jt=ie=>t.jsxs("div",{id:ie,className:"list-view-options-panel",children:[t.jsx("div",{className:"list-view-options-columns",children:kk.map(Fe=>{const Je=le.has(Fe),tt=Je&&le.size===1;return t.jsxs("label",{className:`list-column-dropdown-item${tt?" disabled":""}`,title:tt?"At least one column must be visible":"",children:[t.jsx("input",{type:"checkbox",checked:Je,onChange:()=>Se(Fe),disabled:tt}),t.jsx("span",{children:pe[Fe]})]},Fe)})}),t.jsxs("button",{className:"btn btn-sm list-hide-done-toggle",onClick:()=>H(Fe=>!Fe),"aria-pressed":re,title:re?"Show done tasks":"Hide done tasks",children:[re?t.jsx($o,{size:14}):t.jsx(Nh,{size:14}),re?"Show Done":"Hide Done"]}),t.jsx("button",{className:"btn btn-sm list-hide-done-toggle",onClick:()=>Q(Fe=>!Fe),"aria-pressed":ue,title:ue?"Show all tasks":"Show stale tasks only",children:ue?"Show all":"Stale only"}),t.jsx("button",{className:"btn btn-sm list-hide-done-toggle",onClick:()=>fe(Fe=>!Fe),"aria-pressed":be,title:be?"Show all tasks":"Show stale paused review tasks only",children:be?"Show all":"Stale paused review"}),t.jsx("div",{className:"list-drop-zones list-drop-zones--sidebar",children:Ga.map(Fe=>{const Je=e.filter(pt=>pt.column===Fe).length,tt=Fe==="done"||Fe==="archived",Ye=re&&tt?0:Je,vt=re&&tt&&Je>0;return t.jsxs("div",{className:`list-drop-zone${L===Fe?" drag-over":""}${F===Fe?" active":""}`,onClick:()=>et(Fe),onDragOver:pt=>hn(pt,Fe),onDragLeave:Pn,onDrop:pt=>nn(pt,Fe),"data-column":Fe,children:[t.jsx("span",{className:`list-section-dot dot-${Fe}`}),t.jsx("span",{className:"drop-zone-label",children:Hs[Fe]}),t.jsx("span",{className:"drop-zone-count",children:vt?`${Ye} of ${Je}`:Je})]},Fe)})})]}),Qt=()=>t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"bulk-edit-toolbar",children:[t.jsxs("button",{className:"btn btn-sm",onClick:Tn,disabled:Mt,title:"Pause all selected tasks that are not already paused",children:[t.jsx(Vi,{size:14}),"Pause selected"]}),t.jsxs("button",{className:"btn btn-sm",onClick:Sn,disabled:Mt,title:"Unpause selected tasks that are currently paused",children:[t.jsx(Os,{size:14}),"Unpause selected"]}),t.jsxs("button",{className:"btn btn-sm",onClick:is,disabled:Mt,title:"Archive selected tasks that are in Done",children:[t.jsx(Ar,{size:14}),"Archive selected"]}),t.jsxs("button",{className:"btn btn-danger btn-sm",onClick:xn,disabled:Mt,title:"Delete selected tasks",children:[t.jsx(es,{size:14}),"Delete selected"]})]}),v&&v.length>0?t.jsxs("div",{className:"bulk-edit-toolbar",children:[t.jsx("span",{className:"bulk-edit-label",children:"Bulk Edit Models & Node:"}),t.jsx("div",{className:"bulk-edit-dropdown",children:t.jsx(ri,{models:v,value:je,onChange:mt,label:"Executor Model",noChangeValue:"__no_change__",noChangeLabel:"No change",favoriteProviders:x,onToggleFavorite:g,favoriteModels:y,onToggleModelFavorite:j})}),t.jsx("div",{className:"bulk-edit-dropdown",children:t.jsx(ri,{models:v,value:Et,onChange:Te,label:"Reviewer Model",noChangeValue:"__no_change__",noChangeLabel:"No change",favoriteProviders:x,onToggleFavorite:g,favoriteModels:y,onToggleModelFavorite:j})}),t.jsxs("div",{className:"bulk-edit-dropdown bulk-edit-node-wrap",children:[t.jsxs("select",{className:"select bulk-node-select",value:xe,onChange:ie=>gt(ie.target.value),"aria-label":"Node Override",disabled:Dt,children:[t.jsx("option",{value:"__no_change__",children:"No change"}),t.jsx("option",{value:"",children:"Use project default"}),_t.map(ie=>t.jsx("option",{value:ie.id,children:`${DO(ie.status)} ${ie.name||ie.id} (${$O(ie.status)})`},ie.id))]}),Wt?t.jsx(Cr,{status:Wt.status,showLabel:!0}):null]}),t.jsx("button",{className:"btn btn-primary btn-sm bulk-edit-apply-btn",onClick:On,disabled:Mt||je==="__no_change__"&&Et==="__no_change__"&&xe==="__no_change__",children:Mt?"Applying...":"Apply"})]}):null]});return t.jsxs("div",{className:"list-view",children:[z&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"list-toolbar",children:[t.jsx("button",{className:"btn btn-sm",onClick:Xe,"aria-pressed":ne,children:ne?"Done Editing":"Bulk Edit"}),t.jsxs("button",{className:"btn btn-sm list-view-options-toggle",onClick:()=>A(ie=>!ie),"aria-expanded":ve,"aria-controls":"list-view-options-panel-mobile",children:[t.jsx(Df,{size:14}),"View options"]}),p?t.jsx("button",{className:"btn btn-task-create btn-sm list-new-task-action",onClick:p,children:"+ New Task"}):null,t.jsx("div",{className:"list-stats",children:F?`${Nt} of ${e.length} tasks in ${Hs[F]}`:`${Nt} of ${e.length} tasks`})]}),ve?t.jsx("div",{className:"list-toolbar-mobile-options",children:Jt("list-view-options-panel-mobile")}):null,ne?ee.size>0?t.jsx("div",{className:"list-mobile-bulk-actions-wrapper",children:Qt()}):t.jsxs("div",{className:"list-mobile-bulk-actions",children:[t.jsx("span",{className:"list-mobile-bulk-actions__count",children:`${ee.size} selected`}),t.jsx("button",{className:"btn btn-sm",onClick:at,children:"Clear"})]}):null]}),t.jsx("div",{className:"list-table-container",children:t.jsxs("div",{className:z?"":"list-split-layout","data-testid":z?void 0:"list-split-layout",ref:rt,children:[t.jsxs("div",{className:z?"":"list-split-sidebar","data-testid":z?void 0:"list-split-sidebar",ref:qe,style:z?void 0:{width:`${Re}px`},children:[!z&&t.jsxs("aside",{className:"list-sidebar-controls","aria-label":"List controls",children:[t.jsxs("div",{className:"list-sidebar-controls__header",children:[t.jsxs("p",{className:"list-stats",children:[F?`${Nt} of ${e.length} tasks in ${Hs[F]}`:`${Nt} of ${e.length} tasks`,Be>0&&!F&&t.jsxs("span",{className:"list-stats-hidden",children:[" (",Be," hidden)"]})]}),t.jsxs("div",{className:"list-sidebar-controls__actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:Xe,"aria-pressed":ne,children:ne?"Done Editing":"Bulk Edit"}),p?t.jsx("button",{className:"btn btn-task-create btn-sm list-new-task-action",onClick:p,children:"+ New Task"}):null]}),t.jsxs("div",{className:"list-sidebar-summary-chips",children:[F?t.jsx("button",{className:"btn btn-sm",onClick:it,"aria-label":"Clear column filter",children:`Filter: ${Hs[F]}`}):null,re?t.jsx("span",{className:"list-sidebar-chip",children:"Done hidden"}):null,ue?t.jsx("span",{className:"list-sidebar-chip",children:"Stale only"}):null,be?t.jsx("span",{className:"list-sidebar-chip",children:"Stale paused review"}):null,ne?t.jsx("span",{className:"list-sidebar-chip",children:"Bulk edit"}):null,ne&&ee.size>0?t.jsx("button",{className:"btn btn-sm",onClick:at,children:`${ee.size} selected`}):null]})]}),t.jsxs("button",{className:"btn btn-sm list-view-options-toggle",onClick:()=>A(ie=>!ie),"aria-expanded":ve,"aria-controls":"list-view-options-panel",children:[t.jsx(Df,{size:14}),"View options"]}),ve&&Jt("list-view-options-panel"),ne&&ee.size>0?Qt():null]}),t.jsx("div",{className:"list-quick-entry-above-table",children:t.jsx(Jy,{onCreate:b??(async()=>m("Task creation not available","error")),addToast:m,tasks:e,availableModels:v,onPlanningMode:N,onSubtaskBreakdown:C,projectId:S,autoExpand:!1,favoriteProviders:x,favoriteModels:y,onToggleFavorite:g,onToggleModelFavorite:j,onOpenTask:ie=>{const Fe=e.find(Je=>Je.id===ie);if(Fe){h(Fe);return}typeof window<"u"&&(window.location.hash=`#/tasks/${ie}`)}})}),Nt===0?t.jsx("div",{className:"list-empty",children:E?"No tasks match your filter":"No tasks yet"}):z?t.jsx("div",{className:"list-cards",children:Ga.map(ie=>{if(F&&ie!==F||re&&(ie==="done"||ie==="archived")&&!F)return null;const Fe=xt[ie],Je=Fe.length===0;if(E&&Je)return null;const tt=O.has(ie);return t.jsxs(i.Fragment,{children:[t.jsxs("div",{className:`list-card-section-header${tt?" list-section-header--collapsed":""}`,onClick:()=>Ae(ie),"aria-expanded":!tt,role:"button",tabIndex:0,onKeyDown:Ye=>{(Ye.key==="Enter"||Ye.key===" ")&&(Ye.preventDefault(),Ae(ie))},children:[t.jsx(ps,{size:14,className:`list-section-chevron${tt?"":" list-section-chevron--expanded"}`}),t.jsx("span",{className:`list-section-dot dot-${ie}`}),t.jsx("span",{className:"list-section-title",children:Hs[ie]}),t.jsx("span",{className:"list-section-count",children:Fe.length})]}),!tt&&t.jsx(t.Fragment,{children:Je?t.jsx("div",{className:"list-empty-cell list-card-empty",children:"No tasks"}):Fe.map(Ye=>{const vt=Ye.column==="done",pt=vt?"done":Ye.status,Zt=!vt&&Ye.status==="failed",ce=!vt&&Ye.paused===!0,Ge=ad(Ye,I,M),Me=!f&&!Zt&&!ce&&!Ge&&(Ye.column==="in-progress"||Eb.has(pt)),Ke=typeof pt=="string"&&pt.trim().length>0,Qe=!!(Ye.dependencies&&Ye.dependencies.length>0),Lt=Db(Ye),gn=Lt.hasProgress,Bn=ne;return t.jsxs("div",{className:`list-card${Me?" agent-active":""}${Bn?" list-card--selectable":""}`,onClick:()=>un(Ye),"data-id":Ye.id,children:[Bn&&t.jsx("label",{className:"list-card-checkbox",onClick:wn=>wn.stopPropagation(),children:t.jsx("input",{type:"checkbox",checked:ee.has(Ye.id),onChange:wn=>{wn.stopPropagation(),At(Ye.id)},onClick:wn=>wn.stopPropagation(),disabled:Ye.column==="archived","aria-label":`Select ${Ye.id}`})}),t.jsxs("div",{className:"list-card-row",children:[t.jsx("span",{className:"list-card-id",children:Ye.id}),Ye.executionMode==="fast"&&t.jsxs("span",{className:"list-execution-mode-badge list-execution-mode-badge--fast",title:"Fast mode","aria-label":"Fast mode",children:[t.jsx(Bs,{"aria-hidden":"true"}),t.jsx("span",{className:"visually-hidden",children:"Fast mode"})]}),t.jsx("span",{className:"list-card-spacer"}),ce&&Ye.pausedByAgentId?t.jsx("span",{className:"list-status-badge paused",children:"paused by agent"}):Ge?t.jsx("span",{className:"list-status-badge stuck",children:"Stuck"}):Ke?t.jsx("span",{className:`list-status-badge list-status-badge--${Ye.column}${Zt?" failed":""}${Me?" pulsing":""}`,children:_b(pt??"")}):null]}),t.jsx("div",{className:"list-card-row",children:t.jsx("div",{className:"list-card-title",children:Ye.title||Ye.description})}),(Qe||gn)&&t.jsxs("div",{className:"list-card-row list-card-meta",children:[Qe&&t.jsxs("span",{className:"list-dep-badge",title:Ye.dependencies.join(", "),children:[t.jsx(wo,{size:12})," ",Ye.dependencies.length]}),gn&&t.jsxs("div",{className:"list-progress",children:[t.jsx("div",{className:"list-progress-bar",children:t.jsx("div",{className:"list-progress-fill",style:{width:`${Lt.percent}%`,backgroundColor:vc[Ye.column]}})}),t.jsx("span",{className:"list-progress-label",children:Lt.label})]})]})]},Ye.id)})})]},ie)})}):t.jsxs("table",{className:"list-table",children:[t.jsx("thead",{children:t.jsxs("tr",{children:[ne&&t.jsx("th",{className:"list-header-cell list-header-checkbox",children:t.jsx("input",{type:"checkbox",checked:Oe,ref:ie=>{ie&&(ie.indeterminate=ht)},onChange:Z,"aria-label":"Select all visible tasks"})}),le.has("title")&&t.jsxs("th",{className:"list-header-cell",onClick:()=>_e("title"),children:["Title ",$t("title")]}),le.has("status")&&t.jsxs("th",{className:"list-header-cell",onClick:()=>_e("status"),children:["Status ",$t("status")]}),le.has("column")&&t.jsxs("th",{className:"list-header-cell",onClick:()=>_e("column"),children:["Column ",$t("column")]}),le.has("retries")&&t.jsxs("th",{className:"list-header-cell",onClick:()=>_e("retries"),children:["Retries ",$t("retries")]}),le.has("dependencies")&&t.jsx("th",{className:"list-header-cell",children:"Dependencies"}),le.has("progress")&&t.jsx("th",{className:"list-header-cell",children:"Progress"})]})}),t.jsx("tbody",{children:Ga.map(ie=>{if(F&&ie!==F||re&&(ie==="done"||ie==="archived")&&!F)return null;const Fe=xt[ie],Je=Fe.length===0;if(E&&Je)return null;const tt=O.has(ie);return t.jsxs(i.Fragment,{children:[t.jsx("tr",{className:`list-section-header${tt?" list-section-header--collapsed":""}`,onClick:()=>Ae(ie),"aria-expanded":!tt,children:t.jsxs("th",{colSpan:le.size+(ne?1:0),className:"list-section-cell",children:[t.jsx(ps,{size:14,className:`list-section-chevron${tt?"":" list-section-chevron--expanded"}`}),t.jsx("span",{className:`list-section-dot dot-${ie}`}),t.jsx("span",{className:"list-section-title",children:Hs[ie]}),t.jsx("span",{className:"list-section-count",children:Fe.length})]})}),!tt&&t.jsx(t.Fragment,{children:Je?t.jsx("tr",{className:"list-section-empty",children:t.jsx("td",{colSpan:le.size+(ne?1:0),className:"list-empty-cell",children:"No tasks"})}):Fe.map(Ye=>{const vt=Ye.column==="done",pt=vt?"done":Ye.status,Zt=!vt&&Ye.status==="failed",ce=!vt&&Ye.paused===!0,Ge=ad(Ye,I,M),Me=!f&&!Zt&&!ce&&!Ge&&(Ye.column==="in-progress"||Eb.has(pt)),Ke=W===Ye.id;return t.jsxs("tr",{className:`list-row${Zt?" failed":""}${ce?" paused":""}${Ge?" stuck":""}${Me?" agent-active":""}${Ke?" dragging":""}${Ne===Ye.id?" list-row--selected":""}`,onClick:()=>un(Ye),draggable:!ce,onDragStart:Qe=>mn(Qe,Ye),onDragEnd:Zn,"data-id":Ye.id,children:[ne&&t.jsx("td",{className:"list-cell list-cell-checkbox",children:t.jsx("input",{type:"checkbox",checked:ee.has(Ye.id),onChange:Qe=>{Qe.stopPropagation(),At(Ye.id)},onClick:Qe=>Qe.stopPropagation(),disabled:Ye.column==="archived","aria-label":`Select ${Ye.id}`})}),le.has("title")&&t.jsx("td",{className:"list-cell list-cell-title",children:t.jsxs("div",{className:"list-title-content",children:[t.jsx("span",{className:"list-title-id",children:Ye.id}),t.jsxs("div",{className:"list-title-row",children:[Ye.executionMode==="fast"&&t.jsxs("span",{className:"list-execution-mode-badge list-execution-mode-badge--fast",title:"Fast mode","aria-label":"Fast mode",children:[t.jsx(Bs,{"aria-hidden":"true"}),t.jsx("span",{className:"visually-hidden",children:"Fast mode"})]}),t.jsx("span",{className:"list-title-text",children:Ye.title||Ye.description})]})]})}),le.has("status")&&t.jsx("td",{className:"list-cell",children:ce&&Ye.pausedByAgentId?t.jsx("span",{className:"list-status-badge paused",children:"paused by agent"}):Ge?t.jsx("span",{className:"list-status-badge stuck",children:"Stuck"}):pt?t.jsx("span",{className:`list-status-badge list-status-badge--${Ye.column}${Zt?" failed":""}${Me?" pulsing":""}`,children:_b(pt??"")}):t.jsx("span",{className:"list-status-badge",children:"-"})}),le.has("column")&&t.jsx("td",{className:"list-cell",children:t.jsx("span",{className:"list-column-badge",style:{background:`color-mix(in srgb, ${vc[Ye.column]} 12%, transparent)`,color:vc[Ye.column]},children:Hs[Ye.column]})}),le.has("retries")&&t.jsx("td",{className:"list-cell",children:(Ye.retrySummary?.total??0)>0?Ye.retrySummary?.total??0:"—"}),le.has("dependencies")&&t.jsx("td",{className:"list-cell list-cell-deps",children:Ye.dependencies&&Ye.dependencies.length>0?t.jsxs("span",{className:"list-dep-badge",title:Ye.dependencies.join(", "),children:[t.jsx(wo,{size:12})," ",Ye.dependencies.length]}):"-"}),le.has("progress")&&t.jsx("td",{className:"list-cell list-cell-progress",children:(()=>{const Qe=Db(Ye);return Qe.hasProgress?t.jsxs("div",{className:"list-progress",children:[t.jsx("div",{className:"list-progress-bar",children:t.jsx("div",{className:"list-progress-fill",style:{width:`${Qe.percent}%`,backgroundColor:vc[Ye.column]}})}),t.jsx("span",{className:"list-progress-label",children:Qe.label})]}):"-"})()})]},Ye.id)})})]},ie)})})]})]}),!z&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"list-split-resize-handle","data-testid":"list-split-resize-handle",onMouseDown:In,onKeyDown:rn,role:"separator",tabIndex:0,"aria-orientation":"vertical","aria-label":"Resize task list sidebar","aria-valuemin":ud,"aria-valuemax":Math.round(rh(rt.current?.clientWidth??Re/ah+yc)),"aria-valuenow":Math.round(Re)}),t.jsx("div",{className:"list-split-detail","data-testid":"list-split-detail",children:Le?t.jsx("div",{className:"list-split-detail-content","data-testid":"list-split-detail-content",children:t.jsx(wk,{task:Le,projectId:S,tasks:e,embedded:!0,onOpenDetail:pn,onMoveTask:n,onDeleteTask:a,onMergeTask:c,onRetryTask:s,onResetTask:d,onDuplicateTask:u,onTaskUpdated:ie=>{de(Fe=>!Fe||Fe.id!==ie.id?Fe:{...Fe,...ie})},addToast:m,prAuthAvailable:G})}):t.jsx("div",{className:"list-split-detail-empty",children:t.jsx("p",{children:"Select a task to view details"})})})]})]})})]})}const FO={active:{label:"Active",color:"var(--color-success)",icon:Os},paused:{label:"Paused",color:"var(--color-warning)",icon:Vi},errored:{label:"Error",color:"var(--color-error)",icon:oi},initializing:{label:"Initializing",color:"var(--color-warning)",icon:Ct}};function zO(e){if(!e)return"Never";const n=new Date(e),a=new Date().getTime()-n.getTime(),r=Math.floor(a/6e4),o=Math.floor(a/36e5),l=Math.floor(a/864e5);return r<1?"Just now":r<60?`${r}m ago`:o<24?`${o}h ago`:l<7?`${l}d ago`:n.toLocaleDateString()}function Lb(e,n=40){if(e.length<=n)return e;const s=e.slice(0,Math.floor(n/2)-2),a=e.slice(-Math.floor(n/2)+2);return`${s}...${a}`}function BO(e,n){if(e.project.id!==n.project.id||e.project.status!==n.project.status||e.project.name!==n.project.name||e.project.path!==n.project.path||e.project.lastActivityAt!==n.project.lastActivityAt||e.isLoading!==n.isLoading)return!1;const s=e.health,a=n.health;if(!s&&!a)return!0;if(!s||!a||s.activeTaskCount!==a.activeTaskCount||s.inFlightAgentCount!==a.inFlightAgentCount||s.totalTasksCompleted!==a.totalTasksCompleted||s.totalTasksFailed!==a.totalTasksFailed||s.status!==a.status)return!1;const r=e.availabilityMappings??[],o=n.availabilityMappings??[];return r.length!==o.length?!1:r.every((l,c)=>{const d=o[c];return!!d&&l.nodeId===d.nodeId&&l.path===d.path&&l.displayName===d.displayName&&l.available===d.available})}function UO({project:e,health:n,onSelect:s,onPause:a,onResume:r,onRemove:o,availabilityMappings:l=[],isLoading:c=!1}){const[d,u]=i.useState(!1),h=FO[e.status],m=h.icon,f=i.useCallback(()=>{s(e)},[s,e]),p=i.useCallback(j=>{j.stopPropagation(),a(e)},[a,e]),b=i.useCallback(j=>{j.stopPropagation(),r(e)},[r,e]),v=i.useCallback(j=>{if(j.stopPropagation(),!d){u(!0);return}o(e),u(!1)},[d,o,e]),x=e.status==="paused",y=e.status==="errored",g=e.status==="initializing";return t.jsxs("div",{className:`project-card ${c?"project-card-loading":""} ${y?"project-card-errored":""}`,onClick:f,"data-project-id":e.id,role:"button",tabIndex:0,onKeyDown:j=>{(j.key==="Enter"||j.key===" ")&&(j.preventDefault(),f())},children:[t.jsxs("div",{className:"project-card-header",children:[t.jsx("div",{className:"project-card-icon",children:t.jsx(Qs,{size:20})}),t.jsxs("div",{className:"project-card-title-section",children:[t.jsx("h3",{className:"project-card-name",title:e.name,children:e.name}),l.length>0&&t.jsxs("div",{className:"project-card-availability","aria-label":"Project node availability",children:[l.slice(0,3).map(j=>t.jsxs("div",{className:"project-card-availability__row",title:`${j.displayName} → ${j.path}`,children:[t.jsx("span",{className:"project-card-availability__node",children:j.displayName}),t.jsx("span",{className:"project-card-availability__arrow",children:"→"}),t.jsx("code",{className:"project-card-availability__path",children:Lb(j.path,28)})]},`${j.nodeId}-${j.path}`)),l.length>3&&t.jsxs("span",{className:"project-card-availability__more",children:["+",l.length-3," more"]})]}),t.jsx("span",{className:"project-card-path",title:e.path,children:Lb(e.path)})]}),t.jsxs("div",{className:"project-card-status-badge",style:{color:h.color,borderColor:h.color},children:[t.jsx(m,{size:12,className:g?"animate-spin":""}),t.jsx("span",{children:h.label})]})]}),t.jsxs("div",{className:"project-card-health",children:[n&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"project-card-metric",children:[t.jsx("span",{className:"project-card-metric-value",children:n.activeTaskCount}),t.jsx("span",{className:"project-card-metric-label",children:"Active Tasks"})]}),t.jsxs("div",{className:"project-card-metric",children:[t.jsx("span",{className:"project-card-metric-value",children:n.inFlightAgentCount}),t.jsx("span",{className:"project-card-metric-label",children:"Agents"})]}),t.jsxs("div",{className:"project-card-metric",children:[t.jsx("span",{className:"project-card-metric-value",children:n.totalTasksCompleted}),t.jsx("span",{className:"project-card-metric-label",children:"Completed"})]})]}),!n&&t.jsx("div",{className:"project-card-metric project-card-metric-empty",children:t.jsx("span",{className:"project-card-metric-label",children:"No health data available"})})]}),t.jsxs("div",{className:"project-card-footer",children:[t.jsxs("div",{className:"project-card-activity",children:[t.jsx("span",{className:"project-card-activity-label",children:"Last activity:"}),t.jsx("span",{className:"project-card-activity-time",children:zO(e.lastActivityAt||n?.lastActivityAt)})]}),t.jsxs("div",{className:"project-card-actions",children:[x?t.jsxs("button",{className:"project-card-action project-card-action-resume",onClick:b,disabled:c,title:"Resume project","aria-label":"Resume project",children:[t.jsx(Os,{size:14}),t.jsx("span",{children:"Resume"})]}):t.jsxs("button",{className:"project-card-action project-card-action-pause",onClick:p,disabled:c||g,title:g?"Cannot pause while initializing":"Pause project","aria-label":"Pause project",children:[t.jsx(Vi,{size:14}),t.jsx("span",{children:"Pause"})]}),t.jsxs("button",{className:"project-card-action project-card-action-open",onClick:f,disabled:c,title:"Open project","aria-label":"Open project",children:[t.jsx(Dl,{size:14}),t.jsx("span",{children:"Open"})]}),t.jsxs("button",{className:`project-card-action project-card-action-remove ${d?"is-armed":""}`,onClick:v,disabled:c,title:d?"Confirm remove":"Remove project","aria-label":d?"Confirm remove project":"Remove project",children:[t.jsx(es,{size:14}),t.jsx("span",{children:d?"Confirm":""})]})]})]})]})}const HO=i.memo(UO,BO);function Ob(e){return typeof e=="string"&&e.trim().length>0}function gl(e){return(e.nodeMappings??[]).filter(s=>Ob(s.nodeId)&&Ob(s.path)).map(s=>({nodeId:s.nodeId,nodeName:s.nodeName,path:s.path,available:s.available!==!1}))}function qO(e,n){return gl(e).filter(s=>s.nodeId===n.id&&s.available)}function VO(e,n){return qO(e,n).length>0}function WO(e,n){return e.filter(s=>VO(s,n))}function iq(e,n){return WO(e,n).length}function Fb(e,n,s,a){const r=s.find(o=>o.id===e);return r?.name?r.name:n?.nodeName?n.nodeName:a._sourceNodeName?a._sourceNodeName:e}function GO(){return t.jsxs("div",{className:"project-overview project-overview--loading",children:[t.jsx("div",{className:"project-overview__header-skeleton",children:t.jsxs("div",{className:"project-overview__stats-row",children:[t.jsxs("div",{className:"project-overview__stat-skeleton",children:[t.jsx("div",{className:"project-skeleton project-skeleton--icon",children:t.jsx(Qs,{size:20,className:"project-skeleton-icon"})}),t.jsx("div",{className:"project-skeleton project-skeleton--value"}),t.jsx("div",{className:"project-skeleton project-skeleton--label"})]}),t.jsxs("div",{className:"project-overview__stat-skeleton",children:[t.jsx("div",{className:"project-skeleton project-skeleton--icon",children:t.jsx(fi,{size:20,className:"project-skeleton-icon"})}),t.jsx("div",{className:"project-skeleton project-skeleton--value"}),t.jsx("div",{className:"project-skeleton project-skeleton--label"})]}),t.jsxs("div",{className:"project-overview__stat-skeleton",children:[t.jsx("div",{className:"project-skeleton project-skeleton--icon",children:t.jsx(gs,{size:20,className:"project-skeleton-icon"})}),t.jsx("div",{className:"project-skeleton project-skeleton--value"}),t.jsx("div",{className:"project-skeleton project-skeleton--label"})]}),t.jsxs("div",{className:"project-overview__stat-skeleton",children:[t.jsx("div",{className:"project-skeleton project-skeleton--icon",children:t.jsx(oi,{size:20,className:"project-skeleton-icon"})}),t.jsx("div",{className:"project-skeleton project-skeleton--value"}),t.jsx("div",{className:"project-skeleton project-skeleton--label"})]})]})}),t.jsxs("div",{className:"project-overview__filters-skeleton",children:[t.jsx("div",{className:"project-skeleton project-skeleton--tab"}),t.jsx("div",{className:"project-skeleton project-skeleton--tab"}),t.jsx("div",{className:"project-skeleton project-skeleton--tab"}),t.jsx("div",{className:"project-skeleton project-skeleton--tab"})]}),t.jsx("div",{className:"project-grid project-grid--skeleton",children:Array.from({length:6}).map((e,n)=>t.jsxs("div",{className:"project-card project-card--skeleton",children:[t.jsxs("div",{className:"project-card-skeleton__header",children:[t.jsx("div",{className:"project-skeleton project-skeleton--icon-circle"}),t.jsxs("div",{className:"project-skeleton__text-group",children:[t.jsx("div",{className:"project-skeleton project-skeleton--title"}),t.jsx("div",{className:"project-skeleton project-skeleton--path"})]}),t.jsx("div",{className:"project-skeleton project-skeleton--badge"})]}),t.jsxs("div",{className:"project-card-skeleton__health",children:[t.jsx("div",{className:"project-skeleton project-skeleton--metric"}),t.jsx("div",{className:"project-skeleton project-skeleton--metric"}),t.jsx("div",{className:"project-skeleton project-skeleton--metric"})]}),t.jsxs("div",{className:"project-card-skeleton__footer",children:[t.jsx("div",{className:"project-skeleton project-skeleton--activity"}),t.jsx("div",{className:"project-skeleton project-skeleton--actions"})]})]},n))})]})}const KO=1e4,zb=5;function JO(e){const[n,s]=i.useState({}),[a,r]=i.useState(!0),[o,l]=i.useState(null),c=i.useRef(null),d=i.useRef(null),u=i.useRef(!1),h=i.useCallback(async()=>{if(e.length===0){s({}),u.current||(u.current=!0),r(!1);return}d.current&&d.current.abort(),d.current=new AbortController,!u.current&&r(!0),l(null);try{const p={};for(let b=0;b<e.length;b+=zb){const v=e.slice(b,b+zb),x=await Promise.allSettled(v.map(async y=>{try{return await vp(y)}catch{return null}}));if(v.forEach((y,g)=>{const j=x[g];p[y]=j.status==="fulfilled"?j.value:null}),d.current?.signal.aborted)return}s(p),u.current=!0}catch(p){if(p instanceof Error&&p.name==="AbortError")return;l(p instanceof Error?p.message:"Failed to fetch health data"),u.current=!0}finally{r(!1)}},[e]),m=i.useCallback(async f=>{try{const p=await vp(f);s(b=>({...b,[f]:p}))}catch(p){console.error(`Failed to fetch health for project ${f}:`,p)}},[]);return i.useEffect(()=>(u.current=!1,h(),()=>{d.current&&d.current.abort()}),[h]),i.useEffect(()=>{if(e.length!==0)return c.current&&clearInterval(c.current),c.current=setInterval(()=>{h()},KO),()=>{c.current&&(clearInterval(c.current),c.current=null)}},[h,e.length]),{healthMap:n,loading:a,error:o,refresh:h,refreshProject:m}}function YO({projects:e,loading:n=!1,onSelectProject:s,onAddProject:a,onPauseProject:r,onResumeProject:o,onRemoveProject:l,nodes:c=[]}){const[d,u]=i.useState("all"),[h,m]=i.useState(null),[f,p]=i.useState("activity"),[b,v]=i.useState("desc");i.useEffect(()=>{if(typeof window>"u")return;const U=localStorage.getItem("kb-dashboard-recent-projects");if(U)try{const P=JSON.parse(U);y(P)}catch{}},[]);const[x,y]=i.useState([]),g=i.useMemo(()=>e.map(U=>U.id),[e]),{healthMap:j,loading:N}=JO(g),C=i.useMemo(()=>e.map(U=>({project:U,health:j[U.id]||null})),[e,j]),w=i.useMemo(()=>{let U=[...C];return d!=="all"&&(U=U.filter(({project:P})=>P.status===d)),h!==null&&(U=U.filter(({project:P})=>gl(P).some(T=>T.available&&T.nodeId===h))),U},[C,d,h]),S=i.useMemo(()=>{const U=[...w];return U.sort((P,T)=>{let D=0;switch(f){case"name":D=P.project.name.localeCompare(T.project.name);break;case"activity":{const W=P.project.lastActivityAt||P.health?.lastActivityAt||P.project.updatedAt,Y=T.project.lastActivityAt||T.health?.lastActivityAt||T.project.updatedAt;D=new Date(Y).getTime()-new Date(W).getTime();break}case"status":{const W={errored:0,initializing:1,paused:2,active:3};D=W[P.project.status]-W[T.project.status];break}}return b==="asc"?D:-D}),U},[w,f,b]),R=i.useMemo(()=>{const U=e.length,P=e.filter(F=>F.status==="active").length,T=e.filter(F=>F.status==="errored").length,D=new Set;e.forEach(F=>{gl(F).forEach(ae=>{ae.available&&D.add(ae.nodeId)})});const W=D.size;let Y=0,L=0,_=0;return Object.values(j).forEach(F=>{F&&(Y+=F.activeTaskCount,L+=F.totalTasksCompleted,_+=F.inFlightAgentCount)}),{totalProjects:U,activeProjects:P,erroredProjects:T,totalNodes:W,totalActiveTasks:Y,totalCompletedTasks:L,totalInFlightAgents:_}},[e,j]),I=i.useMemo(()=>({all:e.length,active:e.filter(U=>U.status==="active").length,paused:e.filter(U=>U.status==="paused").length,errored:e.filter(U=>U.status==="errored").length}),[e]),E=i.useMemo(()=>{const U=new Map;return e.forEach(P=>{gl(P).filter(T=>T.available).forEach(T=>{const D=T.nodeId,W=U.get(D),Y=Fb(D,T,c,P);W?W.count+=1:U.set(D,{name:Y,count:1})})}),Array.from(U.entries()).map(([P,{name:T,count:D}])=>({nodeId:P,name:T,count:D}))},[e,c]),M=i.useCallback(U=>{const P=[U.id,...x.filter(T=>T!==U.id)].slice(0,3);y(P),typeof window<"u"&&localStorage.setItem("kb-dashboard-recent-projects",JSON.stringify(P)),s(U)},[s,x]);return n||N&&e.length>0&&Object.keys(j).length===0?t.jsx(GO,{}):e.length===0?t.jsx("div",{className:"project-overview project-overview--empty",children:t.jsxs("div",{className:"project-empty-state",children:[t.jsx("div",{className:"project-empty-state__icon",children:t.jsx(Va,{size:48})}),t.jsx("h2",{className:"project-empty-state__title",children:"No Projects Found"}),t.jsx("p",{className:"project-empty-state__description",children:"Get started by adding your first project. Projects allow you to organize and track tasks across multiple repositories."}),t.jsxs("button",{className:"btn btn-primary project-empty-state__cta",onClick:a,children:[t.jsx(os,{size:16}),"Add Your First Project"]})]})}):t.jsxs("div",{className:"project-overview",children:[t.jsxs("div",{className:"project-overview__header",children:[t.jsxs("h2",{className:"project-overview__title",children:[t.jsx(Xa,{size:20}),"Projects"]}),t.jsxs("div",{className:"project-overview__stats",children:[t.jsxs("div",{className:"project-stat",children:[t.jsx("div",{className:"project-stat__icon",children:t.jsx(Qs,{size:16})}),t.jsxs("div",{className:"project-stat__content",children:[t.jsx("span",{className:"project-stat__value",children:R.totalProjects}),t.jsx("span",{className:"project-stat__label",children:"Total"})]})]}),t.jsxs("div",{className:"project-stat project-stat--active",children:[t.jsx("div",{className:"project-stat__icon",children:t.jsx(fi,{size:16})}),t.jsxs("div",{className:"project-stat__content",children:[t.jsx("span",{className:"project-stat__value",children:R.totalActiveTasks}),t.jsx("span",{className:"project-stat__label",children:"Active Tasks"})]})]}),t.jsxs("div",{className:"project-stat project-stat--completed",children:[t.jsx("div",{className:"project-stat__icon",children:t.jsx(gs,{size:16})}),t.jsxs("div",{className:"project-stat__content",children:[t.jsx("span",{className:"project-stat__value",children:R.totalCompletedTasks}),t.jsx("span",{className:"project-stat__label",children:"Completed"})]})]}),R.erroredProjects>0&&t.jsxs("div",{className:"project-stat project-stat--error",children:[t.jsx("div",{className:"project-stat__icon",children:t.jsx(oi,{size:16})}),t.jsxs("div",{className:"project-stat__content",children:[t.jsx("span",{className:"project-stat__value",children:R.erroredProjects}),t.jsx("span",{className:"project-stat__label",children:"Errored"})]})]}),R.totalNodes>1&&t.jsxs("div",{className:"project-stat project-stat--nodes",children:[t.jsx("div",{className:"project-stat__icon",children:t.jsx(Ml,{size:16})}),t.jsxs("div",{className:"project-stat__content",children:[t.jsx("span",{className:"project-stat__value",children:R.totalNodes}),t.jsx("span",{className:"project-stat__label",children:"Nodes"})]})]})]}),t.jsxs("button",{className:"btn btn-primary project-overview__add-btn",onClick:a,children:[t.jsx(os,{size:16}),"Add Project"]})]}),t.jsxs("div",{className:"project-overview__filters",children:[t.jsxs("div",{className:"project-filter-tabs",children:[t.jsxs("button",{className:`project-filter-tab ${d==="all"?"active":""}`,onClick:()=>u("all"),children:["All",t.jsx("span",{className:"project-filter-count",children:I.all})]}),t.jsxs("button",{className:`project-filter-tab ${d==="active"?"active":""}`,onClick:()=>u("active"),children:["Active",t.jsx("span",{className:"project-filter-count",children:I.active})]}),t.jsxs("button",{className:`project-filter-tab ${d==="paused"?"active":""}`,onClick:()=>u("paused"),children:["Paused",t.jsx("span",{className:"project-filter-count",children:I.paused})]}),t.jsxs("button",{className:`project-filter-tab ${d==="errored"?"active":""} ${I.errored>0?"has-errors":""}`,onClick:()=>u("errored"),children:["Errored",t.jsx("span",{className:"project-filter-count",children:I.errored})]})]}),E.length>1&&t.jsxs("div",{className:"project-node-filter",children:[t.jsx(Ml,{size:14}),t.jsxs("select",{value:h??"",onChange:U=>{m(U.target.value||null)},className:"project-node-filter-select","aria-label":"Filter by node",children:[t.jsx("option",{value:"",children:"All Nodes"}),E.map(({nodeId:U,name:P,count:T})=>t.jsxs("option",{value:U??"",children:[P," (",T,")"]},U??"local"))]})]}),t.jsxs("div",{className:"project-sort",children:[t.jsx(Qc,{size:14}),t.jsxs("select",{value:`${f}-${b}`,onChange:U=>{const[P,T]=U.target.value.split("-");p(P),v(T)},className:"project-sort-select","aria-label":"Sort projects",children:[t.jsx("option",{value:"activity-desc",children:"Last Activity (Newest)"}),t.jsx("option",{value:"activity-asc",children:"Last Activity (Oldest)"}),t.jsx("option",{value:"name-asc",children:"Name (A-Z)"}),t.jsx("option",{value:"name-desc",children:"Name (Z-A)"}),t.jsx("option",{value:"status-asc",children:"Status (Error → Active)"}),t.jsx("option",{value:"status-desc",children:"Status (Active → Error)"})]}),t.jsx(Dv,{size:14})]})]}),t.jsx("div",{className:"project-grid",children:S.map(({project:U,health:P})=>{const T=gl(U).filter(D=>D.available).map(D=>({...D,displayName:Fb(D.nodeId,D,c,U)}));return t.jsx(HO,{project:U,health:P,availabilityMappings:T,onSelect:M,onPause:r,onResume:o,onRemove:l},U.id)})}),S.length===0&&t.jsxs("div",{className:"project-overview__no-results",children:[t.jsx(Qc,{size:32}),t.jsx("p",{children:"No projects match the current filter"}),t.jsx("button",{className:"btn btn-secondary",onClick:()=>u("all"),children:"Show All Projects"})]})]})}const jk=i.createContext(null);function XO({value:e,children:n}){return i.createElement(jk.Provider,{value:e},n)}function ff(){const e=i.useContext(jk);if(!e)throw new Error("useNavigationHistoryContext must be used within a NavigationHistoryProvider");return e}function QO(e){const{enabled:n}=e,s=i.useRef([]),a=i.useRef(!1),r=i.useRef(n);r.current=n;const o=i.useCallback(c=>{if(!r.current||a.current)return;const d=s.current[s.current.length-1];if(d){const m=d.type==="modal"?d.close:d.revert,f=c.type==="modal"?c.close:c.revert;if(m===f)return}s.current.push(c);const u=s.current.length,h=typeof window<"u"&&window.history.state?window.history.state:{};window.history.pushState({...h,navIndex:u},"")},[]),l=i.useCallback(c=>{if(!r.current||s.current.length===0)return;s.current[s.current.length-1]=c;const d=s.current.length,u=typeof window<"u"&&window.history.state?window.history.state:{};window.history.replaceState({...u,navIndex:d},"")},[]);return i.useEffect(()=>{if(typeof window>"u")return;const c=d=>{if(!r.current)return;const u=d.state?.navIndex??0,h=s.current.length;if(u>=h)return;const m=h-u;if(!(m<=0)){a.current=!0;try{for(let f=0;f<m;f++){const p=s.current.pop();p&&(p.type==="modal"?p.close():p.revert())}}finally{a.current=!1}}};return window.addEventListener("popstate",c),()=>{window.removeEventListener("popstate",c)}},[]),{pushNav:o,replaceCurrent:l}}const pf="kb-planning-last-description",gf="kb-subtask-last-description",bf="kb-mission-last-goal";function ZO(e,n){Ns(pf,e,n)}function eF(e){return ns(pf,e)||""}function so(e){qi(pf,e)}function tF(e,n){Ns(gf,e,n)}function nF(e){return ns(gf,e)||""}function Ku(e){qi(gf,e)}function sF(e,n){Ns(bf,e,n)}function iF(e){return ns(bf,e)||""}function Ua(e){qi(bf,e)}function aF(e){const{question:n,response:s}=e;if(!n)return s;if(s&&typeof s=="object"&&!Array.isArray(s)){const a=s;if(n.id in a)return a[n.id]}return s}function rF(e,n){switch(e.type){case"text":return typeof n=="string"?n:n==null?"":String(n);case"single_select":return typeof n=="string"?e.options?.find(a=>a.id===n)?.label??n:n==null?"":String(n);case"multi_select":return Array.isArray(n)?n.map(s=>typeof s!="string"?String(s):e.options?.find(r=>r.id===s)?.label??s).join(", "):n==null?"":String(n);case"confirm":return n===!0?"Yes":n===!1?"No":n==null?"":String(n);default:return n==null?"":JSON.stringify(n)}}function oF(e){let n=0;const s=[];for(const a of e){if(a.question){n+=1,s.push({...a,questionNumber:n});continue}a.thinkingOutput&&s.push({...a,questionNumber:null})}return s}function Wi({entries:e,defaultShowThinking:n=!1}){const[s,a]=i.useState({}),r=oF(e);return r.length===0?null:t.jsx("div",{className:"conversation-history","data-testid":"conversation-history",children:r.map((o,l)=>{const c=!!o.question,d=!!o.thinkingOutput,u=s[l]??n,h=c?aF(o):void 0,m=o.question&&h!==void 0?rF(o.question,h):"",f=o.response&&typeof o.response=="object"&&!Array.isArray(o.response)?o.response:void 0,p=typeof f?._comment=="string"?f._comment.trim():"";return t.jsxs("div",{className:"conversation-entry",children:[c?t.jsxs("div",{className:"conversation-entry-question",children:[t.jsxs("span",{className:"conversation-entry-question-label",children:["Q",o.questionNumber]}),t.jsx("p",{children:o.question?.question})]}):t.jsx("div",{className:"conversation-entry-question",children:t.jsx("span",{className:"conversation-entry-question-label",children:"AI Reasoning"})}),c&&t.jsxs("div",{className:"conversation-entry-response",children:[t.jsx("strong",{children:"Your response"}),t.jsx("p",{children:m||"—"}),p&&t.jsxs("p",{className:"conversation-comment",children:["💬 ",p]})]}),d&&t.jsxs("div",{className:"conversation-entry-thinking",children:[t.jsxs("button",{type:"button",className:"conversation-thinking-toggle",onClick:()=>{a(b=>({...b,[l]:!u}))},"aria-expanded":u,children:[t.jsx("span",{"aria-hidden":"true",children:u?"▾":"▸"}),u?`Hide ${c?"AI thinking":"AI reasoning"}`:`Show ${c?"AI thinking":"AI reasoning"}`]}),u&&t.jsx("pre",{children:o.thinkingOutput})]})]},`${o.question?.id??"thinking"}-${l}`)})})}const Bb="fusion-tab-id";function lF(){const e=globalThis.crypto;return e&&typeof e.randomUUID=="function"?e.randomUUID():`tab-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Pr(){if(typeof window>"u")return"server-tab";const e=window.sessionStorage.getItem(Bb);if(e)return e;const n=lF();return window.sessionStorage.setItem(Bb,n),n}function Fd(e){const n=i.useMemo(()=>Pr(),[]),[s,a]=i.useState(!1),[r,o]=i.useState(null),[l,c]=i.useState(!1);i.useEffect(()=>{if(!e){a(!1),o(null),c(!1);return}let u=!0;return c(!0),Promise.resolve(SM(e,n)).then(h=>{if(u){if(h.acquired){a(!1),o(null);return}a(!0),o(h.currentHolder)}}).catch(()=>{u&&(a(!1),o(null))}).finally(()=>{u&&c(!1)}),()=>{u=!1;try{const h=CM(e,n);h&&typeof h.catch=="function"&&h.catch(()=>{})}catch{}}},[e,n]),i.useEffect(()=>{if(!e||typeof window>"u")return;const u=()=>{if(typeof navigator.sendBeacon!="function")return;const h=Qi(`/api/ai-sessions/${encodeURIComponent(e)}/lock/beacon?tabId=${encodeURIComponent(n)}`);navigator.sendBeacon(h)};return window.addEventListener("beforeunload",u),()=>{window.removeEventListener("beforeunload",u)}},[e,n]),i.useEffect(()=>!e||typeof EventSource>"u"?void 0:Si("/api/events",{events:{"ai_session:updated":h=>{try{const m=JSON.parse(h.data);if(m.id!==e)return;const f=m.lockedByTab??null;o(f),a(!!(f&&f!==n))}catch{}}}}),[e,n]);const d=i.useCallback(async()=>{if(e){c(!0);try{await Promise.resolve(EM(e,n)),a(!1),o(null)}finally{c(!1)}}},[e,n]);return{isLockedByOther:s,currentHolder:r,takeControl:d,isLoading:l}}const cF="fusion:ai-session-sync",Ub="fusion:ai-session-sync",dF=3e4,uF=6e4;function ra(){return Date.now()}function mF(){const e=globalThis.crypto;return e&&typeof e.randomUUID=="function"?e.randomUUID():`tab-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Hb(e){if(!e||typeof e!="object")return null;const n=e;return typeof n.type!="string"||typeof n.timestamp!="number"||!Number.isFinite(n.timestamp)?null:e}class hF{tabId;listeners=new Set;sessionStates=new Map;ownershipBySession=new Map;heartbeatByTab=new Map;ownedSessions=new Map;snapshot;channel=null;usingStorageFallback=!1;cleanupStorageListener=null;cleanupBeforeUnload=null;heartbeatInterval=null;staleSweepInterval=null;constructor(){this.tabId=mF(),this.snapshot={tabId:this.tabId,sessions:new Map,activeTabMap:new Map},this.isBrowser()&&(this.initializeTransport(),this.startHeartbeat(),this.startStaleSweep(),this.setupBeforeUnloadCleanup())}subscribe(n){return this.listeners.add(n),()=>{this.listeners.delete(n)}}getSnapshot(){return this.snapshot}requestSync(){this.publish({type:"sync:request",tabId:this.tabId,timestamp:ra()})}broadcastUpdate(n){const s=n.timestamp??ra();this.applySessionUpdate({sessionId:n.sessionId,status:n.status,needsInput:n.needsInput??n.status==="awaiting_input",owningTabId:n.owningTabId,type:n.type,title:n.title,projectId:n.projectId,updatedAt:n.updatedAt},s),this.publish({type:"session:updated",sessionId:n.sessionId,status:n.status,needsInput:n.needsInput,owningTabId:n.owningTabId,sessionType:n.type,title:n.title,projectId:n.projectId,updatedAt:n.updatedAt,timestamp:s})}broadcastCompleted(n){const s=n.status??"complete",a=n.timestamp??ra();this.applySessionUpdate({sessionId:n.sessionId,status:s,needsInput:!1,owningTabId:null},a),this.ownershipBySession.delete(n.sessionId),this.ownedSessions.delete(n.sessionId),this.emit(),this.publish({type:"session:completed",sessionId:n.sessionId,status:s,timestamp:a})}broadcastLock(n,s){const a=ra();this.applyTabOwnership(n,s,a),this.ownedSessions.set(n,s),this.publish({type:"tab:active",tabId:s,sessionId:n,timestamp:a})}broadcastUnlock(n,s){const a=ra();this.releaseTabOwnership(n,s,a),this.ownedSessions.delete(n),this.publish({type:"tab:inactive",tabId:s,sessionId:n,timestamp:a})}broadcastHeartbeat(n){const s=ra();this.updateHeartbeat(n,s),this.publish({type:"tab:heartbeat",tabId:n,timestamp:s})}destroy(){this.cleanupStorageListener?.(),this.cleanupStorageListener=null,this.cleanupBeforeUnload?.(),this.cleanupBeforeUnload=null,this.channel&&(this.channel.close(),this.channel=null),this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.staleSweepInterval&&(clearInterval(this.staleSweepInterval),this.staleSweepInterval=null)}reset(){this.sessionStates.clear(),this.ownershipBySession.clear(),this.heartbeatByTab.clear(),this.ownedSessions.clear(),this.snapshot={tabId:this.tabId,sessions:new Map,activeTabMap:new Map},this.emit()}isBrowser(){return typeof window<"u"}initializeTransport(){if(typeof BroadcastChannel<"u")try{this.channel=new BroadcastChannel(cF),this.channel.onmessage=s=>{const a=Hb(s.data);a&&this.handleIncomingMessage(a)},this.usingStorageFallback=!1;return}catch{}this.usingStorageFallback=!0;const n=s=>{if(!(s.key!==Ub||!s.newValue))try{const a=JSON.parse(s.newValue),r=Hb(a.message);r&&this.handleIncomingMessage(r)}catch{}};window.addEventListener("storage",n),this.cleanupStorageListener=()=>{window.removeEventListener("storage",n)}}startHeartbeat(){this.heartbeatInterval=setInterval(()=>{const n=ra();this.updateHeartbeat(this.tabId,n),this.publish({type:"tab:heartbeat",tabId:this.tabId,timestamp:n})},dF)}startStaleSweep(){this.staleSweepInterval=setInterval(()=>{this.emit()},1e4)}setupBeforeUnloadCleanup(){const n=()=>{for(const[s,a]of this.ownedSessions.entries()){const r=ra();this.publish({type:"tab:inactive",tabId:a,sessionId:s,timestamp:r})}};window.addEventListener("beforeunload",n),this.cleanupBeforeUnload=()=>{window.removeEventListener("beforeunload",n)}}publish(n){const s={...n,senderTabId:this.tabId};if(this.channel){this.channel.postMessage(s);return}if(this.usingStorageFallback)try{const a={id:`${s.type}-${s.timestamp}-${Math.random().toString(36).slice(2,8)}`,message:s};window.localStorage.setItem(Ub,JSON.stringify(a))}catch{}}handleIncomingMessage(n){switch(n.type){case"session:updated":{this.applySessionUpdate({sessionId:n.sessionId,status:n.status,needsInput:n.needsInput,owningTabId:n.owningTabId,type:n.sessionType,title:n.title,projectId:n.projectId,updatedAt:n.updatedAt},n.timestamp);return}case"session:completed":{this.applySessionUpdate({sessionId:n.sessionId,status:n.status??"complete",needsInput:!1,owningTabId:null},n.timestamp),this.ownershipBySession.delete(n.sessionId),this.emit();return}case"tab:active":{this.applyTabOwnership(n.sessionId,n.tabId,n.timestamp);return}case"tab:inactive":{this.releaseTabOwnership(n.sessionId,n.tabId,n.timestamp);return}case"tab:heartbeat":{this.updateHeartbeat(n.tabId,n.timestamp);return}case"sync:request":{if(n.tabId===this.tabId)return;const s=[...this.sessionStates.values()].map(o=>{const l=this.ownershipBySession.get(o.sessionId);return{...o,owningTabId:l?.tabId??o.owningTabId??null}}),a=[...this.ownershipBySession.entries()].map(([o,l])=>({sessionId:o,tabId:l.tabId,timestamp:l.timestamp})),r=[...this.heartbeatByTab.entries()].map(([o,l])=>({tabId:o,timestamp:l}));this.publish({type:"sync:response",tabId:n.tabId,sessions:s,locks:a,heartbeats:r,timestamp:ra()});return}case"sync:response":{if(n.tabId!==this.tabId)return;for(const s of n.sessions)this.applySessionUpdate({sessionId:s.sessionId,status:s.status,needsInput:s.needsInput,owningTabId:s.owningTabId,type:s.type,title:s.title,projectId:s.projectId,updatedAt:s.updatedAt},s.lastEventTimestamp,!1);for(const s of n.locks??[])this.applyTabOwnership(s.sessionId,s.tabId,s.timestamp,!1);for(const s of n.heartbeats??[])this.updateHeartbeat(s.tabId,s.timestamp,!1);this.emit();return}default:return}}applySessionUpdate(n,s,a=!0){const r=this.sessionStates.get(n.sessionId);if(r&&s<r.lastEventTimestamp)return;const o=this.ownershipBySession.get(n.sessionId),l={sessionId:n.sessionId,status:n.status,needsInput:n.needsInput??n.status==="awaiting_input",lastEventTimestamp:s,owningTabId:n.owningTabId??o?.tabId??r?.owningTabId??null,type:n.type??r?.type,title:n.title??r?.title,projectId:n.projectId??r?.projectId,updatedAt:n.updatedAt??new Date(s).toISOString()};this.sessionStates.set(n.sessionId,l),n.owningTabId!==void 0&&(n.owningTabId?this.applyTabOwnership(n.sessionId,n.owningTabId,s,!1):this.ownershipBySession.delete(n.sessionId)),a&&this.emit()}applyTabOwnership(n,s,a,r=!0){const o=this.ownershipBySession.get(n);if(o&&a<o.timestamp)return;this.ownershipBySession.set(n,{tabId:s,timestamp:a}),this.updateHeartbeat(s,a,!1);const l=this.sessionStates.get(n);l&&a>=l.lastEventTimestamp&&this.sessionStates.set(n,{...l,owningTabId:s,lastEventTimestamp:a}),r&&this.emit()}releaseTabOwnership(n,s,a,r=!0){const o=this.ownershipBySession.get(n);if(!o||o.tabId!==s||a<o.timestamp)return;this.ownershipBySession.delete(n);const l=this.sessionStates.get(n);l&&a>=l.lastEventTimestamp&&this.sessionStates.set(n,{...l,owningTabId:null,lastEventTimestamp:a}),r&&this.emit()}updateHeartbeat(n,s,a=!0){const r=this.heartbeatByTab.get(n);r!==void 0&&s<r||(this.heartbeatByTab.set(n,s),a&&this.emit())}emit(){const n=ra(),s=new Map;for(const[r,o]of this.sessionStates.entries()){const l=this.ownershipBySession.get(r);s.set(r,{...o,owningTabId:l?.tabId??o.owningTabId??null})}const a=new Map;for(const[r,o]of this.ownershipBySession.entries()){const l=this.heartbeatByTab.get(o.tabId)??o.timestamp,c=n-l>uF;a.set(r,{sessionId:r,tabId:o.tabId,lastHeartbeatTimestamp:l,lastLockTimestamp:o.timestamp,stale:c})}this.snapshot={tabId:this.tabId,sessions:s,activeTabMap:a};for(const r of this.listeners)r()}}const oa=new hF;function Bo(){const e=i.useSyncExternalStore(c=>oa.subscribe(c),()=>oa.getSnapshot(),()=>oa.getSnapshot());i.useEffect(()=>{oa.requestSync()},[]);const n=i.useCallback(c=>{oa.broadcastUpdate(c)},[]),s=i.useCallback(c=>{oa.broadcastCompleted(c)},[]),a=i.useCallback((c,d)=>{oa.broadcastLock(c,d)},[]),r=i.useCallback((c,d)=>{oa.broadcastUnlock(c,d)},[]),o=i.useCallback(c=>{oa.broadcastHeartbeat(c)},[]),l=i.useCallback(()=>{oa.requestSync()},[]);return{tabId:e.tabId,sessions:e.sessions,activeTabMap:e.activeTabMap,broadcastUpdate:n,broadcastCompleted:s,broadcastLock:a,broadcastUnlock:r,broadcastHeartbeat:o,requestSync:l}}function fF(e,n){return e&&n?`${e}/${n}`:""}function pF(e){if(!e)return{provider:void 0,modelId:void 0};const n=e.indexOf("/");return n===-1?{provider:void 0,modelId:void 0}:{provider:e.slice(0,n),modelId:e.slice(n+1)}}const gF=["Build a real-time collaborative document editor","Create a customer onboarding flow with email verification","Add a reporting dashboard with charts and CSV export","Implement a plugin system with marketplace"];function bF({isOpen:e,onClose:n,onMissionCreated:s,projectId:a,initialGoal:r,resumeSessionId:o}){ta(e);const[l,c]=i.useState(""),[d,u]=i.useState({type:"initial"}),[h,m]=i.useState(null),[f,p]=i.useState([]),[b,v]=i.useState([]),[x,y]=i.useState(null),[g,j]=i.useState(!1),N=i.useRef(!1),[C,w]=i.useState(""),[S,R]=i.useState(!0),[I,E]=i.useState(!1),[M,G]=i.useState(!1),[U,P]=i.useState(!1),T=i.useRef(null),D=i.useRef(null),W=i.useRef(null),Y=i.useRef(null),[L,_]=i.useState(o??null),F=i.useMemo(()=>Pr(),[]),{isLockedByOther:ae,takeControl:k,isLoading:z}=Fd(e?L:null),{activeTabMap:J,broadcastUpdate:oe,broadcastCompleted:le,broadcastLock:we,broadcastUnlock:re,broadcastHeartbeat:H}=Bo(),{confirm:ue}=Di(),[Q,be]=i.useState(void 0),[fe,O]=i.useState(void 0),[se,ve]=i.useState([]),[A,ne]=i.useState(!0),[ye,ee]=i.useState(null),[ge,Ne]=i.useState([]),[He,Le]=i.useState([]),de=fF(Q,fe);i.useEffect(()=>{(async()=>{try{ne(!0);const Z=await Ki();ve(Z.models),Ne(Z.favoriteProviders),Le(Z.favoriteModels)}catch(Z){ee(Ce(Z)||"Failed to load models")}finally{ne(!1)}})()},[]);const Re=i.useCallback(Be=>{Ne(Z=>{const Oe=Z,je=Oe.includes(Be)?Oe.filter(mt=>mt!==Be):[Be,...Oe];return Cs({favoriteProviders:je,favoriteModels:He}).catch(()=>{Ne(Oe)}),je})},[He]),Pe=i.useCallback(Be=>{Le(Z=>{const Oe=Z,je=Oe.includes(Be)?Oe.filter(mt=>mt!==Be):[Be,...Oe];return Cs({favoriteProviders:ge,favoriteModels:je}).catch(()=>{Le(Oe)}),je})},[ge]),rt=i.useCallback((Be,Z)=>{if(!Be||!Z)return"Using default";const Oe=se.find(ht=>ht.provider===Be&&ht.id===Z);return Oe?`${Oe.provider}/${Oe.id}`:`${Be}/${Z}`},[se]),qe=i.useCallback(Be=>{D.current?.close();const Z=uM(Be,a,{onThinking:Oe=>{w(ht=>ht+Oe),oe({sessionId:Be,status:"generating",needsInput:!1,owningTabId:F,type:"mission_interview",title:l.trim()||void 0,projectId:a??null})},onQuestion:Oe=>{E(!1),G(!1),Ua(a),u({type:"question",sessionId:Be,question:Oe}),w(""),j(!0),oe({sessionId:Be,status:"awaiting_input",needsInput:!0,owningTabId:F,type:"mission_interview",title:l.trim()||void 0,projectId:a??null})},onSummary:Oe=>{E(!1),G(!1),Ua(a),u({type:"summary",sessionId:Be,summary:Oe}),y(Oe),w(""),j(!0),oe({sessionId:Be,status:"complete",needsInput:!1,owningTabId:F,type:"mission_interview",title:l.trim()||void 0,projectId:a??null})},onError:Oe=>{const ht=Oe||"Session failed while contacting the AI.";E(!1),G(!1),m(null),u({type:"error",sessionId:Be,errorMessage:ht}),w(""),j(!0),W.current=Be,oe({sessionId:Be,status:"error",needsInput:!1,owningTabId:F,type:"mission_interview",title:l.trim()||void 0,projectId:a??null}),le({sessionId:Be,status:"error"})},onComplete:()=>{E(!1),G(!1),W.current=null,le({sessionId:Be,status:"complete"})},onConnectionStateChange:Oe=>{E(Oe==="reconnecting")}});D.current=Z},[le,oe,l,a,F]),Xe=i.useCallback(async Be=>{const Z=Be??l;if(Z.trim()){m(null),w(""),p([]),v([]),E(!1),u({type:"loading"});try{const{sessionId:Oe}=await aM(Z.trim(),a,Q&&fe?{modelProvider:Q,modelId:fe}:void 0);W.current=Oe,_(Oe),Ua(a),qe(Oe),p([])}catch(Oe){E(!1),m(Ce(Oe)||"Failed to start interview session"),u({type:"initial"}),W.current=null,_(null)}}},[qe,l,Q,fe,a]);i.useEffect(()=>{e&&d.type==="initial"&&T.current?.focus()},[e,d.type]),i.useEffect(()=>{if(e&&!r&&!o&&!N.current&&d.type==="initial"){const Be=iF(a);Be&&c(Be)}},[e]),i.useEffect(()=>{if(e&&r&&!N.current&&d.type==="initial"){c(r);const Be=setTimeout(()=>{N.current=!0,Xe(r)},0);return()=>clearTimeout(Be)}},[e,r,d.type,Xe]),i.useEffect(()=>{e||(N.current=!1,E(!1),G(!1),_(null))},[e]),i.useEffect(()=>{if(!e||!o||d.type!=="initial")return;let Be=!1;return ma(o).then(Z=>{if(Be||!Z)return;const Oe=Co(Z.conversationHistory);if(v(Oe),_(Z.id),p(Oe.map(ht=>ht.response).filter(ht=>!!(ht&&typeof ht=="object"&&!Array.isArray(ht)))),Z.status==="awaiting_input"&&Z.currentQuestion)try{Ua(a);const ht=JSON.parse(Z.currentQuestion);W.current=Z.id,j(!0),u({type:"question",sessionId:Z.id,question:ht})}catch{m("Failed to restore session question.")}else if(Z.status==="complete"&&Z.result)try{Ua(a);const ht=JSON.parse(Z.result);W.current=Z.id,j(!0),y(ht),u({type:"summary",sessionId:Z.id,summary:ht})}catch{m("Failed to restore session result.")}else Z.status==="generating"?(W.current=Z.id,j(!0),Z.thinkingOutput&&w(Z.thinkingOutput),u({type:"loading"}),qe(Z.id)):Z.status==="error"&&(W.current=Z.id,j(!0),m(null),u({type:"error",sessionId:Z.id,errorMessage:Z.error??"The session encountered an error."}))}).catch(()=>{Be||m("Failed to resume session.")}),()=>{Be=!0}},[qe,e,o,d.type,a]),i.useEffect(()=>{if(!e){Y.current&&(re(Y.current,F),Y.current=null);return}if(L&&Y.current!==L){Y.current&&re(Y.current,F),we(L,F),Y.current=L;return}!L&&Y.current&&(re(Y.current,F),Y.current=null)},[we,re,e,L,F]),i.useEffect(()=>{if(!e||!L||Y.current!==L)return;H(F);const Be=setInterval(()=>{H(F)},3e4);return()=>{clearInterval(Be)}},[H,e,L,F]),i.useEffect(()=>()=>{D.current?.close(),D.current=null,Y.current&&(re(Y.current,F),Y.current=null)},[re,F]),i.useEffect(()=>{if(!e)return;const Be=Z=>{(d.type==="question"||d.type==="summary")&&(Z.preventDefault(),Z.returnValue=""),D.current?.close()};return window.addEventListener("beforeunload",Be),()=>window.removeEventListener("beforeunload",Be)},[e,d]);const At=i.useCallback(()=>{D.current?.close(),D.current=null,n()},[n]),at=i.useCallback(async()=>{if(l&&sF(l,a),!(g&&!await ue({title:"Close Interview",message:"Are you sure you want to close? Your interview progress will be lost.",danger:!0}))){if(D.current?.close(),D.current=null,d.type==="question"||d.type==="summary"||d.type==="error")try{await gy(d.sessionId,a,F)}catch{}c(""),u({type:"initial"}),m(null),p([]),v([]),y(null),w(""),E(!1),G(!1),j(!1),P(!1),be(void 0),O(void 0),W.current=null,_(null),n()}},[l,g,d,n,a,F,ue]);i.useEffect(()=>{if(!e)return;const Be=Z=>{Z.key==="Escape"&&at()};return document.addEventListener("keydown",Be),()=>document.removeEventListener("keydown",Be)},[e,at]);const Se=i.useCallback(async Be=>{if(d.type!=="question")return;const{sessionId:Z}=d;m(null),p(Oe=>[...Oe,Be]),v(Oe=>[...Oe,{question:d.question,response:Be}]),u({type:"loading"}),w("");try{qe(Z),await rM(Z,Be,a,F),j(!0)}catch(Oe){D.current?.close(),D.current=null,m(Ce(Oe)||"Failed to submit response"),u({type:"question",sessionId:Z,question:d.question})}},[d,a,F,qe]),pe=i.useCallback(async()=>{if(d.type!=="error")return;const Be=d.sessionId;m(null),G(!0),w(""),u({type:"loading"}),qe(Be);try{W.current=Be,_(Be),await oM(Be,a,F)}catch(Z){let Oe=Z;if((Ce(Z)||"").includes("not in an error state"))try{const je=await ma(Be);if(!je)throw new Error("Failed to refresh interview session.");const mt=Co(je.conversationHistory);if(v(mt),p(mt.map(Et=>Et.response).filter(Et=>!!(Et&&typeof Et=="object"&&!Array.isArray(Et)))),W.current=je.id,_(je.id),j(!0),je.status==="generating")w(je.thinkingOutput??""),u({type:"loading"}),D.current?.isConnected()||qe(je.id);else if(je.status==="awaiting_input"){if(!je.currentQuestion)throw new Error("Interview session is awaiting input but has no current question.");Ua(a);const Et=JSON.parse(je.currentQuestion);u({type:"question",sessionId:je.id,question:Et}),D.current?.isConnected()||qe(je.id)}else if(je.status==="complete"){if(!je.result)throw new Error("Interview session is complete but has no result.");Ua(a);const Et=JSON.parse(je.result);y(Et),u({type:"summary",sessionId:je.id,summary:Et})}else je.status==="error"&&u({type:"error",sessionId:je.id,errorMessage:je.error??"Retry failed. Please try again."});E(!1);return}catch(je){Oe=je}D.current?.close(),D.current=null,u({type:"error",sessionId:Be,errorMessage:Ce(Oe)||"Retry failed. Please try again."}),E(!1)}finally{G(!1)}},[qe,a,F,d]),_e=i.useCallback(async()=>{if(d.type==="summary"){m(null),P(!0);try{const Be=await dM(d.sessionId,x||void 0,a);s(Be),Ua(a),D.current?.close(),D.current=null,c(""),u({type:"initial"}),m(null),p([]),v([]),y(null),w(""),E(!1),G(!1),j(!1),P(!1),W.current=null,_(null),n()}catch(Be){m(Ce(Be)||"Failed to create mission"),P(!1)}}},[d,x,s,n,a]),et=()=>d.type==="question"?Math.min(f.length+1,6):6,Ae=d.type==="loading"||d.type==="question"||d.type==="summary"||d.type==="error",it=L?J.get(L):null,xt=it&&it.tabId!==F,Nt=!!(xt&&!it.stale),Ut=ae&&(!xt||it.stale);return e?t.jsx("div",{className:"modal-overlay open",onClick:Be=>Be.target===Be.currentTarget&&at(),role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal modal-lg planning-modal",children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("div",{className:"detail-title-row",children:[t.jsx(Ys,{size:20,className:"icon-triage"}),t.jsx("h3",{children:"Plan Mission with AI"})]}),t.jsxs("div",{className:"modal-header-actions",children:[Ae&&t.jsx("button",{className:"modal-send-to-background",onClick:At,title:"Send to background","aria-label":"Send to background",children:t.jsx(Ll,{size:16})}),t.jsx("button",{className:"modal-close",onClick:at,"aria-label":"Close",children:t.jsx(Nn,{size:20})})]})]}),t.jsxs("div",{className:"planning-modal-body",children:[h&&t.jsx("div",{className:"form-error planning-error",children:h}),I&&t.jsx("div",{className:"form-hint text-muted",children:"Reconnecting…"}),Nt&&t.jsx("div",{className:"form-hint text-muted","data-testid":"session-active-another-tab-banner",children:"Session is active in another tab."}),d.type==="initial"&&t.jsxs("div",{className:"planning-initial",children:[t.jsxs("div",{className:"planning-view-scroll",children:[t.jsxs("div",{className:"planning-intro",children:[t.jsx(Ls,{size:32,className:"icon-triage-lg"}),t.jsx("h4",{children:"Transform your vision into a structured mission"}),t.jsx("p",{className:"text-muted",children:"Describe what you want to build. The AI will interview you to understand scope, constraints, and requirements, then produce a structured plan with milestones, slices, and features."})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"mission-goal",children:"What do you want to build?"}),t.jsx("textarea",{ref:T,id:"mission-goal",rows:4,className:"planning-textarea",placeholder:"e.g., Build a real-time collaborative document editor with presence, comments, and version history...",value:l,onChange:Be=>c(Be.target.value),onKeyDown:Be=>{Be.key==="Enter"&&!Be.shiftKey&&l.trim()&&(Be.preventDefault(),Xe())}})]}),t.jsxs("div",{className:"planning-examples",children:[t.jsx("span",{className:"planning-examples-label",children:"Try an example:"}),t.jsx("div",{className:"planning-example-chips",children:gF.map((Be,Z)=>t.jsx("button",{className:"planning-example-chip",onClick:()=>c(Be),children:Be.length>45?Be.slice(0,45)+"...":Be},Z))})]}),t.jsxs("div",{className:"planning-model-select-group",children:[t.jsxs("label",{htmlFor:"mission-interview-modal-model",className:"form-label",children:["Planning Model",A&&t.jsx("span",{className:"text-muted text-muted-sm",children:"Loading models…"})]}),t.jsx(ri,{id:"mission-interview-modal-model",label:"Planning Model",value:de,onChange:Be=>{const{provider:Z,modelId:Oe}=pF(Be);be(Z),O(Oe)},models:se,disabled:A,favoriteProviders:ge,onToggleFavorite:Re,favoriteModels:He,onToggleModelFavorite:Pe}),ye&&t.jsxs("div",{className:"form-hint form-hint-error",children:[ye," ",t.jsx("button",{type:"button",className:"text-link-btn",onClick:()=>{(async()=>{try{ne(!0);const Be=await Ki();ve(Be.models),Ne(Be.favoriteProviders),Le(Be.favoriteModels),ee(null)}catch(Be){ee(Ce(Be)||"Failed to load models")}finally{ne(!1)}})()},children:"Retry"})]}),t.jsx("div",{className:"model-selector-current model-selector-current--spaced",children:t.jsx("span",{className:`model-badge ${Q&&fe?"model-badge-custom":"model-badge-default"}`,children:rt(Q,fe)})})]})]}),t.jsx("div",{className:"planning-view-footer",children:t.jsxs("button",{className:"btn btn-primary planning-start-btn",onClick:()=>Xe(),disabled:!l.trim(),children:[t.jsx(Ys,{size:16,className:"icon-mr-8"}),"Start Interview"]})})]}),d.type==="loading"&&t.jsxs("div",{className:"planning-loading",children:[t.jsx(Ct,{size:40,className:"spin icon-todo"}),t.jsx("p",{children:C?"AI is thinking...":"Preparing next question..."}),t.jsxs("div",{className:"planning-thinking-container",children:[t.jsx("button",{className:"planning-thinking-toggle",onClick:()=>R(!S),type:"button",children:S?"Hide thinking":"Show thinking"}),S&&C&&t.jsx("div",{className:"planning-thinking-output",children:t.jsx("pre",{children:C})})]})]}),d.type==="error"&&t.jsx("div",{className:"planning-summary",children:t.jsxs("div",{className:"planning-view-scroll planning-summary-scroll",children:[b.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:b}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"ai-error-panel",role:"alert",children:[t.jsx("div",{className:"ai-error-icon",children:"⚠️"}),t.jsx("div",{className:"ai-error-message",children:d.errorMessage}),t.jsxs("div",{className:"ai-error-actions",children:[t.jsxs("button",{className:"btn btn-primary",onClick:()=>void pe(),disabled:M,children:[M?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ss,{size:14}),t.jsx("span",{className:"icon-ml-6",children:M?"Retrying...":"Retry"})]}),t.jsx("button",{className:"btn",onClick:at,disabled:M,children:"Cancel"})]})]})]})}),d.type==="question"&&t.jsx(xF,{question:d.question,progress:et(),historyEntries:b,onSubmit:Se}),d.type==="summary"&&x&&t.jsx(vF,{summary:x,historyEntries:b,onSummaryChange:y,onApprove:_e,onStartOver:()=>{u({type:"initial"}),j(!1),y(null),p([]),v([]),_(null),D.current?.close(),D.current=null},isCreating:U}),ae&&t.jsx("div",{className:"session-lock-overlay","data-testid":"session-lock-overlay",children:t.jsxs("div",{className:"session-lock-banner",children:[t.jsx(Do,{size:16}),t.jsx("span",{children:Ut?"This session is active in another tab":"This session is active in another tab (live heartbeat)"}),Ut&&t.jsx("button",{type:"button",onClick:()=>{k()},disabled:z,className:"btn btn-primary session-lock-take-control",children:z?"Taking control...":"Take Control"})]})})]})]})}):null}function xF({question:e,progress:n,historyEntries:s,onSubmit:a}){const[r,o]=i.useState({}),[l,c]=i.useState(""),[d,u]=i.useState(""),h=i.useCallback(()=>{let f;e.type==="text"?f={[e.id]:l}:e.type==="confirm"?f={[e.id]:r[e.id]===!0}:f=r;const p=d.trim();p.length>0&&(f={...f,_comment:p}),a(f)},[d,e,r,l,a]);i.useEffect(()=>{o({}),c(""),u("")},[e.id]);const m=()=>{switch(e.type){case"text":return l.trim().length>0;case"single_select":return r[e.id]!==void 0;case"multi_select":return Array.isArray(r[e.id])&&r[e.id].length>0;case"confirm":return r[e.id]!==void 0;default:return!0}};return t.jsxs("div",{className:"planning-question-form",children:[t.jsxs("div",{className:"planning-view-scroll planning-question-scroll",children:[s.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:s}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"planning-question-panel",children:[t.jsxs("div",{className:"planning-progress",children:[t.jsx("div",{className:"planning-progress-bar",children:[1,2,3,4,5,6].map(f=>t.jsx("div",{className:`planning-progress-step ${f<=n?"active":""}`},f))}),t.jsxs("span",{className:"planning-progress-text",children:["Question ",n," of ~6"]})]}),t.jsxs("div",{className:"planning-question-content",children:[t.jsx("h4",{className:"planning-question-text",children:e.question}),e.description&&t.jsx("p",{className:"planning-question-desc",children:e.description}),t.jsxs("div",{className:"planning-options",children:[e.type==="text"&&t.jsx("textarea",{className:"planning-textarea",rows:4,placeholder:"Type your answer here...",value:l,onChange:f=>c(f.target.value),onKeyDown:f=>{f.key==="Enter"&&!f.shiftKey&&l.trim()&&(f.preventDefault(),h())}}),e.type==="single_select"&&e.options&&t.jsx("div",{className:"planning-radio-group",role:"radiogroup",children:e.options.map(f=>t.jsxs("label",{className:"planning-option planning-option--radio",children:[t.jsx("input",{type:"radio",name:e.id,value:f.id,checked:r[e.id]===f.id,onChange:()=>o({[e.id]:f.id})}),t.jsxs("div",{className:"planning-option-content",children:[t.jsx("span",{className:"planning-option-label",children:f.label}),f.description&&t.jsx("span",{className:"planning-option-desc",children:f.description})]})]},f.id))}),e.type==="multi_select"&&e.options&&t.jsx("div",{className:"planning-checkbox-group",children:e.options.map(f=>{const p=r[e.id]||[];return t.jsxs("label",{className:"planning-option planning-option--checkbox",children:[t.jsx("input",{type:"checkbox",value:f.id,checked:p.includes(f.id),onChange:b=>{const v=b.target.checked?[...p,f.id]:p.filter(x=>x!==f.id);o({[e.id]:v})}}),t.jsxs("div",{className:"planning-option-content",children:[t.jsx("span",{className:"planning-option-label",children:f.label}),f.description&&t.jsx("span",{className:"planning-option-desc",children:f.description})]})]},f.id)})}),e.type==="confirm"&&t.jsxs("div",{className:"planning-confirm-group",children:[t.jsxs("button",{className:`planning-confirm-btn ${r[e.id]===!0?"selected":""}`,onClick:()=>o({[e.id]:!0}),children:[t.jsx(gs,{size:18}),"Yes"]}),t.jsxs("button",{className:`planning-confirm-btn ${r[e.id]===!1?"selected":""}`,onClick:()=>o({[e.id]:!1}),children:[t.jsx(Nn,{size:18}),"No"]})]})]}),e.type!=="text"&&t.jsxs("div",{className:"planning-comment-section",children:[t.jsx("label",{className:"planning-comment-label",htmlFor:`planning-comment-${e.id}`,children:"Additional comments (optional)"}),t.jsx("textarea",{id:`planning-comment-${e.id}`,className:"planning-textarea",rows:2,placeholder:"Add any extra context or direction...",value:d,onChange:f=>u(f.target.value)})]})]})]})]}),t.jsx("div",{className:"planning-actions",children:t.jsxs("button",{className:"btn btn-primary planning-actions-primary",onClick:h,disabled:!m(),children:["Continue",t.jsx(Dl,{size:16,className:"icon-ml-4"})]})})]})}function vF({summary:e,historyEntries:n,onSummaryChange:s,onApprove:a,onStartOver:r,isCreating:o}){const[l,c]=i.useState(()=>new Set(e.milestones.map((N,C)=>C))),[d,u]=i.useState(()=>{const N=new Set;return e.milestones.forEach((C,w)=>{C.slices.forEach((S,R)=>N.add(`${w}-${R}`))}),N}),h=N=>{c(C=>{const w=new Set(C);return w.has(N)?w.delete(N):w.add(N),w})},m=N=>{u(C=>{const w=new Set(C);return w.has(N)?w.delete(N):w.add(N),w})},f=(N,C)=>{const w=[...e.milestones];w[N]={...w[N],...C},s({...e,milestones:w})},p=(N,C,w)=>{const S=[...e.milestones],R=[...S[N].slices];R[C]={...R[C],...w},S[N]={...S[N],slices:R},s({...e,milestones:S})},b=(N,C,w,S)=>{const R=[...e.milestones],I=[...R[N].slices],E=[...I[C].features];E[w]={...E[w],...S},I[C]={...I[C],features:E},R[N]={...R[N],slices:I},s({...e,milestones:R})},v=N=>{const C=e.milestones.filter((w,S)=>S!==N);s({...e,milestones:C})},x=(N,C)=>{const w=[...e.milestones];w[N]={...w[N],slices:w[N].slices.filter((S,R)=>R!==C)},s({...e,milestones:w})},y=(N,C,w)=>{const S=[...e.milestones],R=[...S[N].slices];R[C]={...R[C],features:R[C].features.filter((I,E)=>E!==w)},S[N]={...S[N],slices:R},s({...e,milestones:S})},g=(N,C)=>{const w=[...e.milestones],S=[...w[N].slices];S[C]={...S[C],features:[...S[C].features,{title:"New feature",description:""}]},w[N]={...w[N],slices:S},s({...e,milestones:w})},j=e.milestones.reduce((N,C)=>N+C.slices.reduce((w,S)=>w+S.features.length,0),0);return t.jsxs("div",{className:"planning-summary",children:[t.jsxs("div",{className:"planning-view-scroll planning-summary-scroll",children:[n.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:n}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"planning-summary-header",children:[t.jsx(gs,{size:24,className:"icon-success"}),t.jsx("h4",{children:"Mission Plan Ready"}),t.jsxs("p",{className:"text-muted",children:[e.milestones.length," milestones, ",j," features. Review and edit before approving."]})]}),t.jsxs("div",{className:"planning-summary-form",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Mission Title"}),t.jsx("input",{type:"text",className:"form-input",value:e.missionTitle||"",onChange:N=>s({...e,missionTitle:N.target.value})})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Mission Description"}),t.jsx("textarea",{className:"planning-textarea",rows:3,value:e.missionDescription||"",onChange:N=>s({...e,missionDescription:N.target.value})})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Roadmap"}),t.jsx("div",{className:"roadmap-list",children:e.milestones.map((N,C)=>t.jsxs("div",{className:"roadmap-card",children:[t.jsxs("div",{className:"roadmap-card-header",onClick:()=>h(C),children:[l.has(C)?t.jsx(Ln,{size:16,className:"icon-text-secondary"}):t.jsx(ps,{size:16,className:"icon-text-secondary"}),t.jsx(kr,{size:16,className:"icon-milestone"}),t.jsx("input",{type:"text",className:"form-input roadmap-input-title",value:N.title,onChange:w=>f(C,{title:w.target.value}),onClick:w=>w.stopPropagation()}),e.milestones.length>1&&t.jsx("button",{className:"btn-icon roadmap-shrink",onClick:w=>{w.stopPropagation(),v(C)},title:"Remove milestone",children:t.jsx(es,{size:14,className:"icon-text-secondary"})})]}),l.has(C)&&t.jsxs("div",{className:"roadmap-card-body",children:[t.jsx("textarea",{className:"planning-textarea roadmap-textarea-md",rows:2,placeholder:"Milestone description...",value:N.description||"",onChange:w=>f(C,{description:w.target.value})}),t.jsxs("div",{className:"roadmap-field-group",children:[t.jsx("label",{className:"roadmap-field-label",children:"Verification Criteria"}),t.jsx("textarea",{className:"planning-textarea roadmap-textarea-sm",rows:2,placeholder:"How to confirm this milestone is complete...",value:N.verification||"",onChange:w=>f(C,{verification:w.target.value})})]}),N.slices.map((w,S)=>{const R=`${C}-${S}`;return t.jsxs("div",{className:"roadmap-slice-card",children:[t.jsxs("div",{className:"roadmap-slice-header",onClick:()=>m(R),children:[d.has(R)?t.jsx(Ln,{size:14,className:"icon-text-secondary"}):t.jsx(ps,{size:14,className:"icon-text-secondary"}),t.jsx(_m,{size:14,className:"icon-slice"}),t.jsx("input",{type:"text",className:"form-input roadmap-input-subtitle",value:w.title,onChange:I=>p(C,S,{title:I.target.value}),onClick:I=>I.stopPropagation()}),N.slices.length>1&&t.jsx("button",{className:"btn-icon roadmap-shrink",onClick:I=>{I.stopPropagation(),x(C,S)},title:"Remove slice",children:t.jsx(es,{size:12,className:"icon-text-secondary"})})]}),d.has(R)&&t.jsxs("div",{className:"roadmap-slice-body",children:[t.jsxs("div",{className:"roadmap-slice-field-group",children:[t.jsx("label",{className:"roadmap-field-label",children:"Slice Verification"}),t.jsx("textarea",{className:"planning-textarea roadmap-textarea-xs",rows:1,placeholder:"How to confirm this slice is done...",value:w.verification||"",onChange:I=>p(C,S,{verification:I.target.value})})]}),w.features.map((I,E)=>t.jsxs("div",{className:"roadmap-feature-row",children:[t.jsx(km,{size:12,className:"icon-feature"}),t.jsxs("div",{className:"roadmap-feature-content",children:[t.jsx("input",{type:"text",className:"form-input roadmap-input-feature",value:I.title,onChange:M=>b(C,S,E,{title:M.target.value})}),I.description&&t.jsx("p",{className:"roadmap-feature-text",children:I.description}),I.acceptanceCriteria&&t.jsxs("p",{className:"roadmap-feature-text--italic",children:["AC: ",I.acceptanceCriteria]})]}),t.jsx("button",{className:"btn-icon roadmap-shrink",onClick:()=>y(C,S,E),title:"Remove feature",children:t.jsx(es,{size:12,className:"icon-text-secondary"})})]},E)),t.jsxs("button",{className:"btn roadmap-add-feature-btn",onClick:()=>g(C,S),children:[t.jsx(os,{size:12}),"Add Feature"]})]})]},S)})]})]},C))})]})]})]}),t.jsxs("div",{className:"planning-actions planning-summary-actions",children:[t.jsxs("button",{className:"btn",onClick:r,disabled:o,children:[t.jsx(Tr,{size:16,className:"icon-mr-4"}),"Start Over"]}),t.jsx("button",{className:"btn btn-primary",onClick:a,disabled:o||e.milestones.length===0,children:o?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:16,className:"spin icon-mr-8"}),"Creating Mission..."]}):t.jsxs(t.Fragment,{children:[t.jsx(gs,{size:16,className:"icon-mr-8"}),"Approve Plan"]})})]})]})}const yF=30,wF=16,kF=16,jF=2;function NF(){if(typeof window>"u")return!1;const e="ontouchstart"in window||navigator.maxTouchPoints>0,n=window.innerWidth<=768;return e&&n}let Kc=null;function Nk(){return Kc===null&&(Kc=window.visualViewport?.height??window.innerHeight),Kc}function SF(e){const n=Nk();e>n&&(Kc=e)}function Sk(e){return e?e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?!new Set(["checkbox","radio","button","submit","reset","file","range","color","hidden"]).has(e.type):e instanceof HTMLElement&&e.isContentEditable:!1}const yr={overlap:0,open:!1,vvHeight:null,vvOffsetTop:0};function Ck(){return typeof window>"u"||!window.visualViewport?!1:window.visualViewport.offsetTop+window.visualViewport.height>window.innerHeight+jF}function qb(e=yr){if(typeof window>"u"||!window.visualViewport)return yr;const n=window.visualViewport,s=Sk(document.activeElement),a=n.offsetTop;if(n.scale>1.01)return yr;if(s||SF(n.height),s&&Ck())return e;const r=document.documentElement?.clientHeight||window.innerHeight,o=Math.max(0,r-n.offsetTop-n.height);if(o>0&&s)return{overlap:o,open:!0,vvHeight:n.height,vvOffsetTop:a};const l=Nk(),c=Math.max(0,l-n.offsetTop-n.height);if(c>=yF&&s)return{overlap:c,open:!0,vvHeight:n.height,vvOffsetTop:a};if(c>=wF&&s)return{overlap:c,open:!0,vvHeight:n.height,vvOffsetTop:a};const d=Math.max(0,l-n.height);return s&&d>=kF?{overlap:0,open:!0,vvHeight:n.height,vvOffsetTop:a}:yr}function Ia({enabled:e=!0}={}){const[n,s]=i.useState(0),[a,r]=i.useState(null),[o,l]=i.useState(0),[c,d]=i.useState(!1),u=i.useRef(yr);return i.useEffect(()=>{if(!e||!NF()){s(0),r(null),l(0),d(!1);return}const h=window.visualViewport;if(!h){s(0),r(null),l(0),d(!1),u.current=yr;return}const m=E=>{u.current=E,s(E.overlap),r(E.vvHeight),l(E.vvOffsetTop),d(E.open)},f=()=>{m(qb(u.current))},p=()=>{const E=qb(u.current);u.current=E,s(E.overlap),r(E.vvHeight),d(E.open)},b=[],v=E=>{if(typeof window>"u")return;const M=window.setTimeout(()=>{typeof window>"u"||f()},E);b.push(M)};let x=null,y=null,g=0,j=-1,N=0;const C=()=>{y!==null&&typeof window<"u"&&(window.cancelAnimationFrame(y),y=null)},w=()=>{x!==null&&typeof window<"u"&&(window.cancelAnimationFrame(x),x=null)},S=()=>{if(typeof window>"u")return;f();const E=window.visualViewport?.offsetTop??0;if(E===j?N+=1:(N=0,j=E),N>=2||performance.now()>g){x=null;return}x=window.requestAnimationFrame(S)},R=()=>{typeof window>"u"||(w(),g=performance.now()+1500,j=-1,N=0,x=window.requestAnimationFrame(S))},I=()=>{C(),Sk(document.activeElement)&&Ck()?y=window.requestAnimationFrame(()=>{y=null,f()}):f(),v(50),v(200),v(500),v(1e3),v(1500),R()};return I(),h.addEventListener("resize",f),h.addEventListener("scroll",p),document.addEventListener("focusin",I),document.addEventListener("focusout",f),document.addEventListener("visibilitychange",I),window.addEventListener("pageshow",I),()=>{h.removeEventListener("resize",f),h.removeEventListener("scroll",p),document.removeEventListener("focusin",I),document.removeEventListener("focusout",f),document.removeEventListener("visibilitychange",I),window.removeEventListener("pageshow",I);for(const E of b)clearTimeout(E);C(),w(),u.current=yr,s(0),r(null),l(0),d(!1)}},[e]),{keyboardOverlap:n,viewportHeight:a,viewportOffsetTop:o,keyboardOpen:c}}function CF({isOpen:e,onClose:n,onApplied:s,targetType:a,targetId:r,targetTitle:o,missionContext:l,projectId:c,resumeSessionId:d}){const u=$i();ta(e);const{keyboardOverlap:h,viewportHeight:m,viewportOffsetTop:f,keyboardOpen:p}=Ia({enabled:u==="mobile"}),b=p?{"--keyboard-overlap":`${h}px`,"--vv-offset-top":`${f}px`,...m!==null?{"--vv-height":`${m}px`}:{}}:{},[v,x]=i.useState({type:"initial"}),[y,g]=i.useState(null),[j,N]=i.useState([]),[C,w]=i.useState([]),[S,R]=i.useState(null),[I,E]=i.useState(""),[M,G]=i.useState(!0),[U,P]=i.useState(!1),[T,D]=i.useState(!1),W=i.useRef(null),Y=i.useRef(null),L=i.useRef(null),_=i.useRef(null),[F,ae]=i.useState(null),k=i.useMemo(()=>Pr(),[]);Fd(e?F:null);const{activeTabMap:z,broadcastUpdate:J,broadcastCompleted:oe,broadcastLock:le,broadcastUnlock:we,broadcastHeartbeat:re}=Bo(),H=a==="milestone"?mM:bM,ue=a==="milestone"?hM:xM,Q=a==="milestone"?fM:vM,be=a==="milestone"?pM:yM,fe=a==="milestone"?gM:wM,O=a==="milestone"?"Milestone":"Slice",se=a==="milestone"?"milestone_interview":"slice_interview",ve=i.useCallback(qe=>{Y.current?.close();const Xe=Q(qe,c,{onThinking:At=>{E(at=>at+At),J({sessionId:qe,status:"generating",needsInput:!1,owningTabId:k,type:se,title:o,projectId:c??null})},onQuestion:At=>{P(!1),A(),x({type:"question",sessionId:qe,question:At}),E(""),J({sessionId:qe,status:"awaiting_input",needsInput:!0,owningTabId:k,type:se,title:o,projectId:c??null})},onSummary:At=>{P(!1),A(),x({type:"summary",sessionId:qe,summary:At}),R(At),E(""),J({sessionId:qe,status:"complete",needsInput:!1,owningTabId:k,type:se,title:o,projectId:c??null})},onError:At=>{const at=At||"Session failed while contacting the AI.";P(!1),g(null),x({type:"error",sessionId:qe,errorMessage:at}),E(""),L.current=qe,J({sessionId:qe,status:"error",needsInput:!1,owningTabId:k,type:se,title:o,projectId:c??null}),oe({sessionId:qe,status:"error"})},onComplete:()=>{P(!1),L.current=null,oe({sessionId:qe,status:"complete"})},onConnectionStateChange:At=>{P(At==="reconnecting")}});Y.current=Xe},[oe,J,Q,se,c,k,o]),A=()=>{R(null),N([]),w([]),E("")},ne=i.useCallback(async()=>{g(null),A(),P(!1),x({type:"loading"});try{const{sessionId:qe}=await H(r,c);L.current=qe,ae(qe),ve(qe)}catch(qe){P(!1),g(Ce(qe)||`Failed to start ${O.toLowerCase()} interview`),x({type:"initial"}),L.current=null,ae(null)}},[ve,c,H,r,O]),ye=i.useCallback(async()=>{g(null),D(!0);try{await fe(r,c),s(),x({type:"applied"})}catch(qe){g(Ce(qe)||`Failed to skip ${O.toLowerCase()} interview`),D(!1)}},[s,c,fe,r,O]);i.useEffect(()=>{e&&v.type==="initial"&&W.current?.focus()},[e,v.type]),i.useEffect(()=>{if(!e||!d||v.type!=="initial")return;let qe=!1;return ma(d).then(Xe=>{if(qe||!Xe)return;const At=Co(Xe.conversationHistory);if(w(At),ae(Xe.id),N(At.map(at=>at.response).filter(at=>!!(at&&typeof at=="object"&&!Array.isArray(at)))),Xe.status==="awaiting_input"&&Xe.currentQuestion)try{const at=JSON.parse(Xe.currentQuestion);L.current=Xe.id,x({type:"question",sessionId:Xe.id,question:at})}catch{g("Failed to restore session question.")}else if(Xe.status==="complete"&&Xe.result)try{const at=JSON.parse(Xe.result);L.current=Xe.id,R(at),x({type:"summary",sessionId:Xe.id,summary:at})}catch{g("Failed to restore session result.")}else Xe.status==="generating"?(L.current=Xe.id,Xe.thinkingOutput&&E(Xe.thinkingOutput),x({type:"loading"}),ve(Xe.id)):Xe.status==="error"&&(L.current=Xe.id,g(null),x({type:"error",sessionId:Xe.id,errorMessage:Xe.error??"The session encountered an error."}))}).catch(()=>{qe||g("Failed to resume session.")}),()=>{qe=!0}},[ve,e,d,v.type]),i.useEffect(()=>{e||(P(!1),ae(null))},[e]),i.useEffect(()=>{if(!(!e||!F)){if(_.current!==F){_.current&&we(_.current,k),le(F,k),_.current=F;return}!F&&_.current&&(we(_.current,k),_.current=null)}},[le,we,e,F,k]),i.useEffect(()=>{if(!e||!F||_.current!==F)return;re(k);const qe=setInterval(()=>{re(k)},3e4);return()=>{clearInterval(qe)}},[re,e,F,k]),i.useEffect(()=>()=>{Y.current?.close(),Y.current=null,_.current&&(we(_.current,k),_.current=null)},[we,k]);const ee=i.useCallback(()=>{Y.current?.close(),Y.current=null,n()},[n]),ge=i.useCallback(async()=>{Y.current?.close(),Y.current=null,A(),x({type:"initial"}),g(null),L.current=null,ae(null),n()},[n]),Ne=i.useCallback(async qe=>{if(v.type!=="question")return;const{sessionId:Xe}=v;g(null),N(At=>[...At,qe]),w(At=>[...At,{question:v.question,response:qe}]),x({type:"loading"}),E("");try{ve(Xe),await ue(Xe,qe,c,k)}catch(At){Y.current?.close(),Y.current=null,g(Ce(At)||"Failed to submit response"),x({type:"question",sessionId:Xe,question:v.question})}},[ve,c,ue,k,v]),He=i.useCallback(async()=>{if(v.type==="summary"){g(null),D(!0);try{await be(v.sessionId,S||void 0,c),s(),x({type:"applied"})}catch(qe){g(Ce(qe)||"Failed to apply interview results"),D(!1)}}},[be,S,s,c,v]),Le=()=>v.type==="question"?Math.min(j.length+1,6):6,de=v.type==="loading"||v.type==="question"||v.type==="summary"||v.type==="error",Re=F?z.get(F):null,rt=!!(Re&&Re.tabId!==k&&!Re.stale);return e?t.jsx("div",{className:"modal-overlay open",onClick:qe=>qe.target===qe.currentTarget&&ge(),role:"dialog","aria-modal":"true","data-testid":"milestone-slice-interview-modal",children:t.jsxs("div",{className:"modal modal-lg planning-modal",style:b,children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("div",{className:"detail-title-row",children:[t.jsx(Ls,{size:20,className:"icon-triage"}),t.jsxs("h3",{children:["Plan ",O,": ",o]})]}),t.jsxs("div",{className:"modal-header-actions",children:[de&&t.jsx("button",{className:"modal-send-to-background",onClick:ee,title:"Send to background","aria-label":"Send to background",children:t.jsx(Ll,{size:16})}),t.jsx("button",{className:"modal-close",onClick:ge,"aria-label":"Close",children:t.jsx(Nn,{size:20})})]})]}),t.jsxs("div",{className:"planning-modal-body",children:[y&&t.jsx("div",{className:"form-error planning-error",children:y}),U&&t.jsx("div",{className:"form-hint text-muted",children:"Reconnecting…"}),rt&&t.jsx("div",{className:"form-hint text-muted","data-testid":"session-active-another-tab-banner",children:"Session is active in another tab."}),v.type==="initial"&&t.jsxs("div",{className:"planning-initial",children:[t.jsx("div",{className:"planning-view-scroll",children:t.jsxs("div",{className:"planning-intro",children:[t.jsx(Ls,{size:32,className:"icon-triage-lg"}),t.jsxs("h4",{children:["Refine ",O," scope with AI"]}),t.jsxs("p",{className:"text-muted",children:["The AI will interview you to refine the ",a,"'s scope, acceptance criteria, and verification methods. Each ",a," can have its own refined plan or inherit context from the mission level."]}),l&&t.jsxs("div",{className:"planning-context-info",children:[t.jsx("span",{className:"planning-context-label",children:"Mission context:"}),t.jsx("span",{className:"planning-context-text",children:l})]})]})}),t.jsxs("div",{className:"planning-view-footer",children:[t.jsxs("button",{className:"btn btn-primary planning-start-btn",onClick:()=>void ne(),children:[t.jsx(Ls,{size:16,className:"icon-mr-8"}),"Start Interview"]}),t.jsxs("button",{className:"btn planning-use-context-btn",onClick:()=>void ye(),disabled:T,children:[T?t.jsx(Ct,{size:16,className:"spin"}):null,"Use Mission Context"]}),t.jsx("button",{className:"btn",onClick:ge,children:"Cancel"})]})]}),v.type==="loading"&&t.jsxs("div",{className:"planning-loading",children:[t.jsx(Ct,{size:40,className:"spin icon-todo"}),t.jsx("p",{children:I?"AI is thinking...":"Preparing next question..."}),t.jsxs("div",{className:"planning-thinking-container",children:[t.jsx("button",{className:"planning-thinking-toggle",onClick:()=>G(!M),type:"button",children:M?"Hide thinking":"Show thinking"}),M&&I&&t.jsx("div",{className:"planning-thinking-output",children:t.jsx("pre",{children:I})})]})]}),v.type==="error"&&t.jsx("div",{className:"planning-summary",children:t.jsxs("div",{className:"planning-view-scroll planning-summary-scroll",children:[C.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:C}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"ai-error-panel",role:"alert",children:[t.jsx("div",{className:"ai-error-icon",children:"⚠️"}),t.jsx("div",{className:"ai-error-message",children:v.errorMessage}),t.jsx("div",{className:"ai-error-actions",children:t.jsx("button",{className:"btn",onClick:ge,children:"Cancel"})})]})]})}),v.type==="question"&&t.jsx(EF,{question:v.question,progress:Le(),historyEntries:C,onSubmit:Ne}),v.type==="summary"&&S&&t.jsx(_F,{summary:S,historyEntries:C,onSummaryChange:R,onApply:He,onCancel:ge,isApplying:T}),v.type==="applied"&&t.jsxs("div",{className:"planning-summary planning-applied",children:[t.jsx("div",{className:"planning-view-scroll",children:t.jsxs("div",{className:"planning-applied-content",children:[t.jsx(gs,{size:48,className:"icon-success"}),t.jsxs("h4",{children:[O," Updated"]}),t.jsxs("p",{className:"text-muted",children:["The ",a,"'s scope and verification have been ",v.type==="applied"?"applied":"updated","."]})]})}),t.jsx("div",{className:"planning-view-footer",children:t.jsx("button",{className:"btn btn-primary",onClick:s,children:"Done"})})]})]})]})}):null}function EF({question:e,progress:n,historyEntries:s,onSubmit:a}){const[r,o]=i.useState({}),[l,c]=i.useState(""),[d,u]=i.useState(""),h=i.useCallback(()=>{let f;e.type==="text"?f={[e.id]:l}:e.type==="confirm"?f={[e.id]:r[e.id]===!0}:f=r;const p=d.trim();p.length>0&&(f={...f,_comment:p}),a(f)},[d,e,r,l,a]);i.useEffect(()=>{o({}),c(""),u("")},[e.id]);const m=()=>{switch(e.type){case"text":return l.trim().length>0;case"single_select":return r[e.id]!==void 0;case"multi_select":return Array.isArray(r[e.id])&&r[e.id].length>0;case"confirm":return r[e.id]!==void 0;default:return!0}};return t.jsxs("div",{className:"planning-question-form",children:[t.jsxs("div",{className:"planning-view-scroll planning-question-scroll",children:[s.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:s}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"planning-question-panel",children:[t.jsxs("div",{className:"planning-progress",children:[t.jsx("div",{className:"planning-progress-bar",children:[1,2,3,4,5,6].map(f=>t.jsx("div",{className:`planning-progress-step ${f<=n?"active":""}`},f))}),t.jsxs("span",{className:"planning-progress-text",children:["Question ",n," of ~6"]})]}),t.jsxs("div",{className:"planning-question-content",children:[t.jsx("h4",{className:"planning-question-text",children:e.question}),e.description&&t.jsx("p",{className:"planning-question-desc",children:e.description}),t.jsxs("div",{className:"planning-options",children:[e.type==="text"&&t.jsx("textarea",{className:"planning-textarea",rows:4,placeholder:"Type your answer here...",value:l,onChange:f=>c(f.target.value),onKeyDown:f=>{f.key==="Enter"&&!f.shiftKey&&l.trim()&&(f.preventDefault(),h())}}),e.type==="single_select"&&e.options&&t.jsx("div",{className:"planning-radio-group",role:"radiogroup",children:e.options.map(f=>t.jsxs("label",{className:"planning-option planning-option--radio",children:[t.jsx("input",{type:"radio",name:e.id,value:f.id,checked:r[e.id]===f.id,onChange:()=>o({[e.id]:f.id})}),t.jsxs("div",{className:"planning-option-content",children:[t.jsx("span",{className:"planning-option-label",children:f.label}),f.description&&t.jsx("span",{className:"planning-option-desc",children:f.description})]})]},f.id))}),e.type==="multi_select"&&e.options&&t.jsx("div",{className:"planning-checkbox-group",children:e.options.map(f=>{const p=r[e.id]||[];return t.jsxs("label",{className:"planning-option planning-option--checkbox",children:[t.jsx("input",{type:"checkbox",value:f.id,checked:p.includes(f.id),onChange:b=>{const v=b.target.checked?[...p,f.id]:p.filter(x=>x!==f.id);o({[e.id]:v})}}),t.jsxs("div",{className:"planning-option-content",children:[t.jsx("span",{className:"planning-option-label",children:f.label}),f.description&&t.jsx("span",{className:"planning-option-desc",children:f.description})]})]},f.id)})}),e.type==="confirm"&&t.jsxs("div",{className:"planning-confirm-group",children:[t.jsxs("button",{className:`planning-confirm-btn ${r[e.id]===!0?"selected":""}`,onClick:()=>o({[e.id]:!0}),children:[t.jsx(gs,{size:18}),"Yes"]}),t.jsxs("button",{className:`planning-confirm-btn ${r[e.id]===!1?"selected":""}`,onClick:()=>o({[e.id]:!1}),children:[t.jsx(Nn,{size:18}),"No"]})]})]}),e.type!=="text"&&t.jsxs("div",{className:"planning-comment-section",children:[t.jsx("label",{className:"planning-comment-label",htmlFor:`planning-comment-${e.id}`,children:"Additional comments (optional)"}),t.jsx("textarea",{id:`planning-comment-${e.id}`,className:"planning-textarea",rows:2,placeholder:"Add any extra context or direction...",value:d,onChange:f=>u(f.target.value)})]})]})]})]}),t.jsx("div",{className:"planning-actions",children:t.jsxs("button",{className:"btn btn-primary planning-actions-primary",onClick:h,disabled:!m(),children:["Continue",t.jsx(Dl,{size:16,className:"icon-ml-4"})]})})]})}function _F({summary:e,historyEntries:n,onSummaryChange:s,onApply:a,onCancel:r,isApplying:o}){const[l,c]=i.useState(e),[d,u]=i.useState(!0),h=(m,f)=>{const p={...l,[m]:f};c(p),s(p)};return t.jsxs("div",{className:"planning-summary",children:[t.jsxs("div",{className:"planning-view-scroll planning-summary-scroll",children:[n.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:n}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"planning-summary-panel",children:[t.jsx("div",{className:"planning-summary-header",children:t.jsxs("button",{className:"planning-summary-toggle",onClick:()=>u(!d),"aria-expanded":d,children:[d?t.jsx(Ln,{size:16}):t.jsx(ps,{size:16}),t.jsx("span",{children:"Refined Scope"})]})}),d&&t.jsxs("div",{className:"planning-summary-content",children:[l.description&&t.jsxs("div",{className:"planning-summary-field",children:[t.jsx("label",{children:"Description"}),t.jsx("textarea",{rows:3,value:l.description,onChange:m=>h("description",m.target.value)})]}),l.planningNotes&&t.jsxs("div",{className:"planning-summary-field",children:[t.jsx("label",{children:"Planning Notes"}),t.jsx("textarea",{rows:3,value:l.planningNotes,onChange:m=>h("planningNotes",m.target.value)})]}),l.verification&&t.jsxs("div",{className:"planning-summary-field",children:[t.jsx("label",{children:"Verification Criteria"}),t.jsx("textarea",{rows:2,value:l.verification,onChange:m=>h("verification",m.target.value)})]}),!l.description&&!l.planningNotes&&!l.verification&&t.jsx("p",{className:"text-muted planning-summary-empty",children:"No additional details were generated for this item."})]})]})]}),t.jsxs("div",{className:"planning-view-footer",children:[t.jsxs("button",{className:"btn btn-primary planning-actions-primary",onClick:a,disabled:o,children:[o?t.jsx(Ct,{size:16,className:"spin"}):null,"Apply"]}),t.jsx("button",{className:"btn",onClick:r,disabled:o,children:"Cancel"})]})]})}const Vb=300,kc=220,jc=560,Wb="fusion:mission-sidebar-width",tl={planning:{bg:"var(--mission-planning-bg)",text:"var(--mission-planning-text)"},active:{bg:"var(--mission-active-bg)",text:"var(--mission-active-text)"},blocked:{bg:"var(--mission-blocked-bg)",text:"var(--mission-blocked-text)"},complete:{bg:"var(--mission-complete-bg)",text:"var(--mission-complete-text)"},archived:{bg:"var(--mission-archived-bg)",text:"var(--mission-archived-text)"}},Gb={planning:{bg:"var(--mission-planning-bg)",text:"var(--mission-planning-text)"},active:{bg:"var(--mission-active-bg)",text:"var(--mission-active-text)"},blocked:{bg:"var(--mission-blocked-bg)",text:"var(--mission-blocked-text)"},complete:{bg:"var(--mission-complete-bg)",text:"var(--mission-complete-text)"}},Kb={pending:{bg:"var(--slice-pending-bg)",text:"var(--slice-pending-text)"},active:{bg:"var(--slice-active-bg)",text:"var(--slice-active-text)"},complete:{bg:"var(--slice-complete-bg)",text:"var(--slice-complete-text)"}},Nc={defined:{bg:"var(--feature-defined-bg)",text:"var(--feature-defined-text)"},triaged:{bg:"var(--feature-triaged-bg)",text:"var(--feature-triaged-text)"},"in-progress":{bg:"var(--feature-in-progress-bg)",text:"var(--feature-in-progress-text)"},done:{bg:"var(--feature-done-bg)",text:"var(--feature-done-text)"},blocked:{bg:"var(--mission-blocked-bg)",text:"var(--mission-blocked-text)"}},Sc={inactive:{bg:"var(--autopilot-inactive-bg)",text:"var(--autopilot-inactive-text)"},watching:{bg:"var(--autopilot-watching-bg)",text:"var(--autopilot-watching-text)"},activating:{bg:"var(--autopilot-activating-bg)",text:"var(--autopilot-activating-text)"},completing:{bg:"var(--autopilot-completing-bg)",text:"var(--autopilot-completing-text)"}},Jb={inactive:"Off",watching:"Watching",activating:"Activating slice",completing:"Completing"},Cc={pending:{bg:"var(--assertion-pending-bg)",text:"var(--assertion-pending-text)"},passed:{bg:"var(--assertion-passed-bg)",text:"var(--assertion-passed-text)"},failed:{bg:"var(--assertion-failed-bg)",text:"var(--assertion-failed-text)"},blocked:{bg:"var(--assertion-blocked-bg)",text:"var(--assertion-blocked-text)"}},Yb={not_started:{bg:"var(--assertion-pending-bg)",text:"var(--assertion-pending-text)"},needs_coverage:{bg:"var(--loop-needs-fix-bg)",text:"var(--loop-needs-fix-text)"},ready:{bg:"var(--loop-validating-bg)",text:"var(--loop-validating-text)"},passed:{bg:"var(--loop-passed-bg)",text:"var(--loop-passed-text)"},failed:{bg:"var(--loop-blocked-bg)",text:"var(--loop-blocked-text)"},blocked:{bg:"var(--loop-blocked-bg)",text:"var(--loop-blocked-text)"}},MF=3,RF=new Set(["generating","awaiting_input","error"]);function AF(e){switch(e){case"generating":return"Generating plan";case"awaiting_input":return"Awaiting input";case"error":return"Needs retry";default:return e}}function TF(e){switch(e){case"error":return"Retry interview";case"generating":return"Generating plan";default:return"Resume interview"}}function Ec(e){switch(e){case"planning":return"Starting activates the first slice so work can begin.";case"active":return"Stopping pauses linked tasks and marks the mission blocked.";case"blocked":return"Resuming re-activates the mission and continues execution.";default:return null}}function IF(e){return e in Jb?Jb[e]:e?e.replace(/_/g," "):"Unknown"}function PF(e){return e==="completed"?"planned":e==="needs_update"?"needs_update":"not_started"}function Xb({state:e}){const n=e==="planned"?"mission-plan-state-indicator--planned":e==="needs_update"?"mission-plan-state-indicator--needs-update":"mission-plan-state-indicator--not-started",s=e==="planned"?"Planned":e==="needs_update"?"Needs update":"Not planned";return t.jsx("span",{className:`mission-plan-state-indicator ${n}`,title:s,"aria-label":s})}function Qb(e){return e?e.replace(/_/g," ").replace(/^\w/,n=>n.toUpperCase()):"Not started"}const Zb={title:"",description:"",status:"planning",autopilotEnabled:!1,baseBranch:"",branchStrategy:{mode:"project-default"}},Ju={title:"",description:"",acceptanceCriteria:"",status:"planning",dependencies:[]},Yu={title:"",description:"",status:"pending"},Xu={title:"",description:"",acceptanceCriteria:"",status:"defined"};function $F(e){return e?e.mode==="existing"||e.mode==="custom-new"?{mode:e.mode,branchName:e.branchName??""}:e.mode==="auto-per-task"?{mode:"auto-per-task"}:{mode:"project-default"}:{mode:"project-default"}}function ex(e){if(!e?.baseBranch&&!e?.branchStrategy)return;const n=e.branchStrategy,a={branchSelection:{mode:"project-default",...e.baseBranch?{baseBranch:e.baseBranch}:{}}};if(n?.mode==="existing"||n?.mode==="custom-new"){const r=n.branchName?.trim();r&&(a.branchSelection={mode:n.mode,branchName:r,...e.baseBranch?{baseBranch:e.baseBranch}:{}})}else n?.mode==="auto-per-task"&&(a.branchAssignment={mode:"per-task-derived"});return a}const DF=3600*1e3;function md(e){if(!e)return"—";const n=new Date(e).getTime();if(Number.isNaN(n))return"—";const s=Date.now()-n;if(s<0)return"just now";const a=Math.floor(s/(60*1e3));if(a<1)return"just now";if(a<60)return`${a}m ago`;const r=Math.floor(a/60);return r<24?`${r}h ago`:`${Math.floor(r/24)}d ago`}function LF(e){if(!e)return"healthy";const n=typeof e.lastErrorAt=="string"&&Date.now()-new Date(e.lastErrorAt).getTime()<=DF,s=e.totalTasks>0&&e.tasksFailed>e.totalTasks*.3;return n||s?"error":e.tasksFailed>0?"warning":e.tasksFailed===0&&e.tasksInFlight<=e.totalTasks?"healthy":"warning"}function OF(e){if(!e||typeof e!="object")return!1;const n=e;return typeof n.missionId=="string"&&typeof n.tasksCompleted=="number"&&typeof n.tasksFailed=="number"&&typeof n.tasksInFlight=="number"&&typeof n.totalTasks=="number"&&typeof n.estimatedCompletionPercent=="number"}function FF(e){if(!e||typeof e!="object")return!1;const n=e;return typeof n.id=="string"&&typeof n.missionId=="string"&&typeof n.eventType=="string"&&typeof n.description=="string"&&typeof n.timestamp=="string"}function Qu(e){if(!e||typeof e!="object")return!1;const n=e;return typeof n.rollup?.milestoneId=="string"&&typeof n.rollup?.state=="string"&&Array.isArray(n.validationTelemetry?.validationRounds)&&typeof n.validationTelemetry?.totalRuns=="number"&&n.validationContract!==void 0&&Array.isArray(n.fixFeatures)}const Ek=["feature_triaged","feature_completed"],_k=["slice_activated","slice_completed","milestone_completed"],Mk=["mission_started","mission_paused","mission_resumed","mission_completed"],Rk=["autopilot_enabled","autopilot_disabled","autopilot_state_changed","autopilot_retry","autopilot_stale"];function tx(e,n){switch(n){case"errors":return e==="error"||e==="warning";case"state_changes":return Mk.includes(e);case"tasks":return Ek.includes(e);case"slices":return _k.includes(e);case"autopilot":return Rk.includes(e);default:return!0}}function zF(e){return e==="error"||e==="warning"?"mission-event__type--error":Mk.includes(e)?"mission-event__type--state":Ek.includes(e)?"mission-event__type--task":_k.includes(e)?"mission-event__type--slice":Rk.includes(e)?"mission-event__type--autopilot":"mission-event__type--default"}function BF(e){return e.replace(/_/g," ")}function gr(e){return t.jsx("div",{className:"markdown-body",children:t.jsx(ji,{remarkPlugins:[Ni],children:e})})}function UF(e,n){return n?e==="watching"?`Watching since ${md(n)}`:`Last activation ${md(n)}`:null}function HF(e){if(!Array.isArray(e.milestones))throw new Error("Malformed mission detail response: missing milestones");return{...e,milestones:e.milestones.map(n=>{if(!Array.isArray(n.slices))throw new Error(`Malformed mission detail response: milestone ${n.id} is missing slices`);return{...n,slices:n.slices.map(s=>{if(!Array.isArray(s.features))throw new Error(`Malformed mission detail response: slice ${s.id} is missing features`);return{...s,features:s.features}})}})}}function qF({isOpen:e,isInline:n=!1,onClose:s,addToast:a,projectId:r,onSelectTask:o,availableTasks:l=[],resumeSessionId:c,targetMissionId:d,milestoneSliceResumeSessionId:u,onMilestoneSliceResumeFetchError:h}){const m=n||e,f=r??"",p=`${bn.MISSIONS_PREFIX}${f}`,b=`${bn.MISSIONS_SELECTED_ID_PREFIX}${f}`,v=ui(p),[x,y]=i.useState(()=>Array.isArray(v)?v:[]),[g,j]=i.useState(null),[N,C]=i.useState(!(Array.isArray(v)&&v.length>0)),w=i.useRef(Array.isArray(v)&&v.length>0),[S,R]=i.useState(!1),I=$i()==="mobile",{pushNav:E}=ff(),[M,G]=i.useState(()=>{if(typeof window>"u")return Vb;const B=window.localStorage.getItem(Wb),De=B?Number(B):NaN;return Number.isFinite(De)?Math.max(kc,Math.min(jc,De)):Vb}),U=i.useCallback(B=>{try{window.localStorage.setItem(Wb,String(B))}catch{}},[]),P=i.useCallback(B=>{if(I)return;B.preventDefault(),B.stopPropagation();const De=B.currentTarget;typeof De.setPointerCapture=="function"&&De.setPointerCapture(B.pointerId);const Ve=B.clientX,kt=M;let zn=kt;document.body.style.userSelect="none";const Gt=us=>{const Ze=us.clientX-Ve,dt=Math.max(kc,Math.min(jc,kt+Ze));zn=dt,G(dt)},Yn=us=>{typeof De.releasePointerCapture=="function"&&De.releasePointerCapture(us.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",Gt),document.removeEventListener("pointerup",Yn),U(zn)};document.addEventListener("pointermove",Gt),document.addEventListener("pointerup",Yn)},[I,U,M]),T=i.useCallback(B=>{if(I||B.key!=="ArrowLeft"&&B.key!=="ArrowRight")return;B.preventDefault();const De=B.shiftKey?50:10,Ve=B.key==="ArrowLeft"?-De:De,kt=Math.max(kc,Math.min(jc,M+Ve));G(kt),U(kt)},[I,U,M]),[D,W]=i.useState(!1),[Y,L]=i.useState(null),[_,F]=i.useState(Zb),[ae,k]=i.useState(!1),[z,J]=i.useState(new Set),[oe,le]=i.useState(new Set),[we,re]=i.useState(null),[H,ue]=i.useState(Ju),[Q,be]=i.useState(!1),[fe,O]=i.useState(null),[se,ve]=i.useState(Yu),[A,ne]=i.useState(!1),[ye,ee]=i.useState(null),[ge,Ne]=i.useState(null),[He,Le]=i.useState(Xu),[de,Re]=i.useState(!1),[Pe,rt]=i.useState(null),[qe,Xe]=i.useState(null),[At,at]=i.useState(""),[Se,pe]=i.useState(!1),[_e,et]=i.useState([]),[Ae,it]=i.useState([]),[xt,Nt]=i.useState(void 0),Ut=i.useRef(null),Be=xt??(c&&Ut.current===c?void 0:c),[Z,Oe]=i.useState(null),[ht,je]=i.useState(null),[mt,Et]=i.useState(null);i.useEffect(()=>{m&&Be&&pe(!0)},[m,Be]),i.useEffect(()=>{c&&Ut.current!==c&&(Ut.current=null)},[c]),i.useEffect(()=>{if(!m)return;let B=!1;return Ph(r).then(De=>{if(B)return;const Ve=De.filter(kt=>kt.type!=="mission_interview"||!RF.has(kt.status)?!1:r?kt.projectId===r:kt.projectId==null);et(Ve)}).catch(De=>{console.warn("[MissionManager] Failed to fetch pending interview sessions:",De)}),()=>{B=!0}},[m,r,Be]),i.useEffect(()=>{if(!m)return;let B=!1;return lM(r).then(De=>{B||it(De)}).catch(De=>{console.warn("[MissionManager] Failed to fetch mission interview drafts:",De)}),()=>{B=!0}},[m,r,Be]),i.useEffect(()=>{if(!m||!u)return;let B=!1;return ma(u).then(De=>{if(!(B||!De))try{const Ve=JSON.parse(De.inputPayload||"{}");Ve.targetId&&Ve.targetType&&Oe({type:Ve.targetType,id:Ve.targetId,title:Ve.targetTitle||De.title,resumeSessionId:u})}catch{Oe({type:"milestone",id:"",title:De.title,resumeSessionId:u})}}).catch(De=>{B||(console.warn("[MissionManager] Failed to fetch session for milestone/slice resume:",De),h?.())}),()=>{B=!0}},[m,u,h]);const[Te,xe]=i.useState(null),[gt,_t]=i.useState(new Map),[Ft,Dt]=i.useState(null),[nt,Wt]=i.useState({title:"",assertion:"",status:"pending"}),[Mt,Kt]=i.useState(!1),[xn,Tn]=i.useState(null),[Sn,is]=i.useState(new Map),[On,un]=i.useState(new Set),[tn,on]=i.useState(new Set),[pn,mn]=i.useState(null),[Zn,In]=i.useState(new Map),[rn,hn]=i.useState(null),[Pn,nn]=i.useState(null),[$t,Jt]=i.useState(!0),[Qt,ie]=i.useState(new Set),[Fe,Je]=i.useState(new Map),[tt,Ye]=i.useState(null),[vt,pt]=i.useState(new Map),[Zt,ce]=i.useState(null),[Ge,Me]=i.useState(new Map),[Ke,Qe]=i.useState(new Map),[Lt,gn]=i.useState("structure"),[Bn,wn]=i.useState([]),Yt=i.useRef([]),$n=i.useRef([]),dn=i.useRef(null),me=i.useRef(null),jt=i.useRef("structure"),Cn=i.useRef("all"),[bs,Ts]=i.useState(!1),[kn,ls]=i.useState(0),[cs,ys]=i.useState("all"),[xs,he]=i.useState(new Set),bt=i.useRef(null),ot=i.useRef(null);$n.current=x,dn.current=g,me.current=rn,jt.current=Lt,Cn.current=cs;const St=i.useCallback((B="auto")=>{const De=ot.current;if(De&&typeof De.scrollIntoView=="function"){De.scrollIntoView({block:"end",behavior:B});return}const Ve=bt.current;Ve&&(Ve.scrollTop=Ve.scrollHeight)},[]),lt=i.useCallback(()=>{const B=bt.current;return B?B.scrollHeight-B.scrollTop-B.clientHeight<=100:!0},[]),Tt=i.useCallback(async B=>{if(B.length===0){Qe(new Map);return}const De=await T_(r);Qe(Ve=>{const kt=new Map(Ve);for(const[zn,Gt]of Object.entries(De))OF(Gt)&&kt.set(zn,Gt);return kt})},[r]),Xt=i.useCallback(async()=>{try{w.current||C(!0);const B=await E_(r),De=Array.isArray(B)?B:B&&Array.isArray(B.data)?B.data:[];y(De),Wn(p,De.length>200?De.slice(0,200):De,{maxBytes:5e5}),w.current=!0,Tt(De)}catch(B){a(Ce(B)||"Failed to load missions","error")}finally{C(!1)}},[a,Tt,p,r]),zt=i.useCallback(async B=>{try{R(!0);const De=await py(B,r);if(!De||typeof De!="object")throw new Error("Malformed mission detail response");const Ve=HF(De);if(j(Ve),Ve.milestones.length>0){const kt=Ve.milestones[0].id,zn=new Set(Ve.milestones.map(Gn=>Gn.id)),Gt=me.current,us=typeof Gt=="string"&&zn.has(Gt)?Gt:kt;hn(us),Jt(!0),J(Gn=>{const fs=new Set(Array.from(Gn).filter(Xn=>zn.has(Xn)));return fs.add(us),fs});const Ze=new Set(Ve.milestones.flatMap(Gn=>Gn.slices.map(fs=>fs.id))),dt=Ve.milestones.find(Gn=>Gn.id===us),sn=dt?.slices[0]?.id??null;le(Gn=>{const fs=new Set(Array.from(Gn).filter(Xn=>Ze.has(Xn)));return sn&&((dt?.slices.some(ms=>fs.has(ms.id))??!1)||fs.add(sn)),fs}),eu(us,r).then(Gn=>{_t(fs=>{const Xn=new Map(fs);return Xn.set(us,Gn),Xn})}).catch(()=>{}),tu(us,r).then(Gn=>{In(fs=>{const Xn=new Map(fs);return Xn.set(us,Gn),Xn})}).catch(()=>{})}else hn(null),nn(null)}catch(De){console.error("[MissionManager] loadMissionDetail:",De),a(Ce(De)||"Failed to load mission details","error")}finally{R(!1)}},[a,r]);i.useEffect(()=>{if(!m||!rn){nn(null);return}let B=!1;return nn(null),wp(rn,r).then(De=>{if(!B){if(!Qu(De)){nn(null);return}nn(De),In(Ve=>{const kt=new Map(Ve);return kt.set(rn,De.rollup),kt})}}).catch(()=>{B||nn(null)}),()=>{B=!0}},[m,rn,r]),i.useEffect(()=>{Jt(!0),rn&&J(B=>{if(B.has(rn))return B;const De=new Set(B);return De.add(rn),De})},[rn]);const Ee=i.useCallback(B=>{!B||B!==me.current||wp(B,r).then(De=>{me.current!==B||!Qu(De)||(nn(De),In(Ve=>{const kt=new Map(Ve);return kt.set(B,De.rollup),kt}))}).catch(()=>{})},[r]),yt=i.useCallback(async(B,De)=>{const Ve=De?.append??!1,kt=Ve?Yt.current.length:0;Ve||(Ts(!0),he(new Set));try{const zn=await A_(B,{limit:50,offset:kt,eventType:void 0},r),Gt=zn.events.filter(Yn=>tx(Yn.eventType,cs));wn(Yn=>{if(!Ve)return Yt.current=Gt,Gt;const us=new Set(Yn.map(dt=>dt.id)),Ze=[...Yn];for(const dt of Gt)us.has(dt.id)||Ze.push(dt);return Yt.current=Ze,Ze}),ls(zn.total),Ve||requestAnimationFrame(()=>{St("auto")})}catch(zn){a(Ce(zn)||"Failed to load mission activity","error")}finally{Ve||Ts(!1)}},[a,cs,r,St]);i.useEffect(()=>{Yt.current=Bn},[Bn]),i.useEffect(()=>{const B=ui(p),De=Array.isArray(B)&&B.length>0;y(Array.isArray(B)?B:[]),C(!De),w.current=De},[p]),i.useEffect(()=>{const B=ui(b);if(!B)return;x.some(Ve=>Ve.id===B)&&!g&&zt(B)},[zt,x,g,b]),i.useEffect(()=>{g?.id&&Wn(b,g.id,{maxBytes:5e5})},[g?.id,b]),i.useEffect(()=>{m&&(Xt(),j(null),hn(null),nn(null),wn([]),ls(0),gn("structure"),ys("all"),he(new Set))},[m,Xt]);const Rt=i.useRef(null);i.useEffect(()=>{m&&d&&Rt.current!==d&&x.length>0&&(Rt.current=d,zt(d))},[m,d,x,zt]),i.useEffect(()=>{m||(Rt.current=null)},[m]);const yn=i.useRef(!1);i.useEffect(()=>{!m||!n||I||N||yn.current||g||d||x.length!==0&&(yn.current=!0,zt(x[0].id))},[m,n,I,N,x,g,d,zt]),i.useEffect(()=>{m||(yn.current=!1)},[m]),i.useEffect(()=>{!m||!g||Lt!=="activity"||yt(g.id)},[Lt,m,yt,g,cs]),i.useEffect(()=>{if(!m||typeof EventSource>"u")return;const B=new URLSearchParams;r&&B.set("projectId",r);const De=`/api/events${B.size>0?`?${B.toString()}`:""}`,Ve=()=>{Tt($n.current)},kt=Xn=>{Ve();const ms=Xn;if(ms.data)try{const Fn=JSON.parse(ms.data);Fn?.id&&y(Vs=>Vs.map(ze=>ze.id===Fn.id?{...ze,...Fn}:ze))}catch{}dn.current&&zt(dn.current.id)},zn=Xn=>{Ve(),dn.current&&zt(dn.current.id)},Gt=()=>{Ve(),dn.current&&zt(dn.current.id)},Yn=Xn=>{Ve(),dn.current&&zt(dn.current.id)},us=Xn=>{const ms=Xn;if(ms.data)try{const Fn=JSON.parse(ms.data);Fn&&Fn.featureId&&(ti(Fn.featureId),Ei(Fn.featureId),Fn.milestoneId&&Ee(Fn.milestoneId))}catch{}},Ze=Xn=>{const ms=Xn;if(ms.data)try{const Fn=JSON.parse(ms.data);Fn&&Fn.featureId&&(ti(Fn.featureId),Ei(Fn.featureId),Fn.milestoneId&&Ee(Fn.milestoneId),dn.current&&zt(dn.current.id))}catch{}},dt=Xn=>{const ms=Xn;if(ms.data)try{const Fn=JSON.parse(ms.data);Fn&&Fn.milestoneId&&($e(Fn.milestoneId),Ee(Fn.milestoneId))}catch{}},sn=Xn=>{const ms=Xn;if(ms.data)try{const Fn=JSON.parse(ms.data);Fn&&Fn.milestoneId&&(X(Fn.milestoneId),$e(Fn.milestoneId),Ee(Fn.milestoneId))}catch{}};return Si(De,{events:{"mission:updated":kt,"slice:updated":zn,"feature:updated":Gt,"milestone:updated":Yn,"mission:event":Xn=>{Ve();const ms=dn.current;if(!ms||jt.current!=="activity")return;const Fn=lt(),Vs=Xn;if(Vs.data)try{const ze=JSON.parse(Vs.data);if(!FF(ze)||ze.missionId!==ms.id||!tx(ze.eventType,Cn.current))return;wn(Ot=>{const vn=Ot.filter(Ms=>Ms.id!==ze.id);return[ze,...vn].slice(0,100)}),ls(Ot=>Ot+1),Fn&&requestAnimationFrame(()=>{const Ot=bt.current;Ot&&(Ot.scrollTop=0)})}catch{}},"validator-run:started":us,"validator-run:completed":Ze,"milestone:validation:updated":dt,"assertion:created":sn,"assertion:updated":sn,"assertion:deleted":sn,"assertion:linked":sn,"assertion:unlinked":sn,"fix-feature:created":Xn=>{const ms=Xn;if(ms.data)try{const Fn=JSON.parse(ms.data);if(Fn&&Fn.sourceFeatureId){ti(Fn.sourceFeatureId);const Vs=Fn?.feature?.sliceId,ze=dn.current;if(Vs&&ze){const Ot=ze.milestones.find(vn=>vn.slices.some(Ms=>Ms.id===Vs));Ot&&Ee(Ot.id)}dn.current&&zt(dn.current.id)}}catch{}}}})},[m,lt,zt,Tt,r,Ee]);const _n=i.useCallback(B=>{L(B.id),W(!1),F({title:B.title,description:B.description||"",status:B.status,autopilotEnabled:B.autopilotEnabled??!1,baseBranch:B.baseBranch??"",branchStrategy:$F(B.branchStrategy)})},[]),Dn=i.useCallback(()=>{L(null),W(!1),F(Zb)},[]),an=i.useCallback(async()=>{if(!_.title.trim()){a("Mission title is required","error");return}const B=_.branchStrategy.mode==="existing"||_.branchStrategy.mode==="custom-new",De=_.branchStrategy.branchName?.trim()??"";if(B&&!De){a("Branch name is required for selected branch strategy","error");return}const Ve=_.branchStrategy.mode==="existing"||_.branchStrategy.mode==="custom-new"?{mode:_.branchStrategy.mode,branchName:De}:{mode:_.branchStrategy.mode};try{if(k(!0),D)await __({title:_.title.trim(),description:_.description.trim()||void 0,autopilotEnabled:_.autopilotEnabled,baseBranch:_.baseBranch.trim()||void 0,branchStrategy:Ve},r),a("Mission created","success");else if(Y){const kt={title:_.title.trim(),description:_.description.trim()||void 0,status:_.status,autopilotEnabled:_.autopilotEnabled,baseBranch:_.baseBranch.trim()||"",branchStrategy:Ve};_.autopilotEnabled&&(kt.autoAdvance=!0),await M_(Y,kt,r),a("Mission updated","success"),g?.id===Y&&await zt(Y)}await Xt(),Dn()}catch(kt){a(Ce(kt)||"Failed to save mission","error")}finally{k(!1)}},[_,D,Y,a,Xt,zt,g,Dn,r]),En=i.useCallback(async B=>{try{await R_(B,r),a("Mission deleted","success"),g?.id===B&&j(null),await Xt(),xe(null)}catch(De){a(Ce(De)||"Failed to delete mission","error")}},[a,Xt,g,r]),ws=i.useCallback(()=>{be(!0),re(null),ue(Ju)},[]),Is=i.useCallback(B=>{re(B.id),be(!1),ue({title:B.title,description:B.description||"",acceptanceCriteria:B.acceptanceCriteria||"",status:B.status,dependencies:B.dependencies})},[]),ks=i.useCallback(()=>{re(null),be(!1),ue(Ju)},[]),V=i.useCallback(async()=>{if(!H.title.trim()){a("Milestone title is required","error");return}try{k(!0),Q&&g?(await I_(g.id,{title:H.title.trim(),description:H.description.trim()||void 0,acceptanceCriteria:H.acceptanceCriteria.trim()||void 0,dependencies:H.dependencies},r),a("Milestone created","success")):we&&(await P_(we,{title:H.title.trim(),description:H.description.trim()||void 0,acceptanceCriteria:H.acceptanceCriteria.trim()||void 0,status:H.status,dependencies:H.dependencies},r),a("Milestone updated","success")),await zt(g.id),ks()}catch(B){a(Ce(B)||"Failed to save milestone","error")}finally{k(!1)}},[H,Q,we,g,a,zt,ks,_.title,r]),We=i.useCallback(async B=>{try{await $_(B,r),a("Milestone deleted","success"),await zt(g.id),xe(null)}catch(De){a(Ce(De)||"Failed to delete milestone","error")}},[a,zt,g,r]),wt=i.useCallback(B=>{hn(B),Jt(!0),J(De=>{const Ve=new Set(De);return!Ve.has(B)?(Ve.add(B),eu(B,r).then(zn=>{_t(Gt=>{const Yn=new Map(Gt);return Yn.set(B,zn),Yn})}).catch(()=>{}),tu(B,r).then(zn=>{In(Gt=>{const Yn=new Map(Gt);return Yn.set(B,zn),Yn})}).catch(()=>{})):Ve.delete(B),Ve})},[r]),ut=i.useCallback(B=>{ee(B),ne(!0),O(null),ve(Yu)},[]),Bt=i.useCallback(B=>{O(B.id),ne(!1),ve({title:B.title,description:B.description||"",status:B.status})},[]),en=i.useCallback(()=>{O(null),ne(!1),ee(null),ve(Yu)},[]),jn=i.useCallback(async()=>{if(!se.title.trim()){a("Slice title is required","error");return}try{k(!0),A&&ye?(await D_(ye,{title:se.title.trim(),description:se.description.trim()||void 0},r),a("Slice created","success")):fe&&(await L_(fe,{title:se.title.trim(),description:se.description.trim()||void 0,status:se.status},r),a("Slice updated","success")),await zt(g.id),en()}catch(B){a(Ce(B)||"Failed to save slice","error")}finally{k(!1)}},[se,A,fe,ye,g,a,zt,en,r]),ts=i.useCallback(async B=>{try{await O_(B,r),a("Slice deleted","success"),await zt(g.id),xe(null)}catch(De){a(Ce(De)||"Failed to delete slice","error")}},[a,zt,g,r]),vs=i.useCallback(async B=>{try{await F_(B,r),a("Slice activated","success"),await zt(g.id)}catch(De){a(Ce(De)||"Failed to activate slice","error")}},[a,zt,g,r]),Ps=i.useCallback(B=>{le(De=>{const Ve=new Set(De);return Ve.has(B)?Ve.delete(B):Ve.add(B),Ve})},[]),te=i.useCallback(B=>{rt(B),Re(!0),Ne(null),Le(Xu)},[]),Ie=i.useCallback(B=>{Ne(B.id),Re(!1),Le({title:B.title,description:B.description||"",acceptanceCriteria:B.acceptanceCriteria||"",status:B.status})},[]),ft=i.useCallback(()=>{Ne(null),Re(!1),rt(null),Le(Xu)},[]),Vt=i.useCallback(async()=>{if(!He.title.trim()){a("Feature title is required","error");return}try{k(!0),de&&Pe?(await z_(Pe,{title:He.title.trim(),description:He.description.trim()||void 0,acceptanceCriteria:He.acceptanceCriteria.trim()||void 0},r),a("Feature created","success")):ge&&(await B_(ge,{title:He.title.trim(),description:He.description.trim()||void 0,acceptanceCriteria:He.acceptanceCriteria.trim()||void 0,status:He.status},r),a("Feature updated","success")),await zt(g.id),ft()}catch(B){a(Ce(B)||"Failed to save feature","error")}finally{k(!1)}},[He,de,ge,Pe,g,a,zt,ft,r]),qt=i.useCallback(async B=>{try{await U_(B,r),a("Feature deleted","success"),await zt(g.id),xe(null)}catch(De){a(Ce(De)||"Failed to delete feature","error")}},[a,zt,g,r]),ln=i.useCallback(async()=>{if(!qe||!At.trim()){a("Task ID is required","error");return}try{await H_(qe,At.trim(),r),a("Feature linked to task","success"),await zt(g.id),Xe(null),at("")}catch(B){a(Ce(B)||"Failed to link feature to task","error")}},[qe,At,a,zt,g,r]),Mn=i.useCallback(async B=>{try{await q_(B,r),a("Feature unlinked from task","success"),await zt(g.id)}catch(De){a(Ce(De)||"Failed to unlink feature","error")}},[a,zt,g,r]),Rn=i.useCallback(async B=>{try{k(!0),await V_(B,void 0,void 0,r,ex(g??void 0)),a("Feature triaged — task created","success"),await zt(g.id)}catch(De){a(Ce(De)||"Failed to triage feature","error")}finally{k(!1)}},[a,zt,g,r]),Kn=i.useCallback(async B=>{Et(B);try{const De=await kM(B,r);je({featureId:B,enrichedDescription:De.description})}catch{await Rn(B)}finally{Et(null)}},[Rn,r]),ds=i.useCallback(async()=>{ht&&(je(null),await Rn(ht.featureId))},[Rn,ht]),Jn=i.useCallback(()=>{je(null)},[]),Us=i.useCallback(async B=>{try{k(!0);const De=await W_(B,r,ex(g??void 0));a(`Triaged ${De.count} feature${De.count!==1?"s":""}`,"success"),await zt(g.id)}catch(De){a(Ce(De)||"Failed to triage slice features","error")}finally{k(!1)}},[a,zt,g,r]),X=i.useCallback(async B=>{try{const De=await eu(B,r);_t(Ve=>{const kt=new Map(Ve);return kt.set(B,De),kt})}catch{}},[r]),$e=i.useCallback(async B=>{try{const De=await tu(B,r);In(Ve=>{const kt=new Map(Ve);return kt.set(B,De),kt})}catch{}},[r]),Ue=i.useCallback(async B=>{if(!nt.title.trim()||!nt.assertion.trim()){a("Title and assertion text are required","error");return}try{k(!0),await G_(B,{title:nt.title.trim(),assertion:nt.assertion.trim(),status:nt.status},r),a("Assertion created","success"),await X(B),await $e(B),Kt(!1),Wt({title:"",assertion:"",status:"pending"})}catch(De){a(Ce(De)||"Failed to create assertion","error")}finally{k(!1)}},[nt,a,X,$e,r]),Ht=i.useCallback(B=>{Dt(B.id),Wt({title:B.title,assertion:B.assertion,status:B.status})},[]),cn=i.useCallback(()=>{Dt(null),Kt(!1),Wt({title:"",assertion:"",status:"pending"})},[]),Un=i.useCallback(async(B,De)=>{if(!nt.title.trim()||!nt.assertion.trim()){a("Title and assertion text are required","error");return}try{k(!0),await K_(B,{title:nt.title.trim(),assertion:nt.assertion.trim(),status:nt.status},r),a("Assertion updated","success"),await X(De),await $e(De),cn()}catch(Ve){a(Ce(Ve)||"Failed to update assertion","error")}finally{k(!1)}},[nt,a,X,$e,cn,r]),as=i.useCallback(async B=>{try{const De=await X_(B,r);is(Ve=>{const kt=new Map(Ve);return kt.set(B,De),kt})}catch{}},[r]),$s=i.useCallback(async B=>{const De=xn!==B;Tn(Ve=>Ve===B?null:B),De&&await as(B)},[xn,as]),Fs=i.useCallback(B=>{Tn(B),as(B),requestAnimationFrame(()=>{const De=document.querySelector(`[data-mission-assertion-id="${B}"]`);De instanceof HTMLElement&&typeof De.scrollIntoView=="function"&&De.scrollIntoView({behavior:"smooth",block:"center"})})},[as]),js=i.useCallback(async(B,De)=>{try{un(Ve=>new Set(Ve).add(De)),await J_(B,De,r),a("Feature linked to assertion","success"),await as(De),mn(null)}catch(Ve){a(Ce(Ve)||"Failed to link feature","error")}finally{un(Ve=>{const kt=new Set(Ve);return kt.delete(De),kt})}},[a,as,r]),Zs=i.useCallback(async(B,De)=>{const Ve=`${B}-${De}`;try{on(kt=>new Set(kt).add(Ve)),await Y_(B,De,r),a("Feature unlinked from assertion","success"),await as(De)}catch(kt){a(Ce(kt)||"Failed to unlink feature","error")}finally{on(kt=>{const zn=new Set(kt);return zn.delete(Ve),zn})}},[a,as,r]),ei=i.useCallback(async B=>{try{ie(Ve=>new Set(Ve).add(B)),await Q_(B,r),a("Validation triggered","success");const De=await kp(B,r);Je(Ve=>{const kt=new Map(Ve);return kt.set(B,De),kt})}catch(De){a(Ce(De)||"Failed to trigger validation","error")}finally{ie(De=>{const Ve=new Set(De);return Ve.delete(B),Ve})}},[a,r]),ti=i.useCallback(async B=>{try{const De=await kp(B,r);Je(Ve=>{const kt=new Map(Ve);return kt.set(B,De),kt})}catch{}},[r]),Ei=i.useCallback(async B=>{try{const De=await Z_(B,{limit:10},r);pt(Ve=>{const kt=new Map(Ve);return kt.set(B,De),kt})}catch{}},[r]),_i=i.useCallback(B=>{const De=dn.current;if(De){for(const Ve of De.milestones)for(const kt of Ve.slices)if(kt.features.find(Gt=>Gt.id===B)){J(Gt=>{const Yn=new Set(Gt);return Yn.add(Ve.id),Yn}),le(Gt=>{const Yn=new Set(Gt);return Yn.add(kt.id),Yn}),Ye(B),hn(Ve.id),ti(B),Ei(B),requestAnimationFrame(()=>{const Gt=document.querySelector(`[data-mission-feature-id="${B}"]`);Gt instanceof HTMLElement&&typeof Gt.scrollIntoView=="function"&&Gt.scrollIntoView({behavior:"smooth",block:"center"})});return}}},[ti,Ei]),$r=i.useCallback(async B=>{try{const De=await eM(B,r);Me(Ve=>{const kt=new Map(Ve);return kt.set(B,De),kt})}catch{}},[r]),Pa=i.useCallback(async B=>{tt===B?Ye(null):(Ye(B),await ti(B),await Ei(B))},[tt,ti,Ei]),Uo=i.useCallback(async B=>{Zt===B?ce(null):(ce(B),await $r(B))},[Zt,$r]),Dr=i.useCallback(async B=>{try{await tM(B,r),a("Mission resumed","success"),await zt(B),Xt()}catch(De){a(Ce(De)||"Failed to resume mission","error")}},[a,zt,Xt,r]),Lr=i.useCallback(async B=>{try{const Ve=(await nM(B,r)).pausedTaskIds?.length??0;a(`Mission stopped (${Ve} task${Ve!==1?"s":""} paused)`,"success"),await zt(B),Xt()}catch(De){a(Ce(De)||"Failed to stop mission","error")}},[a,zt,Xt,r]),$a=i.useCallback(async B=>{try{await sM(B,r),a("Mission started — first slice activated","success"),await zt(B),Xt()}catch(De){a(Ce(De)||"Failed to start mission","error")}},[a,zt,Xt,r]),Da=i.useCallback(async(B,De)=>{try{await iM(B,{enabled:De},r),a(De?"Autopilot enabled":"Autopilot disabled","success"),await zt(B),Xt()}catch(Ve){a(Ce(Ve)||"Failed to update autopilot","error")}},[a,zt,Xt,r]),La=i.useCallback(B=>{gn("structure"),hn(null),nn(null),wn([]),ls(0),ys("all"),he(new Set),zt(B.id)},[zt]),_s=i.useCallback(()=>{Wn(b,null,{maxBytes:5e5}),j(null),hn(null),nn(null),gn("structure"),wn([]),ls(0),ys("all"),he(new Set),Xt()},[Xt,b]),na=Bn.length<kn,Li=g?.autopilotState??"inactive",Or=Li==="watching"||Li==="activating",sa=UF(Li,g?.lastAutopilotActivityAt),Oi=i.useRef(g?.id??null);i.useEffect(()=>{const B=Oi.current,De=g?.id??null;Oi.current=De,!(!m||!I||!De||B===De)&&E({type:"view",revert:_s})},[_s,m,I,E,g?.id]);const ya=i.useMemo(()=>!Pn||!rn||!Qu(Pn)?null:Pn.rollup.milestoneId===rn?Pn:null,[rn,Pn]),Fr=i.useMemo(()=>{const B=new Map;for(const De of ya?.validationTelemetry.validationRounds??[]){const Ve=B.get(De.featureId);(!Ve||De.startedAt>Ve.startedAt)&&B.set(De.featureId,De)}return B},[ya]),zr=i.useCallback(()=>{!g||bs||!na||yt(g.id,{append:!0})},[bs,na,yt,g]),Br=i.useCallback(B=>{he(De=>{const Ve=new Set(De);return Ve.has(B)?Ve.delete(B):Ve.add(B),Ve})},[]),Vn=i.useCallback(B=>{B.key==="Enter"&&!B.shiftKey&&(B.preventDefault(),an())},[an]),ir=i.useCallback(B=>{B.key==="Enter"&&!B.shiftKey&&(B.preventDefault(),V())},[V]),Oa=i.useCallback(B=>{B.key==="Enter"&&!B.shiftKey&&(B.preventDefault(),jn())},[jn]),Fa=i.useCallback(B=>{B.key==="Enter"&&!B.shiftKey&&(B.preventDefault(),Vt())},[Vt]),Ur=i.useRef(null);if(i.useEffect(()=>{if(!m)return;const B=De=>{De.key==="Escape"&&s()};return document.addEventListener("keydown",B),()=>document.removeEventListener("keydown",B)},[m,s]),!m)return null;const Hr=()=>g?t.jsxs("div",{className:"mission-detail",children:[t.jsxs("div",{className:"mission-detail__header",children:[t.jsxs("div",{className:"mission-detail__title-row",children:[t.jsxs("div",{className:"mission-detail__title-text",children:[Or&&t.jsx("span",{className:"mission-detail__autopilot-dot",title:"Autopilot watching"}),t.jsx("h3",{className:"mission-detail__title",children:g.title})]}),t.jsx("span",{className:"mission-status-badge",style:{backgroundColor:(tl[g.status]||tl.planning).bg,color:(tl[g.status]||tl.planning).text},children:g.status})]}),g.description&&t.jsx("div",{className:"mission-detail__description",children:gr(g.description)}),t.jsx("div",{className:"mission-detail__meta",children:t.jsxs("span",{className:"mission-detail__meta-info",children:[g.milestones.length," milestones"]})}),t.jsxs("section",{className:"mission-detail__run-settings","aria-label":"Mission run settings",children:[t.jsx("h4",{className:"mission-detail__run-settings-title",children:"Mission run settings"}),t.jsxs("div",{className:"mission-detail__autopilot",children:[t.jsxs("div",{className:"mission-detail__autopilot-toggle",children:[t.jsxs("label",{className:"mission-toggle","data-testid":"mission-autopilot-toggle",children:[t.jsx("input",{type:"checkbox",checked:g.autopilotEnabled??!1,onChange:B=>Da(g.id,B.target.checked),"aria-label":"Autopilot"}),t.jsx("span",{className:"mission-toggle__track","aria-hidden":"true",children:t.jsx("span",{className:"mission-toggle__thumb"})}),t.jsxs("span",{className:"mission-toggle__label",children:[t.jsx(Bs,{size:14,className:"mission-detail__autopilot-icon"}),"Autopilot"]})]}),t.jsxs("span",{className:"mission-status-badge mission-status-badge--sm",style:{backgroundColor:(Sc[Li]||Sc.inactive).bg,color:(Sc[Li]||Sc.inactive).text},"data-testid":"autopilot-state-badge",children:[Or&&t.jsx("span",{className:"mission-detail__autopilot-pulse"}),IF(Li)]})]}),t.jsx("span",{className:"mission-detail__autopilot-description",children:"When on, Fusion automatically activates the next slice and plans its features as work completes."}),sa&&t.jsx("span",{className:"mission-detail__autopilot-activity mission-relative-time",children:sa})]}),t.jsxs("div",{className:"mission-detail__actions",children:[t.jsxs("div",{className:"mission-detail__run-controls",children:[g.status==="active"&&t.jsxs("button",{className:"mission-btn mission-btn--danger",onClick:()=>Lr(g.id),title:"Stop mission","aria-label":"Stop mission",children:[t.jsx(ca,{size:14}),t.jsx("span",{children:"Stop mission"})]}),g.status==="blocked"&&t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:()=>Dr(g.id),title:"Resume mission","aria-label":"Resume mission",children:[t.jsx(Os,{size:14}),t.jsx("span",{children:"Resume mission"})]}),g.status==="planning"&&t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:()=>$a(g.id),title:"Start mission","aria-label":"Start mission",children:[t.jsx(Os,{size:14}),t.jsx("span",{children:"Start mission"})]}),Ec(g.status)&&t.jsx("span",{className:"mission-detail__run-help",children:Ec(g.status)})]}),t.jsxs("div",{className:"mission-detail__management-actions",children:[t.jsx("button",{className:"mission-icon-btn",onClick:()=>_n(g),title:"Edit mission","aria-label":"Edit mission",children:t.jsx(xi,{size:14})}),t.jsx("button",{className:"mission-icon-btn mission-icon-btn--danger",onClick:()=>xe({type:"mission",id:g.id}),title:"Delete mission","aria-label":"Delete mission",children:t.jsx(es,{size:14})})]})]})]})]}),Y===g.id&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Mission title",value:_.title,onChange:B=>F({..._,title:B.target.value}),onKeyDown:Vn,autoFocus:!0}),t.jsx("textarea",{placeholder:"Description (optional)",value:_.description,onChange:B=>F({..._,description:B.target.value}),rows:2}),t.jsxs("label",{children:["Target branch",t.jsx("input",{type:"text",placeholder:"e.g. main",value:_.baseBranch,onChange:B=>F({..._,baseBranch:B.target.value}),"aria-label":"Mission target branch"})]}),t.jsxs("label",{children:["Branch strategy",t.jsxs("select",{value:_.branchStrategy.mode,onChange:B=>F({..._,branchStrategy:{mode:B.target.value,branchName:_.branchStrategy.branchName}}),"aria-label":"Mission branch strategy",children:[t.jsx("option",{value:"project-default",children:"Use project/default branch"}),t.jsx("option",{value:"auto-per-task",children:"Auto-name a branch per task (from details)"}),t.jsx("option",{value:"existing",children:"Use existing branch"}),t.jsx("option",{value:"custom-new",children:"Create custom branch"})]})]}),(_.branchStrategy.mode==="existing"||_.branchStrategy.mode==="custom-new")&&t.jsxs("label",{children:["Branch name",t.jsx("input",{type:"text",placeholder:"e.g. feature/mission-work",value:_.branchStrategy.branchName??"",onChange:B=>F({..._,branchStrategy:{..._.branchStrategy,branchName:B.target.value}}),"aria-label":"Mission branch name"})]}),t.jsxs("div",{className:"mission-form-card__row",children:[t.jsxs("select",{value:_.status,onChange:B=>F({..._,status:B.target.value}),children:[t.jsx("option",{value:"planning",children:"Planning"}),t.jsx("option",{value:"active",children:"Active"}),t.jsx("option",{value:"blocked",children:"Blocked"}),t.jsx("option",{value:"complete",children:"Complete"}),t.jsx("option",{value:"archived",children:"Archived"})]}),t.jsxs("label",{className:"mission-checkbox",children:[t.jsx("input",{type:"checkbox",checked:_.autopilotEnabled,onChange:B=>F({..._,autopilotEnabled:B.target.checked})}),t.jsx(Bs,{size:12})," Autopilot"]})]}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:an,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Update"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:Dn,children:"Cancel"})]})]}),t.jsxs("div",{className:"mission-detail__tabs",role:"tablist","aria-label":"Mission detail tabs",children:[t.jsx("button",{className:`mission-btn ${Lt==="structure"?"mission-btn--primary":"mission-btn--ghost"} mission-btn--sm mission-detail__tab`,onClick:()=>gn("structure"),role:"tab","aria-selected":Lt==="structure","data-testid":"mission-tab-structure",children:"Structure"}),t.jsxs("button",{className:`mission-btn ${Lt==="activity"?"mission-btn--primary":"mission-btn--ghost"} mission-btn--sm mission-detail__tab`,onClick:()=>gn("activity"),role:"tab","aria-selected":Lt==="activity","data-testid":"mission-tab-activity",children:["Activity (",kn,")"]})]}),Lt==="structure"?t.jsxs("div",{className:"mission-detail__milestones",children:[g.milestones.map(B=>{const De=ya?.rollup.milestoneId===B.id?ya:null,Ve=De?.rollup??Zn.get(B.id),kt=De?.validationTelemetry.validationRounds??[],zn=De?.fixFeatures??[],Gt=Yb[Ve?.state??"not_started"]??Yb.not_started,Yn=Ve&&(Ve.state==="blocked"||Ve.state==="failed")?De?.validationTelemetry.validationRounds.find(Ze=>Ze.blockedReason)?.blockedReason:void 0,us=B.slices.flatMap(Ze=>Ze.features).filter(Ze=>(Ze.acceptanceCriteria??"").trim().length>0);return t.jsxs("div",{className:"mission-milestone",children:[t.jsxs("div",{className:"mission-milestone__header",onClick:()=>wt(B.id),children:[t.jsx("button",{className:"mission-milestone__expand",children:z.has(B.id)?t.jsx(Ln,{size:16}):t.jsx(ps,{size:16})}),t.jsx(kr,{size:16,className:"mission-milestone__icon"}),t.jsx("span",{className:"mission-milestone__title",children:B.title}),t.jsx("span",{className:"mission-status-badge mission-status-badge--sm",style:{backgroundColor:Gb[B.status].bg,color:Gb[B.status].text},children:B.status}),t.jsxs("span",{className:"mission-milestone__count",children:[B.slices.length," slices"]}),t.jsx(Xb,{state:PF(B.interviewState)}),Ve&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"mission-status-badge mission-status-badge--sm",style:{backgroundColor:Gt.bg,color:Gt.text},title:"Validation state",children:Qb(Ve.state)}),Ve.totalAssertions>0&&t.jsx("div",{className:"mission-milestone__coverage-bar",title:`${Ve.passedAssertions??0} of ${Ve.totalAssertions} assertions passing`,children:t.jsx("div",{className:"mission-milestone__coverage-bar-fill",style:{width:`${(Ve.passedAssertions??0)/Ve.totalAssertions*100}%`,backgroundColor:(Ve.passedAssertions??0)===Ve.totalAssertions?"var(--color-success)":"var(--color-warning)"}})})]}),B.status!=="complete"&&t.jsx("button",{className:"mission-icon-btn",onClick:()=>Oe({type:"milestone",id:B.id,title:B.title}),title:"Plan milestone","aria-label":"Plan milestone",children:t.jsx(Ya,{size:14})}),t.jsxs("div",{className:"mission-milestone__actions",onClick:Ze=>Ze.stopPropagation(),children:[t.jsx("button",{className:"mission-icon-btn",onClick:()=>ut(B.id),title:"Add slice",children:t.jsx(os,{size:14})}),t.jsx("button",{className:"mission-icon-btn",onClick:()=>Is(B),title:"Edit milestone",children:t.jsx(xi,{size:14})}),t.jsx("button",{className:"mission-icon-btn mission-icon-btn--danger",onClick:()=>xe({type:"milestone",id:B.id}),title:"Delete milestone",children:t.jsx(es,{size:14})})]})]}),z.has(B.id)&&t.jsxs("div",{className:"mission-milestone__body",children:[B.acceptanceCriteria&&t.jsxs("div",{className:"mission-feature__criteria",children:[t.jsx("strong",{children:"Acceptance:"}),gr(B.acceptanceCriteria)]}),(Q||we===B.id)&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Milestone title",value:H.title,onChange:Ze=>ue({...H,title:Ze.target.value}),onKeyDown:ir,autoFocus:!0}),t.jsx("textarea",{placeholder:"Description (optional)",value:H.description,onChange:Ze=>ue({...H,description:Ze.target.value}),rows:2}),t.jsx("textarea",{placeholder:"Acceptance criteria (optional)",value:H.acceptanceCriteria,onChange:Ze=>ue({...H,acceptanceCriteria:Ze.target.value}),rows:2}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:V,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),we?"Update":"Create"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:ks,children:"Cancel"})]})]}),De&&t.jsxs("div",{className:"mission-validation-telemetry",children:[t.jsxs("div",{className:"mission-validation-telemetry__header",children:[t.jsx("span",{className:"mission-validation-telemetry__title",children:"Validation Telemetry"}),t.jsxs("span",{className:"mission-validation-telemetry__meta",children:[De.validationTelemetry.totalRuns," rounds",De.validationTelemetry.lastValidatorStatus?` · Last ${De.validationTelemetry.lastValidatorStatus}`:""]})]}),Yn&&t.jsxs("div",{className:"mission-blocked-reason",children:[t.jsx("strong",{children:"Blocked reason:"})," ",Yn]}),kt.length>0&&t.jsxs("div",{className:"mission-validation-rounds",children:[t.jsxs("button",{className:"mission-btn mission-btn--ghost mission-btn--sm mission-validation-rounds__toggle",onClick:()=>Jt(Ze=>!Ze),title:$t?"Hide validation rounds":"Show validation rounds",children:[$t?t.jsx(Ln,{size:12}):t.jsx(ps,{size:12}),"Validation rounds (",kt.length,")"]}),$t&&t.jsx("div",{className:"mission-validation-rounds__list",children:kt.map(Ze=>t.jsxs("div",{className:"mission-validation-round",children:[t.jsxs("div",{className:"mission-validation-round__header",children:[t.jsx("span",{className:`mission-status-badge mission-status-badge--sm mission-validation-round__status mission-validation-round__status--${Ze.validatorStatus}`,children:Ze.validatorStatus}),t.jsx("span",{className:"mission-validation-round__feature",children:Ze.featureTitle}),t.jsxs("span",{className:"mission-validation-round__attempts",children:["impl #",Ze.implementationAttempt," · reviewer #",Ze.validatorAttempt]})]}),t.jsxs("div",{className:"mission-validation-round__links",children:[t.jsx("span",{className:"mission-validation-round__label",children:"Failed assertions:"}),Ze.failedAssertionIds.length>0?t.jsx("div",{className:"mission-validation-round__chip-list",children:Ze.failedAssertionIds.map(dt=>t.jsx("button",{className:"mission-validation-round__link-chip",onClick:()=>Fs(dt),title:`Jump to assertion ${dt}`,children:dt},`${Ze.roundId}-${dt}`))}):t.jsx("span",{className:"mission-validation-round__empty",children:"None"})]}),t.jsxs("div",{className:"mission-validation-round__links",children:[t.jsx("span",{className:"mission-validation-round__label",children:"Generated fix features:"}),Ze.generatedFixFeatureIds.length>0?t.jsx("div",{className:"mission-validation-round__chip-list",children:Ze.generatedFixFeatureIds.map(dt=>t.jsx("button",{className:"mission-validation-round__link-chip",onClick:()=>_i(dt),title:`Jump to fix feature ${dt}`,children:dt},`${Ze.roundId}-${dt}`))}):t.jsx("span",{className:"mission-validation-round__empty",children:"None"})]}),Ze.blockedReason&&t.jsx("div",{className:"mission-validation-round__blocked-reason",children:Ze.blockedReason})]},Ze.roundId))})]}),zn.length>0&&t.jsxs("div",{className:"mission-fix-features",children:[t.jsx("div",{className:"mission-fix-features__title",children:"Generated Fix Features"}),t.jsx("div",{className:"mission-fix-features__list",children:zn.map(Ze=>t.jsxs("div",{className:"mission-fix-feature",children:[t.jsxs("div",{className:"mission-fix-feature__header",children:[t.jsx("button",{className:"mission-fix-feature__title",onClick:()=>_i(Ze.id),title:`Jump to feature ${Ze.id}`,children:Ze.title}),t.jsx("span",{className:"mission-status-badge mission-status-badge--sm",style:{backgroundColor:Nc[Ze.status].bg,color:Nc[Ze.status].text},children:Ze.status}),Ze.loopState&&t.jsx("span",{className:`mission-loop-state mission-loop-state--${Ze.loopState}`,children:Ze.loopState})]}),t.jsxs("div",{className:"mission-fix-feature__meta",children:[t.jsx("span",{children:"Source:"}),t.jsx("button",{className:"mission-validation-round__link-chip",onClick:()=>_i(Ze.sourceFeatureId),title:`Jump to source feature ${Ze.sourceFeatureId}`,children:Ze.sourceFeatureId}),t.jsx("span",{children:"Run:"}),t.jsx("span",{className:"mission-fix-feature__run",children:Ze.runId})]}),Ze.failedAssertionIds.length>0&&t.jsxs("div",{className:"mission-fix-feature__assertions",children:[t.jsx("span",{className:"mission-validation-round__label",children:"Failed assertions:"}),t.jsx("div",{className:"mission-validation-round__chip-list",children:Ze.failedAssertionIds.map(dt=>t.jsx("button",{className:"mission-validation-round__link-chip",onClick:()=>Fs(dt),title:`Jump to assertion ${dt}`,children:dt},`${Ze.id}-${dt}`))})]})]},Ze.id))})]})]}),t.jsxs("div",{className:"mission-slices",children:[B.slices.map(Ze=>t.jsxs("div",{className:"mission-slice",children:[t.jsxs("div",{className:"mission-slice__header",onClick:()=>Ps(Ze.id),children:[t.jsx("button",{className:"mission-slice__expand",children:oe.has(Ze.id)?t.jsx(Ln,{size:16}):t.jsx(ps,{size:16})}),t.jsx(_m,{size:16,className:"mission-slice__icon"}),t.jsx("span",{className:"mission-slice__title",children:Ze.title}),t.jsx("span",{className:"mission-status-badge mission-status-badge--sm",style:{backgroundColor:Kb[Ze.status].bg,color:Kb[Ze.status].text},children:Ze.status}),t.jsxs("span",{className:"mission-slice__count",children:[Ze.features?.length||0," features"]}),t.jsx(Xb,{state:Ze.planState??"not_started"}),Ze.status!=="complete"&&t.jsx("button",{className:"mission-icon-btn",onClick:()=>Oe({type:"slice",id:Ze.id,title:Ze.title}),title:"Plan slice","aria-label":"Plan slice",children:t.jsx(Ya,{size:14})}),t.jsxs("div",{className:"mission-slice__actions",onClick:dt=>dt.stopPropagation(),children:[Ze.status==="pending"&&t.jsx("button",{className:"mission-icon-btn mission-icon-btn--success",onClick:()=>vs(Ze.id),title:"Activate slice",children:t.jsx(Os,{size:14})}),Ze.status==="active"&&Ze.features?.some(dt=>dt.status==="defined")&&t.jsx("button",{className:"mission-icon-btn",onClick:()=>Us(Ze.id),title:"Triage all features",disabled:ae,children:ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Bs,{size:14})}),t.jsx("button",{className:"mission-icon-btn",onClick:()=>te(Ze.id),title:"Add feature",children:t.jsx(os,{size:14})}),t.jsx("button",{className:"mission-icon-btn",onClick:()=>Bt(Ze),title:"Edit slice",children:t.jsx(xi,{size:14})}),t.jsx("button",{className:"mission-icon-btn mission-icon-btn--danger",onClick:()=>xe({type:"slice",id:Ze.id}),title:"Delete slice",children:t.jsx(es,{size:14})})]})]}),oe.has(Ze.id)&&t.jsxs("div",{className:"mission-slice__body",children:[Ze.verification?.trim()&&t.jsxs("div",{className:"mission-feature__criteria",children:[t.jsx("strong",{children:"Verification:"}),gr(Ze.verification)]}),A&&ye===B.id&&!fe&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Slice title",value:se.title,onChange:dt=>ve({...se,title:dt.target.value}),onKeyDown:Oa,autoFocus:!0}),t.jsx("textarea",{placeholder:"Description (optional)",value:se.description,onChange:dt=>ve({...se,description:dt.target.value}),rows:2}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:jn,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Create"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:en,children:"Cancel"})]})]}),fe===Ze.id&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Slice title",value:se.title,onChange:dt=>ve({...se,title:dt.target.value}),onKeyDown:Oa,autoFocus:!0}),t.jsx("textarea",{placeholder:"Description (optional)",value:se.description,onChange:dt=>ve({...se,description:dt.target.value}),rows:2}),t.jsxs("select",{value:se.status,onChange:dt=>ve({...se,status:dt.target.value}),children:[t.jsx("option",{value:"pending",children:"Pending"}),t.jsx("option",{value:"active",children:"Active"}),t.jsx("option",{value:"complete",children:"Complete"})]}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:jn,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Update"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:en,children:"Cancel"})]})]}),t.jsxs("div",{className:"mission-features",children:[Ze.features?.map(dt=>t.jsxs("div",{className:"mission-feature","data-mission-feature-id":dt.id,children:[t.jsxs("div",{className:"mission-feature__header",children:[t.jsx("button",{className:"mission-feature__expand",onClick:()=>Pa(dt.id),title:tt===dt.id?"Collapse details":"Expand to show run history",children:tt===dt.id?t.jsx(Ln,{size:14}):t.jsx(ps,{size:14})}),t.jsx(km,{size:14,className:"mission-feature__icon"}),t.jsx("span",{className:"mission-feature__title",children:dt.title}),t.jsx("span",{className:"mission-status-badge mission-status-badge--sm",style:{backgroundColor:Nc[dt.status].bg,color:Nc[dt.status].text},children:dt.status}),dt.loopState&&dt.loopState!=="idle"&&t.jsxs("span",{className:`mission-loop-state mission-loop-state--${dt.loopState}`,title:`Loop state: ${dt.loopState}`,children:[dt.loopState==="implementing"&&"⏳",dt.loopState==="validating"&&"🔄",dt.loopState==="needs_fix"&&"🔧",dt.loopState==="passed"&&"✅",dt.loopState==="blocked"&&"🚫"]}),dt.generatedFromFeatureId&&t.jsx("button",{className:"mission-feature__lineage",onClick:()=>_i(dt.generatedFromFeatureId),title:`Generated from feature: ${dt.generatedFromFeatureId}`,children:"🔗 Fix"}),(dt.loopState==="validating"||dt.loopState==="needs_fix")&&(()=>{const sn=Fe.get(dt.id),Gn=Fr.get(dt.id),fs=sn?.implementationAttemptCount??Gn?.implementationAttempt??dt.implementationAttemptCount??0,Xn=sn?.retryBudgetRemaining??Math.max(0,MF-fs);return t.jsxs("span",{className:"mission-feature__retry-budget",title:"Implementation attempts and remaining retry budget",children:["Attempt ",fs," · ",Xn," ",Xn===1?"retry":"retries"," left"]})})(),dt.loopState==="implementing"&&t.jsx("button",{className:"mission-icon-btn mission-icon-btn--validate",onClick:()=>ei(dt.id),title:"Validate feature",disabled:Qt.has(dt.id),children:Qt.has(dt.id)?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Ls,{size:14})}),dt.taskId&&t.jsx("span",{className:"mission-feature__task-link",onClick:()=>o?.(dt.taskId),title:"Click to view task",children:dt.taskId}),t.jsxs("div",{className:"mission-feature__actions",children:[dt.status==="defined"&&!dt.taskId&&t.jsx("button",{className:"mission-icon-btn",onClick:()=>Kn(dt.id),title:"Triage — create task",disabled:ae||mt===dt.id,children:mt===dt.id?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Bs,{size:14})}),dt.taskId?t.jsx("button",{className:"mission-icon-btn",onClick:()=>Mn(dt.id),title:"Unlink task",children:t.jsx(zf,{size:14})}):dt.status!=="defined"?t.jsx("button",{className:"mission-icon-btn",onClick:()=>Xe(dt.id),title:"Link to task",children:t.jsx(wo,{size:14})}):null,t.jsx("button",{className:"mission-icon-btn",onClick:()=>Ie(dt),title:"Edit feature",children:t.jsx(xi,{size:14})}),t.jsx("button",{className:"mission-icon-btn mission-icon-btn--danger",onClick:()=>xe({type:"feature",id:dt.id}),title:"Delete feature",children:t.jsx(es,{size:14})})]})]}),dt.description&&t.jsx("div",{className:"mission-feature__description",children:gr(dt.description)}),dt.acceptanceCriteria&&t.jsxs("div",{className:"mission-feature__criteria",children:[t.jsx("strong",{children:"Acceptance:"}),gr(dt.acceptanceCriteria)]}),ht?.featureId===dt.id&&t.jsxs("div",{className:"mission-triage-preview",children:[t.jsx("div",{className:"mission-triage-preview__header",children:"Enriched Description Preview"}),t.jsx("div",{className:"mission-triage-preview__content",children:ht.enrichedDescription}),t.jsxs("div",{className:"mission-triage-preview__actions",children:[t.jsxs("button",{className:"btn btn-primary",onClick:ds,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):null,"Create Task"]}),t.jsx("button",{className:"btn",onClick:Jn,disabled:ae,children:"Cancel"})]})]}),ge===dt.id&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Feature title",value:He.title,onChange:sn=>Le({...He,title:sn.target.value}),onKeyDown:Fa,autoFocus:!0}),t.jsx("textarea",{placeholder:"Description (optional)",value:He.description,onChange:sn=>Le({...He,description:sn.target.value}),rows:2}),t.jsx("textarea",{placeholder:"Acceptance criteria (optional)",value:He.acceptanceCriteria,onChange:sn=>Le({...He,acceptanceCriteria:sn.target.value}),rows:2}),t.jsxs("select",{value:He.status,onChange:sn=>Le({...He,status:sn.target.value}),children:[t.jsx("option",{value:"defined",children:"Defined"}),t.jsx("option",{value:"triaged",children:"Triaged"}),t.jsx("option",{value:"in-progress",children:"In Progress"}),t.jsx("option",{value:"done",children:"Done"})]}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:Vt,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Update"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:ft,children:"Cancel"})]})]}),tt===dt.id&&t.jsxs("div",{className:"mission-feature__run-history",children:[t.jsx("div",{className:"mission-feature__run-history-header",children:t.jsx("span",{className:"mission-feature__run-history-title",children:"Validation Runs"})}),(vt.get(dt.id)??[]).map(sn=>t.jsxs("div",{className:"mission-run",children:[t.jsxs("div",{className:"mission-run__header",onClick:()=>Uo(sn.id),children:[t.jsx("span",{className:`mission-status-badge mission-status-badge--sm mission-run__status mission-run__status--${sn.status}`,title:sn.status,children:sn.status}),t.jsx("span",{className:"mission-run__time",children:new Date(sn.startedAt).toLocaleString()}),sn.completedAt&&t.jsxs("span",{className:"mission-run__duration",children:[Math.round((new Date(sn.completedAt).getTime()-new Date(sn.startedAt).getTime())/1e3),"s"]}),sn.triggerType&&t.jsx("span",{className:"mission-run__trigger",children:sn.triggerType}),t.jsx("button",{className:"mission-icon-btn",title:Zt===sn.id?"Hide details":"Show details",children:Zt===sn.id?t.jsx(Ln,{size:12}):t.jsx(ps,{size:12})})]}),Zt===sn.id&&Ge.get(sn.id)&&t.jsxs("div",{className:"mission-run__details",children:[sn.summary&&t.jsx("p",{className:"mission-run__summary",children:sn.summary}),sn.blockedReason&&t.jsxs("p",{className:"mission-run__blocked-reason",children:[t.jsx("strong",{children:"Blocked:"})," ",sn.blockedReason]}),Ge.get(sn.id)?.failures&&Ge.get(sn.id).failures.length>0&&t.jsxs("div",{className:"mission-run__failures",children:[t.jsx("span",{className:"mission-run__failures-title",children:"Failed Assertions:"}),Ge.get(sn.id).failures.map(Gn=>t.jsxs("div",{className:"mission-run__failure",children:[t.jsx("span",{className:"mission-run__failure-message",children:Gn.message}),Gn.expected&&t.jsxs("span",{className:"mission-run__failure-expected",children:["Expected: ",Gn.expected]}),Gn.actual&&t.jsxs("span",{className:"mission-run__failure-actual",children:["Actual: ",Gn.actual]})]},Gn.id))]}),(!Ge.get(sn.id)?.failures||Ge.get(sn.id).failures.length===0)&&t.jsx("p",{className:"mission-run__no-failures",children:"No assertion failures"})]})]},sn.id)),(!vt.get(dt.id)||vt.get(dt.id).length===0)&&t.jsx("div",{className:"mission-run-history__empty",children:"No validation runs yet."})]})]},dt.id)),de&&Pe===Ze.id&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Feature title",value:He.title,onChange:dt=>Le({...He,title:dt.target.value}),onKeyDown:Fa,autoFocus:!0}),t.jsx("textarea",{placeholder:"Description (optional)",value:He.description,onChange:dt=>Le({...He,description:dt.target.value}),rows:2}),t.jsx("textarea",{placeholder:"Acceptance criteria (optional)",value:He.acceptanceCriteria,onChange:dt=>Le({...He,acceptanceCriteria:dt.target.value}),rows:2}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:Vt,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Create"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:ft,children:"Cancel"})]})]}),!de&&(!Ze.features||Ze.features.length===0)&&t.jsxs("div",{className:"mission-manager__empty mission-features__empty",children:[t.jsx(km,{size:16}),t.jsx("span",{children:"No fix features generated."})]})]})]})]},Ze.id)),B.slices.length===0&&!A&&t.jsxs("div",{className:"mission-manager__empty",children:[t.jsx(_m,{size:16}),t.jsx("span",{children:"No slices yet"})]}),t.jsxs("div",{className:"mission-assertions",children:[t.jsxs("div",{className:"mission-assertions__header",children:[t.jsx("span",{className:"mission-assertions__title",children:"Assertions"}),Ve&&t.jsx("span",{className:"mission-status-badge mission-status-badge--sm",style:{backgroundColor:Gt.bg,color:Gt.text},children:Qb(Ve.state)}),Ve&&Ve.totalAssertions>0&&t.jsx("div",{className:"mission-assertions__coverage-bar",title:`${Ve.passedAssertions??0} of ${Ve.totalAssertions} assertions passing`,children:t.jsx("div",{className:"mission-assertions__coverage-bar-fill",style:{width:`${(Ve.passedAssertions??0)/Ve.totalAssertions*100}%`,backgroundColor:(Ve.passedAssertions??0)===Ve.totalAssertions?"var(--color-success)":"var(--color-warning)"}})}),t.jsx("button",{className:"mission-icon-btn",onClick:()=>{Kt(!0),Dt(null),Wt({title:"",assertion:"",status:"pending"})},title:"Add assertion",children:t.jsx(os,{size:14})})]}),Mt&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Assertion title",value:nt.title,onChange:Ze=>Wt({...nt,title:Ze.target.value}),autoFocus:!0}),t.jsx("textarea",{placeholder:"Assertion text (what should be true when complete)",value:nt.assertion,onChange:Ze=>Wt({...nt,assertion:Ze.target.value}),rows:2}),t.jsxs("select",{value:nt.status,onChange:Ze=>Wt({...nt,status:Ze.target.value}),children:[t.jsx("option",{value:"pending",children:"Pending"}),t.jsx("option",{value:"passed",children:"Passed"}),t.jsx("option",{value:"failed",children:"Failed"}),t.jsx("option",{value:"blocked",children:"Blocked"})]}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:()=>Ue(B.id),disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Create"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:cn,children:"Cancel"})]})]}),t.jsxs("div",{className:"mission-assertions__list",children:[(Array.isArray(gt.get(B.id))?gt.get(B.id):[]).map(Ze=>t.jsxs("div",{className:"mission-assertion","data-mission-assertion-id":Ze.id,children:[t.jsx("div",{className:"mission-assertion__header",children:Ft===Ze.id?t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Assertion title",value:nt.title,onChange:dt=>Wt({...nt,title:dt.target.value}),autoFocus:!0}),t.jsx("textarea",{placeholder:"Assertion text",value:nt.assertion,onChange:dt=>Wt({...nt,assertion:dt.target.value}),rows:2}),t.jsxs("select",{value:nt.status,onChange:dt=>Wt({...nt,status:dt.target.value}),children:[t.jsx("option",{value:"pending",children:"Pending"}),t.jsx("option",{value:"passed",children:"Passed"}),t.jsx("option",{value:"failed",children:"Failed"}),t.jsx("option",{value:"blocked",children:"Blocked"})]}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:()=>Un(Ze.id,B.id),disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Save"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:cn,children:"Cancel"})]})]}):t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"mission-status-badge mission-status-badge--sm",style:{backgroundColor:(Cc[Ze.status]??Cc.pending).bg,color:(Cc[Ze.status]??Cc.pending).text},children:Ze.status}),t.jsx("span",{className:"mission-assertion__title",children:Ze.title}),(()=>{const sn=Sn.get(Ze.id)?.length??0;return sn>0?t.jsxs("span",{className:"mission-assertion__linked-count",title:`${sn} linked feature${sn!==1?"s":""}`,children:["(",sn," linked)"]}):null})(),t.jsx("button",{className:"mission-icon-btn",onClick:()=>$s(Ze.id),title:"Toggle details",children:xn===Ze.id?t.jsx(Ln,{size:14}):t.jsx(ps,{size:14})}),t.jsx("button",{className:"mission-icon-btn",onClick:()=>Ht(Ze),title:"Edit assertion",children:t.jsx(xi,{size:14})}),t.jsx("button",{className:"mission-icon-btn mission-icon-btn--danger",onClick:()=>xe({type:"assertion",id:Ze.id}),title:"Delete assertion",children:t.jsx(es,{size:14})})]})}),xn===Ze.id&&t.jsxs("div",{className:"mission-assertion__body",children:[t.jsx("p",{className:"mission-assertion__text",children:Ze.assertion}),t.jsxs("div",{className:"mission-assertion__linked-features",children:[t.jsxs("div",{className:"mission-assertion__linked-features-header",children:[t.jsx("span",{className:"mission-assertion__linked-features-label",children:"Linked Features"}),t.jsxs("button",{className:"mission-btn mission-btn--ghost mission-btn--sm",onClick:async()=>{xn!==Ze.id&&await $s(Ze.id),mn(pn===Ze.id?null:Ze.id)},title:"Link a feature",children:[t.jsx(wo,{size:12}),"Link Feature"]})]}),pn===Ze.id&&t.jsx("div",{className:"mission-assertion__feature-picker",children:t.jsx("div",{className:"mission-assertion__feature-picker-dropdown",children:(()=>{const dt=new Set((Sn.get(Ze.id)??[]).map(Gn=>Gn.id)),sn=[];return g?.milestones.forEach(Gn=>Gn.slices.forEach(fs=>sn.push(...fs.features.filter(Xn=>!dt.has(Xn.id))))),sn.length===0?t.jsx("span",{className:"mission-assertion__feature-picker-empty",children:"All features already linked"}):sn.map(Gn=>t.jsxs("button",{className:"mission-assertion__feature-picker-item",onClick:()=>js(Gn.id,Ze.id),disabled:On.has(Ze.id),children:[t.jsx("span",{className:"mission-assertion__feature-picker-title",children:Gn.title}),On.has(Ze.id)&&t.jsx(Ct,{size:12,className:"spinner"})]},Gn.id))})()})}),(()=>{const dt=Sn.get(Ze.id)??[];return dt.length===0?t.jsx("span",{className:"mission-assertion__linked-empty",children:"No features linked yet"}):dt.map(sn=>{const Gn=`${sn.id}-${Ze.id}`,fs=tn.has(Gn);return t.jsxs("div",{className:"mission-assertion__linked-feature",children:[t.jsx("span",{className:"mission-assertion__linked-feature-title",children:sn.title}),t.jsx("button",{className:"mission-icon-btn mission-icon-btn--danger",onClick:()=>Zs(sn.id,Ze.id),disabled:fs,title:"Unlink feature",children:fs?t.jsx(Ct,{size:12,className:"spinner"}):t.jsx(zf,{size:12})})]},sn.id)})})()]})]})]},Ze.id)),(!gt.get(B.id)||gt.get(B.id)?.length===0)&&!Mt&&(us.length>0?t.jsxs("div",{className:"mission-assertions__list","data-testid":"milestone-feature-acceptance-rollup",children:[t.jsx("span",{className:"mission-assertions__title",children:"Completion criteria (from features)"}),us.map(Ze=>t.jsxs("div",{className:"mission-assertion",children:[t.jsx("span",{className:"mission-assertion__title",children:Ze.title}),t.jsxs("div",{className:"mission-assertion__text",children:[t.jsx("strong",{children:"Acceptance:"}),gr(Ze.acceptanceCriteria??"")]})]},Ze.id))]}):B.acceptanceCriteria?.trim()?null:t.jsx("div",{className:"mission-manager__empty mission-assertions__empty",children:t.jsx("span",{children:"No assertions defined. Add one to define completion criteria."})}))]})]})]})]})]},B.id)}),g&&!Q&&we===null&&t.jsxs("button",{className:"mission-add-btn",onClick:ws,children:[t.jsx(os,{size:16}),"Add Milestone"]}),Q&&we===null&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Milestone title",value:H.title,onChange:B=>ue({...H,title:B.target.value}),onKeyDown:ir,autoFocus:!0}),t.jsx("textarea",{placeholder:"Description (optional)",value:H.description,onChange:B=>ue({...H,description:B.target.value}),rows:2}),t.jsx("textarea",{placeholder:"Acceptance criteria (optional)",value:H.acceptanceCriteria,onChange:B=>ue({...H,acceptanceCriteria:B.target.value}),rows:2}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:V,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Create"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:ks,children:"Cancel"})]})]}),g.milestones.length===0&&!Q&&t.jsxs("div",{className:"mission-manager__empty",children:[t.jsx(kr,{size:24}),t.jsx("span",{children:"No milestones yet. Add one to get started."})]})]}):t.jsxs("div",{className:"mission-detail__activity","data-testid":"mission-activity-tab",children:[t.jsxs("div",{className:"mission-detail__activity-controls",children:[t.jsxs("label",{className:"mission-detail__activity-filter",children:[t.jsx("span",{children:"Filter"}),t.jsxs("select",{value:cs,onChange:B=>ys(B.target.value),"data-testid":"mission-activity-filter",children:[t.jsx("option",{value:"all",children:"All events"}),t.jsx("option",{value:"errors",children:"Errors & warnings"}),t.jsx("option",{value:"state_changes",children:"State changes"}),t.jsx("option",{value:"tasks",children:"Task events"}),t.jsx("option",{value:"slices",children:"Slice & milestone events"}),t.jsx("option",{value:"autopilot",children:"Autopilot events"})]})]}),t.jsxs("span",{className:"mission-detail__activity-count",children:[Bn.length," of ",kn]})]}),!bs&&na&&t.jsx("div",{className:"mission-detail__activity-load-more mission-detail__activity-load-more--top",children:t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:zr,"data-testid":"mission-activity-load-more",children:"Load more"})}),bs?t.jsxs("div",{className:"mission-manager__loading mission-detail__activity-loading",children:[t.jsx(Ct,{size:18,className:"spinner"}),t.jsx("span",{children:"Loading mission activity..."})]}):Bn.length===0?t.jsxs("div",{className:"mission-manager__empty",children:[t.jsx(fi,{size:18}),t.jsx("span",{children:"No events yet."})]}):t.jsxs("div",{ref:bt,className:"mission-events","data-testid":"mission-activity-events",children:[Bn.map(B=>{const De=!!(B.metadata&&Object.keys(B.metadata).length>0),Ve=xs.has(B.id);return t.jsxs("div",{className:"mission-event",children:[t.jsxs("div",{className:"mission-event__header",children:[t.jsx("span",{className:`mission-event__type ${zF(B.eventType)}`,children:BF(B.eventType)}),t.jsx("span",{className:"mission-event__time",children:md(B.timestamp)})]}),t.jsx("p",{className:"mission-event__description",children:B.description}),t.jsx("span",{className:"mission-event__timestamp",children:new Date(B.timestamp).toLocaleString()}),De&&t.jsxs("div",{className:"mission-event__metadata",children:[t.jsxs("button",{className:"mission-btn mission-btn--ghost mission-btn--sm",onClick:()=>Br(B.id),"data-testid":`mission-event-metadata-${B.id}`,children:[Ve?"Hide":"Show"," metadata"]}),Ve&&t.jsx("pre",{className:"mission-event__metadata-content",children:JSON.stringify(B.metadata,null,2)})]})]},B.id)}),t.jsx("div",{ref:ot})]})]})]}):null,wa=B=>{Nt(B),pe(!0)},ka=()=>{Ut.current=Be??null,Nt(void 0),pe(!1)},qr=async B=>{try{await cM(B,r),it(De=>De.filter(Ve=>Ve.id!==B))}catch(De){if(De instanceof Nr&&De.status===409){a("Draft is open in another tab","error");return}if(De instanceof Nr&&De.status===404){it(Ve=>Ve.filter(kt=>kt.id!==B));return}a(Ce(De)||"Failed to discard draft","error");return}finally{xe(null)}},Vr=()=>Ae.map(B=>{const De=B.status==="error",Ve=B.status==="generating",kt=TF(B.status);return t.jsxs("div",{className:"mission-list__item mission-list__item--interview",role:"button",tabIndex:0,"aria-label":`Resume interview ${B.title||"Mission interview"}`,onClick:()=>wa(B.id),onKeyDown:zn=>{if(zn.currentTarget===zn.target){if(zn.key==="Enter"){wa(B.id);return}zn.key===" "&&(zn.preventDefault(),wa(B.id))}},children:[t.jsxs("div",{className:"mission-list__item-content",children:[t.jsxs("div",{className:"mission-list__item-header",children:[t.jsx(Ls,{size:16,className:"mission-list__item-icon"}),t.jsx("span",{className:"mission-list__item-title",children:B.title||"Mission interview"})]}),t.jsx("div",{className:"mission-list__item-tags",children:t.jsx("span",{className:`mission-status-badge mission-status-badge--sm mission-interview-status mission-interview-status--${B.status}`,children:AF(B.status)})}),t.jsx("p",{className:"mission-list__item-description",children:Ve?"Generating mission hierarchy from interview context.":De?"Interview hit an error. Retry from this list item.":"Interview is waiting for your next response."})]}),t.jsxs("div",{className:"mission-list__item-actions mission-list__resume-actions",onClick:zn=>zn.stopPropagation(),children:[t.jsxs("button",{className:"mission-btn mission-btn--ghost mission-btn--sm",onClick:()=>wa(B.id),title:kt,"aria-label":kt,disabled:Ve,children:[Ve?t.jsx(Ct,{size:14,className:"spinner"}):De?t.jsx(Ss,{size:14}):t.jsx(Ls,{size:14}),t.jsx("span",{children:Ve?"Generating…":De?"Retry":"Resume"})]}),t.jsxs("button",{className:"mission-btn mission-btn--danger mission-btn--sm",onClick:()=>xe({type:"interview_draft",id:B.id}),title:"Discard draft","aria-label":"Discard draft",children:[t.jsx(es,{size:14}),t.jsx("span",{children:"Discard"})]})]})]},B.id)}),ar=(B,De)=>B.map(Ve=>{const kt=Ve,zn=g?.id===kt.id,Gt=tl[kt.status]||{bg:"",text:""},Yn=kt.summary,us=Ke.get(kt.id),Ze=LF(us),dt=!!(Yn&&(Yn.totalMilestones>0||Yn.totalFeatures>0)),sn=us?.totalTasks??0,Gn=us?.tasksCompleted??0,fs=us?.tasksFailed??0,Xn=us?.estimatedCompletionPercent??Yn?.progressPercent??0,ms=dt||sn>0||fs>0||!!us?.lastActivityAt,Fn=De?.interviewStyle===!0;return t.jsxs("div",{className:`mission-list__item ${zn?"mission-list__item--selected":""} ${Fn?"mission-list__item--interview":""}`,role:"button",tabIndex:0,"aria-label":`Open mission ${kt.title}`,"aria-pressed":zn,onClick:()=>La(Ve),onKeyDown:Vs=>{if(Vs.currentTarget===Vs.target){if(Vs.key==="Enter"){La(Ve);return}Vs.key===" "&&(Vs.preventDefault(),La(Ve))}},children:[t.jsxs("div",{className:"mission-list__item-content",children:[t.jsxs("div",{className:"mission-list__item-header",children:[t.jsx(Ys,{size:16,className:"mission-list__item-icon"}),t.jsx("span",{className:"mission-list__item-title",children:kt.title})]}),t.jsxs("div",{className:"mission-list__item-tags",children:[Ve.autopilotEnabled&&t.jsx("span",{title:"Autopilot enabled",children:t.jsx(Bs,{size:12,className:"mission-list__item-autopilot-icon"})}),t.jsx("span",{className:`mission-health-badge mission-health-badge--${Ze}`,"data-testid":`mission-health-badge-${kt.id}`,"aria-label":`Mission health: ${Ze}`}),t.jsx("span",{className:"mission-status-badge mission-status-badge--sm",style:{backgroundColor:Gt.bg,color:Gt.text},children:kt.status}),Fn&&t.jsx("span",{className:"mission-status-badge mission-status-badge--sm mission-interview-status mission-interview-status--awaiting_input",children:"Interview in progress"})]}),Fn?t.jsx("p",{className:"mission-list__item-description",children:"Mission interview is still in progress. Open this mission to continue planning."}):kt.description?t.jsx("div",{className:"mission-list__item-description",children:gr(kt.description)}):null,ms&&t.jsxs("div",{className:"mission-list__item-summary",children:[dt&&t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:"mission-list__item-stat",children:[Yn.completedMilestones,"/",Yn.totalMilestones," milestones"]}),t.jsxs("span",{className:"mission-list__item-stat",children:[Yn.completedFeatures,"/",Yn.totalFeatures," features"]})]}),t.jsxs("span",{className:"mission-list__item-stat","data-testid":`mission-task-stats-${kt.id}`,children:[Gn,"/",sn," tasks"]}),fs>0&&t.jsxs("button",{className:"mission-list__item-failed",onClick:Vs=>{Vs.stopPropagation(),La(Ve)},"data-testid":`mission-failed-${kt.id}`,title:"View mission failures",children:[fs," failed"]}),t.jsx("div",{className:`mission-list__item-progress mission-list__item-progress--${Ze}`,children:t.jsx("div",{className:"mission-list__item-progress-bar",style:{width:`${Xn}%`}})})]}),ms&&t.jsx("div",{className:"mission-list__item-activity",children:t.jsxs("span",{className:"mission-relative-time","data-testid":`mission-last-activity-${kt.id}`,children:["Activity ",md(us?.lastActivityAt)]})})]}),t.jsxs("div",{className:"mission-list__item-actions",onClick:Vs=>Vs.stopPropagation(),children:[t.jsxs("div",{className:"mission-list__item-run-controls",children:[kt.status==="active"&&t.jsxs("button",{className:"mission-btn mission-btn--danger mission-btn--sm",onClick:()=>Lr(kt.id),title:"Stop mission","aria-label":"Stop mission",children:[t.jsx(ca,{size:14}),t.jsx("span",{children:"Stop mission"})]}),kt.status==="blocked"&&t.jsxs("button",{className:"mission-btn mission-btn--primary mission-btn--sm",onClick:()=>Dr(kt.id),title:"Resume mission","aria-label":"Resume mission",children:[t.jsx(Os,{size:14}),t.jsx("span",{children:"Resume mission"})]}),kt.status==="planning"&&t.jsxs("button",{className:"mission-btn mission-btn--primary mission-btn--sm",onClick:()=>$a(kt.id),title:"Start mission","aria-label":"Start mission",children:[t.jsx(Os,{size:14}),t.jsx("span",{children:"Start mission"})]}),Ec(kt.status)&&t.jsx("span",{className:"mission-list__item-run-help",children:Ec(kt.status)})]}),t.jsx("button",{className:"mission-icon-btn",onClick:()=>_n(Ve),title:"Edit mission","aria-label":"Edit mission",children:t.jsx(xi,{size:14})}),t.jsx("button",{className:"mission-icon-btn mission-icon-btn--danger",onClick:()=>xe({type:"mission",id:kt.id}),title:"Delete mission","aria-label":"Delete mission",children:t.jsx(es,{size:14})})]})]},kt.id)}),rr=({hideBottomButtons:B=!1}={})=>{const De=x.filter(Gt=>Gt.interviewState==="in_progress"),Ve=x.filter(Gt=>Gt.interviewState!=="in_progress"),kt=I&&x.length>0&&!D,zn=!B&&!kt;return t.jsxs("div",{className:"mission-list",children:[D&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Mission title",value:_.title,onChange:Gt=>F({..._,title:Gt.target.value}),onKeyDown:Vn,autoFocus:!0}),t.jsx("textarea",{placeholder:"Description (optional)",value:_.description,onChange:Gt=>F({..._,description:Gt.target.value}),rows:2}),t.jsxs("label",{children:["Target branch",t.jsx("input",{type:"text",placeholder:"e.g. main",value:_.baseBranch,onChange:Gt=>F({..._,baseBranch:Gt.target.value}),"aria-label":"Mission target branch"})]}),t.jsxs("label",{children:["Branch strategy",t.jsxs("select",{value:_.branchStrategy.mode,onChange:Gt=>F({..._,branchStrategy:{mode:Gt.target.value,branchName:_.branchStrategy.branchName}}),"aria-label":"Mission branch strategy",children:[t.jsx("option",{value:"project-default",children:"Use project/default branch"}),t.jsx("option",{value:"auto-per-task",children:"Auto-name a branch per task (from details)"}),t.jsx("option",{value:"existing",children:"Use existing branch"}),t.jsx("option",{value:"custom-new",children:"Create custom branch"})]})]}),(_.branchStrategy.mode==="existing"||_.branchStrategy.mode==="custom-new")&&t.jsxs("label",{children:["Branch name",t.jsx("input",{type:"text",placeholder:"e.g. feature/mission-work",value:_.branchStrategy.branchName??"",onChange:Gt=>F({..._,branchStrategy:{..._.branchStrategy,branchName:Gt.target.value}}),"aria-label":"Mission branch name"})]}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:an,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Create"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:Dn,children:"Cancel"})]})]}),kt&&t.jsx("div",{className:"mission-list__top-action",children:t.jsxs("button",{className:"btn btn-sm btn-task-create mission-list__primary-cta",onClick:()=>pe(!0),children:[t.jsx(Ls,{size:14}),"Plan New Mission"]})}),Ae.length>0&&t.jsxs("div",{className:"mission-list__drafts-group",children:[t.jsxs("div",{className:"mission-list__drafts-header",children:[t.jsx(Ls,{size:16,className:"mission-list__item-icon"}),t.jsx("span",{children:"Drafts"}),t.jsxs("span",{children:["(",Ae.length,")"]})]}),Vr()]}),ar(De,{interviewStyle:!0}),ar(Ve),Y&&t.jsxs("div",{className:"mission-form-card",children:[t.jsx("input",{type:"text",placeholder:"Mission title",value:_.title,onChange:Gt=>F({..._,title:Gt.target.value}),onKeyDown:Vn,autoFocus:!0}),t.jsx("textarea",{placeholder:"Description (optional)",value:_.description,onChange:Gt=>F({..._,description:Gt.target.value}),rows:2}),t.jsxs("label",{children:["Target branch",t.jsx("input",{type:"text",placeholder:"e.g. main",value:_.baseBranch,onChange:Gt=>F({..._,baseBranch:Gt.target.value}),"aria-label":"Mission target branch"})]}),t.jsxs("label",{children:["Branch strategy",t.jsxs("select",{value:_.branchStrategy.mode,onChange:Gt=>F({..._,branchStrategy:{mode:Gt.target.value,branchName:_.branchStrategy.branchName}}),"aria-label":"Mission branch strategy",children:[t.jsx("option",{value:"project-default",children:"Use project/default branch"}),t.jsx("option",{value:"auto-per-task",children:"Auto-name a branch per task (from details)"}),t.jsx("option",{value:"existing",children:"Use existing branch"}),t.jsx("option",{value:"custom-new",children:"Create custom branch"})]})]}),(_.branchStrategy.mode==="existing"||_.branchStrategy.mode==="custom-new")&&t.jsxs("label",{children:["Branch name",t.jsx("input",{type:"text",placeholder:"e.g. feature/mission-work",value:_.branchStrategy.branchName??"",onChange:Gt=>F({..._,branchStrategy:{..._.branchStrategy,branchName:Gt.target.value}}),"aria-label":"Mission branch name"})]}),t.jsxs("div",{className:"mission-form-card__row",children:[t.jsxs("select",{value:_.status,onChange:Gt=>F({..._,status:Gt.target.value}),children:[t.jsx("option",{value:"planning",children:"Planning"}),t.jsx("option",{value:"active",children:"Active"}),t.jsx("option",{value:"blocked",children:"Blocked"}),t.jsx("option",{value:"complete",children:"Complete"}),t.jsx("option",{value:"archived",children:"Archived"})]}),t.jsxs("label",{className:"mission-checkbox",children:[t.jsx("input",{type:"checkbox",checked:_.autopilotEnabled,onChange:Gt=>F({..._,autopilotEnabled:Gt.target.checked})}),t.jsx(Bs,{size:12})," Autopilot"]})]}),t.jsxs("div",{className:"mission-form-card__actions",children:[t.jsxs("button",{className:"mission-btn mission-btn--primary",onClick:an,disabled:ae,children:[ae?t.jsx(Ct,{size:14,className:"spinner"}):t.jsx(Js,{size:14}),"Update"]}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:Dn,children:"Cancel"})]})]}),x.length===0&&Ae.length===0&&De.length===0&&!D&&t.jsxs("div",{className:"mission-manager__empty mission-manager__empty--large mission-manager__empty--mission",children:[t.jsx(Ys,{size:32}),t.jsx("h3",{className:"mission-manager__empty-title",children:"No missions yet"}),t.jsx("p",{className:"mission-manager__empty-body",children:"Missions are large initiatives that bundle milestones, slices, and features into a single plan. Plan a mission to break down a goal end-to-end and let agents work through it autopilot-style."}),t.jsxs("button",{className:"btn btn-sm btn-primary mission-manager__empty-cta",onClick:()=>pe(!0),children:[t.jsx(Ls,{size:14}),"Plan New Mission"]})]}),!D&&t.jsx("div",{className:"mission-list__footer",children:zn&&t.jsx("div",{className:"mission-list__footer-actions",children:t.jsxs("button",{className:"mission-add-btn",onClick:()=>pe(!0),children:[t.jsx(Ls,{size:16}),"Plan New Mission"]})})})]})},or=()=>{const B=Te?.type==="interview_draft";return t.jsx("div",{className:"mission-confirm-panel mission-confirm-panel--danger",children:t.jsxs("div",{className:"mission-confirm-panel__content",children:[t.jsx("p",{children:B?"Discard this interview draft? This removes the saved draft and cannot be undone.":`Delete this ${Te?.type}? This cannot be undone.`}),t.jsxs("div",{className:"mission-confirm-panel__actions",children:[t.jsx("button",{className:"mission-btn mission-btn--danger",onClick:async()=>{Te&&(Te.type==="mission"?await En(Te.id):Te.type==="milestone"?await We(Te.id):Te.type==="slice"?await ts(Te.id):Te.type==="feature"?await qt(Te.id):Te.type==="interview_draft"&&await qr(Te.id))},children:B?"Discard":"Delete"}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:()=>xe(null),children:"Cancel"})]})]})})},lr=()=>t.jsx("div",{className:"mission-confirm-panel mission-confirm-panel--link",children:t.jsxs("div",{className:"mission-confirm-panel__content",children:[t.jsx("p",{children:"Link feature to task:"}),t.jsx("input",{type:"text",placeholder:"Task ID (e.g., FN-001)",value:At,onChange:B=>at(B.target.value),autoFocus:!0}),l.length>0&&t.jsxs("div",{className:"mission-task-suggestions",children:[t.jsx("small",{children:"Or select:"}),t.jsx("div",{className:"mission-task-suggestions__list",children:l.slice(0,5).map(B=>t.jsxs("button",{className:"mission-task-suggestions__item",onClick:()=>at(B.id),children:[B.id,": ",B.title||"Untitled"]},B.id))})]}),t.jsxs("div",{className:"mission-confirm-panel__actions",children:[t.jsx("button",{className:"mission-btn mission-btn--primary",onClick:ln,children:"Link"}),t.jsx("button",{className:"mission-btn mission-btn--ghost",onClick:()=>{Xe(null),at("")},children:"Cancel"})]})]})}),cr=t.jsxs("div",{ref:Ur,className:`mission-manager mission-manager--desktop${n?" mission-manager--inline":""}`,role:n?void 0:"dialog","aria-modal":n?void 0:!0,"aria-label":n?void 0:"Mission Manager","data-testid":"mission-manager-dialog",children:[t.jsxs("div",{className:`mission-manager__header${n?" mission-manager__header--inline":""}`,children:[t.jsxs("div",{className:"mission-manager__header-title",children:[g&&t.jsx("button",{className:"mission-manager__back-btn",onClick:_s,title:"Back to missions","aria-label":"Back to missions list","data-testid":"mission-back-btn",children:t.jsx(wd,{size:18})}),t.jsx(Ys,{size:18,className:"mission-manager__header-icon"}),t.jsxs("h2",{className:"mission-manager__title","data-testid":"mission-header-title",children:[t.jsx("span",{className:"mission-manager__title-text mission-manager__title-text--desktop",children:"Missions"}),t.jsx("span",{className:"mission-manager__title-text mission-manager__title-text--mobile",children:g?g.title:"Missions"})]})]}),!n&&t.jsx("button",{className:"modal-close",onClick:s,title:"Close","aria-label":"Close Mission Manager","data-testid":"mission-close-btn",children:t.jsx(Nn,{size:18})})]}),I?t.jsxs("div",{className:"mission-manager__body mission-manager__body--stacked",children:[N?t.jsxs("div",{className:"mission-manager__loading",children:[t.jsx(Ct,{size:24,className:"spinner"}),t.jsx("span",{children:"Loading missions..."})]}):S?t.jsxs("div",{className:"mission-manager__loading",children:[t.jsx(Ct,{size:24,className:"spinner"}),t.jsx("span",{children:"Loading mission details..."})]}):g?Hr():rr(),Te&&or(),qe&&lr()]}):t.jsxs("div",{className:"mission-manager__split",children:[t.jsxs("aside",{className:"mission-manager__sidebar","data-testid":"mission-sidebar","aria-label":"Mission list",style:I?void 0:{width:`${M}px`},children:[t.jsx("div",{className:"mission-manager__sidebar-list",children:N?t.jsxs("div",{className:"mission-manager__loading",children:[t.jsx(Ct,{size:24,className:"spinner"}),t.jsx("span",{children:"Loading missions..."})]}):rr({hideBottomButtons:!0})}),t.jsx("div",{className:"mission-manager__sidebar-footer","data-testid":"mission-sidebar-footer",children:t.jsxs("button",{className:"btn btn-primary mission-manager__sidebar-cta",onClick:()=>pe(!0),title:"Plan New Mission","aria-label":"Plan New Mission",children:[t.jsx(Ls,{size:14}),"Plan New Mission"]})})]}),!I&&t.jsx("div",{className:"mission-manager__sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":kc,"aria-valuemax":jc,"aria-valuenow":M,"aria-label":"Resize mission sidebar",tabIndex:0,onPointerDown:P,onKeyDown:T}),t.jsxs("div",{className:"mission-manager__detail-pane",children:[S?t.jsxs("div",{className:"mission-manager__loading",children:[t.jsx(Ct,{size:24,className:"spinner"}),t.jsx("span",{children:"Loading mission details..."})]}):g?Hr():t.jsxs("div",{className:"mission-manager__detail-pane-empty","data-testid":"mission-empty-detail",children:[t.jsx(Ys,{size:32}),t.jsx("span",{children:"Select a mission to view details"})]}),Te&&or(),qe&&lr()]})]})]}),Mi=t.jsx(bF,{isOpen:Se,onClose:ka,onMissionCreated:()=>{Xt(),a("Mission created from AI interview","success")},projectId:r,resumeSessionId:Be}),ia=Z?t.jsx(CF,{isOpen:!0,onClose:()=>Oe(null),onApplied:()=>{Oe(null),g&&zt(g.id)},targetType:Z.type,targetId:Z.id,targetTitle:Z.title,missionContext:g?.title,projectId:r,resumeSessionId:Z.resumeSessionId}):null;return n?t.jsxs(t.Fragment,{children:[cr,Mi,ia]}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"mission-manager-overlay open",onClick:B=>B.target===B.currentTarget&&s(),"data-testid":"mission-manager-overlay",role:"dialog","aria-modal":"true",children:cr}),Mi,ia]})}const VF={p:({children:e,...n})=>t.jsx("p",{...n,children:ai(e)}),li:({children:e,...n})=>t.jsx("li",{...n,children:ai(e)}),pre:({children:e,...n})=>t.jsx("pre",{...n,className:"mailbox-markdown-pre",children:e}),table:({children:e,...n})=>t.jsx("table",{...n,className:"mailbox-markdown-table",children:e}),a:({children:e,...n})=>t.jsx("a",{...n,target:"_blank",rel:"noopener noreferrer",children:e})},nx=i.memo(function({content:n,className:s,testId:a}){const r=s?`mailbox-markdown ${s}`:"mailbox-markdown";return t.jsx("div",{className:r,"data-testid":a,children:t.jsx(ji,{remarkPlugins:[Ni],components:VF,children:n})})}),WF=40,GF=320;function sx(e,n){return Math.max(n.min,Math.min(e,n.max))}function Pl({value:e,minHeight:n=WF,maxHeight:s=GF,deps:a=[]}){const r=i.useRef(null),o=i.useCallback(()=>{const c=r.current;c&&(c.style.height="auto",c.style.height=`${sx(c.scrollHeight,{min:n,max:s})}px`)},[s,n]),l=i.useCallback(c=>{r.current=c,c&&(c.style.height="auto",c.style.height=`${sx(c.scrollHeight,{min:n,max:s})}px`)},[s,n]);return i.useLayoutEffect(()=>{o()},[o,e,...a]),{ref:l,resize:o}}const _c=2e3;function ix({recipient:e,replyContext:n,agents:s=[],projectId:a,onSend:r,onCancel:o,addToast:l,isLoadingAgents:c=!1}){const[d,u]=i.useState(e?.id??""),[h,m]=i.useState(e?.type??"agent"),[f,p]=i.useState(""),[b,v]=i.useState(!1),[x,y]=i.useState(!1),[g,j]=i.useState(null),N=i.useRef(null),{ref:C}=Pl({value:f,minHeight:68,maxHeight:640}),w=i.useCallback(T=>{N.current=T,C(T)},[C]),S=i.useMemo(()=>s.find(T=>T.id===d),[s,d]),R=i.useMemo(()=>e?s.find(T=>T.id===e.id):void 0,[s,e]),I=h==="agent",E=I&&S?.runtimeConfig?.messageResponseMode==="immediate",M=I&&(b||E),G=d.trim()!==""&&f.trim().length>0&&f.length<=_c,U=i.useCallback(async()=>{if(!(!G||x)){y(!0),j(null);try{const T=h==="agent"?"user-to-agent":"system",D=n?{replyTo:{messageId:n.messageId}}:void 0,W=M;await IM({toId:d.trim(),toType:h,content:f.trim(),type:T,...D?{metadata:D}:{},...W?{wakeImmediately:!0}:{}},a),r()}catch(T){const D=Ce(T)||"Failed to send message";j(D),l?.(D,"error")}finally{y(!1)}}},[G,x,d,h,f,M,n,a,r,l]),P=i.useCallback(T=>{u(T),m("agent")},[]);return i.useEffect(()=>{n&&N.current?.focus()},[n]),i.useEffect(()=>{if(!n||typeof window>"u"||window.visualViewport==null)return;const T=()=>{N.current?.scrollIntoView({block:"center",behavior:"auto"})};return window.visualViewport.addEventListener("resize",T),()=>{window.visualViewport?.removeEventListener("resize",T)}},[n]),t.jsxs("div",{className:"message-composer","data-testid":"message-composer",children:[t.jsxs("div",{className:"message-composer-header",children:[t.jsx("span",{children:n?"Reply":"New Message"}),t.jsx("button",{className:"btn-icon",onClick:o,"aria-label":"Cancel","data-testid":"message-composer-cancel",children:t.jsx(Nn,{size:16})})]}),t.jsxs("div",{className:"message-composer-body",children:[!e&&t.jsxs("div",{className:"message-composer-field",children:[t.jsx("label",{className:"message-composer-label",htmlFor:"message-recipient",children:"To:"}),t.jsxs("select",{id:"message-recipient",className:"message-composer-select",value:d,onChange:T=>P(T.target.value),disabled:c||s.length===0,"data-testid":"message-composer-recipient",children:[t.jsx("option",{value:"",children:c?"Loading agents…":s.length===0?"No agents available":"Select agent…"}),s.map(T=>t.jsx("option",{value:T.id,children:T.name||T.id},T.id))]})]}),e&&t.jsxs("div",{className:"message-composer-field",children:[t.jsx("span",{className:"message-composer-label",children:"To:"}),t.jsxs("span",{className:"message-composer-recipient-fixed",children:[t.jsx(As,{size:14}),R?.name||e.id]})]}),n&&t.jsxs("div",{className:"message-composer-field","data-testid":"message-composer-reply-context",children:[t.jsx("span",{className:"message-composer-label",children:"Replying to:"}),t.jsx("span",{className:"message-composer-recipient-fixed",children:n.preview?.trim()?n.preview:`Message ${n.messageId}`})]}),t.jsxs("div",{className:"message-composer-field message-composer-field--content",children:[t.jsx("label",{className:"message-composer-label",htmlFor:"message-content",children:"Message:"}),t.jsx("textarea",{id:"message-content",ref:w,className:"message-composer-textarea",placeholder:"Type your message…",value:f,onChange:T=>p(T.target.value),maxLength:_c,"data-testid":"message-composer-content"}),t.jsx("div",{className:"message-composer-charcount","data-testid":"message-composer-charcount",children:t.jsxs("span",{className:f.length>_c?"over-limit":"",children:[f.length,"/",_c]})})]}),I&&t.jsx("div",{className:"message-composer-field message-composer-field--wake",children:t.jsxs("label",{className:"message-composer-wake-label",children:[t.jsx("input",{type:"checkbox",checked:M,disabled:E,onChange:T=>v(T.target.checked),"data-testid":"message-composer-wake"}),t.jsxs("span",{children:["Wake agent immediately",t.jsx("span",{className:"message-composer-wake-hint","data-testid":"message-composer-wake-hint",children:E?"(agent is already set to immediate response mode)":"(one-off override for this message only)"})]})]})}),g&&t.jsxs("div",{className:"message-composer-error","data-testid":"message-composer-error",children:[t.jsx(oi,{size:14}),t.jsx("span",{children:g})]})]}),t.jsxs("div",{className:"message-composer-footer",children:[t.jsx("button",{className:"btn btn-sm btn-secondary",onClick:o,"data-testid":"message-composer-cancel-btn",children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:U,disabled:!G||x,"data-testid":"message-composer-send",children:x?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:14,className:"spin"}),t.jsx("span",{children:"Sending…"})]}):t.jsxs(t.Fragment,{children:[t.jsx(vr,{size:14}),t.jsx("span",{children:"Send"})]})})]})]})}function hd(e){return typeof e=="string"&&e.trim().length>0?e:null}function KF(e){if(!e)return{url:null,sha256:null};const n=e.assets;if(!n||typeof n!="object")return{url:null,sha256:null};const s=Object.values(n)[0];if(!s||typeof s!="object")return{url:null,sha256:null};const a=s;return{url:hd(a.url),sha256:hd(a.sha256)}}function JF({targetAction:e}){const n=e.context,s=hd(n?.version),a=hd(n?.installPath)??e.resourceId,{url:r,sha256:o}=KF(n);return t.jsxs("section",{className:"card worktrunk-install-approval-details","data-testid":"worktrunk-install-approval-details",children:[t.jsx("h4",{className:"worktrunk-install-approval-details__title",children:"Worktrunk install request"}),t.jsxs("dl",{className:"worktrunk-install-approval-details__list",children:[t.jsxs("div",{className:"worktrunk-install-approval-details__row",children:[t.jsx("dt",{children:"Version"}),t.jsx("dd",{children:s??"Unknown"})]}),t.jsxs("div",{className:"worktrunk-install-approval-details__row",children:[t.jsx("dt",{children:"Asset URL"}),t.jsx("dd",{children:r??"Unknown"})]}),t.jsxs("div",{className:"worktrunk-install-approval-details__row",children:[t.jsx("dt",{children:"SHA-256"}),t.jsx("dd",{children:o??"Unknown"})]}),t.jsxs("div",{className:"worktrunk-install-approval-details__row",children:[t.jsx("dt",{children:"Install path"}),t.jsx("dd",{children:a??"Unknown"})]})]})]})}const li="__all_agents__",fd=280,oh=.65,Zu=16,ax=320;function lh(e){return Math.max(fd,e*oh)}function em(e,n){const s=lh(n);return Math.min(Math.max(e,fd),s)}function rx(e){try{const n=ns("kb-dashboard-mailbox-sidebar-width",e);if(!n)return ax;const s=Number(n);if(Number.isFinite(s)&&s>0)return s}catch{}return ax}function Sa(e){const n=new Date(e),a=new Date().getTime()-n.getTime(),r=Math.floor(a/6e4),o=Math.floor(a/36e5),l=Math.floor(a/864e5);return r<1?"Just now":r<60?`${r}m ago`:o<24?`${o}h ago`:l<7?`${l}d ago`:n.toLocaleDateString(void 0,{month:"short",day:"numeric"})}function YF(e,n,s){if(n==="user")return e==="dashboard"?"You":`User: ${e}`;if(n==="agent"){const a=s?.get(e)?.trim();return a?a===e?`Agent: ${e}`:`Agent: ${a} (${e})`:`Agent: ${e}`}return"System"}function XF(e){switch(e){case"agent-to-agent":return"Agent ↔ Agent";case"agent-to-user":return"Agent → You";case"user-to-agent":return"You → Agent";case"system":return"System"}}function ox(e,n=80){return e.length<=n?e:`${e.slice(0,n)}…`}function lx(){if(typeof window>"u")return null;const n=new URLSearchParams(window.location.search).get("mailbox-message");return n||(/^#message-(.+)$/.exec(window.location.hash)?.[1]??null)}function nl(e){return`mailbox-list-message-${e}`}function tm(e){return`mailbox-detail-message-${e}`}function QF(e,n){const s=[...e];s.some(o=>o.id===n.id)||s.push(n);const a=new Set([n.id]);let r=!0;for(;r;){r=!1;for(const o of s){const l=o.metadata?.replyTo?.messageId;a.has(o.id)&&l&&!a.has(l)&&(a.add(l),r=!0),l&&a.has(l)&&!a.has(o.id)&&(a.add(o.id),r=!0)}}return s.filter(o=>a.has(o.id)).sort((o,l)=>new Date(o.createdAt).getTime()-new Date(l.createdAt).getTime())}function ZF({projectId:e,addToast:n,onUnreadCountChange:s}){const[a,r]=i.useState("inbox"),[o,l]=i.useState(null),[c,d]=i.useState(null),[u,h]=i.useState(0),[m,f]=i.useState(!1),[p,b]=i.useState(null),[v,x]=i.useState([]),[y,g]=i.useState(!1),[j,N]=i.useState(null),[C,w]=i.useState(null),[S,R]=i.useState(li),[I,E]=i.useState("inbox"),[M,G]=i.useState(null),[U,P]=i.useState(null),[T,D]=i.useState([]),[W,Y]=i.useState("pending"),[L,_]=i.useState([]),[F,ae]=i.useState(0),[k,z]=i.useState(null),[J,oe]=i.useState(""),[le,we]=i.useState(!1),re=i.useMemo(()=>new Map(T.map(Z=>[Z.id,Z.name??""])),[T]),H=i.useCallback((Z,Oe)=>YF(Z,Oe,re),[re]),Q=$i()==="mobile",be=!Q,[fe,O]=i.useState(()=>rx(e)),se=i.useRef(null),{keyboardOverlap:ve,viewportHeight:A,viewportOffsetTop:ne,keyboardOpen:ye}=Ia({enabled:Q}),ee=i.useMemo(()=>{if(ye)return{"--keyboard-overlap":`${ve}px`,"--vv-offset-top":`${ne}px`,...A!=null?{"--vv-height":`${A}px`}:{}}},[ye,ve,A,ne]);i.useEffect(()=>{O(rx(e))},[e]),i.useEffect(()=>{if(!be)return;const Z=se.current?.clientWidth;Z&&O(Oe=>em(Oe,Z))},[be]),i.useEffect(()=>{if(be)try{Ns("kb-dashboard-mailbox-sidebar-width",String(fe),e)}catch{}},[be,e,fe]);const ge=i.useCallback(Z=>{if(!be)return;Z.preventDefault();const Oe=se.current;if(!Oe)return;const ht=Oe.getBoundingClientRect(),je=Et=>{const Te=Et.clientX-ht.left;O(em(Te,ht.width))},mt=()=>{window.removeEventListener("mousemove",je),window.removeEventListener("mouseup",mt)};window.addEventListener("mousemove",je),window.addEventListener("mouseup",mt)},[be]),Ne=i.useCallback(Z=>{if(!be)return;const Oe=se.current?.clientWidth??0,ht=fe/oh+Zu,je=Math.max(Oe,ht),mt=lh(je);if(Z.key==="ArrowLeft"||Z.key==="ArrowRight"){Z.preventDefault();const Et=Z.key==="ArrowLeft"?-Zu:Zu;O(Te=>em(Te+Et,je));return}if(Z.key==="Home"){Z.preventDefault(),O(fd);return}Z.key==="End"&&(Z.preventDefault(),O(mt))},[be,fe]),He=i.useCallback(async()=>{f(!0);try{const Z=await AM({limit:50},e);l(Z),h(Z.unreadCount),s?.(Z.unreadCount)}catch{}finally{f(!1)}},[e,s]),Le=i.useCallback(async()=>{f(!0);try{const Z=await TM({limit:50},e);d(Z)}catch{}finally{f(!1)}},[e]),de=i.useCallback(async Z=>{f(!0);try{const Oe=await OM(Z,e);G(Oe)}catch{}finally{f(!1)}},[e]),Re=i.useCallback(async()=>{f(!0);try{const Z=await FM(e);P(Z)}catch{}finally{f(!1)}},[e]),Pe=i.useCallback(async()=>{try{const Z=await Qa(void 0,e);D(Z)}catch{}},[e]),rt=i.useCallback(async()=>{try{const Z=await xy(e);h(Z.unreadCount),ae(Z.pendingApprovalCount??0),s?.(Z.unreadCount)}catch{}},[e,s]),qe=i.useCallback(async Z=>{f(!0);try{const Oe=await ac({status:Z==="pending"?"pending":void 0,limit:100},e);if(Z==="pending")_(Oe.requests);else{const[ht,je,mt]=await Promise.all([ac({status:"approved",limit:100},e),ac({status:"denied",limit:100},e),ac({status:"completed",limit:100},e)]);_([...ht.requests,...je.requests,...mt.requests].sort((Et,Te)=>Te.updatedAt.localeCompare(Et.updatedAt)))}ae(Oe.pendingCount)}catch{}finally{f(!1)}},[e]);i.useEffect(()=>{a==="inbox"?He():a==="outbox"?Le():a==="agents"?Pe():a==="approvals"&&qe(W)},[a,He,Le,Pe,qe,W]),i.useEffect(()=>{if(S===li){Re();return}de(S)},[S,de,Re]),i.useEffect(()=>{rt()},[rt]),i.useEffect(()=>{Pe()},[Pe]),i.useEffect(()=>{if(typeof EventSource>"u")return;const Z=e?`?projectId=${encodeURIComponent(e)}`:"",Oe=()=>{rt(),a==="inbox"?He():a==="outbox"?Le():a==="approvals"&&qe(W),S===li?Re():S&&de(S)};return Si(`/api/events${Z}`,{events:{"message:sent":Oe,"message:received":Oe,"message:read":Oe,"message:deleted":Oe,"approval:requested":Oe,"approval:updated":Oe,"approval:decided":Oe}})},[e,a,S,rt,He,Le,de,Re,qe,W]);const Xe=i.useCallback(async Z=>{if(b(Z),!Z.read&&a==="inbox")try{const Oe=await PM(Z.id,e);Oe&&l(je=>je&&{...je,messages:je.messages.map(mt=>mt.id===Oe.id?Oe:mt),unreadCount:Math.max(0,je.unreadCount-1)});const ht=Math.max(0,u-1);h(ht),s?.(ht)}catch{}try{const Oe=await LM(Z.fromId,Z.fromType,e);x(Oe)}catch{x([Z])}},[e,u,s,a]);i.useEffect(()=>{const Z=lx();if(!Z)return;const Oe=[...o?.messages??[],...c?.messages??[],...M?.inbox??[],...M?.outbox??[],...U?.messages??[],...v].find(ht=>ht.id===Z);Oe&&Xe(Oe)},[o,c,M,U,v,Xe]),i.useEffect(()=>{const Z=lx();if(!Z)return;const Oe=document.getElementById(tm(Z));if(!Oe)return;Oe.scrollIntoView({behavior:"smooth",block:"center"}),Oe.classList.add("mailbox-message-highlight");const ht=window.setTimeout(()=>{Oe.classList.remove("mailbox-message-highlight")},2e3);return()=>{window.clearTimeout(ht)}},[p,v]);const At=i.useCallback(()=>{b(null),x([])},[]),at=i.useCallback(async()=>{try{const Z=await $M(e);h(0),s?.(0),l(Oe=>Oe&&{...Oe,messages:Oe.messages.map(ht=>({...ht,read:!0})),unreadCount:0}),n?.(`Marked ${Z.markedAsRead} messages as read`,"success")}catch{n?.("Failed to mark messages as read","error")}},[e,n,s]),Se=i.useCallback(async Z=>{try{await DM(Z,e),b(null),x([]),a==="inbox"?He():a==="outbox"?Le():S===li?Re():S&&de(S),n?.("Message deleted","success")}catch{n?.("Failed to delete message","error")}},[e,a,S,He,Le,de,Re,n]),pe=i.useCallback(Z=>{N({id:Z.fromId,type:Z.fromType}),w({messageId:Z.id,preview:ox(Z.content,120)}),g(!0)},[]),_e=i.useCallback(()=>{g(!1),N(null),w(null),n?.("Message sent","success"),a==="outbox"?Le():a==="agents"&&S===li?Re():a==="agents"&&S&&de(S),rt()},[a,Le,S,de,Re,n,rt]),et=i.useCallback(()=>{N(a==="agents"&&S&&S!==li?{id:S,type:"agent"}:null),w(null),g(!0)},[a,S]),Ae=i.useCallback(()=>{g(!1),N(null),w(null)},[]),it=i.useCallback(async Z=>{try{const Oe=await jp(Z.id,e);z(Oe),oe("")}catch{n?.("Failed to load approval request","error")}},[e,n]),xt=i.useCallback(async Z=>{if(!(!k||le)){we(Z);try{await zM(k.id,{decision:Z,comment:J||void 0},e),await qe(W);const Oe=await jp(k.id,e);z(Oe),oe(""),n?.(`Request ${Z==="approve"?"approved":"denied"}`,"success")}catch{n?.("Failed to submit decision","error")}finally{we(!1)}}},[k,le,J,e,qe,W,n]),Nt=()=>{if(!p||y)return null;const Z=QF(v,p);return t.jsxs("div",{className:"mailbox-message-detail","data-testid":"mailbox-message-detail",id:tm(p.id),children:[t.jsxs("div",{className:"mailbox-message-detail-header",children:[Q&&t.jsx("button",{className:"btn btn-sm btn-secondary",onClick:At,"data-testid":"mailbox-back-to-list",children:"← Back"}),t.jsxs("div",{className:"mailbox-message-detail-meta",children:[t.jsx("span",{className:"mailbox-message-type",children:XF(p.type)}),t.jsx("span",{className:"mailbox-message-time",children:Sa(p.createdAt)})]}),t.jsxs("div",{className:"mailbox-message-detail-actions",children:[p.fromType==="agent"&&t.jsxs("button",{className:"btn btn-sm btn-secondary",onClick:()=>pe(p),"data-testid":"mailbox-reply",children:[t.jsx(fa,{size:14}),t.jsx("span",{children:"Reply"})]}),t.jsxs("button",{className:"btn btn-sm btn-secondary",onClick:()=>Se(p.id),"data-testid":"mailbox-delete",children:[t.jsx(es,{size:14}),t.jsx("span",{children:"Delete"})]})]})]}),t.jsxs("div",{className:"mailbox-message-participants",children:[t.jsxs("div",{className:"mailbox-participant",children:[t.jsx("span",{className:"mailbox-participant-label",children:"From:"}),t.jsxs("span",{className:"mailbox-participant-value",children:[p.fromType==="agent"?t.jsx(As,{size:14}):t.jsx(mr,{size:14}),H(p.fromId,p.fromType)]})]}),t.jsxs("div",{className:"mailbox-participant",children:[t.jsx("span",{className:"mailbox-participant-label",children:"To:"}),t.jsxs("span",{className:"mailbox-participant-value",children:[p.toType==="agent"?t.jsx(As,{size:14}):t.jsx(mr,{size:14}),H(p.toId,p.toType)]})]})]}),Z.length>1&&t.jsxs("div",{className:"mailbox-conversation","data-testid":"mailbox-conversation",children:[t.jsx("div",{className:"mailbox-conversation-label",children:"Conversation"}),Z.map(Oe=>{const ht=Oe.metadata?.replyTo?.messageId,je=ht?Z.find(mt=>mt.id===ht):void 0;return t.jsxs("div",{id:tm(Oe.id),className:`mailbox-conversation-msg ${Oe.id===p.id?"current":""}`,children:[t.jsxs("div",{className:"mailbox-conversation-msg-header",children:[t.jsx("span",{children:H(Oe.fromId,Oe.fromType)}),t.jsx("span",{className:"mailbox-message-time",children:Sa(Oe.createdAt)})]}),ht&&t.jsxs("div",{className:"mailbox-reply-context-static","data-testid":`mailbox-reply-context-${Oe.id}`,children:["↪ Replying to ",je?ox(je.content,60):`message ${ht}`]}),t.jsx(nx,{content:Oe.content,className:"mailbox-conversation-msg-body"})]},Oe.id)})]}),Z.length<=1&&t.jsxs(t.Fragment,{children:[p.metadata?.replyTo?.messageId&&t.jsxs("div",{className:"mailbox-reply-context-static","data-testid":"mailbox-selected-reply-context",children:["↪ Replying to message ",p.metadata.replyTo.messageId]}),t.jsx(nx,{content:p.content,className:"mailbox-message-body",testId:"mailbox-message-body"})]})]})},Ut=()=>t.jsxs(t.Fragment,{children:[a==="inbox"&&t.jsxs("div",{className:"mailbox-list","data-testid":"mailbox-inbox-list",children:[m&&!o&&t.jsx(Mc,{}),o&&o.messages.length===0&&t.jsxs("div",{className:"mailbox-empty","data-testid":"mailbox-inbox-empty",children:[t.jsx(Va,{size:32}),t.jsx("p",{children:"No messages in your inbox"})]}),o?.messages.map(Z=>t.jsxs("div",{id:nl(Z.id),className:`mailbox-item ${Z.read?"":"unread"}`,onClick:()=>Xe(Z),"data-testid":`mailbox-item-${Z.id}`,children:[t.jsx("div",{className:"mailbox-item-avatar",children:Z.fromType==="agent"?t.jsx(As,{size:16}):t.jsx(mr,{size:16})}),t.jsxs("div",{className:"mailbox-item-content",children:[t.jsxs("div",{className:"mailbox-item-header",children:[t.jsx("span",{className:"mailbox-item-from",children:H(Z.fromId,Z.fromType)}),t.jsx("span",{className:"mailbox-item-time",children:Sa(Z.createdAt)})]}),t.jsxs("div",{className:"mailbox-item-preview",children:[Z.content.slice(0,80),Z.content.length>80?"…":""]})]}),!Z.read&&t.jsx("div",{className:"mailbox-item-unread-dot","data-testid":`mailbox-unread-dot-${Z.id}`})]},Z.id))]}),a==="outbox"&&t.jsxs("div",{className:"mailbox-list","data-testid":"mailbox-outbox-list",children:[m&&!c&&t.jsx(Mc,{}),c&&c.messages.length===0&&t.jsxs("div",{className:"mailbox-empty","data-testid":"mailbox-outbox-empty",children:[t.jsx(vr,{size:32}),t.jsx("p",{children:"No sent messages"})]}),c?.messages.map(Z=>t.jsxs("div",{id:nl(Z.id),className:"mailbox-item",onClick:()=>Xe(Z),"data-testid":`mailbox-item-${Z.id}`,children:[t.jsx("div",{className:"mailbox-item-avatar",children:Z.toType==="agent"?t.jsx(As,{size:16}):t.jsx(mr,{size:16})}),t.jsxs("div",{className:"mailbox-item-content",children:[t.jsxs("div",{className:"mailbox-item-header",children:[t.jsxs("span",{className:"mailbox-item-to",children:["To: ",H(Z.toId,Z.toType)]}),t.jsx("span",{className:"mailbox-item-time",children:Sa(Z.createdAt)})]}),t.jsxs("div",{className:"mailbox-item-preview",children:[Z.content.slice(0,80),Z.content.length>80?"…":""]})]})]},Z.id))]}),a==="approvals"&&t.jsxs("div",{className:"mailbox-approvals","data-testid":"mailbox-approvals",children:[t.jsxs("div",{className:"mailbox-approval-filters","data-testid":"mailbox-approval-filters",children:[t.jsx("button",{className:`btn btn-sm btn-secondary mailbox-agent-subtab ${W==="pending"?"active":""}`,onClick:()=>{Y("pending"),z(null)},"data-testid":"mailbox-approval-filter-pending",children:"Pending"}),t.jsx("button",{className:`btn btn-sm btn-secondary mailbox-agent-subtab ${W==="history"?"active":""}`,onClick:()=>{Y("history"),z(null)},"data-testid":"mailbox-approval-filter-history",children:"History"})]}),t.jsxs("div",{className:"mailbox-list","data-testid":"mailbox-approval-list",children:[L.length===0&&!m&&t.jsxs("div",{className:"mailbox-empty","data-testid":"mailbox-approval-empty",children:[t.jsx(Va,{size:32}),t.jsx("p",{children:W==="pending"?"No pending approvals":"No historical approvals"})]}),L.map(Z=>t.jsxs("div",{className:"mailbox-item mailbox-approval-item",onClick:()=>void it(Z),"data-testid":`mailbox-approval-item-${Z.id}`,children:[t.jsx("div",{className:`status-dot mailbox-approval-status-dot mailbox-approval-status-dot--${Z.status}`}),t.jsxs("div",{className:"mailbox-item-content",children:[t.jsxs("div",{className:"mailbox-item-header",children:[t.jsxs("span",{className:"mailbox-item-from",children:[Z.agentId," · ",Z.actionCategory]}),t.jsx("span",{className:"mailbox-item-time",children:Sa(Z.createdAt)})]}),t.jsx("div",{className:"mailbox-item-preview",children:Z.actionSummary})]}),t.jsx("span",{className:`mailbox-approval-status mailbox-approval-status--${Z.status}`,children:Z.status})]},Z.id))]})]}),a==="agents"&&t.jsx("div",{className:"mailbox-agents","data-testid":"mailbox-agents",children:T.length===0?t.jsxs("div",{className:"mailbox-empty",children:[t.jsx(As,{size:32}),t.jsx("p",{children:"No agents found"})]}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"mailbox-agents-header",children:[t.jsx("div",{className:"mailbox-agents-dropdown",children:t.jsxs("select",{className:"message-composer-select mailbox-agent-select",value:S,onChange:Z=>{R(Z.target.value),E("inbox")},"data-testid":"mailbox-agent-select",children:[t.jsx("option",{value:li,children:"All agents"}),T.map(Z=>t.jsx("option",{value:Z.id,children:Z.name||Z.id},Z.id))]})}),t.jsxs("button",{className:"btn btn-sm btn-secondary mailbox-compose-btn",onClick:et,"data-testid":"mailbox-compose-btn",children:[t.jsx(fa,{size:14}),t.jsx("span",{children:"Compose"})]})]}),S&&S!==li&&t.jsxs("div",{className:"mailbox-agent-subtabs","data-testid":"mailbox-agent-subtabs",children:[t.jsxs("button",{className:`btn btn-sm btn-secondary mailbox-agent-subtab ${I==="inbox"?"active":""}`,onClick:()=>E("inbox"),"data-testid":"mailbox-agent-subtab-inbox",children:[t.jsx(Va,{size:12}),t.jsx("span",{children:"Inbox"}),M&&M.unreadCount>0&&t.jsx("span",{className:"mailbox-tab-badge",children:M.unreadCount})]}),t.jsxs("button",{className:`btn btn-sm btn-secondary mailbox-agent-subtab ${I==="outbox"?"active":""}`,onClick:()=>E("outbox"),"data-testid":"mailbox-agent-subtab-outbox",children:[t.jsx(vr,{size:12}),t.jsx("span",{children:"Outbox"})]})]}),t.jsxs("div",{className:"mailbox-agents-content",children:[S===li&&m&&!U&&t.jsx(Mc,{}),S===li&&U&&U.messages.length===0&&t.jsxs("div",{className:"mailbox-empty",children:[t.jsx(Va,{size:32}),t.jsx("p",{children:"No agent-to-agent messages"})]}),S===li&&U&&U.messages.map(Z=>t.jsxs("div",{id:nl(Z.id),className:`mailbox-item ${Z.read?"":"unread"}`,onClick:()=>Xe(Z),"data-testid":`mailbox-item-${Z.id}`,children:[t.jsx("div",{className:"mailbox-item-avatar",children:Z.fromType==="agent"?t.jsx(As,{size:16}):t.jsx(mr,{size:16})}),t.jsxs("div",{className:"mailbox-item-content",children:[t.jsxs("div",{className:"mailbox-item-header",children:[t.jsx("span",{className:"mailbox-item-from",children:H(Z.fromId,Z.fromType)}),t.jsx("span",{className:"mailbox-item-time",children:Sa(Z.createdAt)})]}),t.jsxs("div",{className:"mailbox-item-participants","data-testid":`mailbox-item-participants-${Z.id}`,children:[t.jsxs("span",{children:["From: ",H(Z.fromId,Z.fromType)]}),t.jsxs("span",{children:["To: ",H(Z.toId,Z.toType)]})]}),t.jsxs("div",{className:"mailbox-item-preview",children:[Z.content.slice(0,80),Z.content.length>80?"…":""]})]})]},Z.id)),S&&S!==li&&m&&!M&&t.jsx(Mc,{}),S&&S!==li&&M&&I==="inbox"&&M.inbox.length===0&&t.jsxs("div",{className:"mailbox-empty",children:[t.jsx(Va,{size:32}),t.jsx("p",{children:"No received messages for this agent"})]}),S&&S!==li&&M&&I==="outbox"&&M.outbox.length===0&&t.jsxs("div",{className:"mailbox-empty",children:[t.jsx(vr,{size:32}),t.jsx("p",{children:"No sent messages for this agent"})]}),S&&S!==li&&M&&I==="inbox"&&M.inbox.map(Z=>t.jsxs("div",{id:nl(Z.id),className:`mailbox-item ${Z.read?"":"unread"}`,onClick:()=>Xe(Z),"data-testid":`mailbox-item-${Z.id}`,children:[t.jsx("div",{className:"mailbox-item-avatar",children:Z.fromType==="agent"?t.jsx(As,{size:16}):t.jsx(mr,{size:16})}),t.jsxs("div",{className:"mailbox-item-content",children:[t.jsxs("div",{className:"mailbox-item-header",children:[t.jsx("span",{className:"mailbox-item-from",children:H(Z.fromId,Z.fromType)}),t.jsx("span",{className:"mailbox-item-time",children:Sa(Z.createdAt)})]}),t.jsxs("div",{className:"mailbox-item-preview",children:[Z.content.slice(0,80),Z.content.length>80?"…":""]})]})]},Z.id)),S&&S!==li&&M&&I==="outbox"&&M.outbox.map(Z=>t.jsxs("div",{id:nl(Z.id),className:"mailbox-item",onClick:()=>Xe(Z),"data-testid":`mailbox-item-${Z.id}`,children:[t.jsx("div",{className:"mailbox-item-avatar",children:Z.toType==="agent"?t.jsx(As,{size:16}):t.jsx(mr,{size:16})}),t.jsxs("div",{className:"mailbox-item-content",children:[t.jsxs("div",{className:"mailbox-item-header",children:[t.jsxs("span",{className:"mailbox-item-to",children:["To: ",H(Z.toId,Z.toType)]}),t.jsx("span",{className:"mailbox-item-time",children:Sa(Z.createdAt)})]}),t.jsxs("div",{className:"mailbox-item-preview",children:[Z.content.slice(0,80),Z.content.length>80?"…":""]})]})]},Z.id))]})]})})]}),Be=()=>y?t.jsx(ix,{recipient:j,replyContext:C,agents:T,projectId:e,onSend:_e,onCancel:Ae,addToast:n}):p?Nt():a==="approvals"&&k?t.jsxs("div",{className:"mailbox-message-detail mailbox-approval-detail","data-testid":"mailbox-approval-detail",children:[Q&&t.jsx("button",{className:"btn btn-sm btn-secondary",onClick:()=>z(null),"data-testid":"mailbox-approval-back-to-list",children:"← Back"}),t.jsx("div",{className:"mailbox-message-detail-header",children:t.jsxs("div",{className:"mailbox-message-detail-meta",children:[t.jsx("span",{className:"mailbox-message-type",children:k.actionCategory}),t.jsx("span",{className:"mailbox-message-time",children:k.status})]})}),t.jsxs("div",{className:"mailbox-message-body",children:[t.jsx("strong",{children:k.actionSummary}),t.jsxs("p",{children:["Requester: ",k.requester.actorName," (",k.agentId,")"]}),k.taskId&&t.jsxs("p",{children:["Task: ",k.taskId]}),t.jsxs("p",{children:["Requested: ",Sa(k.createdAt)]})]}),k.targetAction.category==="network_api"&&k.targetAction.action==="worktrunk_install"&&t.jsx(JF,{targetAction:k.targetAction}),t.jsx("div",{className:"mailbox-conversation","data-testid":"mailbox-approval-history",children:k.history.map(Z=>t.jsxs("div",{className:"mailbox-conversation-msg",children:[t.jsxs("div",{className:"mailbox-conversation-msg-header",children:[t.jsx("span",{children:Z.eventType}),t.jsx("span",{children:Z.actor.actorName})]}),Z.note&&t.jsx("div",{className:"mailbox-item-preview",children:Z.note})]},Z.id))}),k.status==="pending"&&t.jsxs("div",{className:"mailbox-approval-decision","data-testid":"mailbox-approval-decision",children:[t.jsx("textarea",{className:"message-composer-textarea mailbox-approval-comment",value:J,onChange:Z=>oe(Z.target.value),placeholder:"Optional comment","data-testid":"mailbox-approval-comment"}),t.jsxs("div",{className:"mailbox-header-actions",children:[t.jsx("button",{className:"btn btn-sm btn-secondary",onClick:()=>void xt("deny"),disabled:le!==!1,"data-testid":"mailbox-approval-deny",children:"Deny"}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void xt("approve"),disabled:le!==!1,"data-testid":"mailbox-approval-approve",children:"Approve"})]})]})]}):t.jsxs("div",{className:"mailbox-split-empty","data-testid":"mailbox-split-empty",children:[t.jsx(jr,{size:24}),t.jsx("p",{children:"Select a message to read"})]});return t.jsxs("div",{className:"mailbox-view",style:ee,"data-testid":"mailbox-view",children:[t.jsxs("div",{className:"mailbox-header",children:[t.jsxs("div",{className:"mailbox-title",children:[t.jsx(jr,{size:18}),t.jsx("span",{children:"Mailbox"}),u>0&&t.jsx("span",{className:"mailbox-unread-badge","data-testid":"mailbox-unread-badge",children:u})]}),t.jsxs("div",{className:"mailbox-header-actions",children:[t.jsxs("button",{className:"btn btn-sm btn-primary",onClick:et,title:"Compose message","data-testid":"mailbox-header-compose",children:[t.jsx(fa,{size:14}),t.jsx("span",{children:"Compose"})]}),a==="inbox"&&u>0&&t.jsxs("button",{className:"btn btn-sm btn-secondary",onClick:at,title:"Mark all as read","data-testid":"mailbox-mark-all-read",children:[t.jsx($f,{size:14}),t.jsx("span",{children:"Mark all read"})]}),t.jsx("button",{className:"btn-icon",onClick:()=>{a==="inbox"?He():a==="outbox"?Le():a==="approvals"?qe(W):S===li?Re():S&&de(S)},disabled:m,title:"Refresh","data-testid":"mailbox-refresh",children:m?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ss,{size:14})})]})]}),t.jsxs("div",{className:"mailbox-tabs","data-testid":"mailbox-tabs",children:[t.jsxs("button",{className:`btn btn-sm btn-secondary mailbox-tab ${a==="inbox"?"active":""}`,onClick:()=>{r("inbox"),b(null)},"data-testid":"mailbox-tab-inbox",children:[t.jsx(Va,{size:14}),t.jsx("span",{children:"Inbox"}),u>0&&t.jsx("span",{className:"mailbox-tab-badge",children:u})]}),t.jsxs("button",{className:`btn btn-sm btn-secondary mailbox-tab ${a==="outbox"?"active":""}`,onClick:()=>{r("outbox"),b(null)},"data-testid":"mailbox-tab-outbox",children:[t.jsx(vr,{size:14}),t.jsx("span",{children:"Outbox"})]}),t.jsxs("button",{className:`btn btn-sm btn-secondary mailbox-tab ${a==="agents"?"active":""}`,onClick:()=>{r("agents"),b(null),z(null)},"data-testid":"mailbox-tab-agents",children:[t.jsx(As,{size:14}),t.jsx("span",{children:"Agents"})]}),t.jsxs("button",{className:`btn btn-sm btn-secondary mailbox-tab ${a==="approvals"?"active":""}`,onClick:()=>{r("approvals"),b(null),z(null)},"data-testid":"mailbox-tab-approvals",children:[t.jsx($f,{size:14}),t.jsx("span",{children:"Approvals"}),F>0&&t.jsx("span",{className:"mailbox-tab-badge","data-testid":"mailbox-approvals-pending-badge",children:F})]})]}),t.jsx("div",{className:"mailbox-content","data-testid":"mailbox-content",children:be?t.jsxs("div",{className:"mailbox-split-layout","data-testid":"mailbox-split-layout",ref:se,children:[t.jsx("div",{className:"mailbox-split-list-pane","data-testid":"mailbox-split-list-pane",style:{width:`${fe}px`},children:Ut()}),t.jsx("div",{className:"mailbox-split-resize-handle","data-testid":"mailbox-split-resize-handle",role:"separator","aria-orientation":"vertical","aria-label":"Resize message list pane",tabIndex:0,"aria-valuemin":fd,"aria-valuemax":Math.round(lh(se.current?.clientWidth??fe/oh)),"aria-valuenow":Math.round(fe),onMouseDown:ge,onKeyDown:Ne}),t.jsx("div",{className:"mailbox-split-detail-pane","data-testid":"mailbox-split-detail-pane",children:Be()})]}):t.jsxs(t.Fragment,{children:[Nt(),a==="approvals"&&k&&Be(),y&&t.jsx(ix,{recipient:j,replyContext:C,agents:T,projectId:e,onSend:_e,onCancel:Ae,addToast:n}),!p&&!k&&!y&&Ut()]})})]})}function Mc(){return t.jsx("div",{className:"mailbox-skeleton","data-testid":"mailbox-skeleton",children:Array.from({length:5}).map((e,n)=>t.jsxs("div",{className:"mailbox-skeleton-item",children:[t.jsx("div",{className:"mailbox-skeleton-avatar"}),t.jsxs("div",{className:"mailbox-skeleton-content",children:[t.jsx("div",{className:"mailbox-skeleton-line mailbox-skeleton-line--short"}),t.jsx("div",{className:"mailbox-skeleton-line mailbox-skeleton-line--long"})]})]},n))})}const ez=640,ch=240,dh=640,Rc=360,cx="fusion:github-import-list-pane-width";function Ac(e){return Math.max(ch,Math.min(dh,e))}function tz({isOpen:e,onClose:n,onImport:s,tasks:a,projectId:r}){ta(e);const[o,l]=i.useState(""),[c,d]=i.useState(""),[u,h]=i.useState(""),[m,f]=i.useState(!1),[p,b]=i.useState("issues"),[v,x]=i.useState([]),[y,g]=i.useState(null),[j,N]=i.useState([]),[C,w]=i.useState(null),[S,R]=i.useState(null),[I,E]=i.useState(!1),[M,G]=i.useState([]),[U,P]=i.useState(!1),[T,D]=i.useState(""),W=i.useRef(!1),Y=i.useRef(null);ea(Y,e,"fusion:github-modal-size");const L=Aa(n),[_,F]=i.useState(!1),[ae,k]=i.useState("list"),[z,J]=i.useState(()=>{if(typeof window>"u")return Rc;try{const pe=window.localStorage.getItem(cx);if(!pe)return Rc;const _e=Number.parseInt(pe,10);return Number.isFinite(_e)?Ac(_e):Rc}catch{return Rc}}),oe=i.useRef(null),le=new Set;for(const pe of a){const _e=pe.description.match(/Source: (https:\/\/github\.com\/[^/]+\/[^/]+\/issues\/\d+)/);_e&&le.add(_e[1]);const et=pe.description.match(/PR: (https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/\d+)/);et&&le.add(et[1])}i.useEffect(()=>{if(e)return l(""),d(""),h(""),x([]),g(null),N([]),w(null),b("issues"),R(null),E(!1),G([]),P(!0),D(""),oe.current=null,W.current=!0,A1().then(pe=>{if(W.current)if(G(pe),P(!1),pe.length===1){const _e=pe[0];l(_e.owner),d(_e.repo),D(_e.name)}else pe.length>1&&(l(""),d(""),D(""))}).catch(()=>{W.current&&P(!1)}),()=>{W.current=!1}},[e]);const we=i.useCallback(pe=>{if(D(pe),pe==="")l(""),d("");else{const _e=M.find(et=>et.name===pe);_e&&(l(_e.owner),d(_e.repo))}},[M]),re=i.useCallback(async()=>{if(!o.trim()||!c.trim()){R("Repository must be selected");return}f(!0),R(null),x([]),g(null);try{const pe=u.split(",").map(et=>et.trim()).filter(Boolean),_e=await E1(o.trim(),c.trim(),30,pe.length>0?pe:void 0);x(_e),_e.length===0&&R("No open issues found")}catch(pe){R(Ce(pe)||"Failed to fetch issues")}finally{f(!1)}},[o,c,u]),H=i.useCallback(async()=>{if(!o.trim()||!c.trim()){R("Repository must be selected");return}f(!0),R(null),N([]),w(null);try{const pe=await M1(o.trim(),c.trim(),30);N(pe),pe.length===0&&R("No open pull requests found")}catch(pe){R(Ce(pe)||"Failed to fetch pull requests")}finally{f(!1)}},[o,c]);i.useEffect(()=>{if(!e||!o.trim()||!c.trim()||m||I)return;const pe={owner:o.trim(),repo:c.trim(),labels:u.trim(),tab:p};oe.current?.owner===pe.owner&&oe.current?.repo===pe.repo&&oe.current?.labels===pe.labels&&oe.current?.tab===pe.tab||(oe.current=pe,p==="issues"?re():H())},[o,c,u,p,e,m,I,re,H]),i.useEffect(()=>{if(!e)return;const pe=_e=>{_e.key==="Escape"&&n()};return document.addEventListener("keydown",pe),()=>document.removeEventListener("keydown",pe)},[e,n]),i.useEffect(()=>{if(!e)return;const pe=()=>{F(window.innerWidth<=ez)};return pe(),window.addEventListener("resize",pe),()=>window.removeEventListener("resize",pe)},[e]),i.useEffect(()=>{if(!(typeof window>"u"))try{window.localStorage.setItem(cx,String(z))}catch{}},[z]);const ue=i.useCallback(pe=>{if(_)return;const _e=pe.clientX,et=z,Ae=pe.currentTarget;Ae.setPointerCapture(pe.pointerId);const it=Nt=>{const Ut=Nt.clientX-_e;J(Ac(et+Ut))},xt=()=>{document.removeEventListener("pointermove",it),document.removeEventListener("pointerup",xt),Ae.hasPointerCapture(pe.pointerId)&&Ae.releasePointerCapture(pe.pointerId)};document.addEventListener("pointermove",it),document.addEventListener("pointerup",xt)},[_,z]),Q=i.useCallback(pe=>{if(_)return;const _e=pe.shiftKey?50:10;if(pe.key==="ArrowLeft"){pe.preventDefault(),J(et=>Ac(et-_e));return}if(pe.key==="ArrowRight"){pe.preventDefault(),J(et=>Ac(et+_e));return}if(pe.key==="Home"){pe.preventDefault(),J(ch);return}pe.key==="End"&&(pe.preventDefault(),J(dh))},[_]),be=i.useCallback(pe=>{g(pe),_&&k("preview")},[_]),fe=i.useCallback(pe=>{w(pe),_&&k("preview")},[_]),O=i.useCallback(()=>{k("list")},[]),se=i.useCallback(async()=>{if(p==="issues"){if(y===null)return;E(!0),R(null);try{const pe=await _1(o.trim(),c.trim(),y,r);s(pe),g(null),_&&ae==="preview"&&k("list")}catch(pe){const _e=Ce(pe);_e?.includes("already imported")?R(_e):R(_e||"Failed to import issue")}finally{E(!1)}}else{if(C===null)return;E(!0),R(null);try{const pe=await R1(o.trim(),c.trim(),C,r);s(pe),w(null),_&&ae==="preview"&&k("list")}catch(pe){const _e=Ce(pe);_e?.includes("already imported")?R(_e):R(_e||"Failed to import pull request")}finally{E(!1)}}},[p,y,C,o,c,s,_,ae]),ve=v.find(pe=>pe.number===y),A=j.find(pe=>pe.number===C);if(!e)return null;const ne=M.length>0,ye=M.length===1,ee=v.filter(pe=>le.has(pe.html_url)).length,ge=j.filter(pe=>le.has(pe.html_url)).length,Ne=S==="No open issues found",He=S==="No open pull requests found",Le=p==="issues"?Ne:He,de=!!S&&!Ne&&v.length===0&&!m,Re=!!S&&!He&&j.length===0&&!m,Pe=p==="issues"?de:Re,rt=m||v.length>0||Ne||de,qe=m||j.length>0||He||Re,Xe=p==="issues"?rt:qe,At=!!S&&v.length>0&&!Ne,at=!!S&&j.length>0&&!He,Se=p==="issues"?At:at;return t.jsx("div",{className:"modal-overlay open",...L,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal modal-lg github-import-modal",ref:Y,children:[t.jsxs("div",{className:"modal-header github-import-modal__header",children:[t.jsxs("div",{children:[t.jsx("h3",{children:"Import from GitHub"}),t.jsx("p",{className:"github-import-modal__subtitle",children:"Choose a detected remote, load open issues or pull requests, and import one into the board."})]}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close import modal",children:"×"})]}),t.jsxs("div",{className:"modal-body github-import-modal__body",children:[t.jsxs("div",{className:"github-import-tabs",role:"tablist","aria-label":"Import type",children:[t.jsxs("button",{role:"tab","aria-selected":p==="issues","aria-controls":"github-import-list-pane",className:`github-import-tab ${p==="issues"?"active":""}`,onClick:()=>{b("issues"),w(null)},disabled:m||I,children:[t.jsx(kd,{size:16}),t.jsx("span",{children:"Issues"})]}),t.jsxs("button",{role:"tab","aria-selected":p==="pulls","aria-controls":"github-import-list-pane",className:`github-import-tab ${p==="pulls"?"active":""}`,onClick:()=>{b("pulls"),g(null)},disabled:m||I,children:[t.jsx(yi,{size:16}),t.jsx("span",{children:"Pull Requests"})]})]}),t.jsxs("div",{className:"github-import-toolbar","data-testid":"github-import-toolbar",role:"toolbar","aria-label":"GitHub import controls",children:[t.jsx("div",{className:"github-import-toolbar__zone github-import-toolbar__zone--remote",children:U?t.jsxs("div",{className:"github-import-toolbar__loading",role:"status","aria-live":"polite",children:[t.jsx(Ct,{size:16,className:"spin"}),t.jsx("span",{children:"Detecting…"})]}):ne?ye?t.jsxs("div",{className:"github-import-remote-pill","data-testid":"github-import-single-remote",children:[t.jsx("span",{className:"github-import-remote-pill__name",children:M[0].name}),t.jsxs("span",{className:"github-import-remote-pill__repo",children:[M[0].owner,"/",M[0].repo]})]}):t.jsxs("div",{className:"github-import-remote-select",children:[t.jsx("label",{htmlFor:"gh-remote",className:"visually-hidden",children:"Repository"}),t.jsxs("select",{id:"gh-remote",value:T,onChange:pe=>we(pe.target.value),disabled:m||I,"aria-label":"Select Git remote",children:[t.jsx("option",{value:"",children:"Select remote…"}),M.map(pe=>t.jsxs("option",{value:pe.name,children:[pe.name," (",pe.owner,"/",pe.repo,")"]},pe.name))]})]}):t.jsx("span",{className:"github-import-toolbar__no-remote",children:"No remotes"})}),t.jsx("div",{className:"github-import-toolbar__zone github-import-toolbar__zone--filter",children:p==="issues"?t.jsxs(t.Fragment,{children:[t.jsx("label",{htmlFor:"gh-labels",className:"visually-hidden",children:"Filter by labels"}),t.jsx("input",{id:"gh-labels",type:"text",placeholder:"Filter: bug,enhancement…",value:u,onChange:pe=>h(pe.target.value),onKeyDown:pe=>pe.key==="Enter"&&re(),disabled:m||I||!ne,"aria-label":"Filter issues by labels"})]}):t.jsxs("span",{className:"github-import-filter-hint",children:["Open pull requests from ",o||"selected remote"]})}),t.jsx("div",{className:"github-import-toolbar__zone github-import-toolbar__zone--action",children:t.jsxs("button",{id:"gh-load",className:"btn btn-primary github-import-load-button",onClick:p==="issues"?re:H,disabled:m||I||!o.trim()||!c.trim(),"aria-label":m?`Loading ${p}`:`Load ${p} from repository`,title:m?"Loading…":`Load ${p}`,children:[m?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ss,{size:14}),t.jsx("span",{children:m?"Loading…":"Load"})]})})]}),!U&&!ne&&t.jsxs("div",{className:"github-import-state github-import-state--warning",role:"alert",children:[t.jsxs("div",{children:[t.jsx("strong",{children:"No GitHub remotes detected"}),t.jsx("span",{children:"Add a GitHub remote to this repository, then reopen the modal."})]}),t.jsx("code",{className:"github-import-command",children:"git remote add origin https://github.com/owner/repo.git"})]}),Se&&t.jsx("div",{className:"form-error github-import-banner",role:"alert",children:S}),t.jsxs("div",{className:"github-import-workspace",children:[t.jsxs("section",{className:`github-import-list-pane ${_?"mobile":""} ${ae==="list"?"active":""}`,style:_?void 0:{flex:`0 0 ${z}px`},"data-testid":"github-import-list-pane","aria-labelledby":"github-import-results-heading",children:[t.jsxs("div",{className:"github-import-pane-header",children:[t.jsx("h4",{id:"github-import-results-heading",children:p==="issues"?"Issues":"Pull Requests"}),p==="issues"&&v.length>0&&t.jsxs("div",{className:"github-import-results-meta","aria-live":"polite",children:[t.jsxs("span",{children:[v.length," issue",v.length===1?"":"s"]}),t.jsxs("span",{children:[ee," imported"]})]}),p==="pulls"&&j.length>0&&t.jsxs("div",{className:"github-import-results-meta","aria-live":"polite",children:[t.jsxs("span",{children:[j.length," pull request",j.length===1?"":"s"]}),t.jsxs("span",{children:[ge," imported"]})]})]}),t.jsxs("div",{className:"github-import-pane-content",children:[!Xe&&t.jsx("div",{className:"github-import-state github-import-state--idle","data-testid":"github-import-results-idle",children:t.jsxs("div",{children:[t.jsx("strong",{children:"Nothing loaded yet"}),t.jsx("span",{children:"Select a repository and click Load to start reviewing import candidates."})]})}),m&&t.jsxs("div",{className:"github-import-state github-import-state--loading",role:"status","aria-live":"polite",children:[t.jsx(Ct,{size:16,className:"spin"}),t.jsxs("div",{children:[t.jsxs("strong",{children:["Loading open ",p==="issues"?"issues":"pull requests","…"]}),t.jsx("span",{children:"Fetching the latest list from GitHub."})]})]}),Pe&&t.jsx("div",{className:"github-import-state github-import-state--error",role:"alert",children:t.jsxs("div",{children:[t.jsxs("strong",{children:["Could not load ",p==="issues"?"issues":"pull requests"]}),t.jsx("span",{children:S})]})}),Le&&t.jsx("div",{className:"github-import-state github-import-state--empty",role:"status",children:t.jsxs("div",{children:[t.jsxs("strong",{children:["No open ",p==="issues"?"issues":"pull requests"," found"]}),t.jsx("span",{children:p==="issues"?"Try a different label filter or choose another repository.":"Choose another repository."})]})}),p==="issues"&&v.length>0&&t.jsx("div",{className:"issues-list","aria-live":"polite",children:v.map(pe=>{const _e=le.has(pe.html_url);return t.jsxs("div",{className:`issue-item ${y===pe.number?"selected":""} ${_e?"imported":""}`,onClick:()=>!_e&&be(pe.number),children:[t.jsx("input",{type:"radio",name:"issue",checked:y===pe.number,onChange:()=>be(pe.number),disabled:_e,"aria-label":`Select issue #${pe.number}`}),t.jsxs("div",{className:"issue-main",children:[t.jsxs("div",{className:"issue-heading-row",children:[t.jsxs("span",{className:"issue-number",children:["#",pe.number]}),t.jsx("span",{className:"issue-title",children:pe.title})]}),pe.labels.length>0&&t.jsx("span",{className:"issue-labels",children:pe.labels.map(et=>t.jsx("span",{className:"label-chip",children:et.name},et.name))})]}),_e&&t.jsx("span",{className:"imported-badge",children:"Imported"})]},pe.number)})}),p==="pulls"&&j.length>0&&t.jsx("div",{className:"issues-list","aria-live":"polite",children:j.map(pe=>{const _e=le.has(pe.html_url);return t.jsxs("div",{className:`issue-item ${C===pe.number?"selected":""} ${_e?"imported":""}`,onClick:()=>!_e&&fe(pe.number),children:[t.jsx("input",{type:"radio",name:"pull",checked:C===pe.number,onChange:()=>fe(pe.number),disabled:_e,"aria-label":`Select pull request #${pe.number}`}),t.jsxs("div",{className:"issue-main",children:[t.jsxs("div",{className:"issue-heading-row",children:[t.jsxs("span",{className:"issue-number",children:["#",pe.number]}),t.jsx("span",{className:"issue-title",children:pe.title})]}),t.jsxs("span",{className:"pull-branch-info",children:[pe.headBranch," → ",pe.baseBranch]})]}),_e&&t.jsx("span",{className:"imported-badge",children:"Imported"})]},pe.number)})})]})]}),!_&&t.jsx("div",{className:"github-import-workspace__resize-handle",role:"separator","aria-orientation":"vertical","aria-label":"Resize issues list","aria-valuemin":ch,"aria-valuemax":dh,"aria-valuenow":z,tabIndex:0,onPointerDown:ue,onKeyDown:Q,"data-testid":"github-import-resize-handle"}),t.jsxs("section",{className:`github-import-preview-pane ${_?"mobile":""} ${ae==="preview"?"active":""}`,"data-testid":"github-import-preview-pane","aria-labelledby":"github-import-preview-heading",children:[t.jsxs("div",{className:"github-import-pane-header",children:[_&&t.jsxs("button",{className:"github-import-back-button",onClick:O,"data-testid":"github-import-back-button","aria-label":`Back to ${p==="issues"?"issues":"pull requests"} list`,children:[t.jsx(Tr,{size:16}),t.jsx("span",{children:"Back"})]}),t.jsx("h4",{id:"github-import-preview-heading",children:"Preview"})]}),t.jsxs("div",{className:"github-import-pane-content",children:[p==="issues"&&ve?t.jsxs("div",{className:"issue-preview","data-testid":"github-import-preview-card",children:[t.jsxs("div",{className:"preview-meta",children:["Issue #",ve.number]}),t.jsx("div",{className:"preview-title",children:ve.title}),t.jsx("div",{className:"preview-body",children:ve.body?ve.body.slice(0,200)+(ve.body.length>200?"…":""):"(no description)"})]}):p==="issues"?t.jsx("div",{className:"github-import-state github-import-state--idle","data-testid":"github-import-preview-empty",children:t.jsxs("div",{children:[t.jsx("strong",{children:"No issue selected"}),t.jsx("span",{children:"Choose an issue from the list to inspect its title and description."})]})}):null,p==="pulls"&&A?t.jsxs("div",{className:"issue-preview","data-testid":"github-import-preview-card",children:[t.jsxs("div",{className:"preview-meta",children:["Pull Request #",A.number]}),t.jsx("div",{className:"preview-title",children:A.title}),t.jsxs("div",{className:"preview-branch",children:[t.jsx("strong",{children:"Branch:"})," ",A.headBranch," → ",A.baseBranch]}),t.jsx("div",{className:"preview-body",children:A.body?A.body.slice(0,200)+(A.body.length>200?"…":""):"(no description)"})]}):p==="pulls"?t.jsx("div",{className:"github-import-state github-import-state--idle","data-testid":"github-import-preview-empty",children:t.jsxs("div",{children:[t.jsx("strong",{children:"No pull request selected"}),t.jsx("span",{children:"Choose a pull request from the list to inspect its details."})]})}):null]})]})]})]}),t.jsxs("div",{className:"modal-actions github-import-modal__actions",children:[t.jsx("button",{className:"btn",onClick:n,disabled:I,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary",onClick:se,disabled:(p==="issues"?y===null:C===null)||I,children:I?t.jsx(Ct,{size:14,className:"spin"}):"Import"})]})]})})}function Ui({summary:e,children:n,className:s="",onToggle:a,defaultOpen:r=!1}){const[o,l]=i.useState(r);return t.jsxs("div",{className:`onboarding-disclosure ${s}`.trim(),children:[t.jsxs("button",{className:"onboarding-disclosure-trigger",onClick:()=>{const c=!o;l(c),a?.(c)},"aria-expanded":o,type:"button",children:[t.jsx(ps,{size:14,className:"onboarding-disclosure-chevron","aria-hidden":"true"}),t.jsx("span",{children:e})]}),o?t.jsx("div",{className:"onboarding-disclosure-content",children:n}):null]})}const nz=["Build a user authentication system with login and signup","Add dark mode support to the dashboard","Create an API endpoint for exporting tasks as CSV","Refactor the task card component for better performance"];function Mr(e){return e&&nr.includes(e)?e:di}function nm(e){return{...e,priority:Mr(e.priority)}}function sz(e,n){return e.length===n.length&&e.every((s,a)=>s===n[a])}function iz(e,n){const s=new Map(e.map(a=>[a.id,a]));return n.map(a=>{const r=s.get(a.id),o=Mr(a.priority),l={id:a.id};return(!r||a.title!==r.title)&&(l.title=a.title),(!r||a.description!==r.description)&&(l.description=a.description),(!r||a.suggestedSize!==r.suggestedSize)&&(l.suggestedSize=a.suggestedSize),(!r||o!==Mr(r.priority))&&(l.priority=o),(!r||!sz(a.dependsOn,r.dependsOn))&&(l.dependsOn=a.dependsOn),l})}function az(e,n){return e&&n?`${e}/${n}`:""}function rz(e){if(!e)return{provider:void 0,modelId:void 0};const n=e.indexOf("/");return n===-1?{provider:void 0,modelId:void 0}:{provider:e.slice(0,n),modelId:e.slice(n+1)}}function oz({isOpen:e,onClose:n,onTaskCreated:s,onTasksCreated:a,tasks:r,initialPlan:o,projectId:l,resumeSessionId:c}){const[d,u]=i.useState(""),[h,m]=i.useState({type:"initial"}),[f,p]=i.useState(null),[b,v]=i.useState([]),[x,y]=i.useState([]),[g,j]=i.useState(null),[N,C]=i.useState("project-default"),[w,S]=i.useState(""),[R,I]=i.useState(""),E=i.useRef(!1),M=i.useRef(!1),[G,U]=i.useState(""),[P,T]=i.useState(!0),[D,W]=i.useState(!1),[Y,L]=i.useState(!1),[_,F]=i.useState(!1),[ae,k]=i.useState(!1),[z,J]=i.useState(!1),[oe,le]=i.useState(null),[we,re]=i.useState(0),H=i.useRef(null),{ref:ue}=Pl({value:d,minHeight:120,maxHeight:640}),Q=i.useCallback(he=>{H.current=he,ue(he)},[ue]),be=i.useRef(null),fe=i.useRef(null),O=i.useRef(null),se=i.useRef(null),ve=i.useRef(null),A=i.useRef(null),[ne,ye]=i.useState(c??null),ee=i.useMemo(()=>Pr(),[]),{isLockedByOther:ge,takeControl:Ne,isLoading:He}=Fd(e?ne:null),{activeTabMap:Le,broadcastUpdate:de,broadcastCompleted:Re,broadcastLock:Pe,broadcastUnlock:rt,broadcastHeartbeat:qe}=Bo(),[Xe,At]=i.useState(void 0),[at,Se]=i.useState(void 0),[pe,_e]=i.useState("medium"),[et,Ae]=i.useState(""),[it,xt]=i.useState([]),[Nt,Ut]=i.useState(!1),[Be,Z]=i.useState(null),[Oe,ht]=i.useState([]),[je,mt]=i.useState([]),[Et,Te]=i.useState({}),xe=i.useRef(null),[gt,_t]=i.useState([]),[Ft,Dt]=i.useState(!1),[nt,Wt]=i.useState(c??null),[Mt,Kt]=i.useState(!!c),[xn,Tn]=i.useState(null),[Sn,is]=i.useState(!1),On=i.useRef(!1),un=i.useRef(null),tn=i.useRef(""),on=i.useRef(null),pn=i.useRef(null);ea(be,e,"fusion:planning-modal-size");const mn=$i(),Zn=mn==="mobile",{pushNav:In}=ff(),{keyboardOverlap:rn,viewportHeight:hn,viewportOffsetTop:Pn,keyboardOpen:nn}=Ia({enabled:mn==="mobile"});ta(mn==="mobile"&&e),i.useEffect(()=>{const he=be.current;he&&(nn?(he.style.setProperty("--keyboard-overlap",`${rn}px`),he.style.setProperty("--vv-offset-top",`${Pn}px`),hn!==null?he.style.setProperty("--vv-height",`${hn}px`):he.style.removeProperty("--vv-height")):(he.style.removeProperty("--keyboard-overlap"),he.style.removeProperty("--vv-offset-top"),he.style.removeProperty("--vv-height")))},[nn,rn,Pn,hn]),i.useEffect(()=>{tn.current=G},[G]),i.useEffect(()=>{const he=un.current;if(!he)return;he.scrollHeight-he.scrollTop-he.clientHeight<32&&(he.scrollTop=he.scrollHeight)},[G]),i.useEffect(()=>{if(h.type!=="loading"){le(null),re(0);return}const he=Date.now();le(he),re(0);const bt=setInterval(()=>{re(Math.max(0,Math.floor((Date.now()-he)/1e3)))},1e3);return()=>clearInterval(bt)},[h.type]),i.useEffect(()=>{if(h.type!=="loading")return;const he=O.current;if(!he)return;let bt=!1;const St=setInterval(async()=>{try{const lt=await ma(he);if(bt||!lt||O.current!==he)return;if(lt.status==="awaiting_input"&&lt.currentQuestion){const Tt=JSON.parse(lt.currentQuestion);m({type:"question",session:{sessionId:he,currentQuestion:Tt,summary:null}}),U("")}else if(lt.status==="complete"&&lt.result){const Tt=nm(JSON.parse(lt.result));m({type:"summary",session:{sessionId:he,currentQuestion:null,summary:Tt},summary:Tt}),j(Tt),U("")}}catch{}},8e3);return()=>{bt=!0,clearInterval(St)}},[h.type]);const $t=i.useCallback(()=>{u(""),m({type:"initial"}),p(null),v([]),y([]),j(null),C("project-default"),S(""),I(""),U(""),W(!1),L(!1),At(void 0),Se(void 0),_e("medium"),Ae(""),O.current=null,ye(null)},[]),Jt=az(Xe,at),Qt=i.useCallback((he,bt)=>{if(!he||!bt)return Et.provider&&Et.modelId?`${Et.provider}/${Et.modelId}`:"Using default";const ot=it.find(St=>St.provider===he&&St.id===bt);return ot?`${ot.provider}/${ot.id}`:`${he}/${bt}`},[it,Et.modelId,Et.provider]),ie=i.useCallback(async()=>{Ut(!0),Z(null);try{const he=await Ki();xt(he.models),ht(he.favoriteProviders),mt(he.favoriteModels),Te({provider:he.resolvedPlanningProvider,modelId:he.resolvedPlanningModelId})}catch(he){Z(Ce(he)||"Failed to load models")}finally{Ut(!1)}},[]),Fe=i.useCallback(he=>{ht(bt=>{const ot=bt,lt=ot.includes(he)?ot.filter(Tt=>Tt!==he):[he,...ot];return Cs({favoriteProviders:lt,favoriteModels:je}).catch(()=>{ht(ot)}),lt})},[je]),Je=i.useCallback(he=>{mt(bt=>{const ot=bt,lt=ot.includes(he)?ot.filter(Tt=>Tt!==he):[he,...ot];return Cs({favoriteProviders:Oe,favoriteModels:lt}).catch(()=>{mt(ot)}),lt})},[Oe]),tt=i.useCallback(he=>{fe.current?.close();const bt=()=>O.current!==he,ot=LE(he,l,{onThinking:St=>{bt()||(U(lt=>lt+St),de({sessionId:he,status:"generating",needsInput:!1,owningTabId:ee,type:"planning",title:d.trim()||void 0,projectId:l??null}))},onQuestion:St=>{if(bt())return;W(!1),L(!1),so(l);const lt=tn.current.trim();lt&&y(Tt=>Tt[Tt.length-1]?.thinkingOutput===lt?Tt:[...Tt,{thinkingOutput:lt}]),m({type:"question",session:{sessionId:he,currentQuestion:St,summary:null}}),U(""),de({sessionId:he,status:"awaiting_input",needsInput:!0,owningTabId:ee,type:"planning",title:d.trim()||void 0,projectId:l??null})},onSummary:St=>{if(bt())return;W(!1),L(!1),so(l);const lt=tn.current.trim();lt&&y(Tt=>Tt[Tt.length-1]?.thinkingOutput===lt?Tt:[...Tt,{thinkingOutput:lt}]),m({type:"summary",session:{sessionId:he,currentQuestion:null,summary:St},summary:St}),j(St),U(""),de({sessionId:he,status:"complete",needsInput:!1,owningTabId:ee,type:"planning",title:d.trim()||void 0,projectId:l??null})},onError:St=>{const lt=St||"Session failed while contacting the AI.";W(!0),(async()=>{try{const Tt=await ma(he);if(Tt&&(Tt.status==="generating"||Tt.status==="awaiting_input")){tt(he);return}}catch{}W(!1),L(!1),p(null),m(Tt=>Tt.type==="question"||Tt.type==="summary"||Tt.type==="error"?{type:"error",session:Tt.session,errorMessage:lt}:{type:"error",session:{sessionId:he,currentQuestion:null,summary:null},errorMessage:lt}),U(""),O.current=he,de({sessionId:he,status:"error",needsInput:!1,owningTabId:ee,type:"planning",title:d.trim()||void 0,projectId:l??null}),Re({sessionId:he,status:"error"})})()},onComplete:()=>{W(!1),L(!1),O.current=null,Re({sessionId:he,status:"complete"})},onConnectionStateChange:St=>{W(St==="reconnecting")}});fe.current=ot},[Re,de,d,l,ee]),Ye=i.useCallback(async he=>{const bt=he??d;if(bt.trim()){p(null),U(""),y([]),v([]),W(!1),m({type:"loading"});try{const ot=Xe&&at?{planningModelProvider:Xe,planningModelId:at}:void 0,St=et.trim()?Number.parseInt(et,10):void 0,lt=se.current,{sessionId:Tt}=await vE(bt.trim(),l,ot,{planningDepth:pe,customQuestionCount:Number.isInteger(St)?St:void 0},lt??void 0);se.current=null,O.current=Tt,ye(Tt),Wt(Tt),tt(Tt),v([])}catch(ot){W(!1),p(Ce(ot)||"Failed to start planning session"),m({type:"initial"}),O.current=null,ye(null)}}},[tt,et,d,pe,at,Xe,l]);i.useEffect(()=>{e&&h.type==="initial"&&H.current?.focus()},[e,h.type]),i.useEffect(()=>{e&&ie()},[e,ie]),i.useEffect(()=>{if(e&&o&&!E.current&&h.type==="initial"){u(o);const he=setTimeout(()=>{E.current=!0,Ye(o)},0);return()=>clearTimeout(he)}else if(e&&!o&&!E.current&&!M.current&&h.type==="initial"){M.current=!0;const he=eF(l);he&&u(he)}},[e,o,h.type,Ye,l]);const vt=i.useCallback(async he=>{fe.current?.close(),fe.current=null,p(null),U(""),v([]),y([]),j(null),L(!1),m({type:"loading"});try{const bt=await ma(he);if(!bt){Wt(null),Kt(!1),m({type:"initial"});return}O.current=he,ye(he);const ot=Co(bt.conversationHistory);if(y(ot),v(ot.map(St=>St.response).filter(St=>!!(St&&typeof St=="object"&&!Array.isArray(St)))),bt.status==="draft"){let St="",lt,Tt;try{const Xt=bt.inputPayload?JSON.parse(bt.inputPayload):null;Xt&&typeof Xt.initialPlan=="string"&&(St=Xt.initialPlan),Xt&&typeof Xt.modelProvider=="string"&&typeof Xt.modelId=="string"&&(lt=Xt.modelProvider,Tt=Xt.modelId)}catch{}u(St),At(lt),Se(Tt),se.current=he,pn.current=St?{sessionId:he,initialPlan:St.trim(),modelProvider:lt,modelId:Tt}:null,m({type:"initial"})}else if(bt.status==="awaiting_input"&&bt.currentQuestion){so(l);const St=JSON.parse(bt.currentQuestion);if(m({type:"question",session:{sessionId:he,currentQuestion:St,summary:null}}),bt.thinkingOutput){const lt=bt.thinkingOutput.trim();lt&&y(Tt=>Tt[Tt.length-1]?.thinkingOutput===lt?Tt:[...Tt,{thinkingOutput:lt}])}tt(he)}else if(bt.status==="complete"&&bt.result){so(l);const St=nm(JSON.parse(bt.result));m({type:"summary",session:{sessionId:he,currentQuestion:null,summary:St},summary:St}),j(St)}else bt.status==="generating"?(m({type:"loading"}),bt.thinkingOutput&&U(bt.thinkingOutput),tt(he)):bt.status==="error"&&m({type:"error",session:{sessionId:he,currentQuestion:null,summary:null},errorMessage:bt.error||"Session failed"})}catch{p("Failed to load session"),m({type:"initial"})}},[tt,l]);i.useEffect(()=>{!e||!c||O.current!==c&&A.current!==c&&(Wt(c),Kt(!0),vt(c))},[e,c]),i.useEffect(()=>{e&&nt&&(c&&c===nt||vt(nt))},[e]);const pt=i.useCallback(async()=>{Dt(!0);try{const bt=(await Ph(l,{includeCompleted:!0,includeArchived:Sn})).filter(ot=>ot.type==="planning").sort((ot,St)=>Date.parse(St.updatedAt)-Date.parse(ot.updatedAt));_t(bt)}catch{}finally{Dt(!1)}},[l,Sn]);i.useEffect(()=>{e&&pt()},[e,pt]);const Zt=i.useRef(!1);i.useEffect(()=>{const he=Zt.current&&!Ft;Zt.current=Ft,he&&mn==="mobile"&&(Mt||c||nt||gt.length>0||Kt(!0))},[mn,Mt,c,nt,Ft,gt.length]),i.useEffect(()=>{if(!e)return;const he=l?`?projectId=${encodeURIComponent(l)}`:"",bt=St=>{try{const lt=JSON.parse(St.data);if(lt.type!=="planning")return;_t(Tt=>{const Xt=Tt.findIndex(Ee=>Ee.id===lt.id);return(Xt>=0?[...Tt.slice(0,Xt),lt,...Tt.slice(Xt+1)]:[lt,...Tt]).sort((Ee,yt)=>Date.parse(yt.updatedAt)-Date.parse(Ee.updatedAt))})}catch{}},ot=St=>{try{const lt=JSON.parse(St.data);_t(Tt=>Tt.filter(Xt=>Xt.id!==lt))}catch{}};return Si(`/api/events${he}`,{events:{"ai_session:updated":bt,"ai_session:deleted":ot},onReconnect:()=>{pt()}})},[e,l,pt]);const ce=i.useCallback(he=>{if(nt===he){Kt(!0);return}Wt(he),Kt(!0),vt(he)},[vt,nt]),Ge=i.useCallback(()=>{fe.current?.close(),fe.current=null,se.current=null,ve.current&&(clearTimeout(ve.current),ve.current=null),c&&(A.current=c),$t(),Wt(null),Kt(!0)},[$t,c]),Me=i.useCallback(()=>{Kt(!1)},[]),Ke=i.useRef(!1);i.useEffect(()=>{e||(Ke.current=!1)},[e]),i.useEffect(()=>{const he=Ke.current;if(Zn){if(!Mt){Ke.current=!1;return}he||In({type:"view",revert:Me}),Ke.current=!0}},[Me,Zn,Mt,In]);const Qe=i.useCallback(async(he,bt)=>{const ot=bt.trim();if(!(!ot||pn.current?.sessionId===he&&pn.current.initialPlan===ot&&pn.current.modelProvider===Xe&&pn.current.modelId===at))try{await MM(he,{initialPlan:ot,modelProvider:Xe&&at?Xe:void 0,modelId:Xe&&at?at:void 0},l),pn.current={sessionId:he,initialPlan:ot,modelProvider:Xe,modelId:at}}catch{}},[at,Xe,l]);i.useEffect(()=>{if(on.current&&(clearTimeout(on.current),on.current=null),!(!e||h.type!=="initial"||!nt))return on.current=setTimeout(()=>{Qe(nt,d)},500),()=>{on.current&&(clearTimeout(on.current),on.current=null)}},[d,e,nt,Qe,h.type]),i.useEffect(()=>{pn.current=null},[nt]),i.useEffect(()=>()=>{on.current&&(clearTimeout(on.current),on.current=null)},[]);const Lt=i.useCallback(async he=>{const bt=St=>St==="generating"||St==="awaiting_input",ot=gt.find(St=>St.id===he);if(ot&&bt(ot.status))try{await ly(he,l,ee)}catch{}try{await by(he)}catch{}Re({sessionId:he,status:"complete",timestamp:Date.now()}),_t(St=>St.filter(lt=>lt.id!==he)),nt===he&&(fe.current?.close(),fe.current=null,$t(),Wt(null),Kt(!1)),Tn(null)},[Re,gt,l,$t,nt,ee]),gn=i.useCallback(async he=>{const ot=gt.find(St=>St.id===he)?.archived===!0;try{ot?await NM(he):await jM(he)}catch{return}_t(St=>!ot&&!Sn?St.filter(lt=>lt.id!==he):St.map(lt=>lt.id===he?{...lt,archived:!ot}:lt)),!ot&&nt===he&&!Sn&&(fe.current?.close(),fe.current=null,$t(),Wt(null),Kt(!1))},[gt,$t,nt,Kt,Sn]);i.useEffect(()=>{e||(E.current=!1,M.current=!1,W(!1),L(!1),ye(null))},[e]),i.useEffect(()=>{if(!e){xe.current&&(rt(xe.current,ee),xe.current=null);return}if(ne&&xe.current!==ne){xe.current&&rt(xe.current,ee),Pe(ne,ee),xe.current=ne;return}!ne&&xe.current&&(rt(xe.current,ee),xe.current=null)},[Pe,rt,e,ne,ee]),i.useEffect(()=>{if(!e||!ne||xe.current!==ne)return;qe(ee);const he=setInterval(()=>{qe(ee)},3e4);return()=>{clearInterval(he)}},[qe,e,ne,ee]),i.useEffect(()=>()=>{ve.current&&(clearTimeout(ve.current),ve.current=null),fe.current?.close(),fe.current=null,xe.current&&(rt(xe.current,ee),xe.current=null)},[rt,ee]),i.useEffect(()=>{if(!e)return;const he=()=>{fe.current?.close(),fe.current=null};return window.addEventListener("beforeunload",he),()=>window.removeEventListener("beforeunload",he)},[e]);const Bn=i.useCallback((he,bt)=>{on.current&&(clearTimeout(on.current),on.current=null),(async()=>{try{await Qe(he,bt),await RM(he,l)}catch{}})()},[l,Qe]),wn=i.useCallback(()=>{if(mn!=="mobile")return;const he=document.activeElement;he instanceof HTMLElement&&he.blur(),window.scrollTo(0,0),requestAnimationFrame(()=>{window.scrollTo(0,0)})},[mn]),Yt=i.useCallback(()=>{d&&h.type==="initial"&&ZO(d,l);const he=se.current;he&&d.trim()&&Bn(he,d),se.current=null,ve.current&&(clearTimeout(ve.current),ve.current=null),fe.current?.close(),fe.current=null,W(!1),L(!1),wn(),n()},[Bn,d,n,l,wn,h.type]);i.useEffect(()=>{if(!e)return;const he=bt=>{bt.key==="Escape"&&Yt()};return document.addEventListener("keydown",he),()=>document.removeEventListener("keydown",he)},[e,Yt]);const $n=i.useCallback(async he=>{if(h.type!=="question")return;const{session:bt}=h,ot=bt.sessionId,St=bt.currentQuestion;if(!St){p("No active question in session");return}p(null),v(lt=>[...lt,he]),y(lt=>{const Tt=tn.current.trim();let Xt=lt;return Tt&&Xt[Xt.length-1]?.thinkingOutput!==Tt&&(Xt=[...Xt,{thinkingOutput:Tt}]),[...Xt,{question:St,response:he}]}),m({type:"loading"}),U("");try{await lp(ot,he,l,ee)}catch(lt){p(Ce(lt)||"Failed to submit response"),m({type:"question",session:bt})}},[l,ee,h]),dn=i.useCallback(async()=>{if(h.type!=="summary")return;const{session:he,summary:bt}=h,ot=he.sessionId;O.current=ot,ye(ot),p(null),L(!1),U(""),m({type:"loading"}),tt(ot);try{await lp(ot,{refine:!0},l,ee)}catch(St){fe.current?.close(),fe.current=null,p(Ce(St)||"Failed to refine plan"),m({type:"summary",session:he,summary:g??bt})}},[tt,g,l,ee,h]),me=i.useCallback(async()=>{const he=O.current;if(he){try{await kE(he,l,ee)}catch{}fe.current?.close(),fe.current=null,W(!1),L(!1),m({type:"error",session:{sessionId:he,currentQuestion:null,summary:null},errorMessage:"Generation stopped by user. You can retry or start a new session."}),U("")}},[l,ee]),jt=i.useCallback(async()=>{if(h.type!=="error")return;const he=h.session;p(null),L(!0),U(""),m({type:"loading"}),tt(he.sessionId);try{O.current=he.sessionId,ye(he.sessionId),await wE(he.sessionId,l,ee)}catch(bt){let ot=bt;if((Ce(bt)||"").includes("not in an error state"))try{const lt=await ma(he.sessionId);if(!lt)throw new Error("Failed to refresh planning session.");if(O.current=lt.id,ye(lt.id),lt.status==="generating")U(lt.thinkingOutput??""),m({type:"loading"});else if(lt.status==="awaiting_input"){if(!lt.currentQuestion)throw new Error("Planning session is awaiting input but has no current question.");const Tt=JSON.parse(lt.currentQuestion);if(so(l),m({type:"question",session:{sessionId:lt.id,currentQuestion:Tt,summary:null}}),lt.thinkingOutput){const Xt=lt.thinkingOutput.trim();Xt&&y(zt=>zt[zt.length-1]?.thinkingOutput===Xt?zt:[...zt,{thinkingOutput:Xt}])}fe.current?.isConnected()||tt(lt.id)}else if(lt.status==="complete"){if(!lt.result)throw new Error("Planning session is complete but has no result.");const Tt=nm(JSON.parse(lt.result));so(l),m({type:"summary",session:{sessionId:lt.id,currentQuestion:null,summary:Tt},summary:Tt}),j(Tt)}else lt.status==="error"&&m({type:"error",session:{sessionId:lt.id,currentQuestion:null,summary:null},errorMessage:lt.error||"Retry failed. Please try again."});W(!1);return}catch(lt){ot=lt}fe.current?.close(),fe.current=null,m({type:"error",session:he,errorMessage:Ce(ot)||"Retry failed. Please try again."}),W(!1)}finally{L(!1)}},[tt,l,ee,h]),Cn=i.useCallback(async()=>{if(h.type==="summary"&&!((N==="existing"||N==="custom-new")&&!w.trim())){p(null),F(!0);try{const he=h.session.sessionId,bt=await jE(he,g??void 0,l,{branchSelection:{mode:N,...N==="existing"||N==="custom-new"?{branchName:w.trim()}:{},...R.trim()?{baseBranch:R.trim()}:{}}});s(bt),Wt(null),_t(ot=>ot.filter(St=>St.id!==he)),Re({sessionId:he,status:"complete",timestamp:Date.now()}),Yt()}catch(he){p(Ce(he)||"Failed to create task")}finally{F(!1)}}},[R,N,w,Re,g,h,l,s,Yt]),bs=i.useCallback(async()=>{if(h.type==="summary"){p(null),k(!0);try{const he=await NE(h.session.sessionId,g??void 0,l),bt=he.subtasks.map(ot=>({...ot,priority:Mr(ot.priority),dependsOn:[...ot.dependsOn]}));ye(he.sessionId),m({type:"breakdown",sessionId:he.sessionId,originalSubtasks:bt.map(ot=>({...ot,dependsOn:[...ot.dependsOn]})),subtasks:bt.map(ot=>({...ot,dependsOn:[...ot.dependsOn]})),dirty:!1})}catch(he){p(Ce(he)||"Failed to start breakdown")}finally{k(!1)}}},[g,h,l]),Ts=i.useCallback(async()=>{if(h.type==="breakdown"){p(null),J(!0);try{const he=h.sessionId,bt=await SE(he,iz(h.originalSubtasks,h.subtasks.map(ot=>({...ot,priority:Mr(ot.priority)}))),l,{branchSelection:{mode:N,...N==="existing"||N==="custom-new"?{branchName:w.trim()}:{},...R.trim()?{baseBranch:R.trim()}:{}}});a(bt.tasks),_t(ot=>ot.filter(St=>St.id!==he)),Re({sessionId:he,status:"complete",timestamp:Date.now()}),u(""),m({type:"initial"}),p(null),v([]),y([]),j(null),U(""),At(void 0),Se(void 0),_e("medium"),Ae(""),O.current=null,ye(null),Wt(null),Yt()}catch(he){p(Ce(he)||"Failed to create tasks")}finally{J(!1)}}},[R,N,w,Re,Yt,h,a,l]),kn=i.useCallback(async()=>{if(h.type!=="question"||b.length===0)return;const he=h.session.sessionId;p(null),m({type:"loading"});try{const bt=await yE(he,l,ee);v(bt.history.map(ot=>ot.response&&typeof ot.response=="object"&&!Array.isArray(ot.response)?ot.response:{[ot.question.id]:ot.response})),y(bt.history.map(ot=>({question:ot.question,response:ot.response&&typeof ot.response=="object"&&!Array.isArray(ot.response)?ot.response:{[ot.question.id]:ot.response},thinkingOutput:ot.thinkingOutput}))),U(""),m({type:"question",session:{...h.session,currentQuestion:bt.currentQuestion,summary:null}})}catch(bt){p(Ce(bt)||"Failed to go back to the previous question"),m({type:"question",session:h.session})}},[l,b.length,ee,h]),ls=()=>h.type==="question"?Math.min(b.length+1,3):3,cs=ne?Le.get(ne):null,ys=cs&&cs.tabId!==ee,xs=ge&&(!ys||cs.stale);return e?t.jsx("div",{className:"modal-overlay open",onMouseDown:he=>{On.current=he.target===he.currentTarget},onClick:he=>{he.target===he.currentTarget&&On.current&&Yt(),On.current=!1},role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal modal-lg planning-modal",ref:be,children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("div",{className:"detail-title-row",children:[Mt&&t.jsx("button",{className:"modal-back planning-mobile-back",onClick:Me,"aria-label":"Back to sessions",title:"Back to sessions",children:t.jsx(wd,{size:18})}),t.jsx(ba,{size:20,className:"icon-triage"}),t.jsx("h3",{children:"Planning Mode"})]}),t.jsx("div",{className:"modal-header-actions",children:t.jsx("button",{className:"modal-close",onClick:Yt,"aria-label":"Close",children:t.jsx(Nn,{size:20})})})]}),t.jsxs("div",{className:`planning-modal-body planning-modal-body--split ${Mt?"planning-modal-body--show-detail":"planning-modal-body--show-list"}`,children:[t.jsx(mz,{sessions:gt,loading:Ft,selectedSessionId:nt,pendingDeleteId:xn,showArchived:Sn,onToggleShowArchived:()=>is(he=>!he),onArchive:he=>void gn(he),onSelectSession:ce,onNewSession:Ge,onRequestDelete:Tn,onConfirmDelete:he=>void Lt(he),onCancelDelete:()=>Tn(null)}),t.jsxs("div",{className:"planning-detail",children:[f&&t.jsx("div",{className:"form-error planning-error",children:f}),D&&t.jsx("div",{className:"form-hint text-muted",children:"Reconnecting…"}),h.type==="initial"&&t.jsxs("div",{className:"planning-initial",children:[t.jsxs("div",{className:"planning-view-scroll",children:[t.jsxs("div",{className:"planning-intro",children:[t.jsx(Ls,{size:32,className:"icon-triage-lg"}),t.jsx("h4",{children:"Transform your idea into a detailed task"}),t.jsx("p",{className:"text-muted",children:"Describe what you want to build in plain language. The AI will ask clarifying questions and help you structure a well-defined task."})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"initial-plan",children:"What do you want to build?"}),t.jsx("textarea",{ref:Q,id:"initial-plan",className:"planning-textarea",placeholder:"e.g., Build a user authentication system with login, signup, and password reset...",value:d,onChange:he=>{const bt=he.target.value;u(bt),!(se.current||bt.trim().length===0)&&(ve.current&&clearTimeout(ve.current),ve.current=setTimeout(()=>{if(se.current)return;const ot=bt.trim();if(!ot)return;xE(ot,l,Xe&&at?{planningModelProvider:Xe,planningModelId:at}:void 0).then(lt=>{se.current=lt.sessionId,_t(Tt=>Tt.some(zt=>zt.id===lt.sessionId)?Tt:[{id:lt.sessionId,type:"planning",status:"draft",title:lt.title,preview:ot.length>80?`${ot.slice(0,79).trimEnd()}…`:ot,projectId:l??null,lockedByTab:null,updatedAt:new Date().toISOString(),archived:!1},...Tt].sort((zt,Ee)=>Date.parse(Ee.updatedAt)-Date.parse(zt.updatedAt))),Wt(lt.sessionId)}).catch(()=>{})},300))},onKeyDown:he=>{he.key==="Enter"&&!he.shiftKey&&d.trim()&&(he.preventDefault(),Ye())},onBlur:()=>{const he=se.current;he&&d.trim()&&Bn(he,d)}})]}),t.jsxs("div",{className:"planning-examples",children:[t.jsx("span",{className:"planning-examples-label",children:"Try an example:"}),t.jsx("div",{className:"planning-example-chips",children:nz.map((he,bt)=>t.jsx("button",{className:"planning-example-chip",onClick:()=>u(he),children:he.length>40?he.slice(0,40)+"...":he},bt))})]}),t.jsx(Ui,{summary:"Advanced planning settings",className:"planning-advanced-disclosure",children:t.jsxs("div",{className:"planning-advanced-content",children:[t.jsxs("div",{className:"planning-advanced-section planning-model-select-group",children:[t.jsxs("label",{htmlFor:"planning-modal-model",className:"form-label",children:["Planning Model",Nt&&t.jsx("span",{className:"text-muted text-muted-sm",children:"Loading models…"})]}),t.jsx("p",{className:"planning-advanced-blurb",children:"Selects which model runs the planning interview and writes the final draft."}),t.jsx(ri,{id:"planning-modal-model",label:"Planning Model",value:Jt,onChange:he=>{const{provider:bt,modelId:ot}=rz(he);At(bt),Se(ot)},models:it,disabled:Nt,favoriteProviders:Oe,onToggleFavorite:Fe,favoriteModels:je,onToggleModelFavorite:Je}),Be&&t.jsxs("div",{className:"form-hint form-hint-error",children:[Be," ",t.jsx("button",{type:"button",className:"text-link-btn",onClick:()=>{ie()},children:"Retry"})]}),t.jsx("div",{className:"model-selector-current model-selector-current--spaced",children:t.jsx("span",{className:`model-badge ${Xe&&at?"model-badge-custom":"model-badge-default"}`,children:Qt(Xe,at)})})]}),t.jsxs("div",{className:"planning-advanced-section planning-depth-selector",children:[t.jsx("p",{className:"planning-advanced-blurb",children:"Plan size sets default interview depth. Questions lets you override with an exact count."}),t.jsxs("div",{className:"planning-depth-controls-row",children:[t.jsx("div",{className:"planning-depth-chip-group",role:"group","aria-label":"Planning depth",children:[{value:"small",label:"Small"},{value:"medium",label:"Medium"},{value:"large",label:"Large"}].map(he=>t.jsx("button",{type:"button",className:`planning-depth-chip btn ${pe===he.value?"btn-primary planning-depth-chip-active":""}`,onClick:()=>_e(he.value),"aria-pressed":pe===he.value,children:he.label},he.value))}),t.jsxs("label",{className:"planning-depth-question-count",htmlFor:"planning-depth-questions",children:[t.jsx("span",{children:"Questions"}),t.jsx("input",{id:"planning-depth-questions",className:"input planning-depth-question-input",type:"number",min:1,max:20,value:et,onChange:he=>Ae(he.target.value),placeholder:"Auto"})]})]})]})]})})]}),t.jsx("div",{className:"planning-view-footer",children:t.jsxs("button",{className:"btn btn-primary planning-start-btn",onClick:()=>Ye(),disabled:!d.trim(),children:[t.jsx(ba,{size:16,className:"icon-mr-8"}),"Start Planning"]})})]}),h.type==="loading"&&t.jsxs("div",{className:"planning-loading",children:[t.jsx(Ct,{size:40,className:"spin icon-todo"}),t.jsx("p",{children:G?"AI is thinking...":"Generating next question..."}),oe&&t.jsxs("div",{className:"planning-elapsed",children:["Thinking… (",we,"s)"]}),t.jsxs("div",{className:"planning-thinking-container",children:[t.jsx("button",{className:"planning-thinking-toggle",onClick:()=>T(!P),type:"button",children:P?"Hide thinking":"Show thinking"}),t.jsx("div",{className:"planning-loading-actions",children:t.jsxs("button",{className:"btn planning-stop-btn",type:"button",onClick:()=>void me(),children:[t.jsx(kN,{size:14}),t.jsx("span",{className:"icon-ml-6",children:"Stop"})]})}),P&&G&&t.jsx("div",{className:"planning-thinking-output",ref:un,children:t.jsx("pre",{children:G})})]})]}),h.type==="error"&&t.jsx("div",{className:"planning-summary",children:t.jsxs("div",{className:"planning-view-scroll planning-summary-scroll",children:[x.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:x}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"ai-error-panel",role:"alert",children:[t.jsx("div",{className:"ai-error-icon",children:"⚠️"}),t.jsx("div",{className:"ai-error-message",children:h.errorMessage}),t.jsxs("div",{className:"ai-error-actions",children:[t.jsxs("button",{className:"btn btn-primary",onClick:()=>void jt(),disabled:Y,children:[Y?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ss,{size:14}),t.jsx("span",{className:"icon-ml-6",children:Y?"Retrying...":"Retry"})]}),t.jsx("button",{className:"btn",onClick:Yt,disabled:Y,children:"Dismiss"})]})]})]})}),h.type==="question"&&h.session.currentQuestion&&t.jsx("div",{className:"planning-question",children:t.jsx(lz,{question:h.session.currentQuestion,progress:ls(),historyEntries:x,onSubmit:$n,onBack:b.length>0?kn:void 0})}),h.type==="summary"&&g&&t.jsx(cz,{summary:g,historyEntries:x,onSummaryChange:j,tasks:r,branchMode:N,branchName:w,baseBranch:R,onBranchModeChange:C,onBranchNameChange:S,onBaseBranchChange:I,onCreateTask:Cn,onBreakIntoTasks:bs,onRefine:()=>{dn()},isLoading:_||ae}),h.type==="breakdown"&&t.jsx(uz,{subtasks:h.subtasks,isLoading:z,onUpdateSubtasks:he=>m({...h,subtasks:he,dirty:!0}),onCreateTasks:Ts,onBack:()=>{const bt={sessionId:h.sessionId,currentQuestion:null,summary:g??null};g&&m({type:"summary",session:bt,summary:g})}})]}),ge&&t.jsx("div",{className:"session-lock-overlay","data-testid":"session-lock-overlay",children:t.jsxs("div",{className:"session-lock-banner",children:[t.jsx(Do,{size:16}),t.jsx("span",{children:xs?"This session is active in another tab":"This session is active in another tab (live heartbeat)"}),xs&&t.jsx("button",{type:"button",onClick:()=>{Ne()},disabled:He,className:"btn btn-primary session-lock-take-control",children:He?"Taking control...":"Take Control"})]})})]})]})}):null}function lz({question:e,progress:n,historyEntries:s,onSubmit:a,onBack:r}){const[o,l]=i.useState({}),[c,d]=i.useState(""),[u,h]=i.useState(""),{ref:m}=Pl({value:c,minHeight:120,maxHeight:640,deps:[e.id]}),{ref:f}=Pl({value:u,minHeight:80,maxHeight:640,deps:[e.id]}),p=i.useCallback(()=>{let v;e.type==="text"?v={[e.id]:c}:e.type==="confirm"?v={[e.id]:o[e.id]===!0}:v=o;const x=u.trim();x.length>0&&(v={...v,_comment:x}),a(v)},[u,e,o,c,a]);i.useEffect(()=>{l({}),d(""),h("")},[e.id]);const b=()=>{switch(e.type){case"text":return c.trim().length>0;case"single_select":return o[e.id]!==void 0;case"multi_select":return Array.isArray(o[e.id])&&o[e.id].length>0;case"confirm":return o[e.id]!==void 0;default:return!0}};return t.jsxs("div",{className:"planning-question-form",children:[t.jsxs("div",{className:"planning-view-scroll planning-question-scroll",children:[s.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:s}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"planning-question-panel",children:[t.jsxs("div",{className:"planning-progress",children:[t.jsx("div",{className:"planning-progress-bar",children:[1,2,3].map(v=>t.jsx("div",{className:`planning-progress-step ${v<=n?"active":""}`},v))}),t.jsxs("span",{className:"planning-progress-text",children:["Question ",n," of ~3"]})]}),t.jsxs("div",{className:"planning-question-content",children:[t.jsx("h4",{className:"planning-question-text",children:e.question}),e.description&&t.jsx("p",{className:"planning-question-desc",children:e.description}),t.jsxs("div",{className:"planning-options",children:[e.type==="text"&&t.jsx("textarea",{ref:m,className:"planning-textarea",placeholder:"Type your answer here...",value:c,onChange:v=>d(v.target.value),onKeyDown:v=>{v.key==="Enter"&&!v.shiftKey&&c.trim()&&(v.preventDefault(),p())}}),e.type==="single_select"&&e.options&&t.jsx("div",{className:"planning-radio-group",role:"radiogroup",children:e.options.map(v=>t.jsxs("label",{className:"planning-option planning-option--radio",children:[t.jsx("input",{type:"radio",name:e.id,value:v.id,checked:o[e.id]===v.id,onChange:()=>l({[e.id]:v.id})}),t.jsxs("div",{className:"planning-option-content",children:[t.jsx("span",{className:"planning-option-label",children:v.label}),v.description&&t.jsx("span",{className:"planning-option-desc",children:v.description})]})]},v.id))}),e.type==="multi_select"&&e.options&&t.jsx("div",{className:"planning-checkbox-group",children:e.options.map(v=>{const x=o[e.id]||[];return t.jsxs("label",{className:"planning-option planning-option--checkbox",children:[t.jsx("input",{type:"checkbox",value:v.id,checked:x.includes(v.id),onChange:y=>{const g=y.target.checked?[...x,v.id]:x.filter(j=>j!==v.id);l({[e.id]:g})}}),t.jsxs("div",{className:"planning-option-content",children:[t.jsx("span",{className:"planning-option-label",children:v.label}),v.description&&t.jsx("span",{className:"planning-option-desc",children:v.description})]})]},v.id)})}),e.type==="confirm"&&t.jsxs("div",{className:"planning-confirm-group",children:[t.jsxs("button",{className:`planning-confirm-btn ${o[e.id]===!0?"selected":""}`,onClick:()=>l({[e.id]:!0}),children:[t.jsx(gs,{size:18}),"Yes"]}),t.jsxs("button",{className:`planning-confirm-btn ${o[e.id]===!1?"selected":""}`,onClick:()=>l({[e.id]:!1}),children:[t.jsx(Nn,{size:18}),"No"]})]})]}),e.type!=="text"&&t.jsxs("div",{className:"planning-comment-section",children:[t.jsx("label",{className:"planning-comment-label",htmlFor:`planning-comment-${e.id}`,children:"Additional comments (optional)"}),t.jsx("textarea",{ref:f,id:`planning-comment-${e.id}`,className:"planning-textarea",placeholder:"Add any extra context or direction...",value:u,onChange:v=>h(v.target.value)})]})]})]})]}),t.jsxs("div",{className:"planning-actions",children:[r&&t.jsxs("button",{className:"btn",onClick:r,children:[t.jsx(Tr,{size:16,className:"icon-mr-4"}),"Back"]}),t.jsxs("button",{className:"btn btn-primary planning-actions-primary",onClick:p,disabled:!b(),children:["Continue",t.jsx(Dl,{size:16,className:"icon-ml-4"})]})]})]})}function cz({summary:e,historyEntries:n,onSummaryChange:s,tasks:a,branchMode:r,branchName:o,baseBranch:l,onBranchModeChange:c,onBranchNameChange:d,onBaseBranchChange:u,onCreateTask:h,onBreakIntoTasks:m,onRefine:f,isLoading:p}){const[b,v]=i.useState(!1),[x,y]=i.useState(e.suggestedDependencies),{ref:g}=Pl({value:e.description,minHeight:b?200:120,maxHeight:b?800:640,deps:[b]}),j=Mr(e.priority),N=r==="existing"||r==="custom-new",C=N&&!o.trim(),w=S=>{const R=x.includes(S)?x.filter(I=>I!==S):[...x,S];y(R),s({...e,suggestedDependencies:R})};return t.jsxs("div",{className:"planning-summary",children:[t.jsxs("div",{className:"planning-view-scroll planning-summary-scroll",children:[n.length>0&&t.jsxs(Ui,{summary:"Show user Q&A",className:"planning-summary-qa-disclosure",children:[t.jsx(Wi,{entries:n}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"planning-summary-header",children:[t.jsx(gs,{size:24,className:"icon-success"}),t.jsx("h4",{children:"Planning Complete!"}),t.jsx("p",{className:"text-muted",children:"Review and refine your task before creating it."})]}),t.jsxs("div",{className:"planning-summary-form",children:[t.jsxs("div",{className:"form-group",children:[t.jsxs("label",{children:["Description",t.jsx("button",{type:"button",className:"planning-expand-btn",onClick:()=>v(!b),children:b?"Collapse":"Expand"})]}),t.jsx("textarea",{ref:g,className:`planning-textarea ${b?"expanded":""}`,value:e.description,onChange:S=>s({...e,description:S.target.value})})]}),t.jsxs("div",{className:"task-detail-section",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Branch strategy"}),t.jsxs("select",{value:r,onChange:S=>c(S.target.value),disabled:p,children:[t.jsx("option",{value:"project-default",children:"Use project/default branch"}),t.jsx("option",{value:"auto-new",children:"Create auto-named branch per task"}),t.jsx("option",{value:"existing",children:"Use existing branch"}),t.jsx("option",{value:"custom-new",children:"Create custom new branch"})]})]}),N&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Branch name"}),t.jsx("input",{value:o,onChange:S=>d(S.target.value),disabled:p})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Merge target / base branch (optional)"}),t.jsx("input",{value:l,onChange:S=>u(S.target.value),disabled:p,placeholder:"main"})]}),C&&t.jsx("div",{className:"form-error planning-error",children:"Branch name is required for this branch strategy."})]}),t.jsxs("div",{className:"planning-summary-meta-row",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"planning-summary-size",children:"Suggested Size"}),t.jsxs("select",{id:"planning-summary-size",className:"planning-size-select",value:e.suggestedSize,onChange:S=>s({...e,suggestedSize:S.target.value}),disabled:p,children:[t.jsx("option",{value:"S",children:"S (Small)"}),t.jsx("option",{value:"M",children:"M (Medium)"}),t.jsx("option",{value:"L",children:"L (Large)"})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"planning-summary-priority",children:"Priority"}),t.jsx("select",{id:"planning-summary-priority",className:"planning-size-select",value:j,onChange:S=>s({...e,priority:S.target.value}),disabled:p,children:nr.map(S=>t.jsx("option",{value:S,children:S[0].toUpperCase()+S.slice(1)},S))})]})]}),a.length>0&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Suggested Dependencies"}),t.jsx("div",{className:"planning-deps-list",children:a.map(S=>t.jsxs("label",{className:`planning-dep-chip ${x.includes(S.id)?"selected":""}`,children:[t.jsx("input",{type:"checkbox",checked:x.includes(S.id),onChange:()=>w(S.id)}),t.jsx("span",{className:"planning-dep-id",children:S.id}),t.jsx("span",{className:"planning-dep-title",children:S.title||S.description.slice(0,30)})]},S.id))})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Key Deliverables"}),t.jsx("ul",{className:"planning-deliverables",children:e.keyDeliverables.map((S,R)=>t.jsx("li",{children:S},R))})]})]})]}),t.jsxs("div",{className:"planning-actions planning-summary-actions",children:[t.jsxs("button",{className:"btn",onClick:f,disabled:p,children:[t.jsx(Tr,{size:16,className:"icon-mr-4"}),"Refine Further"]}),t.jsxs("div",{className:"planning-summary-actions-right",children:[t.jsx("button",{className:"btn",onClick:h,disabled:p||C,children:p?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:16,className:"spin icon-mr-8"}),"Creating..."]}):t.jsxs(t.Fragment,{children:[t.jsx(gs,{size:16,className:"icon-mr-8"}),"Create Single Task"]})}),t.jsx("button",{className:"btn btn-primary",onClick:m,disabled:p,title:"Break the plan into multiple tasks with dependencies",children:p?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:16,className:"spin icon-mr-8"}),"Breaking down..."]}):t.jsxs(t.Fragment,{children:[t.jsx(Sd,{size:16,className:"icon-mr-8"}),"Break into Tasks"]})})]})]})]})}function dx(e){const n=new Map(e.map(o=>[o.id,o.dependsOn])),s=new Set,a=new Set,r=o=>{if(s.has(o))return!0;if(a.has(o))return!1;s.add(o);for(const l of n.get(o)??[])if(n.has(l)&&r(l))return!0;return s.delete(o),a.add(o),!1};return e.some(o=>r(o.id))}function dz(e){return{id:`subtask-${e}`,title:"",description:"",suggestedSize:"M",priority:di,dependsOn:[]}}function uz({subtasks:e,isLoading:n,onUpdateSubtasks:s,onCreateTasks:a,onBack:r}){const[o,l]=i.useState(null),[c,d]=i.useState(null),[u,h]=i.useState(null),m=i.useRef([]),f=i.useMemo(()=>e.length===0||e.some(w=>!w.title.trim())?!0:dx(e),[e]),p=i.useCallback((w,S)=>{s(e.map(R=>R.id===w?{...R,...S}:R))},[e,s]),b=i.useCallback(()=>{s([...e,dz(e.length+1)])},[e,s]),v=i.useCallback(w=>{s(e.filter(S=>S.id!==w).map(S=>({...S,dependsOn:S.dependsOn.filter(R=>R!==w)})))},[e,s]),x=i.useCallback((w,S)=>{if(S<0||S>=e.length)return;const R=[...e],[I]=R.splice(w,1);R.splice(S,0,I),s(R)},[e,s]),y=i.useCallback(w=>S=>{l(w),S.dataTransfer.setData("text/plain",w),S.dataTransfer.effectAllowed="move"},[]),g=i.useCallback(()=>{l(null),d(null),h(null)},[]),j=i.useCallback(w=>S=>{if(S.preventDefault(),w===o)return;const R=S.currentTarget.getBoundingClientRect(),I=R.top+R.height/2,E=S.clientY<I?"before":"after";d(w),h(E)},[o]),N=i.useCallback(w=>S=>{S.preventDefault();const R=S.dataTransfer.getData("text/plain");if(!R||R===w){g();return}const I=e.findIndex(P=>P.id===R),E=e.findIndex(P=>P.id===w);if(I===-1||E===-1){g();return}const M=[...e],[G]=M.splice(I,1);let U=E;u==="after"&&I<E&&U--,u==="after"&&U++,M.splice(U,0,G),s(M),g()},[e,u,s,g]),C=i.useCallback(w=>{const S=w.currentTarget.getBoundingClientRect(),R=w.clientX,I=w.clientY;(R<S.left||R>S.right||I<S.top||I>S.bottom)&&(d(null),h(null))},[]);return t.jsxs("div",{className:"planning-summary",children:[t.jsxs("div",{className:"planning-view-scroll planning-summary-scroll",children:[t.jsxs("div",{className:"planning-summary-header",children:[t.jsx(Sd,{size:24,className:"icon-triage"}),t.jsx("h4",{children:"Break into Tasks"}),t.jsx("p",{className:"text-muted",children:"Review and edit the subtasks generated from your plan. Adjust titles, descriptions, sizes, priorities, and dependencies before creating."})]}),t.jsxs("div",{className:"planning-summary-form",children:[e.map((w,S)=>{const R=o===w.id,I=c===w.id,E=["task-detail-section","subtask-item",R?"subtask-item-dragging":"",I?"subtask-item-drop-target":"",I&&u==="before"?"subtask-item-drop-before":"",I&&u==="after"?"subtask-item-drop-after":""].filter(Boolean).join(" ");return t.jsxs("div",{className:E,"data-testid":`subtask-item-${S}`,draggable:!n,onDragStart:y(w.id),onDragEnd:g,onDragOver:j(w.id),onDrop:N(w.id),onDragLeave:C,children:[t.jsxs("div",{className:"detail-title-row subtask-item-header subtask-item-header--between",children:[t.jsxs("div",{className:"subtask-drag-handle",title:"Drag to reorder",children:[t.jsx(Nd,{size:16}),t.jsx("strong",{children:w.id})]}),t.jsxs("div",{className:"subtask-item-actions",children:[t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>x(S,S-1),disabled:n||S===0,title:"Move up","aria-label":"Move subtask up",children:t.jsx(ua,{size:14})}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>x(S,S+1),disabled:n||S===e.length-1,title:"Move down","aria-label":"Move subtask down",children:t.jsx(Wa,{size:14})}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>v(w.id),disabled:n,children:[t.jsx(es,{size:14})," Remove"]})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Title"}),t.jsx("input",{ref:M=>{m.current[S]=M},value:w.title,onChange:M=>p(w.id,{title:M.target.value}),onKeyDown:M=>{M.key==="Enter"&&(M.preventDefault(),S<e.length-1&&m.current[S+1]?.focus())},disabled:n})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Description"}),t.jsx("textarea",{rows:3,value:w.description,onChange:M=>p(w.id,{description:M.target.value}),disabled:n})]}),t.jsxs("div",{className:"planning-summary-meta-row",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`${w.id}-size`,children:"Size"}),t.jsxs("select",{id:`${w.id}-size`,className:"planning-size-select",value:w.suggestedSize,onChange:M=>p(w.id,{suggestedSize:M.target.value}),disabled:n,children:[t.jsx("option",{value:"S",children:"S"}),t.jsx("option",{value:"M",children:"M"}),t.jsx("option",{value:"L",children:"L"})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`${w.id}-priority`,children:"Priority"}),t.jsx("select",{id:`${w.id}-priority`,className:"planning-size-select",value:Mr(w.priority),onChange:M=>p(w.id,{priority:M.target.value}),disabled:n,children:nr.map(M=>t.jsx("option",{value:M,children:M[0].toUpperCase()+M.slice(1)},M))})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Dependencies"}),t.jsxs("div",{className:"planning-deps-list",children:[e.slice(0,S).filter(M=>M.id!==w.id).map(M=>{const G=w.dependsOn.includes(M.id);return t.jsxs("label",{className:`planning-dep-chip ${G?"selected":""}`,children:[t.jsx("input",{type:"checkbox",checked:G,onChange:()=>{const U=G?w.dependsOn.filter(P=>P!==M.id):[...w.dependsOn,M.id];p(w.id,{dependsOn:U})},disabled:n}),t.jsx("span",{className:"planning-dep-id",children:M.id}),t.jsx("span",{className:"planning-dep-title",children:M.title||"Untitled"})]},M.id)}),S===0&&t.jsx("div",{className:"text-muted",children:"First subtask cannot have dependencies."}),S>0&&e.slice(0,S).filter(M=>M.id!==w.id).length===0&&t.jsx("div",{className:"text-muted",children:"No previous subtasks available."})]})]})]},w.id)}),t.jsxs("button",{type:"button",className:"btn",onClick:b,disabled:n,children:[t.jsx(os,{size:16,className:"icon-mr-6"})," Add subtask"]}),dx(e)&&t.jsx("div",{className:"form-error planning-error",children:"Dependencies contain a cycle. Remove circular references before creating tasks."})]})]}),t.jsxs("div",{className:"planning-actions planning-summary-actions",children:[t.jsxs("button",{className:"btn",onClick:r,disabled:n,children:[t.jsx(Tr,{size:16,className:"icon-mr-4"}),"Back to Summary"]}),t.jsx("button",{className:"btn btn-primary",onClick:a,disabled:n||f,children:n?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:16,className:"spin icon-mr-6"}),"Creating..."]}):t.jsx(t.Fragment,{children:"Create Tasks"})})]})]})}function mz({sessions:e,loading:n,selectedSessionId:s,pendingDeleteId:a,showArchived:r,onToggleShowArchived:o,onArchive:l,onSelectSession:c,onNewSession:d,onRequestDelete:u,onConfirmDelete:h,onCancelDelete:m}){return t.jsxs("aside",{className:"planning-sidebar","aria-label":"Planning sessions",children:[t.jsx("div",{className:"planning-sidebar-header",children:t.jsxs("button",{className:`planning-sidebar-new ${s===null?"active":""}`,onClick:d,type:"button",children:[t.jsx(qS,{size:16}),t.jsx("span",{children:"New session"})]})}),t.jsxs("div",{className:"planning-sidebar-list",children:[e.length===0&&!n&&t.jsx("div",{className:"planning-sidebar-empty text-muted",children:"No saved sessions yet. Start one on the right to see it here."}),e.map(f=>{const p=f.id===s,b=a===f.id,v=f.archived===!0,x=f.status==="complete"||f.status==="error";return t.jsxs("div",{className:`planning-sidebar-item ${p?"selected":""} ${b?"pending-delete":""} ${v?"archived":""}`,children:[t.jsxs("button",{type:"button",className:"planning-sidebar-item-button",onClick:()=>c(f.id),children:[t.jsx(hz,{status:f.status}),t.jsxs("span",{className:"planning-sidebar-item-body",children:[t.jsx("span",{className:"planning-sidebar-item-title",children:f.status==="draft"&&(!f.title||f.title==="New planning session")?f.preview??"New planning session":f.title||"Untitled session"}),t.jsxs("span",{className:"planning-sidebar-item-meta",children:[t.jsx(fz,{status:f.status}),t.jsx("span",{"aria-hidden":!0,children:" · "}),t.jsx("span",{children:pz(f.updatedAt)})]})]})]}),b?t.jsxs("div",{className:"planning-sidebar-confirm",children:[t.jsx("button",{type:"button",className:"btn btn-sm btn-danger",onClick:()=>h(f.id),children:"Delete"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:m,children:"Cancel"})]}):t.jsxs("div",{className:"planning-sidebar-item-actions",children:[x&&t.jsx("button",{type:"button",className:"planning-sidebar-item-archive",onClick:y=>{y.stopPropagation(),l(f.id)},"aria-label":v?"Unarchive session":"Archive session",title:v?"Unarchive session":"Archive session",children:v?t.jsx(Jj,{size:14}):t.jsx(Ar,{size:14})}),t.jsx("button",{type:"button",className:"planning-sidebar-item-delete",onClick:y=>{y.stopPropagation(),u(f.id)},"aria-label":"Delete session",title:"Delete session",children:t.jsx(es,{size:14})})]})]},f.id)})]}),t.jsx("div",{className:"planning-sidebar-footer",children:t.jsx("a",{href:"#",className:"planning-sidebar-toggle-archived-link",onClick:f=>{f.preventDefault(),o()},"aria-pressed":r,children:r?"Hide archived":"Show archived"})})]})}function hz({status:e}){switch(e){case"generating":return t.jsx(Ct,{size:14,className:"spin planning-sidebar-status-icon planning-sidebar-status-generating"});case"awaiting_input":return t.jsx(jm,{size:14,className:"planning-sidebar-status-icon planning-sidebar-status-awaiting"});case"complete":return t.jsx(gs,{size:14,className:"planning-sidebar-status-icon planning-sidebar-status-complete"});case"error":return t.jsx(oi,{size:14,className:"planning-sidebar-status-icon planning-sidebar-status-error"});default:return t.jsx(pa,{size:14,className:"planning-sidebar-status-icon"})}}function fz({status:e}){switch(e){case"generating":return t.jsx("span",{children:"Generating"});case"awaiting_input":return t.jsx("span",{children:"Needs input"});case"complete":return t.jsx("span",{children:"Complete"});case"error":return t.jsx("span",{children:"Error"});default:return t.jsx("span",{children:e})}}function pz(e){const n=Date.now()-Date.parse(e);if(!Number.isFinite(n)||n<0)return"";const s=Math.floor(n/1e3);if(s<60)return"just now";const a=Math.floor(s/60);if(a<60)return`${a}m ago`;const r=Math.floor(a/60);if(r<24)return`${r}h ago`;const o=Math.floor(r/24);if(o<7)return`${o}d ago`;const l=Math.floor(o/7);return l<4?`${l}w ago`:new Date(e).toLocaleDateString()}function gz(e){return{id:`subtask-${e}`,title:"",description:"",suggestedSize:"M",dependsOn:[]}}function ux(e){const n=new Map(e.map(o=>[o.id,o.dependsOn])),s=new Set,a=new Set,r=o=>{if(s.has(o))return!0;if(a.has(o))return!1;s.add(o);for(const l of n.get(o)??[])if(n.has(l)&&r(l))return!0;return s.delete(o),a.add(o),!1};return e.some(o=>r(o.id))}function bz({isOpen:e,onClose:n,initialDescription:s,onTasksCreated:a,parentTaskId:r,projectId:o,resumeSessionId:l}){const c=$i();ta(e);const{keyboardOverlap:d,viewportHeight:u,viewportOffsetTop:h,keyboardOpen:m}=Ia({enabled:c==="mobile"}),f=m?{"--keyboard-overlap":`${d}px`,"--vv-offset-top":`${h}px`,...u!==null?{"--vv-height":`${u}px`}:{}}:{},[p,b]=i.useState({type:"initial"}),[v,x]=i.useState([]),[y,g]=i.useState([]),[j,N]=i.useState(""),[C,w]=i.useState(!0),[S,R]=i.useState(!1),[I,E]=i.useState(!1),[M,G]=i.useState(s),[U,P]=i.useState(null),[T,D]=i.useState(!1),[W,Y]=i.useState("project-default"),[L,_]=i.useState(""),[F,ae]=i.useState(""),[k,z]=i.useState("shared"),[J,oe]=i.useState(null),[le,we]=i.useState(null),[re,H]=i.useState(null),ue=i.useRef(null),Q=i.useRef([]),be=i.useRef(!1),fe=i.useRef(null),O=p.type==="generating"||p.type==="editing"||p.type==="creating"||p.type==="error"?p.sessionId:null,se=i.useMemo(()=>Pr(),[]),{isLockedByOther:ve,takeControl:A,isLoading:ne}=Fd(e?O:null),{activeTabMap:ye,broadcastUpdate:ee,broadcastCompleted:ge,broadcastLock:Ne,broadcastUnlock:He,broadcastHeartbeat:Le}=Bo(),de=i.useMemo(()=>v.length===0||v.some(Te=>!Te.title.trim())||(W==="existing"||W==="custom-new")&&!L.trim()?!0:ux(v),[W,L,v]),Re=p.type==="generating"||p.type==="editing"||p.type==="error",Pe=O?ye.get(O):null,{confirm:rt}=Di(),qe=Pe&&Pe.tabId!==se,Xe=!!(qe&&!Pe.stale),At=ve&&(!qe||Pe.stale),at=i.useCallback(()=>{M&&tF(M,o),ue.current?.close(),ue.current=null,b({type:"initial"}),x([]),g([]),N(""),w(!0),R(!1),E(!1),P(null),D(!1),Y("project-default"),_(""),ae(""),z("shared"),be.current=!1},[M,o]),Se=i.useCallback(()=>{ue.current?.close(),ue.current=null,n()},[n]),pe=i.useCallback(async()=>{if(!((T||p.type==="editing"||p.type==="creating")&&!await rt({title:"Discard Changes",message:"Close subtask breakdown? Unsaved changes will be lost.",danger:!0}))){if(O)try{await uy(O,o,se)}catch{}at(),n()}},[T,n,at,O,se,p.type,o,rt]),_e=i.useCallback(Te=>{ue.current?.close(),ue.current=e_(Te,o,{onThinking:xe=>{N(gt=>gt+xe),ee({sessionId:Te,status:"generating",needsInput:!1,owningTabId:se,type:"subtask",title:M.trim()||void 0,projectId:o??null})},onSubtasks:xe=>{R(!1),E(!1),Ku(o),x(xe),b({type:"editing",sessionId:Te}),D(!1),ee({sessionId:Te,status:"awaiting_input",needsInput:!0,owningTabId:se,type:"subtask",title:M.trim()||void 0,projectId:o??null})},onError:xe=>{const gt=xe||"Session failed while contacting the AI.";R(!1),E(!1),P(null),b({type:"error",sessionId:Te,errorMessage:gt}),ee({sessionId:Te,status:"error",needsInput:!1,owningTabId:se,type:"subtask",title:M.trim()||void 0,projectId:o??null}),ge({sessionId:Te,status:"error"})},onComplete:()=>{ge({sessionId:Te,status:"complete"})},onConnectionStateChange:xe=>{R(xe==="reconnecting")}})},[ge,ee,M,o,se]),et=i.useCallback(async()=>{if(M.trim()){P(null),g([]),N(""),R(!1);try{const{sessionId:Te}=await XE(M.trim(),o);b({type:"generating",sessionId:Te}),_e(Te)}catch(Te){P(Ce(Te)||"Failed to start subtask breakdown"),b({type:"initial"})}}},[_e,M,o]);i.useEffect(()=>{if(!e){at();return}if(e&&s&&!be.current)G(s),be.current=!0,et();else if(e&&!s&&!be.current){const Te=nF(o);Te&&G(Te)}},[e,s,et,at]),i.useEffect(()=>{!e||!l||p.type!=="initial"||(async()=>{try{const Te=await ma(l);if(!Te)return;const xe=Co(Te.conversationHistory);if(g(xe),Te.status==="generating"||Te.status==="awaiting_input")N(Te.thinkingOutput??""),b({type:"generating",sessionId:l}),_e(l);else if(Te.status==="complete"&&Te.result){Ku(o);const gt=JSON.parse(Te.result);x(gt),b({type:"editing",sessionId:l})}else Te.status==="error"&&(P(null),b({type:"error",sessionId:l,errorMessage:Te.error??"Session encountered an error"}))}catch(Te){P(Ce(Te)||"Failed to resume session")}})()},[_e,e,l,p.type,o]),i.useEffect(()=>{if(!e){fe.current&&(He(fe.current,se),fe.current=null);return}if(O&&fe.current!==O){fe.current&&He(fe.current,se),Ne(O,se),fe.current=O;return}!O&&fe.current&&(He(fe.current,se),fe.current=null)},[Ne,He,e,O,se]),i.useEffect(()=>{if(!e||!O||fe.current!==O)return;Le(se);const Te=setInterval(()=>{Le(se)},3e4);return()=>{clearInterval(Te)}},[Le,e,O,se]),i.useEffect(()=>()=>{ue.current?.close(),fe.current&&(He(fe.current,se),fe.current=null)},[He,se]),i.useEffect(()=>{if(!e)return;const Te=xe=>{xe.key==="Escape"&&(xe.preventDefault(),pe())};return document.addEventListener("keydown",Te),()=>document.removeEventListener("keydown",Te)},[e,pe]);const Ae=i.useCallback((Te,xe)=>{x(gt=>gt.map(_t=>_t.id===Te?{..._t,...xe}:_t)),D(!0)},[]),it=i.useCallback(()=>{x(Te=>[...Te,gz(Te.length+1)]),D(!0)},[]),xt=i.useCallback(Te=>{x(xe=>xe.filter(gt=>gt.id!==Te).map(gt=>({...gt,dependsOn:gt.dependsOn.filter(_t=>_t!==Te)}))),D(!0)},[]),Nt=i.useCallback(Te=>xe=>{oe(Te),xe.dataTransfer.setData("text/plain",Te),xe.dataTransfer.effectAllowed="move"},[]),Ut=i.useCallback(()=>{oe(null),we(null),H(null)},[]),Be=i.useCallback(Te=>xe=>{if(xe.preventDefault(),Te===J)return;const gt=xe.currentTarget.getBoundingClientRect(),_t=gt.top+gt.height/2,Ft=xe.clientY<_t?"before":"after";we(Te),H(Ft)},[J]),Z=i.useCallback(Te=>xe=>{xe.preventDefault();const gt=xe.dataTransfer.getData("text/plain");if(!gt||gt===Te){oe(null),we(null),H(null);return}x(_t=>{const Ft=_t.findIndex(Kt=>Kt.id===gt),Dt=_t.findIndex(Kt=>Kt.id===Te);if(Ft===-1||Dt===-1)return _t;const nt=[..._t],[Wt]=nt.splice(Ft,1);let Mt=Dt;return re==="after"&&Ft<Dt&&Mt--,re==="after"&&Mt++,nt.splice(Mt,0,Wt),nt}),D(!0),oe(null),we(null),H(null)},[re]),Oe=i.useCallback(Te=>{const xe=Te.currentTarget.getBoundingClientRect(),gt=Te.clientX,_t=Te.clientY;(gt<xe.left||gt>xe.right||_t<xe.top||_t>xe.bottom)&&(we(null),H(null))},[]),ht=i.useCallback((Te,xe)=>{xe<0||xe>=v.length||(x(gt=>{const _t=[...gt],[Ft]=_t.splice(Te,1);return _t.splice(xe,0,Ft),_t}),D(!0))},[v.length]),je=i.useCallback(Te=>{Q.current[Te+1]?.focus()},[]),mt=i.useCallback(async()=>{if(!(!O||de)){P(null),b({type:"creating",sessionId:O});try{const Te=await t_(O,v,r,o,{branchSelection:{mode:W,...W==="existing"||W==="custom-new"?{branchName:L}:{},...F.trim()?{baseBranch:F.trim()}:{}},branchAssignment:{mode:k}});a(Te.tasks),at(),n()}catch(Te){P(Ce(Te)||"Failed to create tasks"),b({type:"editing",sessionId:O})}}},[F,k,W,L,de,n,a,r,o,at,O,v]),Et=i.useCallback(async()=>{if(p.type!=="error")return;const Te=p.sessionId;P(null),E(!0),N(""),b({type:"generating",sessionId:Te}),_e(Te);try{await QE(Te,o,se)}catch(xe){let gt=xe;if((Ce(xe)||"").includes("not in an error state"))try{const Ft=await ma(Te);if(!Ft)throw new Error("Failed to refresh subtask session.");if(g(Co(Ft.conversationHistory)),Ft.status==="generating"||Ft.status==="awaiting_input")N(Ft.thinkingOutput??""),b({type:"generating",sessionId:Ft.id}),ue.current?.isConnected()||_e(Ft.id);else if(Ft.status==="complete"){if(!Ft.result)throw new Error("Subtask session is complete but has no result.");Ku(o);const Dt=JSON.parse(Ft.result);x(Dt),b({type:"editing",sessionId:Ft.id}),D(!1)}else Ft.status==="error"&&b({type:"error",sessionId:Ft.id,errorMessage:Ft.error??"Retry failed. Please try again."});R(!1);return}catch(Ft){gt=Ft}ue.current?.close(),ue.current=null,b({type:"error",sessionId:Te,errorMessage:Ce(gt)||"Retry failed. Please try again."}),R(!1)}finally{E(!1)}},[_e,o,se,p]);return e?t.jsx("div",{className:"modal-overlay open",onClick:Te=>Te.target===Te.currentTarget&&void pe(),role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal modal-lg planning-modal",style:f,children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("div",{className:"detail-title-row",children:[t.jsx(Sd,{size:20,className:"icon-triage"}),t.jsx("h3",{children:"Subtask Breakdown"})]}),t.jsxs("div",{className:"modal-header-actions",children:[Re&&t.jsx("button",{className:"modal-send-to-background",onClick:Se,title:"Send to background","aria-label":"Send to background",children:t.jsx(Ll,{size:16})}),t.jsx("button",{className:"modal-close",onClick:()=>void pe(),"aria-label":"Close",children:t.jsx(Nn,{size:20})})]})]}),t.jsxs("div",{className:"planning-modal-body",children:[U&&t.jsx("div",{className:"form-error planning-error",children:U}),S&&t.jsx("div",{className:"form-hint text-muted",children:"Reconnecting…"}),Xe&&t.jsx("div",{className:"form-hint text-muted","data-testid":"session-active-another-tab-banner",children:"Session is active in another tab."}),p.type==="initial"&&t.jsx("div",{className:"planning-initial",children:t.jsxs("div",{className:"planning-view-scroll",children:[t.jsx("p",{className:"text-muted",children:"Preparing to break this task into subtasks."}),t.jsx("pre",{className:"planning-thinking-output",children:M})]})}),p.type==="generating"&&t.jsxs("div",{className:"planning-loading",children:[y.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:y,defaultShowThinking:!0}),t.jsx("div",{className:"conversation-separator"})]}),t.jsx(Ct,{size:40,className:"spin icon-todo"}),t.jsx("p",{children:"AI is generating subtasks..."}),t.jsxs("div",{className:"planning-thinking-container",children:[t.jsx("button",{className:"planning-thinking-toggle",onClick:()=>w(!C),type:"button",children:C?"Hide thinking":"Show thinking"}),C&&j&&t.jsx("div",{className:"planning-thinking-output",children:t.jsx("pre",{children:j})})]})]}),p.type==="error"&&t.jsx("div",{className:"planning-summary",children:t.jsxs("div",{className:"planning-view-scroll planning-summary-scroll",children:[y.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:y,defaultShowThinking:!0}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"ai-error-panel",role:"alert",children:[t.jsx("div",{className:"ai-error-icon",children:"⚠️"}),t.jsx("div",{className:"ai-error-message",children:p.errorMessage}),t.jsxs("div",{className:"ai-error-actions",children:[t.jsxs("button",{className:"btn btn-primary",onClick:()=>void Et(),disabled:I,children:[I?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ss,{size:14}),t.jsx("span",{className:"icon-ml-6",children:I?"Retrying...":"Retry"})]}),t.jsx("button",{className:"btn",onClick:()=>void pe(),disabled:I,children:"Cancel"})]})]})]})}),(p.type==="editing"||p.type==="creating")&&t.jsxs("div",{className:"planning-summary",children:[t.jsxs("div",{className:"planning-view-scroll planning-summary-scroll",children:[y.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Wi,{entries:y}),t.jsx("div",{className:"conversation-separator"})]}),t.jsxs("div",{className:"planning-summary-header",children:[t.jsx(gs,{size:24,className:"icon-success"}),t.jsx("h4",{children:"Review your subtasks"}),t.jsx("p",{className:"text-muted",children:"Edit titles, descriptions, sizes, and dependencies before creating all tasks at once."})]}),t.jsxs("div",{className:"planning-summary-form",children:[t.jsxs("div",{className:"task-detail-section",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Branch strategy"}),t.jsxs("select",{value:W,onChange:Te=>Y(Te.target.value),disabled:p.type==="creating",children:[t.jsx("option",{value:"project-default",children:"Use project/default branch"}),t.jsx("option",{value:"auto-new",children:"Create auto-named branch per task"}),t.jsx("option",{value:"existing",children:"Use existing branch"}),t.jsx("option",{value:"custom-new",children:"Create custom new branch"})]})]}),(W==="existing"||W==="custom-new")&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Branch name"}),t.jsx("input",{value:L,onChange:Te=>_(Te.target.value),disabled:p.type==="creating"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Merge target / base branch (optional)"}),t.jsx("input",{value:F,onChange:Te=>ae(Te.target.value),disabled:p.type==="creating",placeholder:"main"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Planning branch mode"}),t.jsxs("select",{value:k,onChange:Te=>z(Te.target.value),disabled:p.type==="creating",children:[t.jsx("option",{value:"shared",children:"Shared branch for all subtasks"}),t.jsx("option",{value:"per-task-derived",children:"Per-task branch derived from planning branch"})]})]})]}),v.map((Te,xe)=>{const gt=J===Te.id,_t=le===Te.id,Ft=["task-detail-section","subtask-item",gt?"subtask-item-dragging":"",_t?"subtask-item-drop-target":"",_t&&re==="before"?"subtask-item-drop-before":"",_t&&re==="after"?"subtask-item-drop-after":""].filter(Boolean).join(" ");return t.jsxs("div",{className:Ft,"data-testid":`subtask-item-${xe}`,draggable:p.type!=="creating",onDragStart:Nt(Te.id),onDragEnd:Ut,onDragOver:Be(Te.id),onDrop:Z(Te.id),onDragLeave:Oe,children:[t.jsxs("div",{className:"detail-title-row subtask-item-header subtask-item-header--between",children:[t.jsxs("div",{className:"subtask-drag-handle",title:"Drag to reorder",children:[t.jsx(Nd,{size:16}),t.jsx("strong",{children:Te.id})]}),t.jsxs("div",{className:"subtask-item-actions",children:[t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>ht(xe,xe-1),disabled:p.type==="creating"||xe===0,title:"Move up","aria-label":"Move subtask up",children:t.jsx(ua,{})}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>ht(xe,xe+1),disabled:p.type==="creating"||xe===v.length-1,title:"Move down","aria-label":"Move subtask down",children:t.jsx(Wa,{})}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>xt(Te.id),disabled:p.type==="creating",children:[t.jsx(es,{size:14})," Remove"]})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Title"}),t.jsx("input",{ref:Dt=>{Q.current[xe]=Dt},value:Te.title,onChange:Dt=>Ae(Te.id,{title:Dt.target.value}),onKeyDown:Dt=>{Dt.key==="Enter"&&(Dt.preventDefault(),je(xe))},disabled:p.type==="creating"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Description"}),t.jsx("textarea",{rows:8,value:Te.description,onChange:Dt=>Ae(Te.id,{description:Dt.target.value}),disabled:p.type==="creating"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Size"}),t.jsxs("select",{className:"planning-size-select",value:Te.suggestedSize,onChange:Dt=>Ae(Te.id,{suggestedSize:Dt.target.value}),disabled:p.type==="creating",children:[t.jsx("option",{value:"S",children:"S"}),t.jsx("option",{value:"M",children:"M"}),t.jsx("option",{value:"L",children:"L"})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Dependencies"}),t.jsxs("div",{className:"planning-deps-list",children:[v.slice(0,xe).filter(Dt=>Dt.id!==Te.id).map(Dt=>{const nt=Te.dependsOn.includes(Dt.id);return t.jsxs("label",{className:`planning-dep-chip ${nt?"selected":""}`,children:[t.jsx("input",{type:"checkbox",checked:nt,onChange:()=>{const Wt=nt?Te.dependsOn.filter(Mt=>Mt!==Dt.id):[...Te.dependsOn,Dt.id];Ae(Te.id,{dependsOn:Wt})},disabled:p.type==="creating"}),t.jsx("span",{className:"planning-dep-id",children:Dt.id}),t.jsx("span",{className:"planning-dep-title",children:Dt.title||"Untitled"})]},Dt.id)}),xe===0&&t.jsx("div",{className:"text-muted",children:"First subtask cannot have dependencies."}),xe>0&&v.slice(0,xe).filter(Dt=>Dt.id!==Te.id).length===0&&t.jsx("div",{className:"text-muted",children:"No previous subtasks available."})]})]})]},Te.id)}),t.jsxs("button",{type:"button",className:"btn",onClick:it,disabled:p.type==="creating",children:[t.jsx(os,{size:16,className:"icon-mr-6"})," Add subtask"]}),ux(v)&&t.jsx("div",{className:"form-error planning-error",children:"Dependencies contain a cycle. Remove circular references before creating tasks."})]})]}),t.jsxs("div",{className:"planning-actions planning-summary-actions",children:[t.jsx("button",{className:"btn",onClick:()=>void pe(),disabled:p.type==="creating",children:"Cancel"}),t.jsx("button",{className:"btn btn-primary",onClick:()=>void mt(),disabled:p.type==="creating"||de,children:p.type==="creating"?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:16,className:"spin icon-mr-6"}),"Creating..."]}):t.jsx(t.Fragment,{children:"Create Tasks"})})]})]}),ve&&t.jsx("div",{className:"session-lock-overlay","data-testid":"session-lock-overlay",children:t.jsxs("div",{className:"session-lock-banner",children:[t.jsx(Do,{size:16}),t.jsx("span",{children:At?"This session is active in another tab":"This session is active in another tab (live heartbeat)"}),At&&t.jsx("button",{type:"button",onClick:()=>{A()},disabled:ne,className:"btn btn-primary session-lock-take-control",children:ne?"Taking control...":"Take Control"})]})})]})]})}):null}const xz=5,vz=1e3,yz=45e3;function Tc(){return{scrollback:null,connected:null,data:[]}}function wz(e,n){const[s,a]=i.useState("disconnected"),r=i.useRef(0),o=i.useRef(e),l=i.useRef(n),c=o.current!==e||l.current!==n;c&&(o.current=e,l.current=n,r.current++);const d=i.useRef(null),u=i.useRef(0),h=i.useRef(null),m=i.useRef(null),f=i.useRef(!1),p=i.useRef(new Set),b=i.useRef(new Set),v=i.useRef(new Set),x=i.useRef(new Set),y=i.useRef(new Set),g=i.useRef(Tc()),j=i.useCallback(P=>{p.current.add(P);const T=g.current;return T.data.length>0&&(T.data.forEach(D=>P(D)),T.data=[]),()=>p.current.delete(P)},[]),N=i.useCallback(P=>(b.current.add(P),()=>b.current.delete(P)),[]),C=i.useCallback(P=>{v.current.add(P);const T=g.current;return T.connected&&(P(T.connected),T.connected=null),()=>v.current.delete(P)},[]),w=i.useCallback(P=>{x.current.add(P);const T=g.current;return T.scrollback&&(P(T.scrollback),T.scrollback=null),()=>x.current.delete(P)},[]),S=i.useCallback(P=>(y.current.add(P),()=>y.current.delete(P)),[]),R=i.useCallback(P=>{const T=d.current;T?.readyState===WebSocket.OPEN&&T.send(JSON.stringify({type:"input",data:P}))},[]),I=i.useCallback((P,T)=>{const D=d.current;D?.readyState===WebSocket.OPEN&&D.send(JSON.stringify({type:"resize",cols:P,rows:T}))},[]),E=i.useCallback(()=>{h.current&&(clearTimeout(h.current),h.current=null),m.current&&(clearInterval(m.current),m.current=null),d.current&&(d.current.onopen=null,d.current.onmessage=null,d.current.onclose=null,d.current.onerror=null,d.current.close(),d.current=null),g.current=Tc()},[]),M=i.useCallback(()=>{h.current&&(clearTimeout(h.current),h.current=null),m.current&&(clearInterval(m.current),m.current=null),d.current&&(f.current=!0,d.current.onopen=null,d.current.onmessage=null,d.current.onclose=null,d.current.onerror=null,d.current.close(),d.current=null),g.current=Tc()},[]),G=i.useCallback(()=>{if(!e){a("disconnected");return}if(d.current?.readyState===WebSocket.OPEN)return;d.current&&(f.current=!0,d.current.onopen=null,d.current.onmessage=null,d.current.onclose=null,d.current.onerror=null,d.current.close(),d.current=null),f.current=!1,a("connecting");const P=r.current;let D=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/terminal/ws?sessionId=${encodeURIComponent(e)}`;n&&(D+=`&projectId=${encodeURIComponent(n)}`);const W=new WebSocket(Qi(D));d.current=W,W.onopen=()=>{if(r.current!==P){W.close();return}g.current=Tc(),a("connected"),u.current=0,m.current&&clearInterval(m.current),m.current=setInterval(()=>{r.current===P&&W.readyState===WebSocket.OPEN&&W.send(JSON.stringify({type:"ping"}))},yz)},W.onmessage=Y=>{if(r.current===P)try{const L=JSON.parse(Y.data),_=g.current;switch(L.type){case"data":L.data&&(p.current.size===0&&_.data.push(L.data),p.current.forEach(F=>F(L.data)));break;case"scrollback":L.data&&(_.scrollback=L.data,x.current.forEach(F=>F(L.data)));break;case"connected":L.shell&&L.cwd&&(_.connected={shell:L.shell,cwd:L.cwd},v.current.forEach(F=>F({shell:L.shell,cwd:L.cwd})));break;case"exit":L.exitCode!==void 0&&b.current.forEach(F=>F(L.exitCode));break;case"ping":W.readyState===WebSocket.OPEN&&W.send(JSON.stringify({type:"pong"}));break;case"pong":break}}catch{}},W.onclose=Y=>{if(r.current!==P)return;if(d.current=null,m.current&&(clearInterval(m.current),m.current=null),f.current){a("disconnected");return}if(Y.code===4e3||Y.code===4004){a("disconnected"),Y.code===4004&&y.current.forEach(F=>F());return}if(u.current++,u.current>xz){a("disconnected");return}const L=vz*Math.pow(2,u.current-1);a("reconnecting");const _=r.current;h.current=setTimeout(()=>{r.current===_&&(f.current||G())},Math.min(L,16e3))},W.onerror=()=>{}},[e,n]),U=i.useCallback(()=>{u.current=0,M(),G()},[M,G]);return i.useEffect(()=>(c&&(E(),u.current=0,a("disconnected")),e?G():a("disconnected"),M),[e,n,c,G,M,E]),{connectionStatus:s,sendInput:R,resize:I,onData:j,onExit:N,onConnect:C,onScrollback:w,reconnect:U,onSessionInvalid:S}}const Ak="kb-terminal-tabs",kz=15e3,jz=15e3;function mx(){return`tab-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}function hx(e){if(typeof window>"u")return[];try{const n=ns(Ak,e);if(n)return JSON.parse(n)}catch{}return[]}function sm(e){const n=e instanceof Error?e.message:typeof e=="string"?e:"";return n.includes("Failed to parse URL")||n.includes("Invalid URL")}function fx(e,n,s){let a;const r=new Promise((o,l)=>{a=setTimeout(()=>l(new Error(`${s} timed out after ${n}ms`)),n)});return Promise.race([e,r]).finally(()=>clearTimeout(a))}function Nz(e){const[n,s]=i.useState(()=>hx(e)),[a,r]=i.useState(!1),[o,l]=i.useState(!0),[c,d]=i.useState(null),[u,h]=i.useState(0),m=i.useRef(0);i.useEffect(()=>{m.current+=1,s(hx(e)),r(!1),l(!0),d(null)},[e]),i.useEffect(()=>{try{Ns(Ak,JSON.stringify(n),e)}catch{}},[e,n]),i.useEffect(()=>{let C=!1;const w=m.current;return(async()=>{if(!C)try{const R=await fx(q1(e),kz,"listTerminalSessions");if(C||w!==m.current)return;const I=new Set(R.map(E=>E.id));l(!0),s(E=>{if(C||w!==m.current)return E;const G=E.map(T=>({...T,_verified:I.has(T.sessionId)})).filter(T=>T._verified);if(G.length===0)return[];const U=G.map(({_verified:T,...D})=>D);return U.find(T=>T.isActive)?U:U.map((T,D)=>({...T,isActive:D===0}))}),r(!0)}catch(R){if(C||w!==m.current)return;const I=sm(R);I||console.warn("Failed to validate terminal sessions with server:",R),l(!I),r(!0)}})(),()=>{C=!0}},[e]),i.useEffect(()=>{if(n.length===0&&a&&o){const C=m.current,w=setTimeout(()=>{fx(nc(void 0,void 0,void 0,e),jz,"createTerminalSession").then(S=>{if(C!==m.current)return;const R={id:mx(),sessionId:S.sessionId,title:`Terminal ${n.length+1}`,isActive:!0,createdAt:Date.now()};s(I=>I.length>0?I:[...I.map(M=>({...M,isActive:!1})),R]),d(null)}).catch(S=>{if(C!==m.current)return;sm(S)||console.error(S);const R=S instanceof Error?S.message:typeof S=="string"?S:"Failed to create terminal session";d(R)})},0);return()=>clearTimeout(w)}},[a,o,n.length,u]);const f=i.useCallback(async()=>{const C=await nc(void 0,void 0,void 0,e),w={id:mx(),sessionId:C.sessionId,title:`Terminal ${n.length+1}`,isActive:!0,createdAt:Date.now()};return s(S=>[...S.map(I=>({...I,isActive:!1})),w]),w},[n.length]),p=i.useCallback(async()=>f(),[f]),b=i.useCallback(C=>{s(w=>{const S=w.find(M=>M.id===C);if(!S)return w;ip(S.sessionId,e).catch(M=>{console.warn(`Failed to kill terminal session ${S.sessionId}:`,M)});const R=w.findIndex(M=>M.id===C),I=S.isActive,E=w.filter(M=>M.id!==C);if(E.length===0)return[];if(I){const M=Math.min(R,E.length-1);return E.map((G,U)=>({...G,isActive:U===M}))}return E})},[]),v=i.useCallback(C=>{s(w=>{let S=!1;const R=w.map(I=>I.id===C?(S=!0,{...I,isActive:!0}):{...I,isActive:!1});return S?R:w})},[]),x=i.useCallback((C,w)=>{s(S=>S.map(R=>R.id===C?{...R,title:w}:R))},[]),y=i.useCallback(async()=>{s(S=>{const R=S.find(I=>I.isActive);return R&&ip(R.sessionId,e).catch(I=>{console.warn(`Failed to kill old session ${R.sessionId}:`,I)}),S});const C=n.find(S=>S.isActive);if(!C)return;const w=await nc(void 0,void 0,void 0,e);s(S=>S.map(R=>R.id===C.id?{...R,sessionId:w.sessionId}:R))},[n]),g=i.useCallback(async()=>{const C=n.find(w=>w.isActive);if(C)try{const w=await nc(void 0,void 0,void 0,e);s(S=>S.map(R=>R.id===C.id?{...R,sessionId:w.sessionId}:R)),d(null)}catch(w){sm(w)||console.error(w);const S=w instanceof Error?w.message:typeof w=="string"?w:"Failed to create terminal session";d(S)}},[n]),j=n.find(C=>C.isActive)??null,N=i.useCallback(()=>{d(null),m.current+=1,h(C=>C+1)},[]);return{tabs:n,activeTab:j,isReady:a,bootstrapError:c,createTab:p,closeTab:b,setActiveTab:v,updateTabTitle:x,restartActiveTab:y,retryBootstrap:N,replaceActiveTabSession:g}}const Sz=1e4,Cz=[500,1500,3e3],Tk="kb-terminal-font-size",bl=14,Ez=8,_z=32,Mz='"Fusion Terminal Nerd Font Symbols", "MesloLGS NF", "MesloLGM Nerd Font", "JetBrainsMono Nerd Font", "FiraCode Nerd Font", "Hack Nerd Font", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace';function Rz(e){if(!e)return"";const n=e.slice(0,1).toUpperCase();return n==="["?"\x1B":n>="A"&&n<="Z"?String.fromCharCode(n.charCodeAt(0)-64):e}function Az(e){return`\x1B${e}`}const Tz=[{label:"C",key:"c",description:"SigInt"},{label:"D",key:"d",description:"EOF"},{label:"Z",key:"z",description:"Suspend"},{label:"L",key:"l",description:"Clear"},{label:"R",key:"r",description:"Reverse search"},{label:"A",key:"a",description:"Home"},{label:"E",key:"e",description:"End"},{label:"U",key:"u",description:"Kill line"},{label:"K",key:"k",description:"Kill to EOL"},{label:"W",key:"w",description:"Del word"},{label:".",key:".",description:"Last argument"}];function xl(e){return Math.min(_z,Math.max(Ez,e))}function Iz(){if(typeof window>"u")return bl;try{const e=window.localStorage.getItem(Tk);if(!e)return bl;const n=Number.parseInt(e,10);return Number.isFinite(n)?xl(n):bl}catch{return bl}}function Pz(e){const n=typeof e=="string"?e:e instanceof Error?e.message:String(e);return n.includes("MIME type")||n.includes("Failed to fetch dynamically imported module")}function $z(e){return new Promise(n=>setTimeout(n,e))}async function Dz(e,n=Cz){let s;for(let a=0;a<=n.length;a+=1)try{return await e()}catch(r){if(!Pz(r))throw r;s===void 0&&(s=r);const o=n[a];if(o===void 0)throw s??r;const l=r instanceof Error?r.message:String(r);console.warn(`[TerminalModal] Dynamic xterm import failed (attempt ${a+1}/${n.length+1}). Retrying in ${o}ms...`,l),await $z(o)}throw s??new Error("Dynamic import failed")}function px(){if(typeof window>"u")return!1;const e="ontouchstart"in window||navigator.maxTouchPoints>0,n=window.innerWidth<=768;return e&&n}function Lz(){if(typeof window>"u"||!window.visualViewport)return 0;const e=window.visualViewport,n=Math.max(0,window.innerHeight-e.offsetTop-e.height);if(n>0)return n;const a=Oz()-e.offsetTop-e.height;return a>=30&&a>80?a:0}let im=null;function Oz(){return im===null&&(im=window.innerHeight),im}function Fz({isOpen:e,onClose:n,initialCommand:s,projectId:a}){const[r,o]=i.useState(null),[l,c]=i.useState(null),[d,u]=i.useState(!1),[h,m]=i.useState(null),[f,p]=i.useState(0),[b,v]=i.useState(0),[x,y]=i.useState(null),[g,j]=i.useState(()=>Iz()),[N,C]=i.useState(!1),[w,S]=i.useState(null),R=i.useRef(null),I=i.useRef(null),E=i.useRef(!1);ea(I,e,"fusion:terminal-modal-size");const M=i.useRef(null),G=i.useRef(null),U=i.useRef(!1),P=i.useRef(!1),T=i.useRef(null),D=i.useRef(()=>{}),W=i.useRef(null),Y=i.useRef(0),L=i.useRef(g),_=i.useRef(null),F=i.useRef(a);Y.current=b,L.current=g;const ae=i.useCallback(Ae=>{if(Ae&&P.current!==Ae)return;const it=G.current,xt=M.current,Nt=T.current;if(!(!it||!xt)&&!(Ae&&P.current!==Ae))try{it.fit(),Nt&&Nt(xt.cols,xt.rows)}catch{}},[]);i.useEffect(()=>{e&&p(Ae=>Ae+1)},[e]),i.useEffect(()=>{if(!e||!px())return;const Ae=window.visualViewport;if(!Ae)return;const it=()=>{const xt=Lz();v(xt),y(Ae.height),xt>0&&I.current?.scrollIntoView&&I.current.scrollIntoView({block:"end",behavior:"smooth"}),_.current!==null&&(cancelAnimationFrame(_.current),_.current=null);const Nt=typeof P.current=="string"?P.current:void 0;_.current=requestAnimationFrame(()=>{_.current=null,ae(Nt)})};return it(),Ae.addEventListener("resize",it),Ae.addEventListener("scroll",it),()=>{Ae.removeEventListener("resize",it),Ae.removeEventListener("scroll",it),_.current!==null&&(cancelAnimationFrame(_.current),_.current=null),v(0),y(null)}},[ae,e]),i.useEffect(()=>{if(!e)return;const Ae=I.current;if(!Ae||typeof ResizeObserver>"u")return;let it=null;const xt=new ResizeObserver(()=>{it!==null&&cancelAnimationFrame(it),it=requestAnimationFrame(()=>{it=null;const Nt=typeof P.current=="string"?P.current:void 0;ae(Nt)})});return xt.observe(Ae),()=>{xt.disconnect(),it!==null&&cancelAnimationFrame(it)}},[ae,e]);const{tabs:k,activeTab:z,isReady:J,bootstrapError:oe,createTab:le,closeTab:we,setActiveTab:re,updateTabTitle:H,restartActiveTab:ue,retryBootstrap:Q,replaceActiveTabSession:be}=Nz(a),{connectionStatus:fe,sendInput:O,resize:se,onData:ve,onConnect:A,onExit:ne,onScrollback:ye,reconnect:ee,onSessionInvalid:ge}=wz(z?.sessionId??null,a);T.current=se,D.current=O,i.useEffect(()=>{if(!(typeof window>"u"))try{window.localStorage.setItem(Tk,String(g))}catch{}},[g]);const Ne=i.useCallback(()=>{const Ae=M.current;if(Ae)try{G.current?.fit(),se(Ae.cols,Ae.rows)}catch{}},[se]);i.useEffect(()=>{if(!e||!J)return;const Ae=z?.sessionId;if(!Ae)return;const it=F.current!==a;if(it&&(F.current=a),P.current===Ae&&M.current&&!it)return;M.current&&(P.current!==Ae||it)&&(M.current.dispose(),M.current=null,G.current=null,P.current=!1,W.current&&(window.removeEventListener("resize",W.current),W.current=null),u(!1),m(null));let xt=!0,Nt;return(async()=>{const Be=Dz(()=>Promise.all([qn(()=>import("./vendor-xterm-DzcZoU0P.js").then(je=>je.x),__vite__mapDeps([6,1,7])),qn(()=>import("./addon-fit-C7jRorKK.js").then(je=>je.a),__vite__mapDeps([10,1])),qn(()=>import("./addon-web-links-CkJwd4cQ.js").then(je=>je.a),__vite__mapDeps([11,1]))])),Z=new Promise((je,mt)=>{Nt=setTimeout(()=>{mt(new Error("xterm initialization timed out"))},Sz)});let Oe,ht;try{const[{Terminal:je},{FitAddon:mt},{WebLinksAddon:Et}]=await Promise.race([Be,Z]);if(!xt||!R.current||M.current)return;Oe=new je({cursorBlink:!0,cursorStyle:"block",fontSize:L.current,fontFamily:Mz,theme:{background:"#1e1e1e",foreground:"#d4d4d4",cursor:"#d4d4d4",selectionBackground:"#264f78",black:"#1e1e1e",red:"#f48771",green:"#4ec9b0",yellow:"#dcdcaa",blue:"#569cd6",magenta:"#c586c0",cyan:"#9cdcfe",white:"#d4d4d4"},allowProposedApi:!0,scrollback:5e3}),ht=new mt,Oe.loadAddon(ht);const Te=new Et;if(Oe.loadAddon(Te),!px())try{const{WebglAddon:_t}=await qn(async()=>{const{WebglAddon:Dt}=await import("./addon-webgl-BjvOw43o.js").then(nt=>nt.a);return{WebglAddon:Dt}},__vite__mapDeps([12,1])),Ft=new _t;Ft.onContextLoss(()=>{Ft.dispose()}),Oe.loadAddon(Ft)}catch{}Oe.open(R.current),Nt&&clearTimeout(Nt);const xe=R.current?.querySelector(".xterm-helper-textarea");if(xe&&xe.focus(),R.current)try{R.current.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0}))}catch{}setTimeout(()=>{ht.fit();const _t=R.current?.querySelector(".xterm-helper-textarea");_t&&_t.focus()},50),M.current=Oe,G.current=ht,P.current=Ae,Y.current>0&&(_.current!==null&&(cancelAnimationFrame(_.current),_.current=null),_.current=requestAnimationFrame(()=>{_.current=null,ae(Ae)})),Oe.onData(_t=>{P.current===Ae&&D.current(_t)});const gt=()=>{if(P.current===Ae&&G.current&&M.current)try{G.current.fit();const{cols:_t,rows:Ft}=M.current;T.current?.(_t,Ft)}catch{}};window.addEventListener("resize",gt),W.current&&window.removeEventListener("resize",W.current),W.current=gt,u(!0),m(null)}catch(je){if(Nt&&clearTimeout(Nt),!xt)return;const mt=je instanceof Error?je.message:"xterm initialization failed";m(mt)}})(),()=>{xt=!1,Nt&&clearTimeout(Nt)}},[ae,e,J,z?.sessionId,a]),i.useEffect(()=>{e||(M.current&&(M.current.dispose(),M.current=null),G.current=null,P.current=!1,W.current&&(window.removeEventListener("resize",W.current),W.current=null),u(!1),m(null),U.current=!1,o(null),c(null),C(!1),S(null))},[e]),i.useEffect(()=>{if(!d||!M.current||!z)return;const Ae=z.sessionId,it=Z=>{P.current===Ae&&M.current?.write(Z)},xt=ve(Z=>{it(Z)}),Nt=ye(Z=>{it(Z)}),Ut=A(Z=>{H(z.id,Lh(Z.shell)||Z.shell)}),Be=ne(Z=>{P.current===Ae&&(c(Z),M.current?.write(`\r
738
738
  \x1B[33m[Process exited with code ${Z}]\x1B[0m\r
739
739
  `))});return()=>{xt(),Nt(),Ut(),Be()}},[d,z?.sessionId,z?.id,z,fe,ve,ye,A,ne,H]),i.useEffect(()=>{fe==="connected"&&s&&U.current!==s&&z&&(U.current=s,setTimeout(()=>{O(s+`
740
- `)},500))},[fe,s,O,z,f]),i.useEffect(()=>{if(!d||!M.current)return;M.current.options.fontSize=g,_.current!==null&&(cancelAnimationFrame(_.current),_.current=null);const Ae=requestAnimationFrame(()=>{_.current=null,Ne()});return _.current=Ae,()=>{_.current===Ae&&(cancelAnimationFrame(Ae),_.current=null)}},[g,d,Ne]),i.useEffect(()=>{if(!e)return;const Ae=it=>{if(!(!it.ctrlKey&&!it.metaKey)){if(it.code==="Equal"||it.code==="NumpadAdd"){it.preventDefault(),j(xt=>xl(xt+1));return}if(it.code==="Minus"||it.code==="NumpadSubtract"){it.preventDefault(),j(xt=>xl(xt-1));return}if(it.code==="Digit0"||it.code==="Numpad0"){it.preventDefault(),j(bl);return}}};return window.addEventListener("keydown",Ae),()=>window.removeEventListener("keydown",Ae)},[e,Ne]),i.useEffect(()=>{if(!e)return;const Ae=it=>{it.key==="Escape"&&n()};return document.addEventListener("keydown",Ae),()=>document.removeEventListener("keydown",Ae)},[e,n]),i.useEffect(()=>{fe==="connected"&&M.current&&setTimeout(()=>{if(!M.current||!R.current)return;const Ae=R.current.querySelector(".xterm-helper-textarea");Ae&&Ae.focus();try{R.current.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0}))}catch{}},100)},[fe]);const He=i.useCallback(()=>{if(!R.current||typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(hover: none) and (pointer: coarse)")?.matches===!0)return;M.current?.focus();const it=R.current.querySelector(".xterm-helper-textarea");if(!it)return;it.autocapitalize="off",it.autocomplete="off",it.autocorrect="off",it.spellcheck=!1,it.setAttribute("inputmode","text");try{it.focus({preventScroll:!0})}catch{it.focus()}const xt=it.value.length;it.setSelectionRange(xt,xt)},[]);i.useEffect(()=>ge(()=>{M.current?.clear(),c(null),U.current=!1,M.current&&(M.current.dispose(),M.current=null),G.current=null,P.current=!1,W.current&&(window.removeEventListener("resize",W.current),W.current=null),u(!1),m(null),be().catch(it=>{console.error("Failed to replace invalid terminal session:",it)})}),[ge,be]);const Le=i.useCallback(Ae=>{Ae.target===Ae.currentTarget&&(E.current=!0)},[]),de=i.useCallback(Ae=>{E.current&&Ae.target===Ae.currentTarget&&n(),E.current=!1},[n]),Re=i.useCallback(()=>{M.current?.clear()},[]),Pe=i.useCallback(async()=>{M.current?.clear(),c(null),U.current=!1;try{await ue()}catch(Ae){o(Ce(Ae)||"Failed to restart terminal session")}},[ue]),rt=i.useCallback(()=>{M.current&&(M.current.dispose(),M.current=null),G.current=null,P.current=!1,W.current&&(window.removeEventListener("resize",W.current),W.current=null),m(null),u(!1)},[]),qe=i.useCallback(()=>{window.location.reload()},[]),Xe=i.useCallback(()=>{j(Ae=>xl(Ae+1))},[]),At=i.useCallback(()=>{j(Ae=>xl(Ae-1))},[]),at=i.useCallback(Ae=>{S(it=>it===Ae?null:Ae)},[]),Se=i.useCallback(Ae=>{if(w==="ctrl"){O(Rz(Ae)),S(null);return}if(w==="alt"){O(Az(Ae)),S(null);return}O(Ae)},[O,w]),pe=i.useCallback(Ae=>{O(Ae),S(null)},[O]);if(!e)return null;const _e=()=>{switch(fe){case"connected":return t.jsx("span",{className:"terminal-status connected",title:"Connected"});case"connecting":case"reconnecting":return t.jsx("span",{className:"terminal-status connecting",title:"Connecting..."});case"disconnected":return t.jsx("span",{className:"terminal-status disconnected",title:"Disconnected"});default:return null}},et=!J||!z&&!oe;return t.jsx("div",{className:"modal-overlay open",onMouseDown:Le,onMouseUp:de,role:"dialog","aria-modal":"true","data-testid":"terminal-modal-overlay",style:b>0?{"--overlay-padding-top":"0px"}:void 0,children:t.jsxs("div",{ref:I,className:"modal terminal-modal","data-testid":"terminal-modal",style:b>0?{"--keyboard-overlap":`${b}px`,"--vv-height":x?`${x}px`:void 0}:void 0,children:[t.jsxs("div",{className:"terminal-header",children:[t.jsxs("div",{className:"terminal-tabs","data-testid":"terminal-tabs",children:[k.map(Ae=>t.jsxs("div",{className:`terminal-tab ${Ae.isActive?"terminal-tab--active":""}`,onClick:()=>re(Ae.id),title:Ae.title,role:"tab","aria-selected":Ae.isActive,children:[t.jsx("span",{className:"terminal-tab-label",children:Ae.title}),k.length>1&&t.jsx("button",{className:"terminal-tab-close",onClick:it=>{it.stopPropagation(),we(Ae.id)},title:"Close tab",children:"×"})]},Ae.id)),t.jsx("button",{className:"terminal-tab terminal-tab--new",onClick:le,title:"New terminal",children:"+"})]}),t.jsxs("div",{className:"terminal-title","data-testid":"terminal-title",children:[t.jsx(_a,{size:16}),_e()]}),t.jsxs("div",{className:"terminal-actions","data-testid":"terminal-actions",children:[fe==="disconnected"&&z&&t.jsxs("button",{className:"terminal-reconnect-btn",onClick:ee,title:"Reconnect","data-testid":"terminal-reconnect-btn",children:[t.jsx(Ss,{size:14}),t.jsx("span",{className:"terminal-action-label",children:"Reconnect"})]}),l!==null&&t.jsxs("button",{className:"terminal-restart-btn",onClick:Pe,title:"New Session","data-testid":"terminal-restart-btn",children:[t.jsx(Ss,{size:14}),t.jsx("span",{className:"terminal-action-label",children:"New Session"})]}),t.jsxs("button",{className:"terminal-clear-btn",onClick:Re,"data-testid":"terminal-clear-btn",title:"Clear terminal",children:[t.jsx(es,{size:14}),t.jsx("span",{className:"terminal-action-label",children:"Clear"})]}),t.jsxs("button",{className:"terminal-clear-btn terminal-clear-btn--shortcut",onClick:()=>C(Ae=>!Ae),"data-testid":"terminal-shortcut-toggle",title:"Shortcuts","aria-pressed":N,children:[t.jsx(NS,{size:14}),t.jsx("span",{className:"terminal-action-label",children:"Shortcuts"})]}),t.jsx("button",{className:"terminal-close",onClick:n,"data-testid":"terminal-close-btn",title:"Close terminal",children:t.jsx(Nn,{size:20})})]})]}),r&&t.jsx("div",{className:"terminal-error","data-testid":"terminal-error",children:r}),t.jsxs("div",{className:"terminal-container","data-testid":"terminal-container",children:[et&&!oe&&t.jsxs("div",{className:"terminal-loading","data-testid":"terminal-loading",children:[t.jsx("div",{className:"terminal-spinner"}),t.jsx("span",{children:"Starting terminal..."})]}),oe&&!z&&t.jsx("div",{className:"terminal-loading","data-testid":"terminal-bootstrap-error",children:t.jsxs("div",{className:"terminal-error-content",children:[t.jsxs("span",{children:["Failed to start terminal: ",oe]}),t.jsxs("div",{className:"terminal-error-actions",children:[t.jsxs("button",{className:"terminal-retry-btn",onClick:Q,"data-testid":"terminal-retry-btn",children:[t.jsx(Ss,{size:14}),"Retry"]}),t.jsxs("button",{className:"terminal-retry-btn",onClick:qe,"data-testid":"terminal-bootstrap-refresh-btn",children:[t.jsx(Ss,{size:14}),"Refresh page"]})]})]})}),h&&z&&t.jsx("div",{className:"terminal-loading","data-testid":"terminal-xterm-init-error",children:t.jsxs("div",{className:"terminal-error-content",children:[t.jsxs("span",{children:["Terminal UI failed to initialize: ",h]}),t.jsxs("div",{className:"terminal-error-actions",children:[t.jsxs("button",{className:"terminal-retry-btn",onClick:rt,"data-testid":"terminal-reinit-btn",children:[t.jsx(Ss,{size:14}),"Reinitialize"]}),t.jsxs("button",{className:"terminal-retry-btn",onClick:qe,"data-testid":"terminal-xterm-refresh-btn",children:[t.jsx(Ss,{size:14}),"Refresh page"]})]})]})}),t.jsx("div",{ref:R,className:"terminal-xterm","data-testid":"terminal-xterm",onPointerDown:He,onTouchStart:He},z?.sessionId)]}),N&&t.jsxs("div",{className:"terminal-shortcut-panel","data-testid":"terminal-shortcut-panel",children:[t.jsxs("div",{className:"terminal-shortcut-modifier-row",children:[t.jsx("button",{type:"button",className:`terminal-shortcut-btn terminal-shortcut-btn--modifier ${w==="ctrl"?"is-active":""}`,"data-testid":"terminal-modifier-ctrl",onClick:()=>at("ctrl"),"aria-pressed":w==="ctrl",children:"Ctrl"}),t.jsx("button",{type:"button",className:`terminal-shortcut-btn terminal-shortcut-btn--modifier ${w==="alt"?"is-active":""}`,"data-testid":"terminal-modifier-alt",onClick:()=>at("alt"),"aria-pressed":w==="alt",children:"Alt"}),t.jsx("button",{type:"button",className:"terminal-shortcut-btn",onClick:()=>pe("\x1B"),children:"ESC"}),t.jsx("button",{type:"button",className:"terminal-shortcut-btn",onClick:()=>pe(" "),children:"Tab"})]}),Tz.map(Ae=>t.jsx("button",{type:"button",className:"terminal-shortcut-btn",onClick:()=>Se(Ae.key),title:Ae.description,children:Ae.label},Ae.label))]}),t.jsxs("div",{className:"terminal-status-bar","data-testid":"terminal-status-bar",children:[t.jsxs("span",{className:`terminal-connection-status ${fe}`,children:[fe==="connected"&&"Connected",fe==="connecting"&&"Connecting...",fe==="reconnecting"&&"Reconnecting...",fe==="disconnected"&&"Disconnected"]}),l!==null&&t.jsxs("span",{className:"terminal-exit-code","data-testid":"terminal-exit-code",children:["Exit: ",l]}),t.jsxs("span",{className:"terminal-font-size-controls",children:[t.jsx("button",{type:"button",className:"terminal-font-size-btn",onClick:At,"data-testid":"terminal-font-size-decrease","aria-label":"Decrease terminal font size",children:t.jsx(KS,{size:14})}),t.jsxs("span",{className:"terminal-font-size-value","data-testid":"terminal-font-size-value",children:[g,"px"]}),t.jsx("button",{type:"button",className:"terminal-font-size-btn",onClick:Xe,"data-testid":"terminal-font-size-increase","aria-label":"Increase terminal font size",children:t.jsx(os,{size:14})})]}),t.jsx("span",{className:"terminal-shortcuts",children:"Ctrl++/- zoom • ⌨ Shortcuts panel • Esc close"})]})]})})}const sl={name:"",command:""};function gx(e){return/^[a-zA-Z0-9_-]+$/.test(e)}function zz(e,n=60){return e.length<=n?e:e.slice(0,n-3)+"..."}function Bz({isOpen:e,onClose:n,addToast:s,projectId:a,onRunScript:r}){ta(e);const[o,l]=i.useState({}),[c,d]=i.useState(!0),[u,h]=i.useState(!1),[m,f]=i.useState(null),[p,b]=i.useState(sl),[v,x]=i.useState(!1),[y,g]=i.useState(null),[j,N]=i.useState(null),C=Aa(n),w=i.useCallback(async()=>{try{d(!0);const D=await Rl(a);l(D)}catch(D){s(Ce(D)||"Failed to load scripts","error")}finally{d(!1)}},[s,a]);i.useEffect(()=>{e&&w()},[e,w]);const S=i.useCallback(()=>{h(!0),f(null),b(sl),N(null)},[]),R=i.useCallback((D,W)=>{f(D),h(!1),b({name:D,command:W}),N(null)},[]),I=i.useCallback(()=>{f(null),h(!1),b(sl),N(null)},[]),E=i.useCallback(D=>{b(W=>({...W,name:D})),D&&!gx(D)?N("Name must contain only letters, numbers, hyphens, and underscores (no spaces)"):N(null)},[]),M=i.useCallback(async()=>{const D=p.name.trim(),W=p.command.trim();if(!D){s("Script name is required","error");return}if(!gx(D)){s("Script name must contain only letters, numbers, hyphens, and underscores (no spaces)","error");return}if(!W){s("Script command is required","error");return}x(!0);try{await JE(D,W,a),s(m?"Script updated":"Script created","success"),f(null),h(!1),b(sl),N(null),await w()}catch(Y){const L=Ce(Y);L?.includes("already exists")?s("A script with this name already exists","error"):s(L||"Failed to save script","error")}finally{x(!1)}},[p,m,s,w,a]),G=i.useCallback(async D=>{try{await YE(D,a),s("Script deleted","success"),g(null),m===D&&(f(null),b(sl)),await w()}catch(W){s(Ce(W)||"Failed to delete script","error")}},[m,s,w,a]),U=i.useCallback((D,W)=>{r&&r(D,W)},[r]);if(!e)return null;const P=u||m!==null,T=Object.entries(o).map(([D,W])=>({name:D,command:W}));return t.jsx("div",{className:"modal-overlay open",...C,"data-testid":"scripts-modal",children:t.jsxs("div",{className:"modal scripts-modal",role:"dialog","aria-modal":"true","aria-label":"Scripts",children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("h2",{children:[t.jsx(_a,{size:18,style:{marginRight:"8px",verticalAlign:"middle"}}),"Scripts"]}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close",children:"×"})]}),t.jsx("div",{className:"modal-body scripts-modal-body",children:c?t.jsxs("div",{style:{textAlign:"center",padding:"32px",color:"var(--text-muted)"},children:[t.jsx(Ct,{size:24,className:"spin",style:{margin:"0 auto 8px",display:"block"}}),"Loading scripts..."]}):P?t.jsxs("div",{className:"scripts-modal-form",style:{display:"flex",flexDirection:"column",gap:"16px"},children:[t.jsxs("div",{children:[t.jsx("label",{htmlFor:"script-name",style:{display:"block",marginBottom:"4px",fontSize:"13px",fontWeight:500,color:"var(--text)"},children:"Script Name"}),t.jsx("input",{id:"script-name",type:"text",className:"input",value:p.name,onChange:D=>E(D.target.value),placeholder:"e.g., build, test, lint",disabled:v||m!==null,"data-testid":"script-name-input",style:{width:"100%",borderColor:j?"var(--color-error)":void 0}}),j&&t.jsx("div",{style:{fontSize:"12px",color:"var(--color-error)",marginTop:"4px"},"data-testid":"script-name-error",children:j}),t.jsx("div",{style:{fontSize:"11px",color:"var(--text-muted)",marginTop:"4px"},children:"Letters, numbers, hyphens, and underscores only"})]}),t.jsxs("div",{children:[t.jsx("label",{htmlFor:"script-command",style:{display:"block",marginBottom:"4px",fontSize:"13px",fontWeight:500,color:"var(--text)"},children:"Command"}),t.jsx("textarea",{id:"script-command",className:"input",value:p.command,onChange:D=>b(W=>({...W,command:D.target.value})),placeholder:"e.g., npm run build",rows:3,disabled:v,"data-testid":"script-command-input",style:{width:"100%",resize:"vertical",fontFamily:"monospace"}})]}),t.jsxs("div",{className:"scripts-modal-form-actions",style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[t.jsx("button",{className:"btn btn-secondary",onClick:I,disabled:v,"data-testid":"script-cancel-btn",children:"Cancel"}),t.jsx("button",{className:"btn btn-primary",onClick:M,disabled:v||!!j,"data-testid":"script-save-btn",children:v?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:14,className:"spin",style:{marginRight:"6px"}}),"Saving..."]}):m?"Update":"Create"})]})]}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"scripts-modal-list-header",style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"16px"},children:[t.jsx("div",{style:{fontSize:"13px",color:"var(--text-muted)"},children:T.length===0?"No scripts defined":`${T.length} script${T.length===1?"":"s"}`}),t.jsxs("button",{className:"btn btn-primary",onClick:S,"data-testid":"add-script-btn",style:{display:"flex",alignItems:"center",gap:"6px"},children:[t.jsx(os,{size:14}),"Add Script"]})]}),T.length===0?t.jsxs("div",{style:{textAlign:"center",padding:"32px",color:"var(--text-muted)",fontSize:"14px",border:"1px dashed var(--border)",borderRadius:"8px"},"data-testid":"empty-state",children:[t.jsx(_a,{size:32,style:{margin:"0 auto 12px",opacity:.5}}),t.jsx("div",{children:"No scripts defined yet."}),t.jsx("div",{style:{marginTop:"4px",fontSize:"12px"},children:"Add scripts to quickly run common commands from the dashboard."})]}):t.jsx("div",{className:"scripts-modal-list",style:{display:"flex",flexDirection:"column",gap:"8px"},children:T.map(D=>t.jsx("div",{className:"script-card","data-testid":`script-${D.name}`,style:{padding:"12px 16px",border:"1px solid var(--border)",borderRadius:"8px",background:"var(--card)"},children:t.jsxs("div",{className:"script-card-header",style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"},children:[t.jsxs("div",{style:{flex:1,minWidth:0},children:[t.jsx("div",{style:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"4px"},children:t.jsx("span",{style:{fontWeight:600,fontSize:"14px",fontFamily:"monospace"},children:D.name})}),t.jsx("div",{style:{fontSize:"12px",color:"var(--text-muted)",fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:D.command,children:zz(D.command)})]}),t.jsxs("div",{className:"script-card-actions",style:{display:"flex",gap:"4px",marginLeft:"8px",flexShrink:0},children:[t.jsxs("button",{className:"btn btn-secondary",onClick:()=>U(D.name,D.command),title:"Run script","aria-label":`Run ${D.name}`,"data-testid":`run-script-${D.name}`,style:{display:"flex",alignItems:"center",gap:"4px",padding:"4px 10px",fontSize:"12px"},children:[t.jsx(Os,{size:12}),"Run"]}),t.jsx("button",{className:"btn-icon",onClick:()=>R(D.name,D.command),title:"Edit","aria-label":`Edit ${D.name}`,"data-testid":`edit-script-${D.name}`,children:t.jsx(os,{size:14,style:{transform:"rotate(45deg)"}})}),y===D.name?t.jsxs("div",{className:"script-delete-confirm",style:{display:"flex",gap:"4px",alignItems:"center"},children:[t.jsx("button",{className:"btn-icon",onClick:()=>G(D.name),title:"Confirm delete","aria-label":`Confirm delete ${D.name}`,"data-testid":`confirm-delete-script-${D.name}`,style:{color:"var(--color-error)"},children:t.jsx(es,{size:14})}),t.jsx("button",{className:"btn-icon",onClick:()=>g(null),title:"Cancel delete","aria-label":"Cancel delete","data-testid":`cancel-delete-script-${D.name}`,children:t.jsx(Nn,{size:14})})]}):t.jsx("button",{className:"btn-icon",onClick:()=>g(D.name),title:"Delete","aria-label":`Delete ${D.name}`,"data-testid":`delete-script-${D.name}`,children:t.jsx(es,{size:14})})]})]})},D.name))})]})})]})})}function Uz(e,n,s){const[a,r]=i.useState([]),[o,l]=i.useState("."),[c,d]=i.useState(!1),[u,h]=i.useState(null),[m,f]=i.useState(0),p=i.useCallback(()=>{f(v=>v+1)},[]),b=i.useCallback(v=>{l(v),h(null)},[]);return i.useEffect(()=>{l("."),h(null),r([])},[e]),i.useEffect(()=>{if(!n||!e)return;let v=!1;async function x(){d(!0),h(null);try{const y=await cE(e,o==="."?void 0:o,s);v||r(y.entries)}catch(y){v||(h(Ce(y)||"Failed to load files"),r([]))}finally{v||d(!1)}}return x(),()=>{v=!0}},[e,o,n,m,s]),{entries:a,currentPath:o,setPath:b,loading:c,error:u,refresh:p}}function Hz(e,n,s,a){const[r,o]=i.useState(""),[l,c]=i.useState(""),[d,u]=i.useState(null),[h,m]=i.useState(!1),[f,p]=i.useState(!1),[b,v]=i.useState(null),x=i.useCallback(j=>{o(j),v(null)},[]);i.useEffect(()=>{if(!e||!n){o(""),c(""),u(null),v(null);return}let j=!1;async function N(){m(!0),v(null);try{const C=await dE(e,n,a);j||(o(C.content),c(C.content),u(C.mtime))}catch(C){j||(v(Ce(C)||"Failed to load file"),o(""),c(""),u(null))}finally{j||m(!1)}}return N(),()=>{j=!0}},[e,n,s,a]);const y=r!==l,g=i.useCallback(async()=>{if(!(!e||!n||!y)){p(!0),v(null);try{const j=await uE(e,n,r,a);c(r),u(j.mtime)}catch(j){throw v(Ce(j)||"Failed to save file"),j}finally{p(!1)}}},[e,n,r,y,a]);return{content:r,setContent:x,originalContent:l,loading:h,saving:f,error:b,save:g,hasChanges:y,mtime:d}}const qz=1e4;function Vz(e){const s=e.replace(/[\\/]+$/,"").split(/[\\/]/).filter(Boolean);return s[s.length-1]||e||"Project Root"}function Wz(e){return{id:e.id,label:e.id,title:e.title,worktree:e.worktree,kind:"task"}}function Gz(e){const[n,s]=i.useState("Project Root"),[a,r]=i.useState([]),[o,l]=i.useState(!0),[c,d]=i.useState(null);return i.useEffect(()=>{let u=!1;async function h(){try{const f=await lE(e);if(u)return;s(Vz(f.project)),r(f.tasks.map(Wz)),d(null)}catch(f){u||d(Ce(f)||"Failed to load workspaces")}finally{u||l(!1)}}h();const m=window.setInterval(()=>{h()},qz);return()=>{u=!0,window.clearInterval(m)}},[e]),{projectName:n,workspaces:a,loading:o,error:c}}function Kz(e){return e===void 0?"":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function Jz(e){return e?new Date(e).toLocaleDateString():""}function bx(e,n){return TR(e,n)}const il={visible:!1,x:0,y:0,entry:null,entryFullPath:""},am={type:null,entry:null,entryFullPath:""},Yz=200,Xz=500,xx=10;function Qz({x:e,y:n,entry:s,onAction:a,onClose:r}){const o=i.useRef(null),[l,c]=i.useState({x:e,y:n});i.useEffect(()=>{const h=o.current;if(!h)return;const m=h.getBoundingClientRect(),f=window.visualViewport,p=f?.width&&f.width>0?f.width:window.innerWidth,b=f?.height&&f.height>0?f.height:window.innerHeight,v=f?.offsetLeft??0,x=f?.offsetTop??0,y=8;let g=e-v,j=n-x;g+m.width>p-y&&(g=p-y-m.width),j+m.height>b-y&&(j=b-y-m.height),g<y&&(g=y),j<y&&(j=y),c({x:g+v,y:j+x})},[e,n]),i.useEffect(()=>{const h=m=>{m.key==="Escape"&&r()};return document.addEventListener("keydown",h),()=>document.removeEventListener("keydown",h)},[r]);const d=s.type==="directory",u=[{id:"copy",label:"Copy",icon:ga,disabled:!1},{id:"move",label:"Move",icon:XS,disabled:!1},{id:"rename",label:"Rename",icon:xi,disabled:!1},...d?[{id:"download-zip",label:"Download as ZIP",icon:Ar,disabled:!1}]:[{id:"download",label:"Download",icon:TN,disabled:!1}],{id:"divider",label:"",icon:ga,disabled:!0},{id:"delete",label:"Delete",icon:es,disabled:!1}];return t.jsx("div",{className:"context-menu-overlay",onClick:r,children:t.jsx("div",{ref:o,className:"file-browser-context-menu",role:"menu","aria-label":"File operations",style:{left:l.x,top:l.y},onClick:h=>h.stopPropagation(),children:u.map(h=>h.id==="divider"?t.jsx("div",{className:"file-browser-context-menu__divider",role:"separator"},"divider"):t.jsxs("button",{role:"menuitem",className:`file-browser-context-menu__item ${h.disabled?"file-browser-context-menu__disabled":""} ${h.id==="delete"?"file-browser-context-menu__item--danger":""}`,disabled:h.disabled,onClick:()=>a(h.id),children:[t.jsx(h.icon,{size:14,className:"file-browser-context-menu__item-icon"}),t.jsx("span",{children:h.label})]},h.id))})})}function Zz({type:e,entry:n,entryFullPath:s,onConfirm:a,onCancel:r,loading:o,error:l}){const c=i.useRef(null),d=e==="rename"?n.name:"",[u,h]=i.useState(d);i.useEffect(()=>{setTimeout(()=>c.current?.focus(),50)},[]),i.useEffect(()=>{if(e==="rename"&&c.current){const b=n.name.lastIndexOf(".");b>0?c.current.setSelectionRange(0,b):c.current.select()}},[e,n.name]);const m=b=>{b.key==="Enter"&&u.trim()&&a(u.trim()),b.key==="Escape"&&r()};if(e==="delete")return t.jsx("div",{className:"context-menu-overlay",onClick:r,children:t.jsxs("div",{className:"file-browser-dialog",onClick:b=>b.stopPropagation(),children:[t.jsxs("div",{className:"file-browser-dialog-title",children:["Delete ",n.type==="directory"?"Folder":"File"]}),t.jsxs("div",{className:"file-browser-dialog-message",children:["Are you sure you want to delete ",t.jsx("strong",{children:n.name}),"?",n.type==="directory"&&" This will delete all contents recursively."]}),l&&t.jsx("div",{className:"file-browser-dialog-error",children:l}),t.jsxs("div",{className:"file-browser-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:r,disabled:o,children:"Cancel"}),t.jsx("button",{className:"btn btn-danger btn-sm",onClick:()=>a(""),disabled:o,children:o?"Deleting...":"Delete"})]})]})});const p={copy:{title:"Copy",placeholder:"Destination path",confirm:"Copy"},move:{title:"Move",placeholder:"Destination path",confirm:"Move"},rename:{title:"Rename",placeholder:"New name",confirm:"Rename"}}[e];return t.jsx("div",{className:"context-menu-overlay",onClick:r,children:t.jsxs("div",{className:"file-browser-dialog",onClick:b=>b.stopPropagation(),children:[t.jsx("div",{className:"file-browser-dialog-title",children:p.title}),t.jsx("div",{className:"file-browser-dialog-info",children:e==="rename"?n.name:s}),t.jsx("input",{ref:c,className:"file-browser-dialog-input",type:"text",value:u,onChange:b=>h(b.target.value),placeholder:p.placeholder,onKeyDown:m,disabled:o}),l&&t.jsx("div",{className:"file-browser-dialog-error",children:l}),t.jsxs("div",{className:"file-browser-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:r,disabled:o,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>a(u.trim()),disabled:o||!u.trim(),children:o?`${p.confirm}ing...`:p.confirm})]})]})})}function e6({entries:e,currentPath:n,onSelectFile:s,onNavigate:a,loading:r,error:o,onRetry:l,workspace:c,onRefresh:d,projectId:u}){const[h,m]=i.useState(il),[f,p]=i.useState(am),[b,v]=i.useState(!1),[x,y]=i.useState(null),[g,j]=i.useState(!1),[N,C]=i.useState(null),w=i.useRef(null),S=i.useRef(null),R=i.useRef(null),I=i.useRef(!1),E=i.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null),S.current!==null&&(window.clearTimeout(S.current),S.current=null)},[]),M=i.useCallback(()=>{E(),R.current=null,j(!1),C(null)},[E]);i.useEffect(()=>()=>{E()},[E]);const G=i.useCallback((F,ae,k,z)=>{m({visible:!0,x:F,y:ae,entry:k,entryFullPath:z})},[]),U=i.useCallback((F,ae,k)=>{if(F.touches.length!==1)return;const z=F.touches[0];z&&(M(),R.current={x:z.clientX,y:z.clientY},S.current=window.setTimeout(()=>{j(!0),C(k)},Yz),w.current=window.setTimeout(()=>{const J=R.current;J&&(I.current=!0,j(!1),C(null),E(),G(J.x,J.y,ae,k))},Xz))},[M,E,G]),P=i.useCallback(F=>{const ae=R.current,k=F.touches[0];!ae||!k||(Math.abs(k.clientX-ae.x)>xx||Math.abs(k.clientY-ae.y)>xx)&&M()},[M]),T=i.useCallback(()=>{M()},[M]);i.useEffect(()=>{if(!h.visible)return;const F=document.querySelector(".file-browser-list"),ae=()=>{I.current=!1,M(),m(il)};return F?.addEventListener("scroll",ae),()=>F?.removeEventListener("scroll",ae)},[M,h.visible]),i.useEffect(()=>{if(!h.visible)return;const F=ae=>{ae.key==="Escape"&&(I.current=!1,m(il))};return document.addEventListener("keydown",F),()=>document.removeEventListener("keydown",F)},[h.visible]);const D=i.useCallback((F,ae)=>{F.preventDefault(),F.stopPropagation(),M(),I.current=!1,G(F.clientX,F.clientY,ae,bx(n,ae.name))},[M,n,G]),W=i.useCallback(F=>{if(!h.entry)return;I.current=!1;const ae=h.entry,k=h.entryFullPath;if(m(il),F==="download"){if(!c)return;const z=oy(c,k,u);window.open(Qi(z),"_blank");return}if(F==="download-zip"){if(!c)return;const z=bE(c,k,u);window.open(Qi(z),"_blank");return}p({type:F,entry:ae,entryFullPath:k}),y(null)},[h,c,u]),Y=i.useCallback(async F=>{if(!(!f.type||!f.entry||!c)){v(!0),y(null);try{switch(f.type){case"copy":await hE(c,f.entryFullPath,F,u);break;case"move":await fE(c,f.entryFullPath,F,u);break;case"rename":await gE(c,f.entryFullPath,F,u);break;case"delete":await pE(c,f.entryFullPath,u);break}p(am),d?.()}catch(ae){y(Ce(ae)||"Operation failed")}finally{v(!1)}}},[f,c,d,u]),L=i.useCallback(()=>{p(am),y(null)},[]),_=i.useCallback((F,ae)=>{if(I.current){I.current=!1;return}h.visible||(F.type==="directory"?a(ae):s(ae))},[h.visible,a,s]);return r?t.jsxs("div",{className:"file-browser-loading",children:[t.jsx(Ct,{className:"spin",size:24}),t.jsx("span",{children:"Loading files..."})]}):o?t.jsxs("div",{className:"file-browser-error",children:[t.jsxs("p",{children:["Error: ",o]}),l&&t.jsx("button",{className:"btn btn-sm",onClick:l,children:"Retry"})]}):t.jsxs("div",{className:"file-browser",children:[t.jsxs("div",{className:"file-browser-header",children:[n!=="."&&t.jsxs("button",{className:"file-browser-up",onClick:()=>{a(IR(n))},children:[t.jsx(ps,{size:16,style:{transform:"rotate(-90deg)"}}),"Up one level"]}),t.jsx("span",{className:"file-browser-path",children:n==="."?"Root":Oo(n)})]}),t.jsx("div",{className:"file-browser-list",children:e.length===0?t.jsx("div",{className:"file-browser-empty",children:"(empty directory)"}):e.map(F=>{const ae=bx(n,F.name),k=g&&N===ae;return t.jsxs("div",{className:`file-node file-node--${F.type} ${k?"file-node--long-pressing":""}`,onClick:()=>_(F,ae),onContextMenu:z=>D(z,F),onTouchStart:z=>U(z,F,ae),onTouchMove:P,onTouchEnd:T,onTouchCancel:T,children:[t.jsx("div",{className:"file-node-icon",children:F.type==="directory"?t.jsx(Qs,{size:16}):t.jsx(Bv,{size:16})}),t.jsx("div",{className:"file-node-name",children:F.name}),F.type==="file"&&F.size!==void 0&&t.jsx("div",{className:"file-node-size",children:Kz(F.size)}),F.mtime&&t.jsx("div",{className:"file-node-time",children:Jz(F.mtime)})]},F.name)})}),h.visible&&h.entry&&t.jsx(Qz,{x:h.x,y:h.y,entry:h.entry,onAction:W,onClose:()=>{I.current=!1,m(il)}}),f.type&&f.entry&&t.jsx(Zz,{type:f.type,entry:f.entry,entryFullPath:f.entryFullPath,onConfirm:Y,onCancel:L,loading:b,error:x})]})}function t6(e){if(!e)return null;const n=e.toLowerCase();return n.endsWith(".js")||n.endsWith(".mjs")||n.endsWith(".cjs")||n.endsWith(".jsx")?Tf({jsx:!0}):n.endsWith(".ts")||n.endsWith(".tsx")?Tf({jsx:!0,typescript:!0}):n.endsWith(".css")?Pj():n.endsWith(".json")?$j():n.endsWith(".md")||n.endsWith(".markdown")||n.endsWith(".mdx")?Dj():null}function n6(e){if(!e)return!1;const n=e.toLowerCase();return n.endsWith(".md")||n.endsWith(".markdown")||n.endsWith(".mdx")}function vx(){return document.documentElement.dataset.theme!=="light"}function yx(e){return e?[Oj]:[Fj(zj)]}function s6({content:e,onChange:n,readOnly:s,filePath:a,showLineNumbers:r=!1,onToggleLineNumbers:o,canToggleLineNumbers:l=!0,toolbarExpanded:c,toolbarActionsId:d}){const[u,h]=i.useState(!1),[m,f]=i.useState(!0),[p,b]=i.useState(!1),v=c!==void 0,x=v?c:p,y=i.useRef(null),g=i.useRef(null),j=i.useRef(!1),N=i.useRef(n);N.current=n;const C=i.useRef(new Ho),w=i.useRef(new Ho),S=i.useRef(new Ho),R=i.useRef(new Ho),I=i.useRef(new Ho),E=n6(a),M=i.useId(),G=d??M,[U,P]=i.useState(()=>vx()),T=E&&(s?!0:u),D=r&&!s&&!T,W=!!o&&l&&!s&&!T,Y=E||!s||W,L=i.useMemo(()=>t6(a),[a]),_=i.useCallback(()=>h(!1),[]),F=i.useCallback(()=>h(!0),[]),ae=i.useCallback(()=>f(z=>!z),[]),k=i.useCallback(()=>{v||b(z=>!z)},[v]);return i.useEffect(()=>{if(!y.current||T)return;const z=qo.theme({"&":{height:"100%",fontFamily:"var(--font-mono)",backgroundColor:"var(--bg)",color:"var(--text)"},".cm-gutters":{backgroundColor:"var(--surface)",color:"var(--text-muted)",borderRight:"calc(var(--space-xs) * 0.25) solid var(--border)"},"&.cm-focused":{outline:"none"}}),J=If.create({doc:e,extensions:[C.current.of(D?Lj():[]),w.current.of(m?qo.lineWrapping:[]),S.current.of(s?[If.readOnly.of(!0),qo.editable.of(!1)]:[]),R.current.of(L??[]),I.current.of(yx(U)),z,qo.updateListener.of(le=>{!le.docChanged||j.current||N.current(le.state.doc.toString())})]}),oe=new qo({state:J,parent:y.current});return g.current=oe,()=>{g.current=null,oe.destroy()}},[e,T,L,s,D,m]),i.useEffect(()=>{const z=new MutationObserver(()=>{P(vx())});return z.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>z.disconnect()},[]),i.useEffect(()=>{const z=g.current;z&&z.dispatch({effects:I.current.reconfigure(yx(U))})},[U]),i.useEffect(()=>{const z=g.current;!z||z.state.doc.toString()===e||(j.current=!0,z.dispatch({changes:{from:0,to:z.state.doc.length,insert:e}}),j.current=!1)},[e]),t.jsxs("div",{className:"file-editor-container",children:[Y&&(x||!v)?t.jsxs("div",{className:`file-editor-toolbar ${x?"file-editor-toolbar--expanded":""}`,children:[!v&&t.jsx("button",{className:"btn btn-sm btn-icon file-editor-toolbar-button",onClick:k,"aria-label":"Toggle editor options",title:"Toggle editor options","aria-expanded":x,"aria-controls":G,children:x?t.jsx(Pi,{size:14}):t.jsx(Ln,{size:14})}),t.jsxs("div",{className:"file-editor-toolbar-actions",id:G,hidden:!x,children:[E?t.jsxs(t.Fragment,{children:[!s&&t.jsxs("button",{className:`btn btn-sm file-editor-toolbar-button ${T?"":"btn-primary"}`,onClick:_,disabled:!T,"aria-label":"Edit mode",children:[t.jsx(zv,{size:14}),"Edit"]}),t.jsxs("button",{className:`btn btn-sm file-editor-toolbar-button ${T?"btn-primary":""}`,onClick:F,disabled:T,"aria-label":"Preview mode",children:[t.jsx($o,{size:14}),"Preview"]})]}):null,W&&t.jsxs("button",{className:`btn btn-sm file-editor-toolbar-button ${r?"btn-primary":""}`,onClick:o,"aria-label":"Toggle line numbers","aria-pressed":r,title:"Toggle line numbers",children:[t.jsx(TS,{size:14}),t.jsx("span",{children:"Line #"})]}),!s&&t.jsxs("button",{className:`btn btn-sm file-editor-toolbar-button ${m?"btn-primary":""}`,onClick:ae,"aria-label":"Toggle word wrap",title:"Toggle word wrap",children:[t.jsx(Eh,{size:14}),t.jsx("span",{children:"Wrap"})]})]})]}):null,T?t.jsx("div",{className:"file-editor-preview markdown-body",children:t.jsx(ji,{remarkPlugins:[Ni],children:e})}):t.jsx("div",{className:"file-editor-codemirror",ref:y,"aria-label":a?`Editor for ${a}`:"File editor"})]})}function i6(e,n=44){if(e)return e.length<=n?e:`${e.slice(0,n-1)}…`}function a6({currentWorkspace:e,projectName:n,workspaces:s,onSelect:a}){const[r,o]=i.useState(!1),l=typeof e=="string"?e:"project",c=i.useMemo(()=>l==="project"?n||"Project Root":s.find(u=>u.id===l)?.label??l,[l,n,s]);return t.jsxs("div",{className:"workspace-selector",children:[t.jsxs("button",{type:"button",className:"workspace-selector-trigger",onClick:()=>o(d=>!d),"aria-haspopup":"listbox","aria-expanded":r,children:[l==="project"?t.jsx(Lf,{size:14}):t.jsx(Cm,{size:14}),t.jsx("span",{className:"workspace-selector-trigger-label",children:c}),t.jsx(Ln,{size:14,className:`workspace-selector-trigger-icon${r?" open":""}`})]}),r&&t.jsxs("div",{className:"workspace-selector-menu",role:"listbox","aria-label":"Select workspace",children:[t.jsxs("button",{type:"button",className:`workspace-selector-option${l==="project"?" active":""}`,onClick:()=>{a("project"),o(!1)},children:[t.jsxs("div",{className:"workspace-selector-option-main",children:[t.jsx(Lf,{size:14}),t.jsx("span",{children:"Project Root"})]}),t.jsx("span",{className:"workspace-selector-option-meta",children:n})]}),s.length>0&&t.jsxs("div",{className:"workspace-selector-group",children:[t.jsx("div",{className:"workspace-selector-group-label",children:"Task Worktrees"}),s.map(d=>t.jsxs("button",{type:"button",className:`workspace-selector-option${l===d.id?" active":""}`,onClick:()=>{a(d.id),o(!1)},children:[t.jsxs("div",{className:"workspace-selector-option-main",children:[t.jsx(Cm,{size:14}),t.jsx("span",{children:d.id})]}),d.title&&t.jsx("span",{className:"workspace-selector-option-meta",title:d.title,children:i6(d.title)})]},d.id))]})]})]})}const r6=768,o6=280,Ic=180,Pc=500,wx="fusion:file-browser-sidebar-width",kx="kb-files-line-numbers",Ik=new Set([".png",".jpg",".jpeg",".gif",".webp",".ico",".bmp",".svgz"]),l6=new Set([...Ik,".exe",".dll",".so",".dylib",".zip",".tar",".gz",".bz2",".xz",".7z",".rar",".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".mp3",".mp4",".avi",".mov",".webm",".mkv",".flv",".woff",".woff2",".ttf",".otf",".eot",".wasm",".bin"]);function al(e){const n=e.slice(e.lastIndexOf(".")).toLowerCase();return l6.has(n)}function c6(e){const n=e.slice(e.lastIndexOf(".")).toLowerCase();return Ik.has(n)}function d6(e){const n=e.replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/$/,""),s=n.lastIndexOf("/");return s>0?n.slice(0,s):"."}function u6({initialWorkspace:e="project",initialFile:n=null,onClose:s,onWorkspaceChange:a,projectId:r}){const{projectName:o,workspaces:l}=Gz(r),c=i.useRef(null);ea(c,!0,"fusion:files-modal-size");const d=Aa(s),[u,h]=i.useState(e),[m,f]=i.useState(null),[p,b]=i.useState(!1),[v,x]=i.useState("list"),[y,g]=i.useState(o6),[j,N]=i.useState(!1),[C,w]=i.useState(!1),S=i.useId(),{entries:R,currentPath:I,setPath:E,loading:M,error:G,refresh:U}=Uz(u,!0,r),{content:P,setContent:T,originalContent:D,loading:W,saving:Y,error:L,save:_,hasChanges:F,mtime:ae}=Hz(u,m,!0,r);i.useEffect(()=>{h(e)},[e]),i.useEffect(()=>{const O=()=>{b(window.innerWidth<=r6)};return O(),window.addEventListener("resize",O),()=>window.removeEventListener("resize",O)},[]),i.useEffect(()=>{m||x("list"),w(!1)},[m]),i.useEffect(()=>{if(!n){f(null);return}f(n),E(d6(n)),p&&x("editor")},[n,p,E]),i.useEffect(()=>{try{const O=localStorage.getItem(wx);if(!O)return;const se=Number.parseInt(O,10);if(!Number.isNaN(se)){const ve=Math.max(Ic,Math.min(Pc,se));g(ve)}}catch{}},[]),i.useEffect(()=>{const O=ns(kx,r);N(O==="true")},[r]),i.useEffect(()=>{const O=se=>{se.key==="Escape"&&s(),(se.metaKey||se.ctrlKey)&&se.key==="s"&&(se.preventDefault(),F&&!Y&&_())};return document.addEventListener("keydown",O),()=>document.removeEventListener("keydown",O)},[s,F,Y,_]);const k=i.useCallback(O=>{f(O),p&&x("editor")},[p]),z=i.useCallback(()=>{x("list")},[]),J=i.useCallback(()=>{T(D)},[D,T]),oe=i.useCallback(O=>{h(O),f(null),x("list"),a?.(O)},[a]),le=i.useCallback(O=>{try{localStorage.setItem(wx,String(O))}catch{}},[]),we=i.useCallback(O=>{if(p)return;O.preventDefault(),O.stopPropagation();const se=O.currentTarget;typeof se.setPointerCapture=="function"&&se.setPointerCapture(O.pointerId);const ve=O.clientX,A=y;let ne=A;document.body.style.userSelect="none";const ye=ge=>{const Ne=ge.clientX-ve,He=Math.max(Ic,Math.min(Pc,A+Ne));ne=He,g(He)},ee=ge=>{typeof se.releasePointerCapture=="function"&&se.releasePointerCapture(ge.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",ye),document.removeEventListener("pointerup",ee),le(ne)};document.addEventListener("pointermove",ye),document.addEventListener("pointerup",ee)},[p,le,y]),re=i.useCallback(O=>{if(p)return;const se=20;if(O.key!=="ArrowLeft"&&O.key!=="ArrowRight")return;O.preventDefault();const ve=O.key==="ArrowLeft"?-se:se,A=Math.max(Ic,Math.min(Pc,y+ve));g(A),le(A)},[p,le,y]),H=i.useCallback(()=>{N(O=>{const se=!O;return Ns(kx,String(se),r),se})},[r]),Q=`Files — ${i.useMemo(()=>u==="project"?"Project":l.find(O=>O.id===u)?.id??u,[u,l])}`,be=i.useMemo(()=>!m||!c6(m)?null:oy(u,m,r),[m,u,r]),fe=O=>{const se=new Blob([O]).size;return se<1024?`${se} B`:`${(se/1024).toFixed(1)} KB`};return t.jsx("div",{className:"modal-overlay open",...d,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal file-browser-modal",ref:c,children:[t.jsxs("div",{className:"modal-header file-browser-modal-header",children:[t.jsxs("div",{className:"file-browser-header-title",children:[t.jsx(Qs,{size:18}),t.jsx("span",{children:Q}),m&&t.jsx("span",{className:"file-browser-header-path",children:m})]}),t.jsxs("div",{className:"file-browser-header-actions",children:[t.jsx(a6,{currentWorkspace:u,projectName:o,workspaces:l,onSelect:oe}),t.jsx("button",{className:"modal-close",onClick:s,"aria-label":"Close",children:t.jsx(Nn,{size:20})})]})]}),t.jsxs("div",{className:"file-browser-body",children:[t.jsx("div",{className:`file-browser-sidebar ${p?"mobile":""} ${v==="list"?"active":""}`,style:p?void 0:{width:`${y}px`},children:t.jsx(e6,{entries:R,currentPath:I,onSelectFile:k,onNavigate:E,loading:M,error:G,onRetry:U,workspace:u,onRefresh:U,projectId:r})}),!p&&t.jsx("div",{className:"file-browser-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":Ic,"aria-valuemax":Pc,"aria-valuenow":y,"aria-label":"Resize sidebar",tabIndex:0,onPointerDown:we,onKeyDown:re}),t.jsx("div",{className:`file-browser-content ${p?"mobile":""} ${v==="editor"?"active":""}`,children:m?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"file-browser-toolbar",children:[t.jsxs("div",{className:"file-browser-file-info",children:[p&&v==="editor"&&t.jsxs("button",{className:"file-browser-back-button",onClick:z,"aria-label":"Back to file list",children:[t.jsx(Tr,{size:16}),t.jsx("span",{children:"Back"})]}),!al(m)&&t.jsx("button",{className:"btn btn-sm btn-icon file-editor-toolbar-button",onClick:()=>w(O=>!O),"aria-label":"Toggle editor options",title:"Toggle editor options","aria-expanded":C,"aria-controls":S,children:C?t.jsx(Pi,{size:14}):t.jsx(Ln,{size:14})}),m,al(m)&&t.jsxs("span",{className:"file-browser-binary-indicator",children:[t.jsx(YN,{size:12}),"Binary file — read only"]}),ae&&t.jsxs("span",{className:"file-browser-mtime",children:["Modified: ",new Date(ae).toLocaleString()]}),W&&t.jsx("span",{className:"file-browser-loading",children:"Loading..."})]}),t.jsx("div",{className:"file-browser-actions",children:!be&&F&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn-sm",onClick:J,disabled:Y,children:[t.jsx(m0,{size:14}),"Discard"]}),t.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>void _(),disabled:Y,children:[t.jsx(Wv,{size:14}),Y?"Saving...":"Save"]})]})})]}),L&&!be&&t.jsx("div",{className:"file-browser-error-banner",children:L}),be?t.jsx("div",{className:"file-browser-image-preview",children:t.jsx("img",{src:be,alt:m??"",className:"file-browser-image"})}):t.jsx("div",{className:"file-editor-wrapper",children:t.jsx(s6,{content:P,onChange:T,filePath:m,readOnly:al(m),showLineNumbers:j&&!al(m),onToggleLineNumbers:H,canToggleLineNumbers:!al(m),toolbarExpanded:C,toolbarActionsId:S})}),!be&&t.jsxs("div",{className:"file-browser-footer",children:[t.jsx("span",{children:fe(P)}),F&&t.jsx("span",{className:"file-browser-unsaved",children:"Unsaved changes"})]})]}):t.jsxs("div",{className:"file-browser-placeholder",children:[t.jsx(Qs,{size:48,opacity:.3}),t.jsx("p",{children:"Select a file to edit"})]})})]})]})})}const m6=i.lazy(()=>qn(()=>import("./TodoView-DXdnOymj.js"),__vite__mapDeps([13,1,6,7,8,14])).then(e=>({default:e.TodoView})));function h6({onClose:e,projectId:n,addToast:s,onPlanningMode:a}){const r=Aa(e),l=$i()==="mobile",{keyboardOverlap:c,viewportHeight:d,viewportOffsetTop:u,keyboardOpen:h}=Ia({enabled:l});ta(l);const m=h?{"--keyboard-overlap":`${c}px`,"--vv-offset-top":`${u}px`,...d!==null?{"--vv-height":`${d}px`}:{}}:{};return i.useEffect(()=>{const f=p=>{p.key==="Escape"&&e()};return document.addEventListener("keydown",f),()=>document.removeEventListener("keydown",f)},[e]),t.jsx("div",{className:"modal-overlay open",...r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal todo-modal",style:m,children:[t.jsxs("div",{className:"modal-header todo-modal-header",children:[t.jsxs("div",{className:"todo-modal-header-title",children:[t.jsx(RS,{size:18}),t.jsxs("div",{children:[t.jsx("h2",{children:"Todos"}),t.jsx("p",{children:"Manage reusable todo lists for your project."})]})]}),t.jsx("button",{className:"modal-close",onClick:e,"aria-label":"Close",children:t.jsx(Nn,{size:20})})]}),t.jsx("div",{className:"todo-modal-body",children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(m6,{projectId:n,addToast:s,onPlanningMode:a,onClose:e,mobileKeyboardActive:l&&h})})})]})})}function f6(e={}){const{pollInterval:n=3e4,autoRefresh:s=!0}=e,[a,r]=i.useState({providers:[],loading:!0,error:null,lastUpdated:null}),o=i.useRef(null),l=i.useRef(null),c=i.useCallback(async(u=!1)=>{l.current&&l.current.abort(),l.current=new AbortController,u&&r(h=>({...h,loading:!0,error:null}));try{const{providers:h}=await r1();r({providers:h,loading:!1,error:null,lastUpdated:new Date})}catch(h){if(h instanceof Error&&h.name==="AbortError")return;r(m=>({...m,loading:!1,error:Ce(h)||"Failed to fetch usage data"}))}},[]);i.useEffect(()=>{c()},[c]),i.useEffect(()=>{if(s)return o.current=setInterval(()=>{c(!1)},n),()=>{o.current&&(clearInterval(o.current),o.current=null)}},[s,n,c]),i.useEffect(()=>()=>{l.current&&l.current.abort(),o.current&&clearInterval(o.current)},[]);const d=i.useCallback(()=>c(!0),[c]);return{providers:a.providers,loading:a.loading,error:a.error,lastUpdated:a.lastUpdated,refresh:d}}function p6(e){const n=new Date(e),s=new Date,a=n.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0});if(n.toDateString()===s.toDateString())return a;const o=new Date(s.getFullYear(),s.getMonth(),s.getDate()),l=new Date(n.getFullYear(),n.getMonth(),n.getDate()),c=Math.round((l.getTime()-o.getTime())/(1440*60*1e3));return c>=1&&c<=7?`${n.toLocaleDateString(void 0,{weekday:"short"})} ${a}`:`${n.toLocaleDateString(void 0,{month:"short",day:"numeric"})}, ${a}`}function g6(e){return e>90?"usage-progress-fill--high":e>70?"usage-progress-fill--medium":"usage-progress-fill--low"}const Pk="kb-usage-hidden-windows",$k="kb-usage-modal-size",Dk="kb-usage-provider-order";function jx(e){const n=ns($k,e);if(!n)return null;try{const s=JSON.parse(n);if(s&&typeof s.width=="number"&&typeof s.height=="number"&&s.width>0&&s.height>0)return{width:s.width,height:s.height}}catch{}return null}function Nx(e){const n=ns(Pk,e);if(!n)return{};try{const s=JSON.parse(n);return!s||typeof s!="object"?{}:Object.entries(s).reduce((a,[r,o])=>{if(Array.isArray(o)){const l=o.filter(c=>typeof c=="string");l.length>0&&(a[r]=l)}return a},{})}catch{return{}}}function b6(e,n){Ns(Pk,JSON.stringify(e),n)}function Sx(e){const n=ns(Dk,e);if(!n)return[];try{const s=JSON.parse(n);return Array.isArray(s)?s.filter(a=>typeof a=="string"):[]}catch{return[]}}function Cx(e,n){Ns(Dk,JSON.stringify(e),n)}function Lk(e,n,s){return s[e]?.includes(n)??!1}function x6({window:e,viewMode:n,isHidden:s,onToggleHidden:a}){const r=g6(e.percentUsed),o=n==="remaining",l=Math.round(o?e.percentLeft:e.percentUsed),c=o?`${Math.round(e.percentLeft)}% remaining`:`${Math.round(e.percentUsed)}% used`,d=o?`${Math.round(e.percentUsed)}% used`:`${Math.round(e.percentLeft)}% left`;let u=e.resetText;if(!u&&e.resetAt){const x=new Date(e.resetAt).getTime()-Date.now();if(x>0){const y=Math.floor(x/36e5),g=Math.floor(y/24),j=y%24;g>0&&j>0?u=`resets in ${g}d ${j}h`:g>0?u=`resets in ${g}d`:y>0?u=`resets in ${y}h`:u=`resets in ${Math.floor(x/6e4)}m`}}const h=e.pace,m=h!==void 0;let f=0;m&&(f=o?100-h.percentElapsed:h.percentElapsed);const p=h?.status==="ahead",b=h?.status==="behind",v=h?.status==="on-track";return t.jsxs("div",{className:`usage-window ${s?"usage-window--hidden":""}`,children:[t.jsxs("div",{className:"usage-window-header",children:[t.jsx("span",{className:"usage-window-label",children:e.label}),t.jsxs("div",{className:"usage-window-header-controls",children:[!s&&t.jsx("span",{className:"usage-window-percentage",children:c}),!s&&t.jsx("button",{className:"btn-icon usage-window-hide-btn",onClick:a,"aria-label":`Hide ${e.label}`,"data-testid":"usage-window-hide-btn",children:t.jsx($o,{size:14})})]})]}),t.jsxs("div",{className:"usage-progress-wrapper",children:[t.jsx("div",{className:"usage-progress-bar",children:t.jsx("div",{className:`usage-progress-fill ${r}`,style:{width:`${l}%`},role:"progressbar","aria-valuenow":l,"aria-valuemin":0,"aria-valuemax":100,"aria-label":`${e.label}: ${c}`})}),m&&t.jsx("div",{className:"usage-pace-marker",style:{left:`${f}%`},"aria-hidden":"true","data-testid":"pace-marker"})]}),t.jsxs("div",{className:"usage-window-footer",children:[t.jsx("span",{className:"usage-window-left",children:d}),t.jsxs("span",{className:"usage-window-reset-group",children:[u&&t.jsx("span",{className:"usage-window-reset",children:u}),e.resetAt&&t.jsx("span",{className:"usage-window-reset-at",children:p6(e.resetAt)})]})]}),m&&t.jsxs("div",{className:"usage-pace-row","data-testid":"pace-row",children:[p&&t.jsxs(t.Fragment,{children:[t.jsx(Ma,{size:14,className:"pace-icon pace-ahead"}),t.jsx("span",{className:"pace-text pace-ahead",children:h.message})]}),b&&t.jsxs(t.Fragment,{children:[t.jsx(I0,{size:14,className:"pace-icon pace-behind"}),t.jsx("span",{className:"pace-text pace-behind",children:h.message})]}),v&&t.jsxs(t.Fragment,{children:[t.jsx(gs,{size:14,className:"pace-icon pace-ontrack"}),t.jsx("span",{className:"pace-text pace-ontrack",children:h.message})]})]})]})}function v6(e){const n=e.toLowerCase();return n.includes("claude")||n.includes("anthropic")?"anthropic":n.includes("codex")||n.includes("openai")||n.includes("gpt")?"openai":n.includes("gemini")||n.includes("google")||n.includes("antigravity")?"google":n.includes("ollama")?"ollama":n.includes("minimax")?"minimax":n.includes("zai")||n.includes("zhipu")?"zai":n.includes("kimi")||n.includes("moonshot")?"kimi":n.includes("bedrock")||n.includes("amazon")?"bedrock":n.includes("xai")||n.includes("grok")?"xai":n.includes("opencode")?"opencode":n.includes("copilot")||n==="github copilot"?"github-copilot":e}function y6({provider:e,viewMode:n,hiddenWindows:s,onToggleWindow:a,onShowAllHidden:r,isDragging:o,isDragOver:l,dragOverPosition:c,onDragStart:d,onDragOver:u,onDragLeave:h,onDrop:m,onDragEnd:f,isTouchReorderMode:p,canMoveUp:b,canMoveDown:v,onMoveUp:x,onMoveDown:y}){const g=s[e.name]?.length??0,j=()=>{switch(e.status){case"ok":return null;case"error":return t.jsx("span",{className:"usage-status-badge usage-status-badge--error",children:"Error"});case"no-auth":default:return t.jsx("span",{className:"usage-status-badge usage-status-badge--not-configured",children:"Not configured"})}};return t.jsxs("div",{className:`usage-provider${o?" usage-provider--dragging":""}${l&&c==="before"?" usage-provider--drag-over-before":""}${l&&c==="after"?" usage-provider--drag-over-after":""}`,"data-provider":e.name,"data-status":e.status,draggable:!p,onDragStart:p?void 0:d,onDragOver:p?void 0:u,onDragLeave:p?void 0:h,onDrop:p?void 0:m,onDragEnd:p?void 0:f,children:[t.jsxs("div",{className:"usage-provider-header",children:[t.jsxs("div",{className:"usage-provider-info",children:[t.jsx(rs,{provider:v6(e.name),size:"md"}),t.jsx("span",{className:"usage-provider-name",children:e.name}),g>0&&t.jsxs("button",{className:"btn btn-sm usage-show-hidden-btn",onClick:()=>r(e.name),"data-testid":"usage-show-hidden-btn",children:["Show hidden (",g,")"]})]}),t.jsxs("div",{className:"usage-provider-actions",children:[p&&t.jsxs("div",{className:"usage-provider-reorder-controls",role:"group","aria-label":`Reorder ${e.name}`,children:[t.jsx("button",{className:"btn-icon usage-provider-reorder-btn",type:"button",onClick:x,disabled:!b,"aria-label":`Move ${e.name} up`,children:t.jsx(Pi,{size:14})}),t.jsx("button",{className:"btn-icon usage-provider-reorder-btn",type:"button",onClick:y,disabled:!v,"aria-label":`Move ${e.name} down`,children:t.jsx(Ln,{size:14})})]}),j(),t.jsx("div",{className:"usage-provider-drag-handle","aria-hidden":"true",children:t.jsx(Nd,{size:16})})]})]}),e.error&&t.jsx("div",{className:"usage-provider-error",children:e.error}),e.plan&&t.jsx("div",{className:"usage-provider-meta",children:t.jsx("span",{className:"usage-provider-plan",children:e.plan})}),e.windows.length>0?t.jsx("div",{className:"usage-provider-windows",children:e.windows.map((N,C)=>{const w=Lk(e.name,N.label,s);return t.jsx(x6,{window:N,viewMode:n,isHidden:w,onToggleHidden:()=>a(e.name,N.label)},`${e.name}-${N.label}-${C}`)})}):e.status==="ok"?t.jsx("div",{className:"usage-provider-empty",children:"No usage data available"}):null]})}function w6(){return t.jsx("div",{className:"usage-skeleton",children:[1,2,3].map(e=>t.jsxs("div",{className:"usage-skeleton-provider",children:[t.jsxs("div",{className:"usage-skeleton-header",children:[t.jsx("div",{className:"usage-skeleton-icon"}),t.jsx("div",{className:"usage-skeleton-name"}),t.jsx("div",{className:"usage-skeleton-badge"})]}),t.jsx("div",{className:"usage-skeleton-bar"}),t.jsx("div",{className:"usage-skeleton-text"})]},e))})}function k6({isOpen:e,onClose:n,projectId:s,anchorRect:a}){const{providers:r,loading:o,error:l,lastUpdated:c,refresh:d}=f6({autoRefresh:e}),[u,h]=i.useState(!1),[m,f]=i.useState(()=>typeof window<"u"?window.innerWidth>=769:!1),[p,b]=i.useState(()=>typeof window>"u"?!1:window.matchMedia?.("(pointer: coarse)").matches??!1),[v,x]=i.useState("used"),[y,g]=i.useState(()=>Nx(s)),[j,N]=i.useState(()=>Sx(s)),[C,w]=i.useState(null),[S,R]=i.useState(null),[I,E]=i.useState(null),M=i.useRef(null),G=i.useRef(null),U=i.useRef(e),P=i.useRef(!1),[T,D]=i.useState(()=>jx(s));i.useEffect(()=>{D(jx(s))},[s]),i.useEffect(()=>{if(!e||!m)return;const A=G.current;if(!A||typeof ResizeObserver>"u")return;let ne=null;const ye=new ResizeObserver(ee=>{const ge=ee[0];if(!ge)return;const{width:Ne,height:He}=ge.contentRect;Ne<=0||He<=0||(ne&&clearTimeout(ne),ne=setTimeout(()=>{Ns($k,JSON.stringify({width:Math.round(Ne),height:Math.round(He)}),s)},250))});return ye.observe(A),()=>{ne&&clearTimeout(ne),ye.disconnect()}},[e,m,s]),i.useEffect(()=>{e||(P.current=!1)},[e]),i.useEffect(()=>{r.length>0&&(P.current=!0)},[r.length]),i.useEffect(()=>{if(typeof window>"u")return;const A=window.matchMedia?.("(pointer: coarse)"),ne=()=>{f(window.innerWidth>=769),b(A?.matches??!1)};return ne(),window.addEventListener("resize",ne),A?.addEventListener?.("change",ne),()=>{window.removeEventListener("resize",ne),A?.removeEventListener?.("change",ne)}},[]),i.useEffect(()=>{!U.current&&e&&(!c||Date.now()-c.getTime()>5e3)&&d(),U.current=e},[e,c,d]),i.useEffect(()=>{const A=ns("kb-usage-view-mode",s);if(A==="used"||A==="remaining"){x(A);return}x("used")},[s]);const W=i.useCallback(A=>{x(A),Ns("kb-usage-view-mode",A,s)},[s]);i.useEffect(()=>{g(Nx(s)),N(Sx(s))},[s]),i.useEffect(()=>{b6(y,s)},[y,s]);const Y=i.useCallback((A,ne)=>{g(ye=>{if(Lk(A,ne,ye)){const ee=(ye[A]??[]).filter(ge=>ge!==ne);if(ee.length===0){const{[A]:ge,...Ne}=ye;return Ne}return{...ye,[A]:ee}}return{...ye,[A]:[...ye[A]??[],ne]}})},[]),L=i.useCallback(A=>{g(ne=>{if(!ne[A])return ne;const{[A]:ye,...ee}=ne;return ee})},[]),_=i.useCallback(A=>{if(j.length===0)return A;const ne=new Map(A.map(ee=>[ee.name,ee])),ye=[];for(const ee of j){const ge=ne.get(ee);ge&&(ye.push(ge),ne.delete(ee))}return[...ye,...ne.values()]},[j]),F=i.useCallback((A,ne)=>{A.dataTransfer.effectAllowed="move",A.dataTransfer.setData("text/plain",ne),w(ne)},[]),ae=i.useCallback((A,ne)=>{if(!C||C===ne)return;A.preventDefault(),A.dataTransfer.dropEffect="move";const{top:ye,height:ee}=A.currentTarget.getBoundingClientRect(),ge=ye+ee/2,Ne=A.clientY<ge?"before":"after";R(ne),E(Ne)},[C]),k=i.useCallback((A,ne)=>{A.preventDefault();const ye=C??A.dataTransfer.getData("text/plain");if(!ye||ye===ne){R(null),E(null);return}const ge=_(r).map(Le=>Le.name).filter(Le=>Le!==ye),Ne=ge.indexOf(ne);if(Ne<0){R(null),E(null);return}const He=I==="after"?Ne+1:Ne;ge.splice(He,0,ye),Cx(ge,s),N(ge),R(null),E(null)},[C,I,s,r,_]),z=i.useCallback(()=>{w(null),R(null),E(null)},[]),J=i.useCallback((A,ne)=>{const ye=_(r).map(Le=>Le.name),ee=ye.indexOf(A),ge=ee+ne;if(ee<0||ge<0||ge>=ye.length)return;const Ne=[...ye],[He]=Ne.splice(ee,1);Ne.splice(ge,0,He),Cx(Ne,s),N(Ne)},[s,r,_]),oe=i.useCallback(async()=>{h(!0),await d(),h(!1)},[d]);i.useEffect(()=>{if(!e)return;const A=ne=>{ne.key==="Escape"&&n()};return document.addEventListener("keydown",A),()=>document.removeEventListener("keydown",A)},[e,n]);const le=i.useCallback(A=>{A.target===A.currentTarget&&n()},[n]);if(!e)return null;const we=!!(a&&m),re=8,H=12,Q=T?.width??420,be=we?Math.min((a?.bottom??0)+re,window.innerHeight-H):void 0,fe=we?Math.max(8,(a?.right??0)-Q):void 0,O=m&&T?{width:T.width,height:T.height}:{},se=_(r),ve=t.jsxs("div",{ref:G,className:`usage-modal${we?" usage-modal--popover":" modal"}`,"data-testid":"usage-modal",style:we?{position:"fixed",top:be,left:fe,...O}:O,children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("div",{className:"usage-header",children:[t.jsx(fi,{size:18,className:"usage-header-icon"}),t.jsx("h3",{children:"Usage"})]}),t.jsxs("div",{className:"usage-header-actions",children:[t.jsxs("div",{className:"usage-view-toggle",role:"group","aria-label":"Usage view mode",children:[t.jsx("button",{className:`usage-view-toggle-btn ${v==="used"?"active":""}`,onClick:()=>W("used"),"aria-pressed":v==="used","data-testid":"usage-view-toggle-used",children:"Used"}),t.jsx("button",{className:`usage-view-toggle-btn ${v==="remaining"?"active":""}`,onClick:()=>W("remaining"),"aria-pressed":v==="remaining","data-testid":"usage-view-toggle-remaining",children:"Remaining"})]}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close usage modal","data-testid":"usage-modal-close",children:t.jsx(Nn,{size:20})})]})]}),t.jsx("div",{className:"usage-content",ref:M,children:(o||!P.current&&!l)&&r.length===0?t.jsx(w6,{}):l&&r.length===0?t.jsxs("div",{className:"usage-error",children:[t.jsx("p",{children:"Failed to load usage data"}),t.jsx("p",{className:"usage-error-message",children:l}),t.jsx("button",{className:"btn btn-sm",onClick:oe,children:"Retry"})]}):r.length===0?t.jsxs("div",{className:"usage-empty",children:[t.jsx("p",{children:"No AI providers configured"}),t.jsx("p",{className:"usage-empty-hint",children:"Configure authentication in Settings to see usage data."})]}):t.jsx("div",{className:"usage-providers",children:se.map((A,ne)=>t.jsx(y6,{provider:A,viewMode:v,hiddenWindows:y,onToggleWindow:Y,onShowAllHidden:L,isDragging:C===A.name,isDragOver:S===A.name,dragOverPosition:S===A.name?I:null,onDragStart:ye=>F(ye,A.name),onDragOver:ye=>ae(ye,A.name),onDragLeave:()=>{S===A.name&&(R(null),E(null))},onDrop:ye=>k(ye,A.name),onDragEnd:z,isTouchReorderMode:p,canMoveUp:ne>0,canMoveDown:ne<se.length-1,onMoveUp:()=>J(A.name,-1),onMoveDown:()=>J(A.name,1)},A.name))})}),t.jsxs("div",{className:"modal-actions usage-actions",children:[t.jsx("div",{className:"modal-actions-left usage-actions-left",children:t.jsx("div",{className:"usage-last-updated",children:c&&t.jsxs("span",{children:["Last updated: ",c.toLocaleTimeString()]})})}),t.jsxs("div",{className:"modal-actions-right usage-actions-right",children:[t.jsxs("button",{className:"btn btn-sm",onClick:oe,disabled:o||u,"data-testid":"usage-refresh-btn",children:[t.jsx(Ss,{size:14,className:u?"spin":"",style:{marginRight:6}}),"Refresh"]}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:n,children:"Close"})]})]})]});return we?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"usage-popover-backdrop",onClick:n,"data-testid":"usage-modal-overlay"}),ve]}):t.jsx("div",{className:"modal-overlay open",onClick:le,"data-testid":"usage-modal-overlay",children:ve})}function Ok(e){if(e<1e3)return`${e}ms`;const n=Math.floor(e/1e3);if(n<60)return`${n}s`;const s=Math.floor(n/60),a=n%60;if(s<60)return a>0?`${s}m ${a}s`:`${s}m`;const r=Math.floor(s/60),o=s%60;return o>0?`${r}h ${o}m`:`${r}h`}function pd(e){const n=Date.now(),s=new Date(e).getTime(),a=n-s;if(a<0){const r=Math.abs(a);return r<6e4?"in a moment":r<36e5?`in ${Math.floor(r/6e4)}m`:r<864e5?`in ${Math.floor(r/36e5)}h`:`in ${Math.floor(r/864e5)}d`}return a<6e4?"just now":a<36e5?`${Math.floor(a/6e4)}m ago`:a<864e5?`${Math.floor(a/36e5)}h ago`:`${Math.floor(a/864e5)}d ago`}const j6={cron:"var(--color-blue, #3b82f6)",webhook:"var(--color-purple, #a855f7)",api:"var(--color-green, #22c55e)",manual:"var(--color-gray, #6b7280)"},Fk={cron:"Cron",webhook:"Webhook",api:"API",manual:"Manual"},N6={cron:Lv,webhook:Gv,api:Ov,manual:Bs},S6={parallel:"Concurrent",queue:"Queued",reject:"Exclusive"},C6={run:"Catch up",skip:"Skip missed",run_one:"Catch up (latest)"};function E6({result:e}){const n=e.completedAt&&e.startedAt?new Date(e.completedAt).getTime()-new Date(e.startedAt).getTime():0;return t.jsxs("span",{className:`schedule-run-badge ${e.success?"success":"failure"}`,children:[e.success?t.jsx(gs,{size:12}):t.jsx(Za,{size:12}),t.jsx("span",{children:e.success?"Success":"Failed"}),n>0&&t.jsx("span",{className:"schedule-run-duration",children:Ok(n)})]})}function _6({result:e,index:n}){const[s,a]=i.useState(!1),r=e.completedAt&&e.startedAt?new Date(e.completedAt).getTime()-new Date(e.startedAt).getTime():0;return t.jsxs("div",{className:"schedule-history-item",children:[t.jsxs("button",{className:"schedule-history-header",onClick:()=>a(!s),"aria-expanded":s,"aria-label":`Run #${n+1}: ${e.success?"succeeded":"failed"} ${pd(e.startedAt)}`,children:[t.jsx("span",{className:`schedule-history-status ${e.success?"success":"failure"}`,children:e.success?t.jsx(gs,{size:12}):t.jsx(Za,{size:12})}),t.jsx("span",{className:"schedule-history-time",children:pd(e.startedAt)}),e.triggerType&&t.jsx("span",{className:"routine-history-trigger-type",children:Fk[e.triggerType]}),t.jsx("span",{className:"schedule-history-duration",children:Ok(r)}),s?t.jsx(Pi,{size:12}):t.jsx(Ln,{size:12})]}),s&&t.jsxs("div",{className:"schedule-history-detail",children:[e.output&&t.jsx("pre",{className:"schedule-history-output",children:e.output}),e.error&&t.jsx("div",{className:"schedule-history-error",children:e.error})]})]})}function M6({routine:e,onEdit:n,onDelete:s,onRun:a,onToggle:r,running:o,lastRunOutput:l}){const[c,d]=i.useState(!1),{confirm:u}=Di(),h=i.useCallback(async()=>{await u({title:"Delete Routine",message:`Delete routine "${e.name}"? This cannot be undone.`,danger:!0})&&s(e)},[e,s,u]),m=j6[e.trigger.type],f=N6[e.trigger.type],p=e.trigger.type==="cron"?("cronExpression"in e.trigger?e.trigger.cronExpression:void 0)||e.cronExpression||"":e.cronExpression||"";return t.jsxs("div",{className:`routine-card${e.enabled?"":" disabled"}${o?" running":""}`,children:[t.jsxs("div",{className:"routine-card-header",children:[t.jsxs("div",{className:"routine-card-info",children:[t.jsxs("div",{className:"routine-card-name-row",children:[t.jsx("span",{className:"routine-card-name",children:e.name}),t.jsxs("span",{className:"routine-trigger-badge",style:{borderColor:m,color:m},children:[t.jsx(f,{size:10}),Fk[e.trigger.type]]}),e.scope&&t.jsxs("span",{className:`routine-scope-badge${e.scope==="global"?" global":" project"}`,title:`${e.scope==="global"?"Global":"Project"}-scoped routine`,children:[e.scope==="global"?t.jsx(jd,{size:10}):t.jsx(Qs,{size:10}),e.scope]})]}),e.description&&t.jsx("p",{className:"routine-card-description",children:e.description})]}),t.jsxs("div",{className:"routine-card-actions",children:[t.jsx("button",{className:"btn-icon",onClick:()=>a(e),disabled:o,title:o?"Running…":"Run now","aria-label":o?"Running…":`Run ${e.name} now`,children:o?t.jsx(Ct,{className:"spinner"}):t.jsx(Os,{})}),t.jsx("button",{className:"btn-icon",onClick:()=>r(e),title:e.enabled?"Disable":"Enable","aria-label":e.enabled?`Disable ${e.name}`:`Enable ${e.name}`,"aria-pressed":e.enabled,children:e.enabled?t.jsx(Vi,{}):t.jsx(Os,{})}),t.jsx("button",{className:"btn-icon",onClick:()=>n(e),title:"Edit","aria-label":`Edit ${e.name}`,children:t.jsx(xi,{})}),t.jsx("button",{className:"btn-icon",onClick:h,title:"Delete","aria-label":`Delete ${e.name}`,children:t.jsx(es,{})})]})]}),t.jsxs("div",{className:"routine-card-meta",children:[e.steps&&e.steps.length>0?t.jsxs("div",{className:"routine-meta-item",children:[t.jsx(kr,{size:12}),t.jsxs("span",{className:"routine-policy-badge",children:[e.steps.length," step",e.steps.length===1?"":"s"]})]}):e.command?t.jsx("div",{className:"routine-meta-item routine-meta-command-preview",title:e.command,children:t.jsx("code",{className:"routine-cron",children:e.command})}):null,e.trigger.type==="cron"&&p&&t.jsxs("div",{className:"routine-meta-item",children:[t.jsx(pa,{size:12}),t.jsx("code",{className:"routine-cron",children:p})]}),t.jsx("div",{className:"routine-meta-item",children:t.jsx("span",{className:"routine-policy-badge",title:`Execution policy: ${e.executionPolicy}`,children:S6[e.executionPolicy]})}),t.jsx("div",{className:"routine-meta-item",children:t.jsx("span",{className:"routine-policy-badge",title:`Catch-up policy: ${e.catchUpPolicy}`,children:C6[e.catchUpPolicy]})}),e.nextRunAt&&e.enabled&&t.jsxs("div",{className:"routine-meta-item",children:[t.jsx("span",{className:"routine-meta-label",children:"Next:"}),t.jsx("span",{title:e.nextRunAt,children:pd(e.nextRunAt)})]}),e.lastRunAt&&t.jsxs("div",{className:"routine-meta-item",children:[t.jsx("span",{className:"routine-meta-label",children:"Last:"}),t.jsx("span",{title:e.lastRunAt,children:pd(e.lastRunAt)})]}),e.lastRunResult&&t.jsx(E6,{result:e.lastRunResult}),t.jsxs("div",{className:"routine-meta-item",children:[t.jsx("span",{className:"routine-meta-label",children:"Runs:"}),t.jsx("span",{children:e.runCount})]})]}),l&&t.jsxs("div",{className:`routine-run-output ${l.success?"success":"failure"}`,children:[l.output&&t.jsx("pre",{className:"routine-run-output-text",children:l.output}),l.error&&t.jsx("div",{className:"routine-run-output-error",children:l.error})]}),e.runHistory.length>0&&t.jsxs("div",{className:"routine-card-history",children:[t.jsxs("button",{className:"schedule-history-toggle",onClick:()=>d(b=>!b),"aria-expanded":c,children:[c?t.jsx(Pi,{size:12}):t.jsx(Ln,{size:12}),t.jsxs("span",{children:["Run History (",e.runHistory.length,")"]})]}),c&&t.jsxs("div",{className:"schedule-history-list",children:[e.runHistory.slice(0,10).map((b,v)=>t.jsx(_6,{result:b,index:v},`${b.startedAt}-${v}`)),e.runHistory.length>10&&t.jsxs("div",{className:"schedule-history-more",children:["…and ",e.runHistory.length-10," more"]})]})]})]})}function R6({type:e,size:n=12}){return e==="command"?t.jsxs("span",{className:"step-type-badge step-type-command",title:"Command step",children:[t.jsx(_a,{size:n}),t.jsx("span",{children:"Command"})]}):e==="create-task"?t.jsxs("span",{className:"step-type-badge step-type-create-task",title:"Create Task step",children:[t.jsx(PS,{size:n}),t.jsx("span",{children:"Create Task"})]}):t.jsxs("span",{className:"step-type-badge step-type-ai-prompt",title:"AI Prompt step",children:[t.jsx(Ls,{size:n}),t.jsx("span",{children:"AI Prompt"})]})}function rm(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`step-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}function A6(e){return e==="command"?{id:rm(),type:e,name:"New Command Step",command:"",continueOnFailure:!1}:e==="ai-prompt"?{id:rm(),type:e,name:"New AI Prompt Step",prompt:"",continueOnFailure:!1}:{id:rm(),type:e,name:"New Create Task Step",taskDescription:"",taskColumn:"triage",continueOnFailure:!1}}function T6({step:e,onSave:n,onCancel:s}){const[a,r]=i.useState(e.name),[o,l]=i.useState(e.type),[c,d]=i.useState(e.command??""),[u,h]=i.useState(e.prompt??""),[m,f]=i.useState(e.modelProvider??""),[p,b]=i.useState(e.modelId??""),[v,x]=i.useState(e.taskTitle??""),[y,g]=i.useState(e.taskDescription??""),[j,N]=i.useState(e.taskColumn??"triage"),[C,w]=i.useState(e.timeoutMs),[S,R]=i.useState(e.continueOnFailure??!1),[I,E]=i.useState({}),[M,G]=i.useState([]),[U,P]=i.useState(!1),[T,D]=i.useState(null);i.useEffect(()=>{let F=!1;return P(!0),D(null),Ki().then(ae=>{F||G(ae.models)}).catch(ae=>{F||D(ae instanceof Error?ae.message:"Failed to load models")}).finally(()=>{F||P(!1)}),()=>{F=!0}},[]);const W=i.useCallback(()=>{const F={};return a.trim()||(F.name="Step name is required"),o==="command"&&!c.trim()&&(F.command="Command is required"),o==="ai-prompt"&&!u.trim()&&(F.prompt="Prompt is required"),o==="create-task"&&!y.trim()&&(F.taskDescription="Task description is required"),(o==="ai-prompt"||o==="create-task")&&(m||p)&&(!m||!p)&&(F.modelProvider="Both model provider and model ID must be set together"),C!==void 0&&C<1e3&&(F.timeoutMs="Timeout must be at least 1 second (1000ms)"),E(F),Object.keys(F).length===0},[a,o,c,u,y,m,p,C]),Y=m&&p?`${m}/${p}`:"",L=i.useCallback(F=>{if(!F)f(""),b("");else{const ae=F.indexOf("/");ae!==-1&&(f(F.slice(0,ae)),b(F.slice(ae+1)))}},[]),_=i.useCallback(()=>{if(!W())return;const F={...e,name:a.trim(),type:o,command:o==="command"?c.trim():void 0,prompt:o==="ai-prompt"?u.trim():void 0,taskTitle:o==="create-task"&&v.trim()?v.trim():void 0,taskDescription:o==="create-task"&&y.trim()?y.trim():void 0,taskColumn:o==="create-task"?j:void 0,modelProvider:(o==="ai-prompt"||o==="create-task")&&m.trim()?m.trim():void 0,modelId:(o==="ai-prompt"||o==="create-task")&&p.trim()?p.trim():void 0,timeoutMs:C||void 0,continueOnFailure:S};o!=="ai-prompt"&&delete F.prompt,o!=="create-task"&&(delete F.taskTitle,delete F.taskDescription,delete F.taskColumn),n(F)},[W,n,e,a,o,c,u,v,y,j,m,p,C,S]);return t.jsxs("div",{className:"step-editor",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-name-${e.id}`,children:"Step Name"}),t.jsx("input",{id:`step-name-${e.id}`,type:"text",placeholder:"e.g. Run tests",value:a,onChange:F=>r(F.target.value),"aria-invalid":!!I.name}),I.name&&t.jsx("small",{className:"field-error",children:I.name})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-type-${e.id}`,children:"Step Type"}),t.jsxs("select",{id:`step-type-${e.id}`,value:o,onChange:F=>l(F.target.value),children:[t.jsx("option",{value:"command",children:"Command"}),t.jsx("option",{value:"ai-prompt",children:"AI Prompt"}),t.jsx("option",{value:"create-task",children:"Create Task"})]})]}),o==="command"&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-command-${e.id}`,children:"Command"}),t.jsx("textarea",{id:`step-command-${e.id}`,placeholder:"e.g. npm test",value:c,onChange:F=>d(F.target.value),rows:2,"aria-invalid":!!I.command}),I.command&&t.jsx("small",{className:"field-error",children:I.command})]}),o==="ai-prompt"&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-prompt-${e.id}`,children:"Prompt"}),t.jsx("textarea",{id:`step-prompt-${e.id}`,placeholder:"e.g. Summarize the test results and highlight any failures",value:u,onChange:F=>h(F.target.value),rows:3,"aria-invalid":!!I.prompt}),I.prompt&&t.jsx("small",{className:"field-error",children:I.prompt})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-model-${e.id}`,children:"Model (optional)"}),t.jsx(ri,{id:`step-model-${e.id}`,label:"Model",models:M,value:Y,onChange:L,placeholder:"Use default",disabled:U}),T&&t.jsx("small",{className:"field-error",children:T}),t.jsx("small",{children:"AI model for this step. Uses default if not selected."})]})]}),o==="create-task"&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-task-title-${e.id}`,children:"Task Title (optional)"}),t.jsx("input",{id:`step-task-title-${e.id}`,type:"text",placeholder:"e.g. Review weekly dependencies",value:v,onChange:F=>x(F.target.value)}),t.jsx("small",{children:"Leave blank to auto-summarize from description"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-task-description-${e.id}`,children:"Task Description *"}),t.jsx("textarea",{id:`step-task-description-${e.id}`,placeholder:"e.g. Check all npm dependencies for security vulnerabilities and update outdated packages",value:y,onChange:F=>g(F.target.value),rows:4,"aria-invalid":!!I.taskDescription}),I.taskDescription&&t.jsx("small",{className:"field-error",children:I.taskDescription})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-task-column-${e.id}`,children:"Target Column"}),t.jsxs("select",{id:`step-task-column-${e.id}`,value:j,onChange:F=>N(F.target.value),children:[t.jsx("option",{value:"triage",children:"Triage"}),t.jsx("option",{value:"todo",children:"To Do"})]}),t.jsx("small",{children:"Column where the new task will be created"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-task-model-${e.id}`,children:"Executor Model (optional)"}),t.jsx(ri,{id:`step-task-model-${e.id}`,label:"Model",models:M,value:Y,onChange:L,placeholder:"Use default",disabled:U}),T&&t.jsx("small",{className:"field-error",children:T}),I.modelProvider&&t.jsx("small",{className:"field-error",children:I.modelProvider}),t.jsx("small",{children:"AI model for executing the created task. Uses default if not selected."})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-timeout-${e.id}`,children:"Timeout (ms, optional)"}),t.jsx("input",{id:`step-timeout-${e.id}`,type:"number",min:1e3,step:1e3,placeholder:"Override schedule timeout",value:C??"",onChange:F=>w(F.target.value?Number(F.target.value):void 0),"aria-invalid":!!I.timeoutMs}),I.timeoutMs&&t.jsx("small",{className:"field-error",children:I.timeoutMs})]}),t.jsxs("div",{className:"form-group",children:[t.jsxs("label",{htmlFor:`step-continue-${e.id}`,className:"checkbox-label",children:[t.jsx("input",{id:`step-continue-${e.id}`,type:"checkbox",checked:S,onChange:F=>R(F.target.checked)}),"Continue on failure"]}),t.jsx("small",{children:"If checked, the next step will run even if this one fails"})]}),t.jsxs("div",{className:"step-editor-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:s,children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:_,children:"Save Step"})]})]})}function I6({steps:e,onChange:n,onEditingChange:s}){const[a,r]=i.useState(null);i.useEffect(()=>{s?.(a!==null)},[a,s]);const o=i.useCallback(u=>{const h=A6(u);n([...e,h]),r(h.id)},[e,n]),l=i.useCallback(u=>{n(e.filter(h=>h.id!==u)),a===u&&r(null)},[e,n,a]),c=i.useCallback((u,h)=>{const m=e.findIndex(b=>b.id===u);if(m<0)return;const f=h==="up"?m-1:m+1;if(f<0||f>=e.length)return;const p=[...e];[p[m],p[f]]=[p[f],p[m]],n(p)},[e,n]),d=i.useCallback(u=>{n(e.map(h=>h.id===u.id?u:h)),r(null)},[e,n]);return t.jsxs("div",{className:"steps-editor",children:[t.jsx("div",{className:"steps-editor-header",children:t.jsxs("span",{className:"steps-editor-title",children:["Steps (",e.length,")"]})}),e.length===0&&t.jsx("div",{className:"steps-empty-state",children:t.jsx("p",{children:"No steps added yet. Add a command or AI prompt step to get started."})}),t.jsx("div",{className:"steps-list",children:e.map((u,h)=>t.jsx("div",{className:"step-card",children:a===u.id?t.jsx(T6,{step:u,onSave:d,onCancel:()=>r(null)}):t.jsxs("div",{className:"step-card-row",children:[t.jsx("div",{className:"step-card-drag",children:t.jsx(Nd,{size:14})}),t.jsx("span",{className:"step-card-index",children:h+1}),t.jsx(R6,{type:u.type}),t.jsx("span",{className:"step-card-name",children:u.name}),u.continueOnFailure&&t.jsx("span",{className:"step-card-flag",title:"Continues on failure",children:"⚡"}),t.jsxs("div",{className:"step-card-actions",children:[t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>c(u.id,"up"),disabled:h===0,title:"Move up","aria-label":`Move ${u.name} up`,children:t.jsx(Pi,{})}),t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>c(u.id,"down"),disabled:h===e.length-1,title:"Move down","aria-label":`Move ${u.name} down`,children:t.jsx(Ln,{})}),t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>r(u.id),title:"Edit","aria-label":`Edit ${u.name}`,children:t.jsx(xi,{})}),t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>l(u.id),title:"Delete","aria-label":`Delete ${u.name}`,children:t.jsx(es,{})})]})]})},u.id))}),t.jsxs("div",{className:"steps-add-buttons",children:[t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>o("command"),children:[t.jsx(os,{size:14}),"Add Command Step"]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>o("ai-prompt"),children:[t.jsx(os,{size:14}),"Add AI Prompt Step"]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>o("create-task"),children:[t.jsx(os,{size:14}),"Add Create Task Step"]})]})]})}const zk={hourly:"0 * * * *",daily:"0 0 * * *",weekly:"0 0 * * 1",monthly:"0 0 1 * *"},P6={hourly:"Every hour",daily:"Every day (midnight)",weekly:"Every week (Monday)",monthly:"Every month (1st)",custom:"Custom cron expression"};function $6(e){const n=e.trim();for(const[s,a]of Object.entries(zk))if(a===n)return s;return"custom"}function D6(e){const n=e.trim().split(/\s+/);return n.length!==5?!1:n.every(s=>/^[\d*,/-]+$/.test(s))}function L6(e,n,s,a,r){switch(e){case"cron":return{type:"cron",cronExpression:n};case"webhook":return{type:"webhook",webhookPath:s||"/trigger/"+Math.random().toString(36).slice(2,10),secret:a||void 0};case"api":return{type:"api",endpoint:r||"/api/routine/"+Math.random().toString(36).slice(2,10)};case"manual":return{type:"manual"}}}function O6(e){const n=e.trigger;switch(n.type){case"cron":return{triggerType:"cron",cronExpression:n.cronExpression,webhookPath:"",webhookSecret:"",endpoint:""};case"webhook":return{triggerType:"webhook",cronExpression:"",webhookPath:n.webhookPath,webhookSecret:n.secret||"",endpoint:""};case"api":return{triggerType:"api",cronExpression:"",webhookPath:"",webhookSecret:"",endpoint:n.endpoint};case"manual":return{triggerType:"manual",cronExpression:"",webhookPath:"",webhookSecret:"",endpoint:""}}}const F6=[{value:"parallel",label:"Allow concurrent runs"},{value:"queue",label:"Queue after current (one at a time)"},{value:"reject",label:"Reject new runs while running"}],z6=[{value:"skip",label:"Skip missed runs"},{value:"run_one",label:"Run the most recent missed run"},{value:"run",label:"Run all missed runs"}];function Ex(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`step-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}function _x({routine:e,onSubmit:n,onCancel:s,scope:a,projectId:r,onScopeChange:o}){const l=!!e,c=e?O6(e):{triggerType:"cron",cronExpression:"0 * * * *",webhookPath:"",webhookSecret:"",endpoint:""},[d,u]=i.useState(e?.name??""),[h,m]=i.useState(e?.description??""),[f,p]=i.useState(c.triggerType),[b,v]=i.useState(c.cronExpression),[x,y]=i.useState(()=>c.triggerType!=="cron"?"custom":$6(c.cronExpression)),[g,j]=i.useState(c.webhookPath),[N,C]=i.useState(c.webhookSecret),[w,S]=i.useState(c.endpoint),[R,I]=i.useState(e?.executionPolicy??"queue"),[E,M]=i.useState(e?.catchUpPolicy??"run_one"),[G,U]=i.useState(e?.enabled??!0),P=e?.steps&&e.steps.length===1&&e.steps[0].type==="ai-prompt"&&!e.command,T=e?.steps&&e.steps.length===1&&e.steps[0].type==="create-task"&&!e.command,[D,W]=i.useState(e?.steps&&e.steps.length>0&&!P&&!T?"advanced":"simple"),[Y,L]=i.useState(()=>P?"ai-prompt":T?"create-task":"command"),[_,F]=i.useState(e?.command??""),[ae,k]=i.useState(e?.steps??[]),[z,J]=i.useState(!1),[oe,le]=i.useState(e?.timeoutMs??3e5),[we,re]=i.useState(P?e.steps?.[0]?.prompt??"":""),[H,ue]=i.useState(T?e.steps?.[0]?.taskTitle??"":""),[Q,be]=i.useState(T?e.steps?.[0]?.taskDescription??"":""),[fe,O]=i.useState(T?e.steps?.[0]?.taskColumn??"triage":"triage"),[se,ve]=i.useState(P||T?e.steps?.[0]?.modelProvider??"":""),[A,ne]=i.useState(P||T?e.steps?.[0]?.modelId??"":""),[ye,ee]=i.useState([]),[ge,Ne]=i.useState(!1),[He,Le]=i.useState(null),[de,Re]=i.useState(a??"global"),[Pe,rt]=i.useState({}),[qe,Xe]=i.useState(!1),At=i.useRef(!0);i.useEffect(()=>()=>{At.current=!1},[]),i.useEffect(()=>{a&&Re(a)},[a]),i.useEffect(()=>{let je=!1;return Ne(!0),Le(null),Ki().then(mt=>{je||ee(mt.models)}).catch(mt=>{je||Le(mt instanceof Error?mt.message:"Failed to load models")}).finally(()=>{je||Ne(!1)}),()=>{je=!0}},[]);const at=se&&A?`${se}/${A}`:"",Se=i.useCallback(je=>{if(!je){ve(""),ne("");return}const mt=je.indexOf("/");mt!==-1&&(ve(je.slice(0,mt)),ne(je.slice(mt+1)))},[]),pe=i.useCallback(()=>{const je={};if(d.trim()||(je.name="Name is required"),de==="project"&&!r&&(je.scope="Project-specific entries require an active project."),f==="cron"&&x==="custom"&&(b.trim()?D6(b)||(je.cronExpression="Invalid cron format — expected 5 fields (e.g. '0 */6 * * *')"):je.cronExpression="Cron expression is required"),f==="webhook"&&!g.trim()&&(je.webhookPath="Webhook path is required"),f==="api"&&!w.trim()&&(je.endpoint="API endpoint is required"),D==="simple")Y==="command"&&!_.trim()&&(je.command="Command is required"),Y==="ai-prompt"&&!we.trim()&&(je.prompt="Prompt is required"),Y==="create-task"&&!Q.trim()&&(je.taskDescription="Task description is required"),(se.trim()&&!A.trim()||!se.trim()&&A.trim())&&(je.model="Both model provider and model ID must be set, or both must be empty");else{ae.length===0&&(je.steps="At least one step is required"),z&&(je.stepsEditing="Please save or cancel all step edits before saving the routine");const mt=[];ae.forEach((Et,Te)=>{Et.name?.trim()||mt.push(`Step ${Te+1}: Name is required`),Et.type==="command"&&!Et.command?.trim()&&mt.push(`Step ${Te+1}: Command is required`),Et.type==="ai-prompt"&&!Et.prompt?.trim()&&mt.push(`Step ${Te+1}: Prompt is required`),Et.type==="create-task"&&!Et.taskDescription?.trim()&&mt.push(`Step ${Te+1}: Task description is required`)}),mt.length>0&&(je.steps=mt.join("; "))}return oe<1e3&&(je.timeoutMs="Timeout must be at least 1 second (1000ms)"),rt(je),Object.keys(je).length===0},[d,f,b,x,g,w,de,r,D,Y,_,we,Q,se,A,ae,z,oe]),_e=i.useCallback(async je=>{if(je.preventDefault(),!!pe()){Xe(!0);try{let mt=e?.scope??de??(r?"project":"global");mt==="project"&&!r&&(mt="global");const Et=L6(f,b,g,N,w);let Te,xe;D==="simple"?Y==="command"?Te=_.trim()||void 0:Y==="ai-prompt"?xe=[{id:Ex(),type:"ai-prompt",name:d.trim(),prompt:we.trim(),modelProvider:se.trim()||void 0,modelId:A.trim()||void 0}]:xe=[{id:Ex(),type:"create-task",name:d.trim(),taskTitle:H.trim()||void 0,taskDescription:Q.trim(),taskColumn:fe,modelProvider:se.trim()||void 0,modelId:A.trim()||void 0}]:xe=ae;const gt={name:d.trim(),agentId:e?.agentId??"",description:h.trim()||void 0,trigger:Et,command:Te,steps:xe,timeoutMs:oe,executionPolicy:R,catchUpPolicy:E,enabled:G,scope:mt};await n(gt)}finally{At.current&&Xe(!1)}}},[pe,n,d,h,f,b,g,N,w,D,Y,_,we,se,A,H,Q,fe,ae,oe,R,E,G,de,r,e?.scope,e?.agentId]),et="routine-name-error",Ae="routine-cron-error",it="routine-webhook-error",xt="routine-endpoint-error",Nt="routine-command-error",Ut="routine-prompt-error",Be="routine-task-description-error",Z="routine-model-error",Oe="routine-timeout-error",ht=i.useCallback(je=>{y(je),je!=="custom"&&v(zk[je])},[]);return t.jsxs("form",{className:"routine-form",onSubmit:_e,noValidate:!0,children:[t.jsx("h4",{className:"settings-section-heading",children:l?"Edit Routine":"New Routine"}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-name",children:"Name"}),t.jsx("input",{id:"routine-name",type:"text",placeholder:"e.g. Daily standup reminder",value:d,onChange:je=>u(je.target.value),"aria-invalid":!!Pe.name,"aria-describedby":Pe.name?et:void 0}),Pe.name&&t.jsx("small",{id:et,className:"field-error",children:Pe.name})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-description",children:"Description (optional)"}),t.jsx("textarea",{id:"routine-description",placeholder:"What does this routine do?",value:h,onChange:je=>m(je.target.value),rows:2})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Scope"}),t.jsxs("div",{className:"routine-scope-toggle",role:"radiogroup","aria-label":"Routine scope",children:[t.jsxs("button",{type:"button",className:`routine-scope-btn${de==="global"?" active":""}`,onClick:()=>{Re("global"),o?.("global")},role:"radio","aria-checked":de==="global"?"true":"false",disabled:!!e?.scope,title:e?.scope?`Scope is locked to ${e.scope} for existing routines`:"Global scope",children:[t.jsx(jd,{size:12}),"Global"]}),t.jsxs("button",{type:"button",className:`routine-scope-btn${de==="project"?" active":""}`,onClick:()=>{Re("project"),o?.("project")},role:"radio","aria-checked":de==="project"?"true":"false",disabled:!!e?.scope||!r,title:e?.scope?`Scope is locked to ${e.scope} for existing routines`:r?"Project scope":"Select a project to enable project scope",children:[t.jsx(Qs,{size:12}),"Project"]})]}),t.jsx("small",{children:!r&&!e?.scope?"No active project. Routines will be created at global scope.":de==="project"&&r?"This routine will be scoped to the current project.":"This routine will be created at global scope."}),Pe.scope&&t.jsx("small",{className:"field-error",children:Pe.scope})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Trigger Type"}),t.jsxs("div",{className:"routine-trigger-type-selector",role:"radiogroup","aria-label":"Trigger type",children:[t.jsxs("button",{type:"button",className:`routine-trigger-btn${f==="cron"?" active":""}`,onClick:()=>p("cron"),role:"radio","aria-checked":f==="cron",children:[t.jsx(Lv,{size:14}),"Cron"]}),t.jsxs("button",{type:"button",className:`routine-trigger-btn${f==="webhook"?" active":""}`,onClick:()=>p("webhook"),role:"radio","aria-checked":f==="webhook",children:[t.jsx(Gv,{size:14}),"Webhook"]}),t.jsxs("button",{type:"button",className:`routine-trigger-btn${f==="api"?" active":""}`,onClick:()=>p("api"),role:"radio","aria-checked":f==="api",children:[t.jsx(Ov,{size:14}),"API"]}),t.jsxs("button",{type:"button",className:`routine-trigger-btn${f==="manual"?" active":""}`,onClick:()=>p("manual"),role:"radio","aria-checked":f==="manual",children:[t.jsx(Bs,{size:14}),"Manual"]})]})]}),f==="cron"&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-frequency",children:"Frequency"}),t.jsx("select",{id:"routine-frequency",value:x,onChange:je=>ht(je.target.value),children:Object.entries(P6).map(([je,mt])=>t.jsx("option",{value:je,children:mt},je))}),t.jsx("label",{htmlFor:"routine-cron",children:"Cron Expression"}),t.jsx("input",{id:"routine-cron",type:"text",placeholder:"* * * * *",value:b,onChange:je=>v(je.target.value),disabled:x!=="custom","aria-invalid":!!Pe.cronExpression,"aria-describedby":Pe.cronExpression?Ae:void 0}),Pe.cronExpression?t.jsx("small",{id:Ae,className:"field-error",children:Pe.cronExpression}):t.jsx("small",{children:x==="custom"?t.jsxs(t.Fragment,{children:["min hour day month weekday — ",t.jsx("a",{href:"https://crontab.guru",target:"_blank",rel:"noopener noreferrer",children:"crontab.guru"})]}):`Auto-filled from preset: ${b}`})]}),f==="webhook"&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-webhook-path",children:"Webhook Path"}),t.jsx("input",{id:"routine-webhook-path",type:"text",placeholder:"/trigger/my-routine",value:g,onChange:je=>j(je.target.value),"aria-invalid":!!Pe.webhookPath,"aria-describedby":Pe.webhookPath?it:void 0}),Pe.webhookPath?t.jsx("small",{id:it,className:"field-error",children:Pe.webhookPath}):t.jsx("small",{children:"URL path for the webhook endpoint"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-webhook-secret",children:"Webhook Secret (optional)"}),t.jsx("input",{id:"routine-webhook-secret",type:"password",placeholder:"Optional — leave empty for unauthenticated webhooks",value:N,onChange:je=>C(je.target.value)}),t.jsx("small",{children:"HMAC secret for signature verification. Leave empty for unauthenticated webhooks."})]})]}),f==="api"&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-endpoint",children:"API Endpoint"}),t.jsx("input",{id:"routine-endpoint",type:"text",placeholder:"/api/routine/my-routine",value:w,onChange:je=>S(je.target.value),"aria-invalid":!!Pe.endpoint,"aria-describedby":Pe.endpoint?xt:void 0}),Pe.endpoint?t.jsx("small",{id:xt,className:"field-error",children:Pe.endpoint}):t.jsx("small",{children:"API endpoint path that triggers this routine"})]}),f==="manual"&&t.jsx("div",{className:"form-group",children:t.jsx("small",{className:"routine-trigger-info",children:"This routine will be triggered manually via the dashboard or API."})}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Action Mode"}),t.jsxs("div",{className:"schedule-mode-toggle",role:"radiogroup","aria-label":"Action mode",children:[t.jsx("button",{type:"button",className:`schedule-mode-btn${D==="simple"?" active":""}`,onClick:()=>W("simple"),role:"radio","aria-checked":D==="simple",children:"Simple"}),t.jsx("button",{type:"button",className:`schedule-mode-btn${D==="advanced"?" active":""}`,onClick:()=>W("advanced"),role:"radio","aria-checked":D==="advanced",children:"Multi-Step"})]}),t.jsx("small",{children:D==="simple"?"Run one command, prompt, or task creation action":"Run multiple actions sequentially"})]}),D==="simple"?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Action Type"}),t.jsxs("div",{className:"schedule-mode-toggle",role:"radiogroup","aria-label":"Action type",children:[t.jsx("button",{type:"button",className:`schedule-mode-btn${Y==="command"?" active":""}`,onClick:()=>L("command"),role:"radio","aria-checked":Y==="command",children:"Command"}),t.jsx("button",{type:"button",className:`schedule-mode-btn${Y==="ai-prompt"?" active":""}`,onClick:()=>L("ai-prompt"),role:"radio","aria-checked":Y==="ai-prompt",children:"AI Prompt"}),t.jsx("button",{type:"button",className:`schedule-mode-btn${Y==="create-task"?" active":""}`,onClick:()=>L("create-task"),role:"radio","aria-checked":Y==="create-task",children:"Create Task"})]})]}),Y==="command"?t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-command",children:"Command"}),t.jsx("input",{id:"routine-command",type:"text",placeholder:"e.g. npx runfusion.ai backup --create",value:_,onChange:je=>F(je.target.value),"aria-invalid":!!Pe.command,"aria-describedby":Pe.command?Nt:void 0}),Pe.command?t.jsx("small",{id:Nt,className:"field-error",children:Pe.command}):t.jsx("small",{children:"Shell command to execute."})]}):Y==="ai-prompt"?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-prompt",children:"Prompt"}),t.jsx("textarea",{id:"routine-prompt",placeholder:"e.g. Summarize recent activity and create action items",value:we,onChange:je=>re(je.target.value),rows:3,"aria-invalid":!!Pe.prompt,"aria-describedby":Pe.prompt?Ut:void 0}),Pe.prompt?t.jsx("small",{id:Ut,className:"field-error",children:Pe.prompt}):t.jsx("small",{children:"AI prompt to execute."})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-model",children:"Model (optional)"}),t.jsx(ri,{id:"routine-model",label:"Model",models:ye,value:at,onChange:Se,placeholder:"Use default",disabled:ge}),He&&t.jsx("small",{className:"field-error",children:He}),Pe.model&&t.jsx("small",{id:Z,className:"field-error",children:Pe.model})]})]}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-task-title",children:"Task Title (optional)"}),t.jsx("input",{id:"routine-task-title",type:"text",placeholder:"e.g. Review weekly dependencies",value:H,onChange:je=>ue(je.target.value)})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-task-description",children:"Task Description"}),t.jsx("textarea",{id:"routine-task-description",placeholder:"e.g. Check npm dependencies for security vulnerabilities",value:Q,onChange:je=>be(je.target.value),rows:4,"aria-invalid":!!Pe.taskDescription,"aria-describedby":Pe.taskDescription?Be:void 0}),Pe.taskDescription?t.jsx("small",{id:Be,className:"field-error",children:Pe.taskDescription}):t.jsx("small",{children:"Describes the task that will be created."})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-task-column",children:"Target Column"}),t.jsxs("select",{id:"routine-task-column",value:fe,onChange:je=>O(je.target.value),children:[t.jsx("option",{value:"triage",children:"Triage"}),t.jsx("option",{value:"todo",children:"To Do"})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-task-model",children:"Executor Model (optional)"}),t.jsx(ri,{id:"routine-task-model",label:"Executor Model",models:ye,value:at,onChange:Se,placeholder:"Use default",disabled:ge}),He&&t.jsx("small",{className:"field-error",children:He}),Pe.model&&t.jsx("small",{id:Z,className:"field-error",children:Pe.model})]})]})]}):t.jsxs(t.Fragment,{children:[t.jsx(I6,{steps:ae,onChange:k,onEditingChange:J}),Pe.steps&&t.jsx("small",{className:"field-error",children:Pe.steps}),Pe.stepsEditing&&t.jsx("small",{className:"field-error",children:Pe.stepsEditing})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-timeout",children:"Timeout (ms)"}),t.jsx("input",{id:"routine-timeout",type:"number",min:1e3,step:1e3,value:oe,onChange:je=>le(Number(je.target.value)),"aria-invalid":!!Pe.timeoutMs,"aria-describedby":Pe.timeoutMs?Oe:void 0}),Pe.timeoutMs?t.jsx("small",{id:Oe,className:"field-error",children:Pe.timeoutMs}):t.jsx("small",{children:"Maximum execution time in milliseconds."})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-execution-policy",children:"Execution Policy"}),t.jsx("select",{id:"routine-execution-policy",value:R,onChange:je=>I(je.target.value),children:F6.map(je=>t.jsx("option",{value:je.value,children:je.label},je.value))}),t.jsx("small",{children:"How to handle concurrent executions of this routine"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-catchup-policy",children:"Catch-up Policy"}),t.jsx("select",{id:"routine-catchup-policy",value:E,onChange:je=>M(je.target.value),children:z6.map(je=>t.jsx("option",{value:je.value,children:je.label},je.value))}),t.jsx("small",{children:"What to do when a scheduled run is missed"})]}),t.jsxs("div",{className:"form-group",children:[t.jsxs("label",{htmlFor:"routine-enabled",className:"checkbox-label",children:[t.jsx("input",{id:"routine-enabled",type:"checkbox",checked:G,onChange:je=>U(je.target.checked)}),"Enabled"]}),t.jsx("small",{children:"When disabled, the routine will not run automatically"})]}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:s,disabled:qe,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-primary btn-sm",disabled:qe,children:qe?"Saving…":l?"Save Changes":"Create Routine"})]})]})}const B6=3e4;function U6({onClose:e,addToast:n,projectId:s}){const[a,r]=i.useState(()=>s?"project":"global"),[o,l]=i.useState([]),[c,d]=i.useState("list"),[u,h]=i.useState(),[m,f]=i.useState(null),[p,b]=i.useState({}),v=i.useRef(null);ea(v,!0,"fusion:automation-modal-size");const x=i.useMemo(()=>({scope:a,projectId:a==="project"?s:void 0}),[a,s]),y=i.useCallback(async()=>{try{const P=await OE(x);l(P),b(T=>{const D={...T};for(const W of P){const Y=D[W.id];if(!Y||!W.lastRunResult)continue;const L=W.lastRunResult;L.success===Y.success&&(L.output||"")===Y.output&&(L.error||"")===(Y.error||"")&&delete D[W.id]}return D})}catch(P){n(Ce(P)||"Failed to load routines","error")}},[n,x]);i.useEffect(()=>{y()},[y]),i.useEffect(()=>{const P=setInterval(()=>{y()},B6);return()=>clearInterval(P)},[y]),i.useEffect(()=>{const P=T=>{T.key==="Escape"&&(c!=="list"?(d("list"),h(void 0)):e())};return document.addEventListener("keydown",P),()=>document.removeEventListener("keydown",P)},[e,c]);const g=Aa(e),j=i.useCallback(async P=>{try{await FE(P,x),n("Routine created","success"),d("list"),await y()}catch(T){n(Ce(T)||"Failed to create routine","error")}},[n,y,x]),N=i.useCallback(P=>{h(P),d("edit")},[]),C=i.useCallback(async P=>{if(u)try{await up(u.id,P,x),n("Routine updated","success"),d("list"),h(void 0),await y()}catch(T){n(Ce(T)||"Failed to update routine","error")}},[u,n,y,x]),w=i.useCallback(async P=>{try{await zE(P.id,x),n(`Deleted "${P.name}"`,"success"),await y()}catch(T){n(Ce(T)||"Failed to delete routine","error")}},[n,y,x]),S=i.useCallback(async P=>{f(P.id);try{const{result:T}=await BE(P.id,x);b(D=>({...D,[P.id]:{output:T.output||"",error:T.error,success:T.success}})),T.success?n(`"${P.name}" completed successfully`,"success"):n(`"${P.name}" failed: ${T.error||"Unknown error"}`,"error"),await y()}catch(T){n(Ce(T)||"Failed to run routine","error")}finally{f(null)}},[n,y,x]),R=i.useCallback(async P=>{try{await up(P.id,{enabled:!P.enabled},x),n(`"${P.name}" ${P.enabled?"disabled":"enabled"}`,"success"),await y()}catch(T){n(Ce(T)||"Failed to toggle routine","error")}},[n,y,x]),I=i.useCallback(()=>{d("list"),h(void 0)},[]);i.useEffect(()=>{c!=="list"&&b({})},[c]);const E=i.useCallback(P=>{r(P),d("list"),h(void 0),b({})},[]),M=()=>c==="create"?t.jsx(_x,{onSubmit:j,onCancel:I,scope:a,projectId:s}):c==="edit"&&u?t.jsx(_x,{routine:u,onSubmit:C,onCancel:I,scope:a,projectId:s}):o.length===0?t.jsxs("div",{className:"routine-empty-state",children:[t.jsx(Bs,{size:48,strokeWidth:1}),t.jsx("h4",{children:"No automations yet"}),t.jsx("p",{children:"Create an automation with a schedule, webhook, API, or manual trigger."}),t.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>d("create"),children:[t.jsx(os,{size:14}),"Create your first automation"]})]}):t.jsx("div",{className:"routine-list",children:o.map(P=>t.jsx(M6,{routine:P,onEdit:N,onDelete:w,onRun:S,onToggle:R,running:m===P.id,lastRunOutput:p[P.id]??null},P.id))}),G=()=>M(),U=c==="list"&&o.length>0;return t.jsx("div",{className:"modal-overlay open",...g,children:t.jsxs("div",{ref:v,className:"modal modal-lg automation-modal",role:"dialog","aria-modal":"true","aria-labelledby":"schedules-modal-title",children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("div",{className:"detail-title-row",children:[t.jsx(Bs,{size:20,className:"icon-triage"}),t.jsx("h3",{id:"schedules-modal-title",children:"Automations"})]}),t.jsx("button",{className:"modal-close",onClick:e,"aria-label":"Close",children:t.jsx(Nn,{size:20})})]}),t.jsxs("div",{className:"scheduling-toolbar","aria-live":"polite",children:[t.jsxs("div",{className:"scheduling-toolbar-left",role:"group","aria-label":"Scheduling scope",children:[t.jsxs("div",{className:"scheduling-scope-selector",children:[t.jsxs("button",{type:"button",className:`scope-btn${a==="global"?" active":""}`,onClick:()=>E("global"),"aria-pressed":a==="global",title:"Global (user-level) automations",children:[t.jsx(jd,{size:14}),"Global"]}),t.jsxs("button",{type:"button",className:`scope-btn${a==="project"?" active":""}`,onClick:()=>E("project"),"aria-pressed":a==="project",title:"Project-scoped automations",children:[t.jsx(Qs,{size:14}),"Project"]})]}),t.jsxs("span",{className:"scheduling-count",children:[t.jsx(Bs,{size:14}),o.length," automation",o.length===1?"":"s"]})]}),t.jsx("div",{className:"scheduling-toolbar-right",children:U&&t.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>d("create"),"aria-label":"Create new automation",children:[t.jsx(os,{size:14}),"New Automation"]})})]}),t.jsx("div",{className:"schedule-modal-content",id:"scheduled-tasks-content",children:G()})]})})}const H6=3e4,uh=new Map,om=new Map;function Mx(e){return e??"default"}function Rx(e){const n=uh.get(e);return n?Date.now()>=n.expiresAt?(uh.delete(e),null):n:null}function q6(e,n){const s=e.some(r=>r.id!=="github"&&r.authenticated),a=e.some(r=>r.id==="github"&&r.authenticated)||(n?.authenticated??!1);return{hasAiProvider:s,hasGithub:a}}async function V6(e){const n=om.get(e);if(n)return n;const s=No().then(({providers:a,ghCli:r})=>{const l={...q6(a,r),ghCli:r,expiresAt:Date.now()+H6};return uh.set(e,l),l}).finally(()=>{om.delete(e)});return om.set(e,s),s}function Bk(e){const n=Mx(e),s=Rx(n),[a,r]=i.useState(s?.hasAiProvider??!1),[o,l]=i.useState(s?.hasGithub??!1),[,c]=i.useState(s?.ghCli),[d,u]=i.useState(s==null),h=i.useRef(!!s);return i.useEffect(()=>{let m=!1;const f=Mx(e),p=Rx(f);if(p)return r(p.hasAiProvider),l(p.hasGithub),c(p.ghCli),u(!1),h.current=!0,()=>{m=!0};h.current=!1;async function b(){!h.current&&u(!0);try{const x=await V6(f);if(m)return;r(x.hasAiProvider),l(x.hasGithub),c(x.ghCli)}catch{}finally{m||(h.current=!0,u(!1))}}return b(),()=>{m=!0}},[e]),i.useMemo(()=>({hasAiProvider:a,hasGithub:o,loading:d,hasWarnings:!a||!o}),[a,o,d])}function Uk({hasAiProvider:e,hasGithub:n,compact:s=!1,onDismiss:a}){if(e&&n)return null;const r=a?t.jsx("button",{type:"button",className:"setup-warning-banner__dismiss touch-target","aria-label":"Dismiss setup warning",onClick:a,children:t.jsx(Nn,{size:16,"aria-hidden":"true"})}):null;if(s)return t.jsxs("div",{className:`setup-warning-banner setup-warning-banner--compact${a?" setup-warning-banner--dismissible":""}`,role:"status","aria-live":"polite",children:[t.jsx("p",{className:"setup-warning-banner__compact-text",children:"⚠ Setup incomplete — AI and/or GitHub features will be limited."}),r]});const o=[];return e||o.push({key:"ai",title:"No AI provider connected",description:"AI agents won't be able to work on tasks until you connect a provider. Set one up in Settings → AI Setup."}),n||o.push({key:"github",title:"GitHub not connected",description:"You won't be able to import issues from GitHub, but you can still create tasks manually."}),t.jsxs("div",{className:`setup-warning-banner${a?" setup-warning-banner--dismissible":""}`,role:"status","aria-live":"polite",children:[r,o.map(l=>t.jsxs("div",{className:"setup-warning-banner__item",children:[t.jsx("strong",{className:"setup-warning-banner__title",children:l.title}),t.jsx("p",{className:"setup-warning-banner__description",children:l.description})]},l.key))]})}const lm=new Map,Jc=new Map;function xf(e){return e??"global"}function mh(e){return`${bn.CHAT_AGENTS_MAP_PREFIX}${xf(e)}`}function io(e){return ui(mh(e),{maxAgeMs:eh})}function W6(e,n){for(const s of Jc.get(e)??[])s(n)}async function G6(e){const n=xf(e),s=lm.get(n);if(s)return s;const a=Qa(void 0,e).finally(()=>{lm.delete(n)});return lm.set(n,a),a}function K6(e){const[n,s]=i.useState(()=>io(e)??[]),[a,r]=i.useState(()=>io(e)===null),o=i.useRef(io(e)!==null),l=xf(e);i.useEffect(()=>{const h=io(e)??[];s(h),r(io(e)===null),o.current=io(e)!==null},[e]),i.useEffect(()=>{const h=Jc.get(l)??new Set;return h.add(s),Jc.set(l,h),()=>{h.delete(s),h.size===0&&Jc.delete(l)}},[l]);const c=i.useCallback(async()=>{try{const h=await G6(e);o.current=!0,Wn(mh(e),h,{maxBytes:5e5}),W6(l,h)}catch{o.current||hs(mh(e))}finally{r(!1)}},[e,l]);i.useEffect(()=>{c()},[c]);const d=i.useCallback(async()=>{r(!0),await c()},[c]);return{agentsMap:i.useMemo(()=>{const h=new Map;for(const m of n)h.set(m.id,m);return h},[n]),agents:n,loading:a,refresh:d}}function J6({isOpen:e,onClose:n,projectId:s,tasks:a,onCreateTask:r,addToast:o}){const{confirm:l}=Di(),c=$i();ta(e);const{keyboardOverlap:d,viewportHeight:u,viewportOffsetTop:h,keyboardOpen:m}=Ia({enabled:c==="mobile"}),f=m?{"--keyboard-overlap":`${d}px`,"--vv-offset-top":`${h}px`,...u!==null?{"--vv-height":`${u}px`}:{}}:{},[p,b]=i.useState(""),[v,x]=i.useState([]),[y,g]=i.useState("project-default"),[j,N]=i.useState(""),[C,w]=i.useState(""),[S,R]=i.useState([]),[I,E]=i.useState(!1),[M,G]=i.useState(""),[U,P]=i.useState(""),[T,D]=i.useState(""),[W,Y]=i.useState(""),[L,_]=i.useState(""),[F,ae]=i.useState("default"),[k,z]=i.useState(!1),[J,oe]=i.useState([]),[le,we]=i.useState(!1),[re,H]=i.useState(void 0),[ue,Q]=i.useState(di),[be,fe]=i.useState(void 0),[O,se]=i.useState(!1),[ve,A]=i.useState(""),[ne,ye]=i.useState(null),{agents:ee,loading:ge}=K6(s),[Ne,He]=i.useState(!1),Le=i.useRef(null),[de,Re]=i.useState(!1),[Pe,rt]=i.useState(""),qe=i.useRef(null),{hasAiProvider:Xe,hasGithub:At,loading:at}=Bk(s),{nodes:Se}=Td(),pe=i.useCallback(xe=>{we(!0),oe(xe)},[]),_e=i.useCallback(()=>{we(!1)},[]),et=i.useCallback(()=>{He(!0)},[]);i.useEffect(()=>{if(!Ne)return;const xe=gt=>{Le.current&&!Le.current.contains(gt.target)&&He(!1)};return document.addEventListener("mousedown",xe),()=>document.removeEventListener("mousedown",xe)},[Ne]),i.useEffect(()=>{if(!de)return;const xe=gt=>{qe.current&&!qe.current.contains(gt.target)&&(Re(!1),rt(""))};return document.addEventListener("mousedown",xe),()=>document.removeEventListener("mousedown",xe)},[de]);const Ae=a.filter(xe=>!v.includes(xe.id)).sort((xe,gt)=>{const _t=gt.createdAt.localeCompare(xe.createdAt);if(_t!==0)return _t;const Ft=parseInt(xe.id.slice(xe.id.lastIndexOf("-")+1),10)||0;return(parseInt(gt.id.slice(gt.id.lastIndexOf("-")+1),10)||0)-Ft}),it=Pe?Ae.filter(xe=>xe.id.toLowerCase().includes(Pe.toLowerCase())||xe.title&&xe.title.toLowerCase().includes(Pe.toLowerCase())||xe.description&&xe.description.toLowerCase().includes(Pe.toLowerCase())):Ae,xt=(xe,gt)=>xe.length>gt?xe.slice(0,gt)+"…":xe,Nt=ve.trim(),Ut=Nt.length>0&&!_d.test(Nt),Be=y==="existing"||y==="custom-new",Z=Be&&!j.trim();i.useEffect(()=>{const xe=p.trim()!==""||v.length>0||S.length>0||M!==""||U!==""||T!==""||W!==""||J.length>0||ne!==null||re!==void 0||ue!==di||be!==void 0||y!=="project-default"||j!==""||C!==""||O||Nt!=="";z(xe)},[p,v,S,M,U,T,W,J,ne,re,ue,be,y,j,C,O,Nt]);const Oe=i.useCallback(async()=>{k&&!await l({title:"Discard Changes",message:"You have unsaved changes. Discard them?",danger:!0})||(S.forEach(xe=>URL.revokeObjectURL(xe.previewUrl)),R([]),b(""),x([]),G(""),P(""),D(""),Y(""),_(""),ae("default"),oe([]),we(!1),ye(null),He(!1),H(void 0),Q(di),fe(void 0),g("project-default"),N(""),w(""),z(!1),se(!1),A(""),n())},[k,n,S,l]),ht=i.useCallback(async()=>{const xe=p.trim();if(!(!xe||I||Ut||Z)){E(!0);try{const gt=M.indexOf("/"),_t=U.indexOf("/"),Ft=T.indexOf("/"),Dt={title:void 0,description:xe,column:"triage",dependencies:v.length?v:void 0,enabledWorkflowSteps:le?J.length>0?J:[]:void 0,...ne?{assignedAgentId:ne}:{},modelPresetId:F==="preset"&&L||void 0,modelProvider:M&&gt!==-1?M.slice(0,gt):void 0,modelId:M&&gt!==-1?M.slice(gt+1):void 0,validatorModelProvider:U&&_t!==-1?U.slice(0,_t):void 0,validatorModelId:U&&_t!==-1?U.slice(_t+1):void 0,planningModelProvider:T&&Ft!==-1?T.slice(0,Ft):void 0,planningModelId:T&&Ft!==-1?T.slice(Ft+1):void 0,thinkingLevel:W!==""?W:void 0,reviewLevel:re,priority:ue,nodeId:be,branchSelection:{mode:y,...Be&&j.trim()?{branchName:j.trim()}:{},...C.trim()?{baseBranch:C.trim()}:{}},...O||Nt!==""?{githubTracking:{enabled:O,...Nt!==""?{repoOverride:Nt}:{}}}:{}},nt=await r(Dt);if(S.length>0){const Wt=[];for(const Mt of S)try{await Rd(nt.id,Mt.file,s)}catch{Wt.push(Mt.file.name)}Wt.length>0&&o(`Failed to upload: ${Wt.join(", ")}`,"error")}S.forEach(Wt=>URL.revokeObjectURL(Wt.previewUrl)),R([]),b(""),x([]),G(""),P(""),D(""),Y(""),_(""),ae("default"),oe([]),we(!1),ye(null),He(!1),H(void 0),Q(di),fe(void 0),g("project-default"),N(""),w(""),o(`Created ${nt.id}`,"success"),n()}catch(gt){o(Ce(gt)||"Failed to create task","error")}finally{E(!1)}}},[p,v,S,M,U,T,W,I,Ut,Z,r,o,n,s,F,L,J,le,ne,re,ue,be,y,Be,j,C,O,Nt]),je=i.useCallback(xe=>{xe.key==="Escape"&&(xe.preventDefault(),Oe())},[Oe]),Et=(ne?ee.find(xe=>xe.id===ne):void 0)?.name??ne,Te=t.jsxs("div",{className:"new-task-quick-fields",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Dependencies"}),t.jsxs("div",{className:"dep-trigger-wrap",ref:qe,children:[t.jsx("button",{type:"button",className:"btn btn-sm dep-trigger",onClick:()=>Re(xe=>!xe),disabled:I,"data-testid":"dep-trigger",children:v.length>0?`${v.length} selected`:"Add dependencies"}),de&&t.jsxs("div",{className:"dep-dropdown",children:[t.jsx("input",{className:"dep-dropdown-search",placeholder:"Search tasks…",autoFocus:!0,value:Pe,onChange:xe=>rt(xe.target.value),onClick:xe=>xe.stopPropagation()}),it.length===0?t.jsx("div",{className:"dep-dropdown-empty",children:"No available tasks"}):it.map(xe=>t.jsxs("div",{className:`dep-dropdown-item${v.includes(xe.id)?" selected":""}`,onClick:()=>{x(v.includes(xe.id)?v.filter(gt=>gt!==xe.id):[...v,xe.id]),Re(!1),rt("")},onMouseDown:gt=>gt.preventDefault(),children:[t.jsx("span",{className:"dep-dropdown-id",children:xe.id}),t.jsx("span",{className:"dep-dropdown-title",children:xt(xe.title||xe.description||xe.id,30)})]},xe.id))]})]}),v.length>0&&t.jsx("div",{className:"selected-deps",children:v.map(xe=>t.jsxs("span",{className:"dep-chip",children:[xe,t.jsx("button",{type:"button",className:"dep-chip-remove",onClick:()=>x(v.filter(gt=>gt!==xe)),disabled:I,children:"×"})]},xe))})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Assign Agent"}),t.jsxs("div",{className:"agent-trigger-wrap",ref:Le,children:[t.jsxs("button",{type:"button",className:"btn btn-sm dep-trigger",onClick:()=>{Ne?He(!1):et()},disabled:I,"data-testid":"new-task-agent-button",children:[t.jsx(As,{size:12,style:{verticalAlign:"middle"}}),Et?` ${Et}`:" Assign agent"]}),Ne&&t.jsxs("div",{className:"dep-dropdown agent-picker-dropdown",onMouseDown:xe=>xe.preventDefault(),children:[t.jsx("div",{className:"dep-dropdown-search-header",children:"Select agent"}),ge&&t.jsx("div",{className:"dep-dropdown-empty",children:"Loading agents..."}),!ge&&ee.map(xe=>t.jsxs("div",{className:`dep-dropdown-item${ne===xe.id?" selected":""}`,onMouseDown:gt=>gt.preventDefault(),onClick:()=>{ye(xe.id===ne?null:xe.id),He(!1)},"data-testid":`agent-option-${xe.id}`,children:[t.jsx(As,{size:12,style:{marginRight:6}}),t.jsx("span",{className:"dep-dropdown-id",children:xe.role}),t.jsx("span",{className:"dep-dropdown-title",children:xe.name})]},xe.id)),!ge&&ee.length===0&&t.jsx("div",{className:"dep-dropdown-empty",children:"No agents available"}),ne&&t.jsx("div",{className:"dep-dropdown-item",onMouseDown:xe=>xe.preventDefault(),onClick:()=>{ye(null),He(!1)},children:t.jsx("span",{className:"dep-dropdown-title",children:"Clear selection"})})]})]})]})]});return e?t.jsx("div",{className:"modal-overlay open",onClick:Oe,onKeyDown:je,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal modal-lg new-task-modal",onClick:xe=>xe.stopPropagation(),style:f,children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:"New Task"}),t.jsx("button",{className:"modal-close",onClick:Oe,disabled:I,"aria-label":"Close",children:"×"})]}),t.jsxs("div",{className:"modal-body",children:[!at&&t.jsx(Uk,{hasAiProvider:Xe,hasGithub:At}),t.jsx(xk,{mode:"create",description:p,onDescriptionChange:b,dependencies:v,onDependenciesChange:x,executorModel:M,onExecutorModelChange:G,validatorModel:U,onValidatorModelChange:P,presetMode:F,onPresetModeChange:ae,selectedPresetId:L,onSelectedPresetIdChange:_,selectedWorkflowSteps:J,onWorkflowStepsChange:pe,onDefaultOnApplied:_e,pendingImages:S,onImagesChange:R,tasks:a,projectId:s,disabled:I,addToast:o,isActive:e,onClose:Oe,planningModel:T,onPlanningModelChange:D,thinkingLevel:W,onThinkingLevelChange:Y,reviewLevel:re,onReviewLevelChange:H,priority:ue,onPriorityChange:Q,branch:j,onBranchChange:N,branchMode:y,onBranchModeChange:g,baseBranch:C,onBaseBranchChange:w,nodeId:be,onNodeIdChange:fe,nodeOptions:Se,githubTrackingEnabled:O,onGithubTrackingEnabledChange:se,githubRepoOverride:ve,onGithubRepoOverrideChange:A,renderBelowPrimary:Te,hideDependencies:!0,autoExpandMoreOptionsOnSelection:!1})]}),Z&&t.jsx("div",{className:"form-error new-task-branch-error",children:"Branch name is required for this branch strategy."}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:Oe,disabled:I,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:ht,disabled:!p.trim()||I||Ut||Z,children:I?"Creating...":"Create Task"})]})]})}):null}function Ji(e){if(!Number.isFinite(e)||e<0)return"—";const n=e/(1024*1024);return n<1024?`${n.toFixed(0)} MB`:`${(n/1024).toFixed(2)} GB`}function Ax(e,n){return!Number.isFinite(e)||!Number.isFinite(n)||n<=0?"—":`${(e/n*100).toFixed(1)}%`}function Y6(e,n){if(n<=0)return"normal";const s=e/n;return s>=.85?"critical":s>=.65?"warning":"normal"}function X6(e,n){if(n<=0)return"normal";const s=e/n;return s>=.5?"critical":s>=.25?"warning":"normal"}function Q6(e,n){if(n<=0)return"normal";const s=e/n;return s>=.9?"critical":s>=.75?"warning":"normal"}function Z6(e,n){if(e===null||!Number.isFinite(e)||e<0)return"normal";const s=n>0?e/n:e;return s>=80?"critical":s>=50?"warning":"normal"}function $c(e){return e==="critical"?"system-stats-modal__value--critical":e==="warning"?"system-stats-modal__value--warning":""}function e3(e){if(!e)return"Not yet";const n=new Date(e);return Number.isNaN(n.getTime())?"Not yet":n.toLocaleString()}function t3({isOpen:e,onClose:n,projectId:s}){const[a,r]=i.useState(null),[o,l]=i.useState(!1),[c,d]=i.useState(null),[u,h]=i.useState(!0),[m,f]=i.useState(90),[p,b]=i.useState(!1),[v,x]=i.useState(!1),[y,g]=i.useState(null),[j,N]=i.useState(null),[C,w]=i.useState(null),S=i.useCallback(async H=>{l(!0);try{const ue=await w_(s);r(ue),d(null),w(Date.now()),H?.preserveKillResult||g(null)}catch(ue){d(ue instanceof Error?ue.message:"Failed to load system stats")}finally{l(!1)}},[s]);i.useEffect(()=>{if(!e)return;S();const H=window.setInterval(()=>{S()},5e3);return()=>{window.clearInterval(H)}},[e,S]),i.useEffect(()=>{if(!e)return;(async()=>{try{const ue=await Ra();h(ue.vitestAutoKillEnabled??!0),f(ue.vitestKillThresholdPct??90),N(null)}catch(ue){N(ue instanceof Error?ue.message:"Failed to load vitest settings")}})()},[e]),i.useEffect(()=>{if(!e)return;const H=ue=>{ue.key==="Escape"&&n()};return document.addEventListener("keydown",H),()=>document.removeEventListener("keydown",H)},[e,n]);const R=i.useMemo(()=>{if(!a)return[];const H=a.systemStats,ue=$c(Y6(H.heapUsed,H.heapLimit)),Q=$c(X6(H.rss,H.systemTotalMem));return[{label:"RSS",value:Ji(H.rss),detail:Ax(H.rss,H.systemTotalMem),className:Q},{label:"Heap Used",value:Ji(H.heapUsed),detail:`of ${Ji(H.heapTotal)}`,className:ue},{label:"Heap Limit",value:Ji(H.heapLimit),detail:"V8 limit"},{label:"External",value:Ji(H.external)},{label:"Array Buffers",value:Ji(H.arrayBuffers)}]},[a]),I=i.useCallback(async H=>{h(H);try{await Cs({vitestAutoKillEnabled:H}),N(null)}catch(ue){N(ue instanceof Error?ue.message:"Failed to save vitest settings")}},[]),E=i.useCallback(async H=>{const ue=Math.min(99,Math.max(50,Number.isFinite(H)?Math.round(H):90));f(ue);try{await Cs({vitestKillThresholdPct:ue}),N(null)}catch(Q){N(Q instanceof Error?Q.message:"Failed to save vitest settings")}},[]),M=i.useCallback(async()=>{if(!p){if(!v){x(!0);return}b(!0);try{const H=await k_(s);g(H),x(!1),await S({preserveKillResult:!0})}catch(H){d(H instanceof Error?H.message:"Failed to kill vitest processes")}finally{b(!1)}}},[v,p,S,s]);if(!e)return null;const G=a?.systemStats,U=o&&!!a,P=C?`Updated ${new Date(C).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}`:"Waiting for first update",T=a?.taskStats,D=G?G.systemTotalMem-G.systemFreeMem:0,W=G?Q6(D,G.systemTotalMem):"normal",Y=G?$c(W):"",L=G&&Number.isFinite(G.systemTotalMem)&&G.systemTotalMem>0?Math.max(0,Math.min(100,D/G.systemTotalMem*100)):0,_=G?`System memory used: ${L.toFixed(1)}% (${Ji(D)} of ${Ji(G.systemTotalMem)})`:"System memory usage unavailable",F=a?.vitestProcessCount,ae=Z6(G?.cpuPercent??null,G?.cpuCount??0),k=$c(ae),z=G?.cpuPercent??null,J=z===null?0:Math.max(0,Math.min(100,z)),oe=z===null?"Sampling…":`${z.toFixed(1)}%`,le=z===null?"App CPU usage unavailable: waiting for another sample":`App CPU usage: ${z.toFixed(1)}%`,we=y?y.killed>0?"system-stats-modal__kill-result system-stats-modal__kill-result--success":"system-stats-modal__kill-result system-stats-modal__kill-result--error":"",re=e3(a?.vitestLastAutoKillAt);return t.jsx("div",{className:"modal-overlay open",role:"dialog","aria-modal":"true","aria-labelledby":"system-stats-modal-title",onClick:H=>{H.target===H.currentTarget&&n()},"data-testid":"system-stats-modal-overlay",children:t.jsxs("div",{className:"modal modal-lg system-stats-modal","data-testid":"system-stats-modal",children:[t.jsxs("div",{className:"modal-header system-stats-modal__header",children:[t.jsxs("h2",{id:"system-stats-modal-title",className:"system-stats-modal__title",children:[t.jsx(ko,{}),t.jsx("span",{children:"System Stats"})]}),t.jsxs("div",{className:"system-stats-modal__header-actions",children:[t.jsxs("span",{className:"system-stats-modal__auto-refresh","aria-live":"polite",children:[t.jsx("span",{children:"Auto-refresh · 5s"}),t.jsx("span",{className:"system-stats-modal__auto-refresh-time",children:P})]}),t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>void S(),title:"Refresh","aria-label":"Refresh system stats",children:t.jsx(Ss,{size:16,className:U?"system-stats-modal__refresh--spinning":void 0})}),t.jsx("button",{type:"button",className:"modal-close",onClick:n,"aria-label":"Close",children:t.jsx(Nn,{})})]})]}),o&&!a&&t.jsx("div",{className:"system-stats-modal__state",children:"Loading system stats…"}),c&&!a&&t.jsx("div",{className:"system-stats-modal__state system-stats-modal__state--error",role:"alert",children:c}),a&&t.jsxs("div",{className:"system-stats-modal__content",children:[t.jsxs("section",{className:"system-stats-modal__section","aria-label":"Process stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"Process"}),t.jsx("dl",{className:"system-stats-modal__grid",children:R.map(H=>t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:H.label}),t.jsxs("dd",{children:[t.jsx("span",{className:`system-stats-modal__value ${H.className}`.trim(),children:H.value}),H.detail?t.jsx("span",{className:"system-stats-modal__detail",children:H.detail}):null]})]},H.label))})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"CPU and load stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"CPU & Load"}),t.jsxs("dl",{className:"system-stats-modal__grid",children:[t.jsxs("div",{className:"system-stats-modal__row system-stats-modal__row--cpu-used",children:[t.jsx("dt",{children:"App CPU"}),t.jsxs("dd",{children:[t.jsx("span",{className:`system-stats-modal__value ${k}`.trim(),children:oe}),t.jsx("span",{className:"system-stats-modal__detail",children:z===null?"First sample pending":"process usage"})]}),t.jsx("div",{className:"system-stats-modal__memory-progress-wrapper",children:t.jsx("div",{className:`system-stats-modal__memory-progress-track system-stats-modal__memory-progress-track--${ae}`,role:"progressbar","aria-valuenow":Math.round(J),"aria-valuemin":0,"aria-valuemax":100,"aria-label":le,children:t.jsx("div",{className:`system-stats-modal__memory-progress-fill system-stats-modal__memory-progress-fill--${ae}`,style:{width:`${J}%`}})})})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Load Avg"}),t.jsx("dd",{children:G?.loadAvg.map(H=>H.toFixed(2)).join(" ")??"—"})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Cores"}),t.jsx("dd",{children:G?.cpuCount??"—"})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Platform"}),t.jsx("dd",{children:G?.platform??"—"})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Node"}),t.jsx("dd",{children:G?.nodeVersion??"—"})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"PID"}),t.jsx("dd",{children:G?.pid??"—"})]})]})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"System memory stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"System"}),t.jsxs("dl",{className:"system-stats-modal__grid",children:[t.jsxs("div",{className:"system-stats-modal__row system-stats-modal__row--memory-used",children:[t.jsx("dt",{children:"Memory Used"}),t.jsxs("dd",{children:[t.jsx("span",{className:`system-stats-modal__value ${Y}`.trim(),children:G?Ji(D):"—"}),t.jsx("span",{className:"system-stats-modal__detail",children:G?`${Ax(D,G.systemTotalMem)} of ${Ji(G.systemTotalMem)}`:""})]}),t.jsx("div",{className:"system-stats-modal__memory-progress-wrapper",children:t.jsx("div",{className:`system-stats-modal__memory-progress-track system-stats-modal__memory-progress-track--${W}`,role:"progressbar","aria-valuenow":Math.round(L),"aria-valuemin":0,"aria-valuemax":100,"aria-label":_,children:t.jsx("div",{className:`system-stats-modal__memory-progress-fill system-stats-modal__memory-progress-fill--${W}`,style:{width:`${L}%`}})})})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Memory Free"}),t.jsx("dd",{children:G?Ji(G.systemFreeMem):"—"})]})]})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"Task stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"Tasks"}),t.jsxs("dl",{className:"system-stats-modal__grid",children:[t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Total"}),t.jsx("dd",{children:T?.total??0})]}),Object.entries(T?.byColumn??{}).map(([H,ue])=>t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:H}),t.jsx("dd",{children:ue})]},H))]})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"Agent stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"Agents"}),t.jsxs("dl",{className:"system-stats-modal__grid",children:[t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"idle"}),t.jsx("dd",{children:T?.agents.idle??0})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"active"}),t.jsx("dd",{children:T?.agents.active??0})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"running"}),t.jsx("dd",{children:T?.agents.running??0})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"error"}),t.jsx("dd",{children:T?.agents.error??0})]})]})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"Vitest controls",children:[t.jsxs("h3",{className:"system-stats-modal__section-title system-stats-modal__section-title--with-icon",children:[t.jsx(y0,{}),t.jsx("span",{children:"Vitest Controls"})]}),t.jsx("dl",{className:"system-stats-modal__grid system-stats-modal__vitest-controls",children:t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Vitest Processes"}),t.jsx("dd",{children:F??"—"})]})}),t.jsxs("div",{className:"system-stats-modal__vitest-controls",children:[t.jsx("div",{className:"system-stats-modal__kill-row",children:t.jsxs("button",{type:"button",className:"btn btn-danger",onClick:()=>void M(),disabled:p||F===0,children:[t.jsx(N0,{}),t.jsx("span",{children:v?"Confirm Kill?":"Kill Vitest Processes"})]})}),t.jsxs("label",{className:"system-stats-modal__toggle-row",children:[t.jsx("input",{type:"checkbox",checked:u,onChange:H=>{I(H.target.checked)}}),t.jsx("span",{children:"Auto-kill vitest on memory pressure"})]}),t.jsxs("div",{className:"system-stats-modal__threshold-row",children:[t.jsx("label",{htmlFor:"vitest-threshold-number",children:"Kill threshold (%)"}),t.jsxs("div",{className:"system-stats-modal__threshold-controls",children:[t.jsx("input",{id:"vitest-threshold-range",type:"range",min:50,max:99,value:m,"aria-label":"Kill threshold slider (%)",onChange:H=>{const ue=Number.parseInt(H.target.value,10);E(Number.isNaN(ue)?90:ue)}}),t.jsx("input",{id:"vitest-threshold-number",type:"number",className:"input",min:50,max:99,value:m,"aria-label":"Kill threshold (%)",onChange:H=>{const ue=Number.parseInt(H.target.value,10);E(Number.isNaN(ue)?90:ue)},onBlur:()=>{E(m)}})]})]}),y&&t.jsxs("p",{className:we,children:["Killed ",y.killed," processes"]}),t.jsxs("p",{className:"system-stats-modal__last-kill",children:["Last auto-kill: ",re]}),j&&t.jsx("p",{className:"system-stats-modal__kill-result system-stats-modal__kill-result--error",children:j})]})]})]}),c&&a&&t.jsxs("div",{className:"system-stats-modal__footer-error",children:["Latest refresh failed: ",c]})]})})}const n3=5e3;function s3(e={}){const{projectId:n,type:s,limit:a=50,autoRefresh:r=!0,useCentralFeed:o=!1}=e,[l,c]=i.useState([]),[d,u]=i.useState(!1),[h,m]=i.useState(null),[f,p]=i.useState(!1),b=i.useRef(null),v=i.useRef(void 0),x=i.useCallback(async()=>{try{u(!0),m(null);let j;o?j=await yp({limit:a,projectId:n,type:s}):j=(await mp({limit:a,type:s,projectId:n})).map(C=>({...C,projectId:n??"",projectName:""})),c(j),p(j.length===a),j.length>0&&(v.current=j[j.length-1].timestamp)}catch(j){m(j instanceof Error?j.message:"Failed to load activity log")}finally{u(!1)}},[a,n,s,o]),y=i.useCallback(async()=>{if(v.current)try{u(!0);let j;o?j=await yp({limit:a,projectId:n,type:s,since:v.current}):j=(await mp({limit:a,type:s,since:v.current,projectId:n})).map(C=>({...C,projectId:n??"",projectName:""})),c(N=>[...N,...j]),p(j.length===a),j.length>0&&(v.current=j[j.length-1].timestamp)}catch(j){m(j instanceof Error?j.message:"Failed to load more entries")}finally{u(!1)}},[a,n,s,o]),g=i.useCallback(()=>{c([]),p(!1),v.current=void 0},[]);return i.useEffect(()=>{x()},[x]),i.useEffect(()=>{if(r)return b.current=setInterval(()=>{x()},n3),()=>{b.current&&(clearInterval(b.current),b.current=null)}},[r,x]),{entries:l,loading:d,error:h,refresh:x,clear:g,hasMore:f,loadMore:y}}const cm={"task:created":"Task Created","task:moved":"Task Moved","task:updated":"Task Updated","task:deleted":"Task Deleted","task:merged":"Task Merged","task:failed":"Task Failed","task:duplicate-warning-overridden":"Duplicate Warning Overridden","task:auto-archived-ghost-bug":"Task Auto-Archived (Ghost Bug)","task:auto-archived-duplicate":"Task Auto-Archived (Duplicate)","task:merge-worktree-reacquired":"Merge Worktree Reacquired","task:auto-archived-deterministic-duplicate":"Task Auto-Archived (Deterministic Duplicate)","task:auto-archived-near-duplicate":"Task Auto-Archived (Near-Duplicate)","settings:updated":"Settings Updated","project:isolation-transition":"Project Isolation Transition"},i3={"task:created":t.jsx(os,{size:14,className:"activity-icon created"}),"task:moved":t.jsx(Dl,{size:14,className:"activity-icon moved"}),"task:updated":t.jsx(Ss,{size:14,className:"activity-icon updated"}),"task:deleted":t.jsx(Nn,{size:14,className:"activity-icon deleted"}),"task:merged":t.jsx(gs,{size:14,className:"activity-icon merged"}),"task:failed":t.jsx(Za,{size:14,className:"activity-icon failed"}),"task:duplicate-warning-overridden":t.jsx(oi,{size:14,className:"activity-icon updated"}),"task:auto-archived-ghost-bug":t.jsx(oi,{size:14,className:"activity-icon failed"}),"task:auto-archived-duplicate":t.jsx(es,{size:14,className:"activity-icon deleted"}),"task:auto-archived-deterministic-duplicate":t.jsx(es,{size:14,className:"activity-icon deleted"}),"task:auto-archived-near-duplicate":t.jsx(es,{size:14,className:"activity-icon deleted"}),"task:merge-worktree-reacquired":t.jsx(Ss,{size:14,className:"activity-icon updated"}),"settings:updated":t.jsx(wl,{size:14,className:"activity-icon settings"}),"project:isolation-transition":t.jsx(Qs,{size:14,className:"activity-icon settings"})};function a3(e){const n=new Date(e),a=new Date().getTime()-n.getTime(),r=Math.floor(a/6e4),o=Math.floor(a/36e5),l=Math.floor(a/864e5);return r<1?"Just now":r<60?`${r}m ago`:o<24?`${o}h ago`:l<7?`${l}d ago`:n.toLocaleDateString(void 0,{month:"short",day:"numeric"})}function r3({isOpen:e,onClose:n,tasks:s,onOpenTaskDetail:a,projectId:r,projects:o=[],onProjectFilterChange:l,currentProject:c}){const[d,u]=i.useState("all"),[h,m]=i.useState(r||"all"),[f,p]=i.useState(!1);i.useEffect(()=>{m(r||"all")},[r]);const b=d==="all"?void 0:d,v=h==="all"?void 0:h,x=!c&&o.length>0,{entries:y,loading:g,error:j,refresh:N,hasMore:C}=s3({projectId:v,type:b,limit:100,autoRefresh:e,useCentralFeed:x}),w=y.map(M=>({id:M.id,timestamp:M.timestamp,type:M.type,taskId:M.taskId,taskTitle:M.taskTitle,details:M.details,metadata:M.metadata,projectId:M.projectId,projectName:M.projectName})),S=async()=>{try{await UE(),N(),p(!1)}catch{p(!1)}},R=M=>{a&&a(M)},I=M=>{m(M),l?.(M==="all"?void 0:M)};i.useEffect(()=>{if(!e)return;const M=G=>{G.key==="Escape"&&(f?p(!1):n())};return document.addEventListener("keydown",M),()=>document.removeEventListener("keydown",M)},[e,n,f]);const E=d!=="all"||h!=="all";return e?t.jsx("div",{className:"modal-overlay open",onClick:M=>{M.target===M.currentTarget&&n()},role:"dialog","aria-modal":"true","data-testid":"activity-log-modal-overlay",children:t.jsxs("div",{className:"modal modal-lg activity-log-modal","data-testid":"activity-log-modal",children:[t.jsxs("div",{className:"modal-header activity-log-header",children:[t.jsxs("div",{className:"activity-log-title",children:[t.jsx(wr,{size:18}),t.jsx("span",{children:"Activity Log"})]}),t.jsxs("div",{className:"activity-log-actions",children:[o.length>0&&t.jsxs("div",{className:"activity-log-filter activity-log-filter--project",children:[t.jsx(Qs,{size:14}),t.jsxs("select",{value:h,onChange:M=>I(M.target.value),className:"activity-log-filter-select","data-testid":"activity-project-filter",children:[t.jsx("option",{value:"all",children:"All Projects"}),o.map(M=>t.jsx("option",{value:M.id,children:M.name},M.id))]})]}),t.jsxs("div",{className:"activity-log-filter",children:[t.jsx(Qc,{size:14}),t.jsxs("select",{value:d,onChange:M=>u(M.target.value),className:"activity-log-filter-select","data-testid":"activity-filter",children:[t.jsx("option",{value:"all",children:"All Events"}),Object.entries(cm).map(([M,G])=>t.jsx("option",{value:M,children:G},M))]})]}),t.jsx("button",{className:"activity-log-refresh",onClick:()=>N(),title:"Refresh","data-testid":"activity-refresh",children:g?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ss,{size:14})}),w.length>0&&t.jsx("button",{className:"activity-log-clear",onClick:()=>p(!0),title:"Clear Log","data-testid":"activity-clear",children:t.jsx(es,{size:14})})]}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close",title:"Close","data-testid":"activity-close",children:"×"})]}),E&&t.jsxs("div",{className:"activity-log-active-filters",children:[t.jsx("span",{className:"activity-log-filter-label",children:"Active filters:"}),h!=="all"&&t.jsxs("span",{className:"activity-log-filter-badge",children:["Project: ",o.find(M=>M.id===h)?.name||h]}),d!=="all"&&t.jsxs("span",{className:"activity-log-filter-badge",children:["Type: ",cm[d]]}),t.jsx("button",{className:"activity-log-clear-filters",onClick:()=>{u("all"),m("all"),l?.(void 0)},children:"Clear all"})]}),t.jsxs("div",{className:"activity-log-content","data-testid":"activity-log-content",children:[j&&t.jsxs("div",{className:"activity-log-error","data-testid":"activity-error",children:[t.jsx(oi,{size:16}),t.jsx("span",{children:j})]}),w.length===0&&!g&&!j&&t.jsxs("div",{className:"activity-log-empty","data-testid":"activity-empty",children:[t.jsx(wr,{size:48,className:"activity-log-empty-icon"}),t.jsx("p",{children:E?"No activity matches the current filters":"No activity recorded yet"}),E&&t.jsx("button",{className:"btn btn-secondary",onClick:()=>{u("all"),m("all"),l?.(void 0)},children:"Clear Filters"})]}),t.jsx("div",{className:"activity-log-list",children:w.map(M=>t.jsxs("div",{className:"activity-log-entry","data-testid":"activity-entry",children:[t.jsx("div",{className:"activity-log-entry-icon",children:i3[M.type]}),t.jsxs("div",{className:"activity-log-entry-content",children:[t.jsxs("div",{className:"activity-log-entry-header",children:[t.jsx("span",{className:"activity-log-entry-type",children:cm[M.type]}),t.jsx("span",{className:"activity-log-entry-time",children:a3(M.timestamp)})]}),t.jsxs("div",{className:"activity-log-entry-details",children:[M.taskId&&t.jsx("button",{className:"activity-log-task-link",onClick:()=>R(M.taskId),"data-testid":"activity-task-link",children:M.taskId}),M.taskTitle&&t.jsx("span",{className:"activity-log-task-title",children:M.taskTitle}),t.jsx("span",{className:"activity-log-entry-text",children:zs(M.details??"")})]}),M.metadata&&Object.keys(M.metadata).length>0&&t.jsxs("div",{className:"activity-log-entry-metadata",children:[typeof M.metadata.from=="string"&&typeof M.metadata.to=="string"&&t.jsxs("span",{className:"activity-log-metadata-item",children:[M.metadata.from," → ",M.metadata.to]}),typeof M.metadata.merged=="boolean"&&t.jsx("span",{className:`activity-log-metadata-item ${M.metadata.merged?"success":"error"}`,children:M.metadata.merged?"Merged":"Not merged"})]})]})]},M.id))}),C&&!g&&t.jsx("button",{className:"activity-log-load-more",onClick:N,"data-testid":"activity-load-more",children:"Load More"}),g&&w.length>0&&t.jsx("div",{className:"activity-log-loading",children:t.jsx(Ct,{size:20,className:"spin"})})]}),f&&t.jsx("div",{className:"activity-log-confirm-overlay",children:t.jsxs("div",{className:"activity-log-confirm-dialog",children:[t.jsx("h3",{children:"Clear Activity Log?"}),t.jsx("p",{children:"This will permanently delete all activity log entries. This action cannot be undone."}),t.jsxs("div",{className:"activity-log-confirm-actions",children:[t.jsx("button",{className:"activity-log-confirm-cancel",onClick:()=>p(!1),children:"Cancel"}),t.jsx("button",{className:"activity-log-confirm-clear",onClick:S,children:"Clear Log"})]})]})})]})}):null}const rl=[{id:"status",label:"Status",icon:Vv},{id:"changes",label:"Changes",icon:Sm},{id:"commits",label:"Commits",icon:yo},{id:"branches",label:"Branches",icon:ii},{id:"worktrees",label:"Worktrees",icon:fS},{id:"stashes",label:"Stashes",icon:Ar},{id:"remotes",label:"Remotes",icon:Sh}];function Tx({status:e}){switch(e){case"added":case"untracked":return t.jsx(VN,{size:14,className:"gm-file-icon gm-file-added"});case"modified":return t.jsx(zv,{size:14,className:"gm-file-icon gm-file-modified"});case"deleted":return t.jsx(UN,{size:14,className:"gm-file-icon gm-file-deleted"});case"renamed":case"copied":return t.jsx(Ya,{size:14,className:"gm-file-icon gm-file-renamed"});default:return t.jsx(GN,{size:14,className:"gm-file-icon"})}}function Ix({status:e}){const n=e==="untracked"?"U":e==="added"?"A":e==="modified"?"M":e==="deleted"?"D":e==="renamed"?"R":e==="copied"?"C":"?";return t.jsx("span",{className:`gm-file-badge gm-file-badge-${e}`,children:n})}function o3(e){return i.useCallback(async(n,s)=>{try{await navigator.clipboard.writeText(n),e(`Copied ${s||"to clipboard"}`,"success")}catch{e("Failed to copy","error")}},[e])}function Mo(e){if(!e)return"—";const n=new Date(e);if(isNaN(n.getTime()))return"—";const a=new Date().getTime()-n.getTime(),r=Math.floor(a/6e4);if(r<1)return"just now";if(r<60)return`${r}m ago`;const o=Math.floor(r/60);if(o<24)return`${o}h ago`;const l=Math.floor(o/24);return l<30?`${l}d ago`:n.toLocaleDateString()}function l3({isOpen:e,onClose:n,tasks:s,addToast:a,projectId:r}){const o=Di(),l=$i();ta(e);const{keyboardOverlap:c,viewportHeight:d,viewportOffsetTop:u,keyboardOpen:h}=Ia({enabled:l==="mobile"}),m=h?{"--keyboard-overlap":`${c}px`,"--vv-offset-top":`${u}px`,...d!==null?{"--vv-height":`${d}px`}:{}}:{},f=i.useCallback(()=>{if(l==="mobile"){const Me=document.activeElement;Me instanceof HTMLElement&&Me.blur(),window.scrollTo(0,0),requestAnimationFrame(()=>{window.scrollTo(0,0)})}n()},[n,l]),[p,b]=i.useState("status"),[v,x]=i.useState(!1),[y,g]=i.useState(null),j=i.useRef(null);ea(j,e,"fusion:git-modal-size");const N=Aa(f),C=o3(a),[w,S]=i.useState(null),[R,I]=i.useState(null),[E,M]=i.useState([]),[G,U]=i.useState(new Set),[P,T]=i.useState(""),[D,W]=i.useState(!1),[Y,L]=i.useState(null),[_,F]=i.useState(!1),[ae,k]=i.useState(null),[z,J]=i.useState(null),oe=i.useRef(0),[le,we]=i.useState([]),[re,H]=i.useState(null),[ue,Q]=i.useState(null),[be,fe]=i.useState(!1),[O,se]=i.useState(20),[ve,A]=i.useState(""),[ne,ye]=i.useState([]),[ee,ge]=i.useState(""),[Ne,He]=i.useState(""),[Le,de]=i.useState(""),[Re,Pe]=i.useState(null),[rt,qe]=i.useState([]),[Xe,At]=i.useState(!1),[at,Se]=i.useState(null),[pe,_e]=i.useState(null),[et,Ae]=i.useState(!1),[it,xt]=i.useState([]),[Nt,Ut]=i.useState([]),[Be,Z]=i.useState(""),[Oe,ht]=i.useState(null),[je,mt]=i.useState(null),[Et,Te]=i.useState(null),[xe,gt]=i.useState(!1),[_t,Ft]=i.useState(null),Dt=i.useRef(0),[nt,Wt]=i.useState(null),[Mt,Kt]=i.useState(null),xn=i.useCallback(async()=>{if(e){x(!0),g(null);try{switch(p){case"status":{const Me=await zi(r,{extended:!0});S(Me);break}case"changes":{const[Me,Ke]=await Promise.all([zi(r,{extended:!0}),Xr(r)]);S(Me),M(Ke),U(new Set),J(null),L(null),k(null);break}case"commits":{const Me=await V1(O,r);we(Me);break}case"branches":{const[Me,Ke]=await Promise.all([Vo(r),zi(r,{extended:!0})]);ye(Me),S(Ke);break}case"worktrees":{const Me=await J1(r);xt(Me);break}case"stashes":{const Me=await sc(r);Ut(Me),mt(null),Te(null),Ft(null),Dt.current+=1;break}case"remotes":{const Me=await zi(r,{extended:!0});S(Me);break}}}catch(Me){g(Ce(Me)||"Failed to fetch git data"),a(Ce(Me)||"Failed to fetch git data","error")}finally{x(!1)}}},[p,e,O,a,r]);i.useEffect(()=>{e&&xn()},[xn,e]),i.useEffect(()=>{if(!e)return;const Me=Ke=>{if(Ke.key==="Escape"){f();return}if((Ke.key==="ArrowUp"||Ke.key==="ArrowDown")&&Ke.altKey){Ke.preventDefault();const Qe=rl.findIndex(Lt=>Lt.id===p);Ke.key==="ArrowUp"&&Qe>0?b(rl[Qe-1].id):Ke.key==="ArrowDown"&&Qe<rl.length-1&&b(rl[Qe+1].id)}};return document.addEventListener("keydown",Me),()=>document.removeEventListener("keydown",Me)},[e,f,p]);const Tn=i.useCallback(async Me=>{try{await rp(Me,r),a(`Staged ${Me.length} file(s)`,"success");const Ke=await Xr(r);M(Ke),U(new Set),J(null),L(null),k(null)}catch(Ke){a(Ce(Ke)||"Failed to stage files","error")}},[a,r]),Sn=i.useCallback(async Me=>{try{await rE(Me,r),a(`Unstaged ${Me.length} file(s)`,"success");const Ke=await Xr(r);M(Ke),U(new Set),J(null),L(null),k(null)}catch(Ke){a(Ce(Ke)||"Failed to unstage files","error")}},[a,r]),is=i.useCallback(async Me=>{if(await o.confirm({title:"Discard Changes",message:`Discard changes to ${Me.length} file(s)? This cannot be undone.`,danger:!0}))try{await oE(Me,r),a(`Discarded changes to ${Me.length} file(s)`,"success");const[Qe,Lt]=await Promise.all([Xr(r),zi(r,{extended:!0})]);M(Qe),S(Lt),U(new Set),J(null),L(null),k(null)}catch(Qe){a(Ce(Qe)||"Failed to discard changes","error")}},[a,r,o]),On=i.useCallback(async Me=>{if(Me.preventDefault(),!!P.trim()){W(!0);try{const Ke=await op(P.trim(),r);a(`Committed: ${Ke.hash}`,"success"),T("");const[Qe,Lt]=await Promise.all([Xr(r),zi(r,{extended:!0})]);M(Qe),S(Lt),J(null),L(null),k(null)}catch(Ke){a(Ce(Ke)||"Failed to commit","error")}finally{W(!1)}}},[P,a,r]),un=i.useCallback(async()=>{if(P.trim()){W(!0);try{const Me=E.filter(gn=>!gn.staged).map(gn=>gn.file);Me.length>0&&await rp(Me,r);const Ke=await op(P.trim(),r);a(`Committed: ${Ke.hash}`,"success"),T("");const[Qe,Lt]=await Promise.all([Xr(r),zi(r,{extended:!0})]);M(Qe),S(Lt),J(null),L(null),k(null)}catch(Me){a(Ce(Me)||"Failed to commit","error")}finally{W(!1)}}},[P,E,a,r]),tn=i.useCallback(async(Me,Ke)=>{J({file:Me,staged:Ke}),F(!0),k(null);const Qe=oe.current+1;oe.current=Qe;try{const Lt=await aE(Me,Ke,r);if(oe.current!==Qe)return;L(Lt)}catch(Lt){if(oe.current!==Qe)return;const gn=Ce(Lt)||"Failed to load file diff";L(null),k(gn),a(gn,"error")}finally{oe.current===Qe&&F(!1)}},[a,r]),on=i.useCallback(Me=>{U(Ke=>{const Qe=new Set(Ke);return Qe.has(Me)?Qe.delete(Me):Qe.add(Me),Qe})},[]),pn=i.useCallback(async Me=>{if(re===Me){H(null),Q(null);return}H(Me),fe(!0);try{const Ke=await nd(Me,r);Q(Ke)}catch(Ke){a(Ce(Ke)||"Failed to load diff","error"),Q(null)}finally{fe(!1)}},[re,a,r]),mn=i.useCallback(()=>{se(Me=>Math.min(Me+20,100))},[]),Zn=i.useMemo(()=>{if(!ve.trim())return le;const Me=ve.toLowerCase();return le.filter(Ke=>Ke.message.toLowerCase().includes(Me)||Ke.author.toLowerCase().includes(Me)||Ke.shortHash.toLowerCase().includes(Me))},[le,ve]),In=i.useCallback(async Me=>{if(Me.preventDefault(),!!ee.trim()){x(!0);try{await Y1(ee.trim(),Ne.trim()||void 0,r),a(`Created branch ${ee}`,"success"),ge(""),He("");const Ke=await Vo(r);ye(Ke)}catch(Ke){a(Ce(Ke)||"Failed to create branch","error")}finally{x(!1)}}},[ee,Ne,a,r]),rn=i.useCallback(async Me=>{x(!0);try{await X1(Me,r),a(`Switched to ${Me}`,"success");const[Ke,Qe]=await Promise.all([zi(r,{extended:!0}),Vo(r)]);S(Ke),ye(Qe)}catch(Ke){a(Ce(Ke)||"Failed to checkout branch","error")}finally{x(!1)}},[a,r]),hn=i.useCallback(async Me=>{if(await o.confirm({title:"Delete Branch",message:`Delete branch "${Me}"?`,danger:!0})){x(!0);try{await ap(Me,void 0,r),a(`Deleted branch ${Me}`,"success");const Qe=await Vo(r);ye(Qe)}catch(Qe){if(Ce(Qe).includes("not fully merged")){if(await o.confirm({title:"Force Delete Branch",message:"Branch has unmerged commits. Force delete?",danger:!0}))try{await ap(Me,!0,r),a(`Force deleted branch ${Me}`,"success");const gn=await Vo(r);ye(gn)}catch(gn){a(Ce(gn)||"Failed to delete branch","error")}}else a(Ce(Qe)||"Failed to delete branch","error")}finally{x(!1)}}},[a,r,o]),Pn=i.useMemo(()=>{if(!Le.trim())return ne;const Me=Le.toLowerCase();return ne.filter(Ke=>Ke.name.toLowerCase().includes(Me))},[ne,Le]),nn=i.useCallback(async Me=>{if(Re===Me){Pe(null),qe([]),Se(null),_e(null);return}Pe(Me),qe([]),Se(null),_e(null),At(!0);try{const Ke=await K1(Me,10,r);qe(Ke)}catch{qe([])}finally{At(!1)}},[Re,r]),$t=i.useCallback(async Me=>{if(at===Me){Se(null),_e(null);return}Se(Me),_e(null),Ae(!0);try{const Ke=await nd(Me,r);_e(Ke)}catch{_e(null)}finally{Ae(!1)}},[at,r]),Jt=i.useCallback(()=>{Pe(null),qe([]),Se(null),_e(null)},[]),Qt=i.useCallback(()=>{Dt.current+=1,mt(null),Te(null),Ft(null),gt(!1)},[]),ie=i.useCallback(async Me=>{Me.preventDefault(),ht("create"),Qt();try{await tE(Be.trim()||void 0,r),a("Changes stashed","success"),Z("");const Ke=await sc(r);Ut(Ke)}catch(Ke){a(Ce(Ke)||"Failed to stash changes","error")}finally{ht(null)}},[Be,a,r,Qt]),Fe=i.useCallback(async(Me,Ke=!1)=>{ht(`apply-${Me}`),Qt();try{await nE(Me,Ke,r),a(Ke?"Stash popped":"Stash applied","success");const Qe=await sc(r);Ut(Qe)}catch(Qe){a(Ce(Qe)||"Failed to apply stash","error")}finally{ht(null)}},[a,r,Qt]),Je=i.useCallback(async Me=>{if(await o.confirm({title:"Drop Stash",message:`Drop stash@{${Me}}? This cannot be undone.`,danger:!0})){ht(`drop-${Me}`),Qt();try{await sE(Me,r),a("Stash dropped","success");const Qe=await sc(r);Ut(Qe)}catch(Qe){a(Ce(Qe)||"Failed to drop stash","error")}finally{ht(null)}}},[a,r,o,Qt]),tt=i.useCallback(async Me=>{if(je===Me){Qt();return}const Ke=Dt.current+1;Dt.current=Ke,mt(Me),Te(null),Ft(null),gt(!0);try{const Qe=await iE(Me,r);if(Dt.current!==Ke)return;Te(Qe)}catch(Qe){if(Dt.current!==Ke)return;Te(null),Ft(Ce(Qe)||"Failed to load stash diff")}finally{Dt.current===Ke&&gt(!1)}},[je,r,Qt]),Ye=i.useCallback(async()=>{Wt("fetch");try{const Me=await Q1(void 0,r);Kt(Me),a(Me.message||"Fetch completed",Me.fetched?"success":"info");const Ke=await zi(r,{extended:!0});S(Ke)}catch(Me){a(Ce(Me)||"Fetch failed","error")}finally{Wt(null)}},[a,r]),vt=i.useCallback(async Me=>{Wt("pull");try{const Ke=await Z1(Me,r);if(Kt(Ke),Ke.conflict)a("Merge conflict detected. Resolve manually.","error");else{const Lt=Me?.rebase?"Pull --rebase completed":"Pull completed";a(Ke.message||Lt,"success")}const Qe=await zi(r,{extended:!0});S(Qe)}catch(Ke){a(Ce(Ke)||"Pull failed","error")}finally{Wt(null)}},[a,r]),pt=i.useCallback(async()=>{Wt("push");try{const Me=await eE(r);Kt(Me),a(Me.message||"Push completed","success");const Ke=await zi(r,{extended:!0});S(Ke)}catch(Me){a(Ce(Me)||"Push failed","error")}finally{Wt(null)}},[a,r]);i.useEffect(()=>{ay(r).then(Me=>I(Me.rootDir)).catch(()=>I(null))},[r]);const Zt=i.useCallback(async()=>{if(!w?.integrationBranch||w.isOnIntegrationBranch===!1)return;const Me=R;if(!Me){a("Project root path not available","error");return}Wt("sync-integration");try{const Ke=r?`?projectId=${encodeURIComponent(r)}`:"";await $(`/git/pull${Ke}`,{method:"POST",body:JSON.stringify({worktreePath:Me,integrationBranch:w.integrationBranch,taskId:void 0,skipOriginFetch:!0})}),a("Synced worktree to local integration tip","success");const Qe=await zi(r,{extended:!0});S(Qe)}catch(Ke){a(Ce(Ke)||"Sync failed","error")}finally{Wt(null)}},[a,r,R,w?.integrationBranch,w?.isOnIntegrationBranch]),ce=i.useMemo(()=>E.filter(Me=>Me.staged),[E]),Ge=i.useMemo(()=>E.filter(Me=>!Me.staged),[E]);return e?t.jsx("div",{className:"modal-overlay open git-manager-modal-overlay",...N,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal gm-modal",ref:j,style:m,children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("h3",{children:[t.jsx(Cm,{size:18,style:{marginRight:8,verticalAlign:"middle"}}),"Git Manager"]}),t.jsxs("div",{className:"gm-header-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:xn,disabled:v,title:"Refresh",children:t.jsx(Ss,{size:14,className:v?"spin":""})}),t.jsx("button",{className:"modal-close",onClick:f,"aria-label":"Close",children:t.jsx(Nn,{size:18})})]})]}),t.jsxs("div",{className:"gm-layout",children:[t.jsx("nav",{className:"gm-sidebar",role:"tablist","aria-label":"Git Manager Sections",children:rl.map(Me=>{const Ke=Me.icon;return t.jsxs("button",{role:"tab","aria-selected":p===Me.id,className:`gm-nav-item${p===Me.id?" active":""}`,onClick:()=>b(Me.id),children:[t.jsx(Ke,{size:16}),t.jsx("span",{className:"gm-nav-label",children:Me.label})]},Me.id)})}),t.jsxs("div",{className:"gm-content",role:"tabpanel",children:[v&&t.jsxs("div",{className:"gm-loading",children:[t.jsx(Ct,{size:24,className:"spin"}),t.jsx("span",{children:"Loading..."})]}),y&&!v&&t.jsxs("div",{className:"gm-error",children:[t.jsx(oi,{size:18}),t.jsx("span",{children:y}),t.jsx("button",{className:"btn btn-sm",onClick:xn,children:"Retry"})]}),p==="status"&&!v&&w&&t.jsx(c3,{status:w,copyToClipboard:C,onSyncWorkingTree:Zt,syncing:nt==="sync-integration"}),p==="changes"&&!v&&t.jsx(d3,{status:w,stagedFiles:ce,unstagedFiles:Ge,selectedFiles:G,toggleFileSelection:on,onStageFiles:Tn,onUnstageFiles:Sn,onDiscardChanges:is,onSelectDiffFile:tn,selectedDiffTarget:z,changeDiff:Y,loadingChangeDiff:_,changeDiffError:ae,commitMessage:P,setCommitMessage:T,onCommit:On,onStageAllAndCommit:un,committing:D}),p==="commits"&&!v&&t.jsx(u3,{commits:Zn,commitSearch:ve,setCommitSearch:A,selectedCommit:re,commitDiff:ue,loadingDiff:be,onCommitClick:pn,onLoadMore:mn,canLoadMore:le.length>=O&&O<100,copyToClipboard:C}),p==="branches"&&!v&&t.jsx(m3,{branches:Pn,branchSearch:Le,setBranchSearch:de,newBranchName:ee,setNewBranchName:ge,branchBase:Ne,setBranchBase:He,onCreateBranch:In,onCheckoutBranch:rn,onDeleteBranch:hn,loading:v,allBranches:ne,selectedBranch:Re,branchCommits:rt,loadingBranchCommits:Xe,expandedBranchCommit:at,branchCommitDiff:pe,loadingBranchCommitDiff:et,onSelectBranch:nn,onBranchCommitClick:$t,onCloseBranchDetails:Jt}),p==="worktrees"&&!v&&t.jsx(h3,{worktrees:it}),p==="stashes"&&!v&&t.jsx(f3,{stashes:Nt,stashMessage:Be,setStashMessage:Z,onCreateStash:ie,onApplyStash:Fe,onDropStash:Je,onToggleStashDiff:tt,stashLoading:Oe,expandedStashIndex:je,stashDiff:Et,loadingStashDiff:xe,stashDiffError:_t}),p==="remotes"&&!v&&t.jsx(p3,{status:w,remoteLoading:nt,lastRemoteResult:Mt,onFetch:Ye,onPull:vt,onPush:pt,onSyncIntegrationTip:Zt,syncIntegrationDisabled:!w?.integrationBranch||w?.isOnIntegrationBranch===!1||nt!==null,addToast:a,projectId:r,copyToClipboard:C})]})]})]})}):null}function c3({status:e,copyToClipboard:n,onSyncWorkingTree:s,syncing:a}){const[r,o]=i.useState(!1);return t.jsxs("div",{className:"gm-panel","data-testid":"status-panel",children:[t.jsx("div",{className:"gm-panel-header",children:t.jsx("h4",{children:"Repository Status"})}),t.jsxs("div",{className:"gm-status-grid",children:[t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"Branch"}),t.jsxs("span",{className:"gm-status-value",children:[t.jsx(ii,{size:14}),t.jsx("span",{children:e.branch}),e.integrationBranch&&e.isOnIntegrationBranch===!1&&t.jsxs("span",{className:"gm-status-sub",title:"Currently on a non-integration branch",children:[" ","(not on ",e.integrationBranch,")"]})]})]}),t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"Commit"}),t.jsxs("span",{className:"gm-status-value",children:[t.jsx("code",{className:"gm-hash",children:e.commit}),t.jsx("button",{className:"gm-icon-btn",onClick:()=>n(e.commit,"commit hash"),title:`Copy short commit hash${e.headSha?" (use the full SHA below for git operations)":""}`,children:t.jsx(ga,{size:12})}),e.headSha&&t.jsxs("button",{className:"gm-icon-btn",onClick:()=>n(e.headSha,"full commit hash"),title:"Copy full 40-char SHA",children:[t.jsx(ga,{size:12}),t.jsx("span",{style:{fontSize:10,marginLeft:2},children:"full"})]})]})]}),t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"Working Tree"}),t.jsx("span",{className:`gm-status-badge ${e.isDirty?"dirty":"clean"}`,children:e.isDirty?t.jsxs(t.Fragment,{children:[t.jsx(oi,{size:12}),"Modified"]}):t.jsxs(t.Fragment,{children:[t.jsx(gs,{size:12}),"Clean"]})}),e.dirtyDetails&&e.dirtyDetails.staged+e.dirtyDetails.modified+e.dirtyDetails.untracked+e.dirtyDetails.conflicted>0&&t.jsxs("span",{className:"gm-status-sub",children:[e.dirtyDetails.staged>0&&t.jsxs("span",{title:"Staged",children:[e.dirtyDetails.staged," staged"]}),e.dirtyDetails.staged>0&&e.dirtyDetails.modified+e.dirtyDetails.untracked+e.dirtyDetails.conflicted>0&&" · ",e.dirtyDetails.modified>0&&t.jsxs("span",{title:"Modified",children:[e.dirtyDetails.modified," modified"]}),e.dirtyDetails.modified>0&&e.dirtyDetails.untracked+e.dirtyDetails.conflicted>0&&" · ",e.dirtyDetails.untracked>0&&t.jsxs("span",{title:"Untracked",children:[e.dirtyDetails.untracked," untracked"]}),e.dirtyDetails.untracked>0&&e.dirtyDetails.conflicted>0&&" · ",e.dirtyDetails.conflicted>0&&t.jsxs("span",{title:"Unresolved merge conflicts",className:"gm-status-conflict",children:[e.dirtyDetails.conflicted," conflicted"]})]})]}),t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"vs origin"}),t.jsxs("span",{className:"gm-status-value",children:[e.ahead>0&&t.jsxs("span",{className:"gm-ahead",title:`${e.ahead} commit(s) ahead of upstream`,children:[t.jsx(ua,{size:12}),e.ahead]}),e.behind>0&&t.jsxs("span",{className:"gm-behind",title:`${e.behind} commit(s) behind upstream`,children:[t.jsx(Wa,{size:12}),e.behind]}),e.ahead===0&&e.behind===0&&t.jsxs("span",{className:"gm-in-sync",children:[t.jsx(gs,{size:12}),"Up to date"]})]})]})]}),e.integrationBranch&&t.jsxs("div",{className:"gm-status-grid",children:[t.jsxs("div",{className:"gm-status-card","data-testid":"integration-branch-card",children:[t.jsx("span",{className:"gm-status-label",children:"Integration branch"}),t.jsxs("span",{className:"gm-status-value",children:[t.jsx(ii,{size:14}),t.jsx("span",{children:e.integrationBranch}),e.integrationBranchSource&&t.jsxs("span",{className:"gm-status-sub",title:`Resolved from ${e.integrationBranchSource}`,children:[" ","(",e.integrationBranchSource,")"]})]}),e.integrationTipSha&&t.jsxs("span",{className:"gm-status-sub",children:["tip ",t.jsx("code",{className:"gm-hash",children:e.integrationTipSha.slice(0,8)}),e.integrationTipSource==="remote-only"&&t.jsxs(t.Fragment,{children:[" ",t.jsxs("span",{title:"No local refs/heads/<branch>; using refs/remotes/origin/<branch> as the integration tip.",children:["(remote-only — run ",t.jsxs("code",{children:["git switch ",e.integrationBranch]})," to track locally)"]})]})]}),e.integrationTipSource==="missing"&&t.jsxs("span",{className:"gm-status-sub gm-status-conflict",title:"Neither refs/heads nor refs/remotes/origin has this branch",children:["no ref found for ",e.integrationBranch]})]}),e.integrationTipSha!==void 0&&(e.aheadOfIntegration!==void 0||e.behindIntegration!==void 0)&&t.jsxs("div",{className:"gm-status-card",children:[t.jsxs("span",{className:"gm-status-label",children:["HEAD vs ",e.integrationBranch]}),t.jsx("span",{className:"gm-status-value",children:(e.aheadOfIntegration??0)===0&&(e.behindIntegration??0)===0?t.jsxs("span",{className:"gm-in-sync",children:[t.jsx(gs,{size:12}),"Aligned"]}):t.jsxs(t.Fragment,{children:[(e.aheadOfIntegration??0)>0&&t.jsxs("span",{className:"gm-ahead",title:`HEAD has ${e.aheadOfIntegration} commit(s) not on ${e.integrationBranch}`,children:[t.jsx(ua,{size:12}),e.aheadOfIntegration]}),(e.behindIntegration??0)>0&&t.jsxs("span",{className:"gm-behind",title:`${e.integrationBranch} has ${e.behindIntegration} commit(s) HEAD doesn't`,children:[t.jsx(Wa,{size:12}),e.behindIntegration]})]})})]}),e.originIntegrationTipSha!==void 0&&t.jsxs("div",{className:"gm-status-card",children:[t.jsxs("span",{className:"gm-status-label",children:["Local ",e.integrationBranch," vs origin"]}),t.jsx("span",{className:"gm-status-value",children:e.originIntegrationTipSha===null?t.jsx("span",{className:"gm-status-sub",children:"no origin tracking"}):e.integrationTipSource==="remote-only"?t.jsx("span",{className:"gm-status-sub",title:"No local refs/heads/<branch> exists; nothing to compare against origin.",children:"no local tracking"}):(e.aheadOfOriginIntegration??0)===0&&(e.behindOriginIntegration??0)===0?t.jsxs("span",{className:"gm-in-sync",children:[t.jsx(gs,{size:12}),"Synced"]}):t.jsxs(t.Fragment,{children:[(e.aheadOfOriginIntegration??0)>0&&t.jsxs("span",{className:"gm-ahead",title:`Local ${e.integrationBranch} is ${e.aheadOfOriginIntegration} commit(s) ahead of origin/${e.integrationBranch}`,children:[t.jsx(ua,{size:12}),e.aheadOfOriginIntegration]}),(e.behindOriginIntegration??0)>0&&t.jsxs("span",{className:"gm-behind",title:`Local ${e.integrationBranch} is ${e.behindOriginIntegration} commit(s) behind origin/${e.integrationBranch}`,children:[t.jsx(Wa,{size:12}),e.behindOriginIntegration]})]})})]}),e.integrationTipSource==="remote-only"&&e.aheadOfIntegrationRemote!==void 0&&t.jsxs("div",{className:"gm-status-card",children:[t.jsxs("span",{className:"gm-status-label",children:["HEAD vs origin/",e.integrationBranch]}),t.jsx("span",{className:"gm-status-value",children:(e.aheadOfIntegrationRemote??0)===0&&(e.behindIntegrationRemote??0)===0?t.jsxs("span",{className:"gm-in-sync",children:[t.jsx(gs,{size:12}),"Aligned"]}):t.jsxs(t.Fragment,{children:[(e.aheadOfIntegrationRemote??0)>0&&t.jsxs("span",{className:"gm-ahead",title:`HEAD has ${e.aheadOfIntegrationRemote} commit(s) not on origin/${e.integrationBranch}`,children:[t.jsx(ua,{size:12}),e.aheadOfIntegrationRemote]}),(e.behindIntegrationRemote??0)>0&&t.jsxs("span",{className:"gm-behind",title:`origin/${e.integrationBranch} has ${e.behindIntegrationRemote} commit(s) HEAD doesn't`,children:[t.jsx(Wa,{size:12}),e.behindIntegrationRemote]})]})})]}),(e.stashCount??0)>0&&t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"Stashes"}),t.jsxs("span",{className:"gm-status-value",children:[t.jsx(Ar,{size:14}),t.jsx("span",{children:e.stashCount})]})]})]}),e.indexStaleVsHead===!0&&t.jsxs("div",{className:"gm-status-warning","data-testid":"index-stale-warning",role:"alert",children:[t.jsx(oi,{size:14}),t.jsxs("div",{children:[t.jsx("strong",{children:"Stale index detected."})," ",'HEAD has advanced (typically because Fusion\'s merger updated the integration-branch ref) but the index still reflects the previous tip — `git status` will report the new commits inverted as "staged changes." Enable ',t.jsx("code",{children:"mergeAdvanceAutoSync"})," in Settings to have the merger reconcile automatically, or run ",t.jsx("code",{children:"git reset --hard HEAD"})," to snap forward manually."]})]}),(e.recentMergeAdvances??[]).length>0&&t.jsxs("div",{className:"gm-status-advances","data-testid":"recent-merge-advances",children:[t.jsxs("div",{className:"gm-status-advances-header",children:[t.jsxs("span",{children:["Recent integration-branch advances",t.jsxs("span",{className:"gm-status-sub",children:[" ","(",(e.recentMergeAdvances??[]).filter(l=>l.needsAction).length," need action)"]}),t.jsx("button",{type:"button",className:"gm-icon-btn",style:{marginLeft:6},"aria-expanded":r,"aria-label":r?"Hide explanation":"What does this mean?",onClick:()=>o(l=>!l),title:"What does this mean?",children:t.jsx(wS,{size:13})})]}),(e.recentMergeAdvances??[]).some(l=>l.needsAction)&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:s,disabled:a,"data-testid":"sync-working-tree-btn",title:"Pull the integration branch into your working tree (auto-stashes uncommitted edits and restores them)",children:a?"Syncing…":"Sync working tree"})]}),r&&t.jsxs("div",{className:"gm-status-advances-help","data-testid":"recent-merge-advances-help",children:[t.jsxs("p",{children:["Each entry is a Fusion task whose squash commit advanced the integration branch ref (",t.jsx("code",{children:e.integrationBranch??"main"}),"). The ",t.jsx("em",{children:"auto-sync outcome"})," says whether your working tree was also fast-forwarded to that new tip."]}),t.jsxs("ul",{className:"gm-status-advances-help-list",children:[t.jsxs("li",{children:[t.jsx("code",{children:"clean-sync"})," / ",t.jsx("code",{children:"synced-with-edits-restored"})," — working tree is in sync; nothing to do."]}),t.jsxs("li",{children:[t.jsx("code",{children:"off / not run"})," — auto-sync is disabled in Settings; the branch ref moved but your worktree didn't follow."]}),t.jsxs("li",{children:[t.jsx("code",{children:"stash-failed"})," / ",t.jsx("code",{children:"would-conflict"})," / similar — auto-sync tried but couldn't reconcile (usually local edits collide with the new commit)."]})]}),t.jsxs("p",{children:[t.jsx("strong",{children:"Fix:"})," click ",t.jsx("em",{children:"Sync working tree"})," to catch up now. Pure-local — it auto-stashes any uncommitted edits, hard-resets the worktree to match the local integration tip (the sha the merger advanced ",t.jsxs("code",{children:["refs/heads/",e.integrationBranch??"main"]})," to), and restores your stash. Origin is not touched, so no unrelated remote work gets pulled in. To make this automatic going forward, enable ",t.jsx("code",{children:"mergeAdvanceAutoSync"})," in Settings."]})]}),t.jsx("ul",{children:(e.recentMergeAdvances??[]).map(l=>t.jsxs("li",{className:l.needsAction?"gm-advance-needs-action":"gm-advance-handled",children:[t.jsx("code",{className:"gm-hash",children:l.toSha.slice(0,8)})," ",t.jsx("strong",{children:l.taskId}),l.autoSyncOutcome?t.jsxs("span",{className:"gm-status-sub",children:[" ","auto-sync: ",t.jsx("code",{children:l.autoSyncOutcome})]}):t.jsxs("span",{className:"gm-status-sub",children:[" ","auto-sync: ",t.jsx("em",{children:"off / not run"})]}),t.jsxs("span",{className:"gm-status-sub",children:[" ","· ",new Date(l.advancedAt).toLocaleTimeString()]})]},`${l.taskId}-${l.toSha}`))})]})]})}function d3({status:e,stagedFiles:n,unstagedFiles:s,selectedFiles:a,toggleFileSelection:r,onStageFiles:o,onUnstageFiles:l,onDiscardChanges:c,onSelectDiffFile:d,selectedDiffTarget:u,changeDiff:h,loadingChangeDiff:m,changeDiffError:f,commitMessage:p,setCommitMessage:b,onCommit:v,onStageAllAndCommit:x,committing:y}){const g=s.filter(N=>a.has(`unstaged:${N.file}`)),j=n.filter(N=>a.has(`staged:${N.file}`));return t.jsxs("div",{className:"gm-panel","data-testid":"changes-panel",children:[e&&t.jsxs("div",{className:"gm-changes-header",children:[t.jsxs("span",{className:"gm-branch-indicator",children:[t.jsx(ii,{size:14}),e.branch]}),e.isDirty&&t.jsx("span",{className:"gm-dirty-badge",children:"Modified"})]}),t.jsxs("div",{className:"gm-changes-split",children:[t.jsxs("div",{className:"gm-changes-lists",children:[t.jsxs("div",{className:"gm-file-section",children:[t.jsxs("div",{className:"gm-file-section-header",children:[t.jsxs("h5",{children:["Unstaged Changes (",s.length,")"]}),t.jsxs("div",{className:"gm-file-section-actions",children:[g.length>0&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn-sm btn-primary",onClick:()=>o(g.map(N=>N.file)),title:"Stage selected",children:[t.jsx(os,{size:12})," Stage (",g.length,")"]}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>c(g.map(N=>N.file)),title:"Discard selected",children:t.jsx(Za,{size:12})})]}),s.length>0&&t.jsx("button",{className:"btn btn-sm",onClick:()=>o(s.map(N=>N.file)),title:"Stage all",children:"Stage All"})]})]}),t.jsx("div",{className:"gm-file-list gm-file-list-unstaged","data-testid":"gm-file-list-unstaged",children:s.length===0?t.jsx("div",{className:"gm-empty",children:"No unstaged changes"}):s.map(N=>{const C=u?.file===N.file&&u.staged===!1;return t.jsxs("div",{className:`gm-file-item${C?" active":""}`,onClick:()=>d(N.file,!1),role:"button",tabIndex:0,onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),d(N.file,!1))},children:[t.jsx("label",{className:"gm-file-checkbox",onClick:w=>w.stopPropagation(),children:t.jsx("input",{type:"checkbox",checked:a.has(`unstaged:${N.file}`),onChange:()=>r(`unstaged:${N.file}`)})}),t.jsx(Tx,{status:N.status}),t.jsx("span",{className:"gm-file-name",title:N.file,children:t.jsx("bdo",{dir:"ltr",children:N.file})}),t.jsx(Ix,{status:N.status}),t.jsx("button",{className:"gm-icon-btn",onClick:w=>{w.stopPropagation(),o([N.file])},title:"Stage file",children:t.jsx(os,{size:12})})]},`unstaged:${N.file}`)})})]}),t.jsxs("div",{className:"gm-file-section",children:[t.jsxs("div",{className:"gm-file-section-header",children:[t.jsxs("h5",{children:["Staged Changes (",n.length,")"]}),t.jsxs("div",{className:"gm-file-section-actions",children:[j.length>0&&t.jsxs("button",{className:"btn btn-sm",onClick:()=>l(j.map(N=>N.file)),title:"Unstage selected",children:["Unstage (",j.length,")"]}),n.length>0&&t.jsx("button",{className:"btn btn-sm",onClick:()=>l(n.map(N=>N.file)),title:"Unstage all",children:"Unstage All"})]})]}),t.jsx("div",{className:"gm-file-list gm-file-list-staged","data-testid":"gm-file-list-staged",children:n.length===0?t.jsx("div",{className:"gm-empty",children:"No staged changes"}):n.map(N=>{const C=u?.file===N.file&&u.staged===!0;return t.jsxs("div",{className:`gm-file-item staged${C?" active":""}`,onClick:()=>d(N.file,!0),role:"button",tabIndex:0,onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),d(N.file,!0))},children:[t.jsx("label",{className:"gm-file-checkbox",onClick:w=>w.stopPropagation(),children:t.jsx("input",{type:"checkbox",checked:a.has(`staged:${N.file}`),onChange:()=>r(`staged:${N.file}`)})}),t.jsx(Tx,{status:N.status}),t.jsx("span",{className:"gm-file-name",title:N.file,children:t.jsx("bdo",{dir:"ltr",children:N.file})}),t.jsx(Ix,{status:N.status}),t.jsx("button",{className:"gm-icon-btn",onClick:w=>{w.stopPropagation(),l([N.file])},title:"Unstage file",children:t.jsx(Nn,{size:12})})]},`staged:${N.file}`)})})]})]}),t.jsx("div",{className:"gm-changes-diff",children:u||m||h||f?t.jsxs("div",{className:"gm-diff-section",children:[u&&t.jsxs("div",{className:"gm-diff-target",children:[t.jsx(Sm,{size:14}),t.jsxs("span",{children:[u.staged?"Staged":"Unstaged"," diff: "]}),t.jsx("code",{children:u.file})]}),m&&t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}),f&&!m&&t.jsx("div",{className:"gm-diff-error",children:f}),h&&!m&&t.jsxs("div",{className:"gm-diff-viewer",children:[h.stat&&t.jsx("pre",{className:"gm-diff-stat",children:h.stat}),t.jsx("pre",{className:"gm-diff-patch",children:h.patch})]})]}):t.jsxs("div",{className:"gm-diff-empty",children:[t.jsx(Sm,{size:20}),t.jsx("span",{children:"Select a file to view its diff"})]})})]}),t.jsxs("form",{className:"gm-commit-form",onSubmit:v,children:[t.jsx("textarea",{className:"gm-commit-input",placeholder:"Commit message...",value:p,onChange:N=>b(N.target.value),rows:3,disabled:y}),t.jsxs("div",{className:"gm-commit-actions",children:[t.jsxs("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:y||!p.trim()||n.length===0,title:n.length===0?"No staged changes to commit":"Commit staged changes",children:[y?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(vr,{size:14}),"Commit"]}),s.length>0&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,disabled:y||!p.trim(),title:"Stage all and commit",children:"Stage All & Commit"})]})]})]})}function u3({commits:e,commitSearch:n,setCommitSearch:s,selectedCommit:a,commitDiff:r,loadingDiff:o,onCommitClick:l,onLoadMore:c,canLoadMore:d,copyToClipboard:u}){return t.jsxs("div",{className:"gm-panel","data-testid":"commits-panel",children:[t.jsxs("div",{className:"gm-panel-header",children:[t.jsx("h4",{children:"Commits"}),t.jsxs("div",{className:"gm-search-box",children:[t.jsx(da,{size:14}),t.jsx("input",{type:"text",placeholder:"Search commits...",value:n,onChange:h=>s(h.target.value)})]})]}),t.jsx("div",{className:"gm-commits-list",children:e.length===0?t.jsx("div",{className:"gm-empty",children:n?"No matching commits":"No commits found"}):e.map((h,m)=>t.jsxs("div",{className:"gm-commit-item",children:[t.jsxs("div",{className:"gm-commit-graph",children:[t.jsx("div",{className:"gm-commit-dot"}),m<e.length-1&&t.jsx("div",{className:"gm-commit-line"})]}),t.jsxs("div",{className:"gm-commit-body",children:[t.jsxs("button",{className:"gm-commit-header",onClick:()=>l(h.hash),children:[t.jsxs("div",{className:"gm-commit-top-row",children:[t.jsx("code",{className:"gm-hash",children:h.shortHash}),t.jsx("span",{className:"gm-commit-message",title:h.message,children:h.message})]}),t.jsxs("div",{className:"gm-commit-meta",children:[t.jsx("span",{children:h.author}),t.jsx("span",{children:"•"}),t.jsx("span",{children:Mo(h.date)}),h.parents.length>1&&t.jsx("span",{className:"gm-merge-badge",children:"merge"})]})]}),t.jsx("div",{className:"gm-commit-actions-row",children:t.jsx("button",{className:"gm-icon-btn",onClick:()=>u(h.hash,"commit hash"),title:"Copy full hash",children:t.jsx(ga,{size:12})})}),a===h.hash&&t.jsx("div",{className:"gm-commit-diff",children:o?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}):r?t.jsxs(t.Fragment,{children:[h.body&&t.jsx("div",{className:"gm-commit-message-full",children:h.body}),r.stat&&t.jsx("pre",{className:"gm-diff-stat",children:r.stat}),t.jsx("pre",{className:"gm-diff-patch",children:r.patch})]}):t.jsx("div",{className:"gm-diff-error",children:"Failed to load diff"})})]})]},h.hash))}),d&&t.jsx("button",{className:"gm-load-more",onClick:c,children:"Load more commits"})]})}function m3({branches:e,branchSearch:n,setBranchSearch:s,newBranchName:a,setNewBranchName:r,branchBase:o,setBranchBase:l,onCreateBranch:c,onCheckoutBranch:d,onDeleteBranch:u,loading:h,allBranches:m,selectedBranch:f,branchCommits:p,loadingBranchCommits:b,expandedBranchCommit:v,branchCommitDiff:x,loadingBranchCommitDiff:y,onSelectBranch:g,onBranchCommitClick:j,onCloseBranchDetails:N}){return t.jsxs("div",{className:"gm-panel","data-testid":"branches-panel",children:[t.jsxs("div",{className:"gm-panel-header",children:[t.jsx("h4",{children:"Branches"}),t.jsxs("div",{className:"gm-search-box",children:[t.jsx(da,{size:14}),t.jsx("input",{type:"text",placeholder:"Filter branches...",value:n,onChange:C=>s(C.target.value)})]})]}),t.jsxs("form",{className:"gm-create-form",onSubmit:c,children:[t.jsx("input",{type:"text",placeholder:"New branch name",value:a,onChange:C=>r(C.target.value),disabled:h}),t.jsxs("select",{value:o,onChange:C=>l(C.target.value),disabled:h,className:"gm-branch-select",children:[t.jsx("option",{value:"",children:"Base: HEAD"}),m.map(C=>t.jsx("option",{value:C.name,children:C.name},C.name))]}),t.jsxs("button",{type:"submit",className:"btn btn-primary btn-sm",disabled:h||!a.trim(),children:[t.jsx(os,{size:14}),"Create"]})]}),t.jsx("div",{className:"gm-branches-list",children:e.length===0?t.jsx("div",{className:"gm-empty",children:n?"No matching branches":"No branches found"}):e.map(C=>t.jsxs("div",{children:[t.jsxs("div",{className:`gm-branch-item${C.isCurrent?" current":""}${f===C.name?" selected":""}`,onClick:()=>g(C.name),children:[t.jsxs("div",{className:"gm-branch-info",children:[t.jsxs("span",{className:"gm-branch-name",children:[C.isCurrent&&t.jsx(Js,{size:14,className:"gm-current-icon"}),C.name]}),C.remote&&t.jsxs("span",{className:"gm-branch-remote",children:["→ ",C.remote]}),C.lastCommitDate&&t.jsx("span",{className:"gm-branch-date",children:Mo(C.lastCommitDate)})]}),t.jsx("div",{className:"gm-branch-actions",children:!C.isCurrent&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:w=>{w.stopPropagation(),d(C.name)},disabled:h,title:"Checkout",children:t.jsx(ii,{size:14})}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:w=>{w.stopPropagation(),u(C.name)},disabled:h,title:"Delete",children:t.jsx(es,{size:14})})]})})]}),f===C.name&&t.jsxs("div",{className:"gm-branch-details",children:[t.jsxs("div",{className:"gm-branch-details-header",children:[t.jsxs("span",{className:"gm-branch-details-title",children:[t.jsx(yo,{size:14}),"Commits on ",C.name]}),t.jsx("button",{className:"gm-icon-btn",onClick:N,title:"Close","data-testid":"close-branch-details",children:t.jsx(Nn,{size:14})})]}),b?t.jsxs("div",{className:"gm-branch-details-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading commits..."]}):p.length===0?t.jsx("div",{className:"gm-empty",children:"No commits found"}):t.jsx("div",{className:"gm-branch-commits-list",children:p.map(w=>t.jsxs("div",{className:"gm-branch-commit",children:[t.jsxs("button",{className:"gm-branch-commit-row",onClick:()=>j(w.hash),"data-testid":`branch-commit-${w.shortHash}`,children:[t.jsx("span",{className:"gm-commit-hash",children:w.shortHash}),t.jsx("span",{className:"gm-commit-message",title:w.message,children:w.message}),t.jsxs("div",{className:"gm-commit-meta",children:[t.jsx("span",{children:w.author}),t.jsx("span",{children:"•"}),t.jsx("span",{children:Mo(w.date)}),w.parents.length>1&&t.jsx("span",{className:"gm-merge-badge",children:"merge"})]})]}),v===w.hash&&t.jsx("div",{className:"gm-commit-diff",children:y?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}):x?t.jsxs(t.Fragment,{children:[(w.body||w.message)&&t.jsx("div",{className:"gm-commit-message-full",children:w.body||w.message}),x.stat&&t.jsx("pre",{className:"gm-diff-stat",children:x.stat}),t.jsx("pre",{className:"gm-diff-patch",children:x.patch})]}):t.jsx("div",{className:"gm-diff-error",children:"Failed to load diff"})})]},w.hash))})]})]},C.name))})]})}function h3({worktrees:e}){return t.jsxs("div",{className:"gm-panel","data-testid":"worktrees-panel",children:[t.jsxs("div",{className:"gm-panel-header",children:[t.jsx("h4",{children:"Worktrees"}),t.jsxs("div",{className:"gm-worktree-stats",children:[t.jsxs("span",{children:[e.length," total"]}),t.jsx("span",{className:"gm-stat-separator",children:"•"}),t.jsxs("span",{children:[e.filter(n=>n.taskId).length," in use"]})]})]}),t.jsx("div",{className:"gm-worktrees-list",children:e.map(n=>t.jsx("div",{className:`gm-worktree-item${n.isMain?" main":""}`,children:t.jsxs("div",{className:"gm-worktree-info",children:[t.jsxs("div",{className:"gm-worktree-path-row",children:[n.isMain&&t.jsx("span",{className:"gm-badge main",children:"main"}),n.isBare&&t.jsx("span",{className:"gm-badge bare",children:"bare"}),t.jsx("span",{className:"gm-worktree-path",title:n.path,children:Lh(n.path)||n.path})]}),t.jsxs("div",{className:"gm-worktree-detail",children:[n.branch&&t.jsxs("span",{className:"gm-worktree-branch",children:[t.jsx(ii,{size:12}),n.branch]}),n.taskId&&t.jsx("span",{className:"gm-worktree-task",children:n.taskId})]})]})},n.path))})]})}function f3({stashes:e,stashMessage:n,setStashMessage:s,onCreateStash:a,onApplyStash:r,onDropStash:o,onToggleStashDiff:l,stashLoading:c,expandedStashIndex:d,stashDiff:u,loadingStashDiff:h,stashDiffError:m}){return t.jsxs("div",{className:"gm-panel","data-testid":"stashes-panel",children:[t.jsx("div",{className:"gm-panel-header",children:t.jsx("h4",{children:"Stashes"})}),t.jsxs("form",{className:"gm-create-form",onSubmit:a,children:[t.jsx("input",{type:"text",placeholder:"Stash message (optional)",value:n,onChange:f=>s(f.target.value),disabled:c!==null}),t.jsxs("button",{type:"submit",className:"btn btn-primary btn-sm",disabled:c!==null,children:[c==="create"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ar,{size:14}),"Stash"]})]}),t.jsx("div",{className:"gm-stash-list",children:e.length===0?t.jsx("div",{className:"gm-empty",children:"No stashes"}):e.map(f=>t.jsxs("div",{className:"gm-stash-item",children:[t.jsxs("div",{className:"gm-stash-header",children:[t.jsxs("div",{className:"gm-stash-info",children:[t.jsxs("span",{className:"gm-stash-ref",children:["stash@",`{${f.index}}`]}),t.jsx("span",{className:"gm-stash-message",children:f.message}),t.jsxs("div",{className:"gm-stash-meta",children:[f.branch&&t.jsxs("span",{className:"gm-stash-branch",children:[t.jsx(ii,{size:12}),f.branch]}),t.jsx("span",{children:Mo(f.date)})]})]}),t.jsxs("div",{className:"gm-stash-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>l(f.index),disabled:c!==null,children:d===f.index?"Hide":"View"}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>r(f.index,!1),disabled:c!==null,title:"Apply stash (keep)",children:c===`apply-${f.index}`?t.jsx(Ct,{size:14,className:"spin"}):"Apply"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>r(f.index,!0),disabled:c!==null,title:"Pop stash (apply and drop)",children:"Pop"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>o(f.index),disabled:c!==null,title:"Drop stash",children:c===`drop-${f.index}`?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(es,{size:14})})]})]}),d===f.index&&t.jsx("div",{className:"gm-stash-diff",children:h?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:14,className:"spin"}),"Loading stash diff…"]}):m?t.jsx("div",{className:"gm-diff-error",children:m}):u?t.jsxs("div",{className:"gm-diff-viewer",children:[u.stat&&t.jsx("pre",{className:"gm-diff-stat",children:u.stat}),t.jsx("pre",{className:"gm-diff-patch",children:u.patch})]}):null})]},f.index))})]})}function p3({status:e,remoteLoading:n,lastRemoteResult:s,onFetch:a,onPull:r,onPush:o,onSyncIntegrationTip:l,syncIntegrationDisabled:c,addToast:d,projectId:u,copyToClipboard:h}){const m=Se=>{try{return new URL(Se).hostname}catch{return Se.replace(/^git@/,"").split(":")[0]||Se}},[f,p]=i.useState([]),[b,v]=i.useState(!1),[x,y]=i.useState(null),[g,j]=i.useState(""),[N,C]=i.useState(""),[w,S]=i.useState(null),[R,I]=i.useState(""),[E,M]=i.useState(""),[G,U]=i.useState(!1),[P,T]=i.useState(!1),D=i.useRef(null),[W,Y]=i.useState([]),[L,_]=i.useState(!1),[F,ae]=i.useState(null),[k,z]=i.useState([]),[J,oe]=i.useState(!1),[le,we]=i.useState(null),re=i.useRef(0),H=f.find(Se=>Se.name===F);i.useEffect(()=>{(n!==null||b)&&T(!1)},[n,b]),i.useEffect(()=>{if(!P)return;const Se=_e=>{D.current?.contains(_e.target)||T(!1)},pe=_e=>{_e.key==="Escape"&&T(!1)};return document.addEventListener("mousedown",Se),document.addEventListener("keydown",pe),()=>{document.removeEventListener("mousedown",Se),document.removeEventListener("keydown",pe)}},[P]);const[ue,Q]=i.useState(null),[be,fe]=i.useState(null),[O,se]=i.useState(!1),[ve,A]=i.useState(null),[ne,ye]=i.useState(null),[ee,ge]=i.useState(!1);i.useEffect(()=>{Ne()},[]),i.useEffect(()=>{e&&e.ahead>0?He():e&&e.ahead===0&&Y([])},[e?.ahead]),i.useEffect(()=>{f.length>0&&!F&&ae(f[0].name)},[f]),i.useEffect(()=>{F?Le(F):(z([]),we(null))},[F]),i.useEffect(()=>{!F||!s||Le(F)},[F,s]),i.useEffect(()=>{F&&!f.find(Se=>Se.name===F)&&ae(f.length>0?f[0].name:null)},[f,F]);const Ne=async()=>{v(!0);try{const Se=await T1(u);p(Se)}catch(Se){d(Ce(Se)||"Failed to load remotes","error")}finally{v(!1)}},He=async()=>{_(!0);try{const Se=await W1(u);Y(Se)}catch{Y([])}finally{_(!1)}},Le=async Se=>{const pe=re.current+1;re.current=pe,oe(!0),we(null);try{const _e=await G1(Se,void 0,10,u);if(re.current!==pe)return;z(_e)}catch(_e){if(re.current!==pe)return;we(Ce(_e)||"Failed to load remote commits"),z([])}finally{re.current===pe&&oe(!1)}},de=Di(),Re=async Se=>{if(Se.preventDefault(),!(!g.trim()||!N.trim())){y("add");try{await I1(g.trim(),N.trim(),u),d(`Remote '${g}' added successfully`,"success"),j(""),C(""),U(!1),await Ne()}catch(pe){d(Ce(pe)||"Failed to add remote","error")}finally{y(null)}}},Pe=async Se=>{if(await de.confirm({title:"Remove Remote",message:`Are you sure you want to remove remote '${Se}'?`,danger:!0})){y(`remove-${Se}`);try{await P1(Se,u),d(`Remote '${Se}' removed`,"success"),await Ne()}catch(_e){d(Ce(_e)||"Failed to remove remote","error")}finally{y(null)}}},rt=async Se=>{if(E.trim()){y(`rename-${Se}`);try{await $1(Se,E.trim(),u),d(`Remote renamed to '${E.trim()}'`,"success"),S(null),M(""),await Ne()}catch(pe){d(Ce(pe)||"Failed to rename remote","error")}finally{y(null)}}},qe=async Se=>{if(R.trim()){y(`url-${Se}`);try{await D1(Se,R.trim(),u),d("Remote URL updated","success"),S(null),I(""),await Ne()}catch(pe){d(Ce(pe)||"Failed to update remote URL","error")}finally{y(null)}}},Xe=i.useCallback(async(Se,pe)=>{if(pe==="ahead"){if(ue===Se){Q(null),fe(null);return}Q(Se),fe(null),se(!0);try{const _e=await nd(Se);fe(_e)}catch{fe(null)}finally{se(!1)}}else{if(ve===Se){A(null),ye(null);return}A(Se),ye(null),ge(!0);try{const _e=await nd(Se);ye(_e)}catch{ye(null)}finally{ge(!1)}}},[ue,ve]),At=Se=>{S(`url-${Se.name}`),I(Se.pushUrl||Se.fetchUrl)},at=Se=>{S(`name-${Se.name}`),M(Se.name)};return t.jsx("div",{className:"gm-panel gm-remotes-panel","data-testid":"remotes-panel",children:t.jsxs("div",{className:"gm-remotes-layout",children:[t.jsxs("div",{className:"gm-remote-selector","data-testid":"remote-selector",children:[t.jsxs("div",{className:"gm-remote-selector-header",children:[t.jsx("span",{className:"gm-remote-selector-title",children:"Remotes"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>U(!G),disabled:x!==null,title:G?"Cancel":"Add Remote",children:G?t.jsx(Nn,{size:14}):t.jsx(os,{size:14})})]}),G&&t.jsxs("form",{className:"gm-remote-form",onSubmit:Re,children:[t.jsx("input",{type:"text",placeholder:"Remote name",value:g,onChange:Se=>j(Se.target.value),disabled:x==="add",className:"input gm-input"}),t.jsx("input",{type:"text",placeholder:"Repository URL",value:N,onChange:Se=>C(Se.target.value),disabled:x==="add",className:"input gm-input gm-input-url"}),t.jsxs("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:!g.trim()||!N.trim()||x==="add",children:[x==="add"?t.jsx(Ct,{size:12,className:"spin"}):t.jsx(os,{size:12}),"Add"]})]}),b?t.jsxs("div",{className:"gm-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading..."]}):f.length===0?t.jsx("div",{className:"gm-empty",children:"No remotes"}):f.map(Se=>t.jsxs("div",{className:`gm-remote-selector-item${F===Se.name?" selected":""}`,onClick:()=>ae(Se.name),role:"button",tabIndex:0,onKeyDown:pe=>{(pe.key==="Enter"||pe.key===" ")&&(pe.preventDefault(),ae(Se.name))},children:[t.jsxs("div",{className:"gm-remote-selector-info",children:[t.jsxs("span",{className:"gm-remote-selector-name",children:[t.jsx("span",{className:"gm-remote-selector-name-text",children:Se.name}),Se.name==="origin"&&t.jsx("span",{className:"gm-remote-default-badge",children:"default"})]}),t.jsx("span",{className:"gm-remote-selector-host",title:Se.fetchUrl,children:m(Se.fetchUrl)})]}),t.jsx("button",{className:"btn btn-icon btn-sm gm-remote-remove-btn",onClick:pe=>{pe.stopPropagation(),Pe(Se.name)},disabled:x!==null,title:"Remove remote",children:t.jsx(es,{size:14})})]},Se.name))]}),t.jsxs("div",{className:"gm-remote-detail","data-testid":"remote-detail-panel",children:[F&&H?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"gm-remote-sync-card","data-testid":"remote-sync-card",children:[t.jsxs("div",{className:"gm-remote-sync-card-header",children:[t.jsx("span",{className:"gm-remote-sync-card-title",children:F}),e&&(e.ahead>0||e.behind>0)&&t.jsxs("div",{className:"gm-remote-status",children:[e.ahead>0&&t.jsxs("div",{className:"gm-remote-indicator ahead",children:[t.jsx("span",{className:"status-dot status-dot--online","aria-hidden":"true"}),t.jsx(ua,{size:14}),e.ahead," to push"]}),e.behind>0&&t.jsxs("div",{className:"gm-remote-indicator behind",children:[t.jsx("span",{className:"status-dot status-dot--pending","aria-hidden":"true"}),t.jsx(Wa,{size:14}),e.behind," to pull"]})]})]}),t.jsxs("div",{className:"gm-remote-actions",children:[t.jsxs("button",{className:"btn btn-primary",onClick:a,disabled:n!==null||b,children:[n==="fetch"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ss,{size:14}),"Fetch"]}),t.jsxs("div",{className:"gm-pull-split",ref:D,children:[t.jsxs("button",{className:"btn btn-primary gm-pull-split-main",onClick:()=>{T(!1),r({rebase:!1})},disabled:n!==null||b,children:[n==="pull"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(yi,{size:14}),"Pull"]}),t.jsx("button",{className:"btn btn-primary btn-icon gm-pull-split-toggle",onClick:()=>T(Se=>!Se),disabled:n!==null||b,"aria-label":"Pull options","aria-haspopup":"menu","aria-expanded":P,children:t.jsx(Ln,{size:14})}),P?t.jsxs("div",{className:"gm-pull-menu",role:"menu","aria-label":"Pull options menu",children:[t.jsx("button",{className:"gm-pull-menu-item",role:"menuitem",onClick:()=>{T(!1),r({rebase:!1})},children:"Pull"}),t.jsx("button",{className:"gm-pull-menu-item",role:"menuitem",onClick:()=>{T(!1),r({rebase:!0})},children:"Pull --rebase"})]}):null]}),t.jsxs("button",{className:"btn btn-primary",onClick:o,disabled:n!==null||b,children:[n==="push"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(ua,{size:14}),"Push"]}),e?.integrationBranch&&t.jsxs("button",{className:"btn gm-sync-integration-btn",onClick:l,disabled:c,title:e.isOnIntegrationBranch===!1?`Not on integration branch (${e.integrationBranch})`:"Sync working tree to local integration tip (same as banner Pull)","data-testid":"remotes-sync-integration-tip-btn",children:[n==="sync-integration"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Sh,{size:14}),"Sync local tip"]})]})]}),t.jsxs("div",{className:"gm-remote-detail-card","data-testid":"remote-detail-card",children:[t.jsxs("div",{className:"gm-remote-detail-urls",children:[t.jsxs("div",{className:"gm-remote-detail-url-row",children:[t.jsx("span",{className:"gm-url-label",children:"Fetch:"}),w===`url-${F}`?t.jsxs("div",{className:"gm-remote-edit",children:[t.jsx("input",{type:"text",value:R,onChange:Se=>I(Se.target.value),className:"input gm-input",autoFocus:!0}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>qe(F),disabled:x===`url-${F}`,children:x===`url-${F}`?t.jsx(Ct,{size:12,className:"spin"}):t.jsx(Js,{size:12})}),t.jsx("button",{className:"btn btn-sm",onClick:()=>{S(null),I("")},title:"Cancel",children:t.jsx(Nn,{size:12})})]}):t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"gm-url-value",title:H.fetchUrl,children:t.jsx("bdo",{dir:"ltr",children:H.fetchUrl})}),t.jsxs("div",{className:"gm-remote-inline-actions",children:[t.jsx("button",{className:"btn btn-icon btn-sm",onClick:()=>h(H.fetchUrl,"fetch URL"),title:"Copy fetch URL",children:t.jsx(ga,{size:14})}),t.jsx("button",{className:"btn btn-icon btn-sm",onClick:()=>At(H),disabled:x!==null,title:"Edit remote URL",children:t.jsx(xi,{size:14})})]})]})]}),H.pushUrl&&H.pushUrl!==H.fetchUrl&&t.jsxs("div",{className:"gm-remote-detail-url-row",children:[t.jsx("span",{className:"gm-url-label",children:"Push:"}),t.jsx("span",{className:"gm-url-value",title:H.pushUrl,children:t.jsx("bdo",{dir:"ltr",children:H.pushUrl})}),t.jsx("div",{className:"gm-remote-inline-actions",children:t.jsx("button",{className:"btn btn-icon btn-sm",onClick:()=>h(H.pushUrl,"push URL"),title:"Copy push URL",children:t.jsx(ga,{size:14})})})]})]}),t.jsx("div",{className:"gm-remote-detail-name-row",children:w===`name-${F}`?t.jsxs("div",{className:"gm-remote-edit",children:[t.jsx("input",{type:"text",value:E,onChange:Se=>M(Se.target.value),className:"input gm-input",autoFocus:!0}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>rt(F),disabled:x===`rename-${F}`,children:x===`rename-${F}`?t.jsx(Ct,{size:12,className:"spin"}):t.jsx(Js,{size:12})}),t.jsx("button",{className:"btn btn-sm",onClick:()=>{S(null),M("")},title:"Cancel",children:t.jsx(Nn,{size:12})})]}):t.jsx("button",{className:"btn btn-icon btn-sm",onClick:()=>at(H),disabled:x!==null,title:"Edit remote name",children:t.jsx(xi,{size:14})})})]}),e&&e.ahead>0&&t.jsxs("div",{className:"gm-remote-section","data-testid":"commits-to-push",children:[t.jsx("div",{className:"gm-section-subheader",children:t.jsxs("h5",{children:[t.jsx(ua,{size:14}),"Commits to Push (",e.ahead,")"]})}),L?t.jsxs("div",{className:"gm-loading",children:[t.jsx(Ct,{size:14,className:"spin"}),"Loading..."]}):W.length>0?t.jsx("div",{className:"gm-ahead-commits-list","data-testid":"ahead-commits-list",children:W.map(Se=>t.jsxs("div",{className:"gm-commit-item-compact-wrapper",children:[t.jsxs("div",{className:"gm-commit-item-compact gm-commit-clickable",onClick:()=>Xe(Se.hash,"ahead"),role:"button",tabIndex:0,onKeyDown:pe=>{(pe.key==="Enter"||pe.key===" ")&&(pe.preventDefault(),Xe(Se.hash,"ahead"))},title:"Click to view diff",children:[t.jsx("div",{className:"gm-commit-compact-hash",children:t.jsx("code",{className:"gm-hash",children:Se.shortHash})}),t.jsxs("div",{className:"gm-commit-compact-info",children:[t.jsx("span",{className:"gm-commit-message",title:Se.message,children:Se.message}),t.jsxs("span",{className:"gm-commit-meta",children:[t.jsx("span",{children:Se.author}),t.jsx("span",{children:"•"}),t.jsx("span",{children:Mo(Se.date)})]})]}),t.jsx("span",{className:"gm-commit-expand-icon",children:ue===Se.hash?t.jsx(Ln,{size:14}):t.jsx(ps,{size:14})})]}),ue===Se.hash&&t.jsx("div",{className:"gm-commit-diff gm-commit-diff-compact",children:O?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}):be?t.jsxs(t.Fragment,{children:[(Se.body||Se.message)&&t.jsx("div",{className:"gm-commit-message-full",children:Se.body||Se.message}),be.stat&&t.jsx("pre",{className:"gm-diff-stat",children:be.stat}),t.jsx("pre",{className:"gm-diff-patch",children:be.patch})]}):t.jsx("div",{className:"gm-diff-error",children:"Failed to load diff"})})]},Se.hash))}):t.jsx("div",{className:"gm-empty",children:"No ahead commits found (may need to fetch first)"})]}),t.jsxs("div",{className:"gm-remote-section","data-testid":"remote-commits-section",children:[t.jsx("div",{className:"gm-section-subheader",children:t.jsxs("h5",{children:[t.jsx(Vv,{size:14}),"Recent commits on ",F]})}),J?t.jsxs("div",{className:"gm-loading",children:[t.jsx(Ct,{size:14,className:"spin"}),"Loading commits..."]}):le?t.jsxs("div",{className:"gm-error",children:[t.jsx(oi,{size:14}),le]}):k.length===0?t.jsxs("div",{className:"gm-empty",children:["No commits found on ",F,". Try fetching first."]}):t.jsx("div",{className:"gm-remote-commits-list","data-testid":"remote-commits-list",children:k.map(Se=>t.jsxs("div",{className:"gm-commit-item-compact-wrapper",children:[t.jsxs("div",{className:"gm-commit-item-compact gm-commit-clickable",onClick:()=>Xe(Se.hash,"remote"),role:"button",tabIndex:0,onKeyDown:pe=>{(pe.key==="Enter"||pe.key===" ")&&(pe.preventDefault(),Xe(Se.hash,"remote"))},title:"Click to view diff",children:[t.jsx("div",{className:"gm-commit-compact-hash",children:t.jsx("code",{className:"gm-hash",children:Se.shortHash})}),t.jsxs("div",{className:"gm-commit-compact-info",children:[t.jsx("span",{className:"gm-commit-message",title:Se.message,children:Se.message}),t.jsxs("span",{className:"gm-commit-meta",children:[t.jsx("span",{children:Se.author}),t.jsx("span",{children:"•"}),t.jsx("span",{children:Mo(Se.date)})]})]}),t.jsx("span",{className:"gm-commit-expand-icon",children:ve===Se.hash?t.jsx(Ln,{size:14}):t.jsx(ps,{size:14})})]}),ve===Se.hash&&t.jsx("div",{className:"gm-commit-diff gm-commit-diff-compact",children:ee?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}):ne?t.jsxs(t.Fragment,{children:[(Se.body||Se.message)&&t.jsx("div",{className:"gm-commit-message-full",children:Se.body||Se.message}),ne.stat&&t.jsx("pre",{className:"gm-diff-stat",children:ne.stat}),t.jsx("pre",{className:"gm-diff-patch",children:ne.patch})]}):t.jsx("div",{className:"gm-diff-error",children:"Failed to load diff"})})]},Se.hash))})]})]}):t.jsx("div",{className:"gm-empty",children:"Select a remote to view details"}),s&&t.jsx("div",{className:"gm-remote-result",children:s.message})]})]})})}const ao={name:"",description:"",mode:"prompt",phase:"pre-merge",prompt:"",gateMode:"advisory",scriptName:"",enabled:!0,defaultOn:!1,modelProvider:"",modelId:""};function g3(e,n){return e&&n?`${e}/${n}`:""}function b3(e){if(!e)return{provider:"",modelId:""};const n=e.indexOf("/");return n===-1?{provider:"",modelId:""}:{provider:e.slice(0,n),modelId:e.slice(n+1)}}function Px(e){switch(e){case"file-text":return Ya;case"check-circle":return gs;case"shield":return k0;case"zap":return Bs;case"eye":return $o;case"globe":return jd;case"layout-grid":return Xa;case"puzzle":return o0;default:return gs}}function $x(e){switch(e.toLowerCase()){case"quality":return"wfm-badge-category wfm-badge-category-quality";case"security":return"wfm-badge-category wfm-badge-category-security";default:return"wfm-badge-category"}}function x3({isOpen:e,onClose:n,addToast:s,projectId:a}){const[r,o]=i.useState([]),[l,c]=i.useState([]),[d,u]=i.useState({}),[h,m]=i.useState(!0),[f,p]=i.useState(!0),[b,v]=i.useState("my-steps"),[x,y]=i.useState(null),[g,j]=i.useState(!1),[N,C]=i.useState(!1),[w,S]=i.useState(ao),[R,I]=i.useState(!1),[E,M]=i.useState(!1),[G,U]=i.useState(null),[P,T]=i.useState(null),[D,W]=i.useState({}),[Y,L]=i.useState([]),_=i.useRef(null);ea(_,e,"fusion:workflow-steps-modal-size");const F=i.useCallback(async()=>{try{m(!0);const O=await Bl(a);o(O)}catch(O){s(Ce(O)||"Failed to load workflow steps","error")}finally{m(!1)}},[s,a]),ae=i.useCallback(async()=>{try{const O=await Rl(a);W(O||{})}catch{}},[a]),k=i.useCallback(async()=>{try{const O=await Ki();L(O.models||[])}catch{}},[]),z=i.useCallback(async()=>{try{p(!0);const[O,se]=await Promise.all([WE(),GE()]);c(O.templates);const ve=Object.fromEntries(se.templates.map(({pluginId:A,template:ne})=>[ne.id,A]));u(ve)}catch(O){s(Ce(O)||"Failed to load templates","error")}finally{p(!1)}},[s]);i.useEffect(()=>{e&&(F(),z(),ae(),k())},[e,F,z,ae,k]);const J=i.useCallback(()=>{C(!0),j(!1),y(null),S(ao)},[]),oe=i.useCallback(()=>{C(!1),j(!0),y(null),S(ao)},[]),le=i.useCallback(O=>{y(O.id),j(!1),S({name:O.name,description:O.description,mode:O.mode||"prompt",phase:O.phase||"pre-merge",prompt:O.prompt,gateMode:O.gateMode||((O.mode||"prompt")==="script"?"gate":"advisory"),scriptName:O.scriptName||"",enabled:O.enabled,defaultOn:O.defaultOn||!1,modelProvider:O.modelProvider||"",modelId:O.modelId||""})},[]),we=i.useCallback(()=>{y(null),j(!1),C(!1),S(ao)},[]),re=i.useCallback(async()=>{if(!w.name.trim()||!w.description.trim()){s("Name and description are required","error");return}I(!0);try{const O=w.mode==="prompt"&&w.modelProvider&&w.modelId?{modelProvider:w.modelProvider,modelId:w.modelId}:w.mode==="prompt"?{modelProvider:void 0,modelId:void 0}:{};if(g){const se={name:w.name.trim(),description:w.description.trim(),mode:w.mode,phase:w.phase,prompt:w.mode==="prompt"&&w.prompt.trim()||void 0,gateMode:w.gateMode,scriptName:w.mode==="script"?w.scriptName.trim():void 0,enabled:w.enabled,defaultOn:w.defaultOn||void 0,...O};await hp(se,a),s("Workflow step created","success")}else x&&(await HE(x,{name:w.name.trim(),description:w.description.trim(),mode:w.mode,phase:w.phase,prompt:w.mode==="prompt"?w.prompt:"",gateMode:w.gateMode,scriptName:w.mode==="script"?w.scriptName.trim():void 0,enabled:w.enabled,defaultOn:w.defaultOn,...O},a),s("Workflow step updated","success"));j(!1),y(null),S(ao),await F()}catch(O){s(Ce(O)||"Failed to save workflow step","error")}finally{I(!1)}},[w,g,x,s,F]),H=i.useCallback(async O=>{try{await qE(O,a),s("Workflow step deleted","success"),U(null),x===O&&(y(null),S(ao)),await F()}catch(se){s(Ce(se)||"Failed to delete workflow step","error")}},[x,s,F]),ue=i.useCallback(async()=>{if(!(!x&&!g)&&w.mode==="prompt"){if(g){if(!w.name.trim()||!w.description.trim()){s("Name and description are required before refining","error");return}I(!0);try{const O=w.modelProvider&&w.modelId?{modelProvider:w.modelProvider,modelId:w.modelId}:{},se={name:w.name.trim(),description:w.description.trim(),mode:"prompt",prompt:w.prompt.trim()||void 0,gateMode:w.gateMode,enabled:w.enabled,defaultOn:w.defaultOn||void 0,...O},ve=await hp(se,a);j(!1),y(ve.id),M(!0);const A=await fp(ve.id,a);S(ne=>({...ne,prompt:A.prompt})),s("Prompt refined with AI","success"),await F()}catch(O){s(Ce(O)||"Failed to refine prompt","error")}finally{I(!1),M(!1)}return}if(x){M(!0);try{const O=await fp(x,a);S(se=>({...se,prompt:O.prompt})),s("Prompt refined with AI","success"),await F()}catch(O){s(Ce(O)||"Failed to refine prompt","error")}finally{M(!1)}}}},[x,g,w,s,F]),Q=i.useCallback(async O=>{T(O.id);try{await KE(O.id,a),s(`Added ${O.name} workflow step`,"success"),await F(),v("my-steps"),C(!1)}catch(se){const ve=Ce(se);ve?.includes("already exists")?s(`A workflow step named '${O.name}' already exists`,"error"):s(ve||"Failed to add workflow step from template","error")}finally{T(null)}},[s,F]),be=Aa(n);if(!e)return null;const fe=g||x!==null;return t.jsx("div",{className:"modal-overlay open",...be,"data-testid":"workflow-step-manager",children:t.jsxs("div",{ref:_,className:"modal workflow-step-manager-modal",role:"dialog","aria-modal":"true","aria-label":"Workflow Steps",children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h2",{children:"Workflow Steps"}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close",children:"×"})]}),t.jsx("div",{className:"wfm-body",children:h?t.jsx("div",{className:"wfm-loading",children:"Loading..."}):t.jsxs(t.Fragment,{children:[!fe&&t.jsxs("div",{className:"wfm-tab-row",children:[t.jsxs("button",{className:`btn ${b==="my-steps"?"btn-primary":"btn-secondary"} wfm-tab-btn`,onClick:()=>v("my-steps"),"data-testid":"tab-my-steps",children:[t.jsx(sN,{size:14}),"My Workflow Steps (",r.length,")"]}),t.jsxs("button",{className:`btn ${b==="templates"?"btn-primary":"btn-secondary"} wfm-tab-btn`,onClick:()=>v("templates"),"data-testid":"tab-templates",children:[t.jsx(Xa,{size:14}),"Templates (",l.length,")"]})]}),b==="my-steps"&&!fe&&!N&&t.jsxs(t.Fragment,{children:[r.length===0&&t.jsx("div",{className:"wfm-empty","data-testid":"empty-state",children:"No workflow steps defined. Create one to get started, or add one from the Templates tab."}),r.length>0&&t.jsx("div",{className:"wfm-step-list",children:r.map(O=>t.jsx("div",{className:"wfm-step-card","data-testid":`workflow-step-${O.id}`,children:t.jsxs("div",{className:"wfm-step-card-top",children:[t.jsxs("div",{className:"wfm-step-card-info",children:[t.jsxs("div",{className:"wfm-step-card-title-row",children:[t.jsx("span",{className:"wfm-step-card-name",children:O.name}),t.jsx("span",{className:`wfm-badge ${O.enabled?"wfm-badge-enabled":"wfm-badge-disabled"}`,children:O.enabled?"Enabled":"Disabled"}),t.jsx("span",{className:`wfm-badge ${(O.mode||"prompt")==="script"?"wfm-badge-script":"wfm-badge-prompt"}`,children:(O.mode||"prompt")==="script"?"Script":"AI Prompt"}),t.jsx("span",{className:`wfm-badge ${(O.phase||"pre-merge")==="post-merge"?"wfm-badge-post-merge":"wfm-badge-pre-merge"}`,children:(O.phase||"pre-merge")==="post-merge"?"Post-merge":"Pre-merge"}),t.jsx("span",{className:`wfm-badge ${(O.gateMode||((O.mode||"prompt")==="script"?"gate":"advisory"))==="gate"?"wfm-badge-gate":"wfm-badge-advisory"}`,children:(O.gateMode||((O.mode||"prompt")==="script"?"gate":"advisory"))==="gate"?"Gate":"Advisory"}),O.defaultOn&&t.jsx("span",{className:"wfm-badge wfm-badge-default-on",children:"Default on"})]}),t.jsx("div",{className:"wfm-step-card-desc",children:O.description})]}),t.jsxs("div",{className:"wfm-step-card-actions",children:[t.jsx("button",{className:"btn-icon",onClick:()=>le(O),title:"Edit","aria-label":`Edit ${O.name}`,children:t.jsx(xi,{size:14})}),G===O.id?t.jsxs("div",{className:"wfm-delete-confirm",children:[t.jsx("button",{className:"btn-icon wfm-delete-confirm-btn",onClick:()=>H(O.id),title:"Confirm delete","aria-label":`Confirm delete ${O.name}`,children:t.jsx(Js,{size:14})}),t.jsx("button",{className:"btn-icon",onClick:()=>U(null),title:"Cancel delete","aria-label":"Cancel delete",children:t.jsx(Nn,{size:14})})]}):t.jsx("button",{className:"btn-icon",onClick:()=>U(O.id),title:"Delete","aria-label":`Delete ${O.name}`,children:t.jsx(es,{size:14})})]})]})},O.id))})]}),b==="templates"&&!fe&&!N&&t.jsx(t.Fragment,{children:f?t.jsxs("div",{className:"wfm-loading",children:[t.jsx(Ct,{size:24,className:"spin wfm-spinner"}),"Loading templates..."]}):l.length===0?t.jsx("div",{className:"wfm-empty","data-testid":"no-templates-state",children:"No templates available."}):t.jsx("div",{className:"wfm-template-list",children:l.map(O=>{const se=Px(O.icon),ve=$x(O.category),A=P===O.id;return t.jsx("div",{className:"wfm-template-card","data-testid":`template-${O.id}`,children:t.jsxs("div",{className:"wfm-template-inner",children:[t.jsx("div",{className:"wfm-template-icon",children:t.jsx(se,{size:20})}),t.jsxs("div",{className:"wfm-template-content",children:[t.jsxs("div",{className:"wfm-template-title-row",children:[t.jsx("span",{className:"wfm-template-name",children:O.name}),t.jsx("span",{className:ve,children:O.category}),d[O.id]&&t.jsx("span",{className:"wfm-badge-category wfm-badge-category-plugin",children:d[O.id]})]}),t.jsx("div",{className:"wfm-template-desc",children:O.description}),t.jsx("button",{className:"btn btn-primary wfm-template-add-btn",onClick:()=>Q(O),disabled:A,"data-testid":`add-template-${O.id}`,children:A?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:12,className:"spin"}),"Adding..."]}):t.jsxs(t.Fragment,{children:[t.jsx(os,{size:12}),"Add"]})})]})]})},O.id)})})}),N&&!fe&&t.jsxs("div",{className:"wfm-create-chooser","data-testid":"workflow-step-create-chooser",children:[t.jsx("h3",{className:"wfm-form-title",children:"How would you like to create this workflow step?"}),t.jsx("p",{className:"wfm-create-chooser-hint",children:"Start from a built-in template or create a fully custom workflow step."}),t.jsxs("button",{className:"btn wfm-create-custom-btn",onClick:oe,"data-testid":"create-custom-step",children:[t.jsx(os,{size:14}),"Custom workflow step"]}),f?t.jsxs("div",{className:"wfm-loading","data-testid":"create-chooser-template-loading",children:[t.jsx(Ct,{size:24,className:"spin wfm-spinner"}),"Loading built-in templates..."]}):l.length===0?t.jsx("div",{className:"wfm-empty","data-testid":"create-chooser-no-templates",children:"No built-in templates are available right now. You can still create a custom step."}):t.jsx("div",{className:"wfm-template-list","data-testid":"create-chooser-templates",children:l.map(O=>{const se=Px(O.icon),ve=$x(O.category),A=P===O.id;return t.jsx("div",{className:"wfm-template-card","data-testid":`chooser-template-${O.id}`,children:t.jsxs("div",{className:"wfm-template-inner",children:[t.jsx("div",{className:"wfm-template-icon",children:t.jsx(se,{size:20})}),t.jsxs("div",{className:"wfm-template-content",children:[t.jsxs("div",{className:"wfm-template-title-row",children:[t.jsx("span",{className:"wfm-template-name",children:O.name}),t.jsx("span",{className:ve,children:O.category}),d[O.id]&&t.jsx("span",{className:"wfm-badge-category wfm-badge-category-plugin",children:d[O.id]})]}),t.jsx("div",{className:"wfm-template-desc",children:O.description}),t.jsx("button",{className:"btn btn-primary wfm-template-add-btn",onClick:()=>Q(O),disabled:A,"data-testid":`chooser-add-template-${O.id}`,children:A?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:12,className:"spin"}),"Adding..."]}):t.jsxs(t.Fragment,{children:[t.jsx(os,{size:12}),"Add template"]})})]})]})},O.id)})})]}),fe&&t.jsxs("div",{className:"wfm-form","data-testid":"workflow-step-form",children:[t.jsx("h3",{className:"wfm-form-title",children:g?"New Workflow Step":"Edit Workflow Step"}),t.jsxs("div",{className:"wfm-form-fields",children:[t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Name"}),t.jsx("input",{type:"text",value:w.name,onChange:O=>S(se=>({...se,name:O.target.value})),placeholder:"e.g. Documentation Review","data-testid":"workflow-step-name"})]}),t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Description"}),t.jsx("textarea",{value:w.description,onChange:O=>S(se=>({...se,description:O.target.value})),placeholder:"Brief description of what this step does",rows:2,"data-testid":"workflow-step-description"})]}),t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Execution Mode"}),t.jsxs("div",{className:"wfm-mode-selector","data-testid":"workflow-step-mode-selector",children:[t.jsxs("button",{className:`btn ${w.mode==="prompt"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,mode:"prompt",gateMode:O.gateMode||"advisory",scriptName:""})),"data-testid":"mode-prompt",children:[t.jsx(fa,{size:14}),"AI Prompt"]}),t.jsxs("button",{className:`btn ${w.mode==="script"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,mode:"script",gateMode:"gate",prompt:"",modelProvider:"",modelId:""})),"data-testid":"mode-script",children:[t.jsx(_a,{size:14}),"Run Script"]})]})]}),t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Execution Phase"}),t.jsxs("div",{className:"wfm-mode-selector","data-testid":"workflow-step-phase-selector",children:[t.jsx("button",{className:`btn ${w.phase==="pre-merge"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,phase:"pre-merge"})),"data-testid":"phase-pre-merge",children:"Pre-merge"}),t.jsx("button",{className:`btn ${w.phase==="post-merge"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,phase:"post-merge"})),"data-testid":"phase-post-merge",children:"Post-merge"})]}),t.jsx("div",{className:"wfm-field-hint",children:w.phase==="pre-merge"?"Runs before merge — can block merge on failure":"Runs after merge success — failures are logged but do not block"})]}),t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Failure Behavior"}),t.jsxs("div",{className:"wfm-mode-selector","data-testid":"workflow-step-gate-mode-selector",children:[t.jsx("button",{className:`btn ${w.gateMode==="advisory"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,gateMode:"advisory"})),"data-testid":"gate-mode-advisory",children:"Advisory"}),t.jsx("button",{className:`btn ${w.gateMode==="gate"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,gateMode:"gate"})),"data-testid":"gate-mode-gate",children:"Gate"})]}),t.jsx("div",{className:"wfm-field-hint",children:w.gateMode==="gate"?"Failures block merge and request remediation.":"Failures are recorded as advisory and do not block merge."})]}),w.mode==="prompt"&&t.jsxs("div",{className:"wfm-field",children:[t.jsxs("div",{className:"wfm-prompt-header",children:[t.jsx("label",{children:"Agent Prompt"}),t.jsxs("button",{className:"btn-icon wfm-refine-btn",onClick:ue,disabled:!w.description.trim()||E,title:"Refine with AI","aria-label":"Refine prompt with AI","data-testid":"refine-btn",children:[E?t.jsx(Ct,{size:12,className:"spin"}):t.jsx(Ls,{size:12}),t.jsx("span",{children:"Refine with AI"})]})]}),t.jsx("textarea",{value:w.prompt,onChange:O=>S(se=>({...se,prompt:O.target.value})),placeholder:"Leave empty to use AI refinement",rows:6,className:"wfm-prompt-textarea","data-testid":"workflow-step-prompt"})]}),w.mode==="prompt"&&t.jsxs("div",{className:"wfm-field","data-testid":"workflow-step-model-field",children:[t.jsxs("div",{className:"wfm-model-header",children:[t.jsx("label",{children:"Model Override"}),w.modelProvider&&w.modelId&&t.jsxs("button",{type:"button",className:"btn-icon wfm-model-clear-btn",onClick:()=>S(O=>({...O,modelProvider:"",modelId:""})),title:"Clear model override (use global default)","data-testid":"clear-model-override",children:[t.jsx(Nn,{size:12}),t.jsx("span",{children:"Use default"})]})]}),t.jsx("span",{className:"wfm-model-hint",children:w.modelProvider&&w.modelId?`Using ${w.modelProvider}/${w.modelId}`:"Using global default model"}),t.jsx("div",{"data-testid":"workflow-step-model-select",children:t.jsx(ri,{models:Y,value:g3(w.modelProvider,w.modelId),onChange:O=>{const se=b3(O);S(ve=>({...ve,modelProvider:se.provider,modelId:se.modelId}))},placeholder:"Select a model override…",label:"Model override for this workflow step"})})]}),w.mode==="script"&&t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Script"}),Object.keys(D).length===0?t.jsx("div",{className:"wfm-no-scripts","data-testid":"no-scripts-message",children:"No scripts configured. Add scripts in Settings → Scripts first."}):t.jsxs("select",{value:w.scriptName,onChange:O=>S(se=>({...se,scriptName:O.target.value})),"data-testid":"workflow-step-script-select",children:[t.jsx("option",{value:"",children:"Select a script…"}),Object.entries(D).map(([O,se])=>t.jsxs("option",{value:O,children:[O," (",se,")"]},O))]})]}),t.jsxs("label",{className:"wfm-checkbox-label",children:[t.jsx("input",{type:"checkbox",checked:w.enabled,onChange:O=>S(se=>({...se,enabled:O.target.checked})),"data-testid":"workflow-step-enabled"}),"Enabled (available for selection on new tasks)"]}),t.jsxs("label",{className:"wfm-checkbox-label",children:[t.jsx("input",{type:"checkbox",checked:w.defaultOn,onChange:O=>S(se=>({...se,defaultOn:O.target.checked})),"data-testid":"workflow-step-default-on"}),"Default on for new tasks"]}),t.jsxs("div",{className:"wfm-form-actions",children:[t.jsx("button",{className:"btn btn-secondary",onClick:we,disabled:R,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary",onClick:re,disabled:R||!w.name.trim()||!w.description.trim()||w.mode==="script"&&!w.scriptName.trim(),"data-testid":"save-workflow-step",children:R?"Saving...":g?"Create":"Save"})]})]})]})]})}),!fe&&!N&&t.jsx("div",{className:"wfm-footer",children:t.jsxs("button",{className:"btn btn-primary wfm-footer-add-btn",onClick:J,"data-testid":"add-workflow-step",children:[t.jsx(os,{size:14}),"Add Workflow Step"]})})]})})}const v3=36e5,y3=3e5,dm=[{value:3e5,label:"5m"},{value:9e5,label:"15m"},{value:18e5,label:"30m"},{value:36e5,label:"1h"},{value:108e5,label:"3h"},{value:216e5,label:"6h"},{value:432e5,label:"12h"},{value:864e5,label:"24h"},{value:1728e5,label:"48h"},{value:2592e5,label:"72h"},{value:6048e5,label:"1w"}];function w3(e){return e<1e3?`${e}ms`:e<6e4?`${Math.round(e/1e3)}s`:e<36e5?`${Math.round(e/6e4)}m`:e<864e5?`${Math.round(e/36e5)}h`:e<6048e5?`${Math.round(e/864e5)}d`:`${Math.round(e/6048e5)}w`}function k3(e){return typeof e!="number"||!Number.isFinite(e)?v3:Math.max(y3,Math.round(e))}function aq(e){if(dm.some(s=>s.value===e))return[...dm];const n={value:e,label:`${w3(e)} (custom)`};return[...dm,n].sort((s,a)=>s.value-a.value)}const j3=4,N3=5*6e4;function S3(e){const n=k3(e?.heartbeatIntervalMs);return Math.max(n*j3,N3)}function Dx(e){const n=Math.floor(e/6e4);if(n<1)return"<1m";const s=Math.floor(n/60),a=n%60;return s>0&&a>0?`${s}h ${a}m`:s>0?`${s}h`:`${a}m`}function C3(e){const n=e.metadata;return n&&(n.agentKind==="task-worker"||n.taskWorker===!0||n.managedBy==="task-executor")?!0:!!(e.role==="executor"&&e.name?.startsWith("executor-")&&e.taskId)}function E3(e){const s=e.metadata?.heartbeatTimerRepair;if(!s||typeof s!="object")return{};const a=s;return{repairedAt:typeof a.repairedAt=="string"?a.repairedAt:void 0,staleAtRepair:typeof a.staleAtRepair=="boolean"?a.staleAtRepair:void 0,staleRepairReason:typeof a.staleRepairReason=="string"?a.staleRepairReason:void 0}}function _3(e){const{state:n,lastHeartbeatAt:s,lastError:a,pauseReason:r,runtimeConfig:o}=e,l=C3(e),c=l||o?.enabled!==!1;if(n==="error")return{label:a??"Error",icon:t.jsx(fi,{size:14}),color:"var(--state-error-text)",stateDerived:!a};if(n==="paused")return{label:r?`Paused: ${r}`:"Paused",icon:t.jsx(Vi,{size:14}),color:"var(--state-paused-text)",stateDerived:!r};if(n==="running"||l&&n==="active")return{label:"Running",icon:t.jsx(fi,{size:14}),color:"var(--state-active-text)",stateDerived:!0};if(!c)return{label:"Heartbeat Disabled",icon:t.jsx(Vi,{size:14}),color:"var(--state-paused-text)",stateDerived:!1};if(!s)return{label:n==="active"?"Starting...":"Idle",icon:t.jsx(As,{size:14}),color:"var(--text-muted)",stateDerived:!1};const d=E3(e);if(d.staleAtRepair&&d.repairedAt){const f=Date.parse(d.repairedAt),p=Date.parse(s);if(Number.isFinite(f)&&Number.isFinite(p)&&p<f)return{label:"Unresponsive",icon:t.jsx(fi,{size:14}),color:"var(--state-error-text)",stateDerived:!1,reason:d.staleRepairReason??"Heartbeat scheduler repaired a missing timer; waiting for recovery heartbeat"}}const u=new Date(s).getTime(),h=Date.now()-u,m=S3(o);if(h>m){const f=`No heartbeat for ${Dx(h)} (threshold: ${Dx(m)})`;return{label:"Unresponsive",icon:t.jsx(fi,{size:14}),color:"var(--state-error-text)",stateDerived:!1,reason:f}}return{label:"Healthy",icon:t.jsx(bS,{size:14}),color:"var(--state-active-text)",stateDerived:!1}}function gd({agent:e,size:n=36,className:s}){const[a,r]=i.useState(!1);i.useEffect(()=>{r(!1)},[e.imageUrl]);const o=i.useMemo(()=>{if(!e.imageUrl)return;const l=encodeURIComponent(e.updatedAt??""),c=e.imageUrl.includes("?")?"&":"?";return`${e.imageUrl}${c}t=${l}`},[e.imageUrl,e.updatedAt]);return t.jsx("span",{className:`agent-avatar${s?` ${s}`:""}`,style:{width:`${n}px`,height:`${n}px`},"aria-label":`${e.name} avatar`,children:o&&!a?t.jsx("img",{src:o,alt:`${e.name} avatar`,onError:()=>r(!0)}):e.icon?.trim()?t.jsx("span",{className:"agent-avatar-emoji",style:{fontSize:`calc(${n}px * 0.58)`},"aria-hidden":"true",children:e.icon}):t.jsx(As,{size:Math.max(14,Math.round(n*.55)),"aria-hidden":"true"})})}const M3="https://github.com/Runfusion/Fusion/issues/new";function R3(e,n){const s=`[Agent Error] ${n.surface}${n.agentName?` - ${n.agentName}`:""}`,a=["## Agent Error Report","",`- Surface: ${n.surface}`,`- Agent ID: ${n.agentId??"unknown"}`,`- Agent Name: ${n.agentName??"unknown"}`,`- Agent State: ${n.agentState??"unknown"}`,`- Run ID: ${n.runId??"n/a"}`,`- Task ID: ${n.taskId??"n/a"}`,`- Timestamp: ${n.timestamp??new Date().toISOString()}`,"","## Error","```text",e,"```"],r=new URLSearchParams({title:s,body:a.join(`
740
+ `)},500))},[fe,s,O,z,f]),i.useEffect(()=>{if(!d||!M.current)return;M.current.options.fontSize=g,_.current!==null&&(cancelAnimationFrame(_.current),_.current=null);const Ae=requestAnimationFrame(()=>{_.current=null,Ne()});return _.current=Ae,()=>{_.current===Ae&&(cancelAnimationFrame(Ae),_.current=null)}},[g,d,Ne]),i.useEffect(()=>{if(!e)return;const Ae=it=>{if(!(!it.ctrlKey&&!it.metaKey)){if(it.code==="Equal"||it.code==="NumpadAdd"){it.preventDefault(),j(xt=>xl(xt+1));return}if(it.code==="Minus"||it.code==="NumpadSubtract"){it.preventDefault(),j(xt=>xl(xt-1));return}if(it.code==="Digit0"||it.code==="Numpad0"){it.preventDefault(),j(bl);return}}};return window.addEventListener("keydown",Ae),()=>window.removeEventListener("keydown",Ae)},[e,Ne]),i.useEffect(()=>{if(!e)return;const Ae=it=>{it.key==="Escape"&&n()};return document.addEventListener("keydown",Ae),()=>document.removeEventListener("keydown",Ae)},[e,n]),i.useEffect(()=>{fe==="connected"&&M.current&&setTimeout(()=>{if(!M.current||!R.current)return;const Ae=R.current.querySelector(".xterm-helper-textarea");Ae&&Ae.focus();try{R.current.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0}))}catch{}},100)},[fe]);const He=i.useCallback(()=>{if(!R.current||typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(hover: none) and (pointer: coarse)")?.matches===!0)return;M.current?.focus();const it=R.current.querySelector(".xterm-helper-textarea");if(!it)return;it.autocapitalize="off",it.autocomplete="off",it.autocorrect="off",it.spellcheck=!1,it.setAttribute("inputmode","text");try{it.focus({preventScroll:!0})}catch{it.focus()}const xt=it.value.length;it.setSelectionRange(xt,xt)},[]);i.useEffect(()=>ge(()=>{M.current?.clear(),c(null),U.current=!1,M.current&&(M.current.dispose(),M.current=null),G.current=null,P.current=!1,W.current&&(window.removeEventListener("resize",W.current),W.current=null),u(!1),m(null),be().catch(it=>{console.error("Failed to replace invalid terminal session:",it)})}),[ge,be]);const Le=i.useCallback(Ae=>{Ae.target===Ae.currentTarget&&(E.current=!0)},[]),de=i.useCallback(Ae=>{E.current&&Ae.target===Ae.currentTarget&&n(),E.current=!1},[n]),Re=i.useCallback(()=>{M.current?.clear()},[]),Pe=i.useCallback(async()=>{M.current?.clear(),c(null),U.current=!1;try{await ue()}catch(Ae){o(Ce(Ae)||"Failed to restart terminal session")}},[ue]),rt=i.useCallback(()=>{M.current&&(M.current.dispose(),M.current=null),G.current=null,P.current=!1,W.current&&(window.removeEventListener("resize",W.current),W.current=null),m(null),u(!1)},[]),qe=i.useCallback(()=>{window.location.reload()},[]),Xe=i.useCallback(()=>{j(Ae=>xl(Ae+1))},[]),At=i.useCallback(()=>{j(Ae=>xl(Ae-1))},[]),at=i.useCallback(Ae=>{S(it=>it===Ae?null:Ae)},[]),Se=i.useCallback(Ae=>{if(w==="ctrl"){O(Rz(Ae)),S(null);return}if(w==="alt"){O(Az(Ae)),S(null);return}O(Ae)},[O,w]),pe=i.useCallback(Ae=>{O(Ae),S(null)},[O]);if(!e)return null;const _e=()=>{switch(fe){case"connected":return t.jsx("span",{className:"terminal-status connected",title:"Connected"});case"connecting":case"reconnecting":return t.jsx("span",{className:"terminal-status connecting",title:"Connecting..."});case"disconnected":return t.jsx("span",{className:"terminal-status disconnected",title:"Disconnected"});default:return null}},et=!J||!z&&!oe;return t.jsx("div",{className:"modal-overlay open",onMouseDown:Le,onMouseUp:de,role:"dialog","aria-modal":"true","data-testid":"terminal-modal-overlay",style:b>0?{"--overlay-padding-top":"0px"}:void 0,children:t.jsxs("div",{ref:I,className:"modal terminal-modal","data-testid":"terminal-modal",style:b>0?{"--keyboard-overlap":`${b}px`,"--vv-height":x?`${x}px`:void 0}:void 0,children:[t.jsxs("div",{className:"terminal-header",children:[t.jsxs("div",{className:"terminal-tabs","data-testid":"terminal-tabs",children:[k.map(Ae=>t.jsxs("div",{className:`terminal-tab ${Ae.isActive?"terminal-tab--active":""}`,onClick:()=>re(Ae.id),title:Ae.title,role:"tab","aria-selected":Ae.isActive,children:[t.jsx("span",{className:"terminal-tab-label",children:Ae.title}),k.length>1&&t.jsx("button",{className:"terminal-tab-close",onClick:it=>{it.stopPropagation(),we(Ae.id)},title:"Close tab",children:"×"})]},Ae.id)),t.jsx("button",{className:"terminal-tab terminal-tab--new",onClick:le,title:"New terminal",children:"+"})]}),t.jsxs("div",{className:"terminal-title","data-testid":"terminal-title",children:[t.jsx(_a,{size:16}),_e()]}),t.jsxs("div",{className:"terminal-actions","data-testid":"terminal-actions",children:[fe==="disconnected"&&z&&t.jsxs("button",{className:"terminal-reconnect-btn",onClick:ee,title:"Reconnect","data-testid":"terminal-reconnect-btn",children:[t.jsx(Ss,{size:14}),t.jsx("span",{className:"terminal-action-label",children:"Reconnect"})]}),l!==null&&t.jsxs("button",{className:"terminal-restart-btn",onClick:Pe,title:"New Session","data-testid":"terminal-restart-btn",children:[t.jsx(Ss,{size:14}),t.jsx("span",{className:"terminal-action-label",children:"New Session"})]}),t.jsxs("button",{className:"terminal-clear-btn",onClick:Re,"data-testid":"terminal-clear-btn",title:"Clear terminal",children:[t.jsx(es,{size:14}),t.jsx("span",{className:"terminal-action-label",children:"Clear"})]}),t.jsxs("button",{className:"terminal-clear-btn terminal-clear-btn--shortcut",onClick:()=>C(Ae=>!Ae),"data-testid":"terminal-shortcut-toggle",title:"Shortcuts","aria-pressed":N,children:[t.jsx(NS,{size:14}),t.jsx("span",{className:"terminal-action-label",children:"Shortcuts"})]}),t.jsx("button",{className:"terminal-close",onClick:n,"data-testid":"terminal-close-btn",title:"Close terminal",children:t.jsx(Nn,{size:20})})]})]}),r&&t.jsx("div",{className:"terminal-error","data-testid":"terminal-error",children:r}),t.jsxs("div",{className:"terminal-container","data-testid":"terminal-container",children:[et&&!oe&&t.jsxs("div",{className:"terminal-loading","data-testid":"terminal-loading",children:[t.jsx("div",{className:"terminal-spinner"}),t.jsx("span",{children:"Starting terminal..."})]}),oe&&!z&&t.jsx("div",{className:"terminal-loading","data-testid":"terminal-bootstrap-error",children:t.jsxs("div",{className:"terminal-error-content",children:[t.jsxs("span",{children:["Failed to start terminal: ",oe]}),t.jsxs("div",{className:"terminal-error-actions",children:[t.jsxs("button",{className:"terminal-retry-btn",onClick:Q,"data-testid":"terminal-retry-btn",children:[t.jsx(Ss,{size:14}),"Retry"]}),t.jsxs("button",{className:"terminal-retry-btn",onClick:qe,"data-testid":"terminal-bootstrap-refresh-btn",children:[t.jsx(Ss,{size:14}),"Refresh page"]})]})]})}),h&&z&&t.jsx("div",{className:"terminal-loading","data-testid":"terminal-xterm-init-error",children:t.jsxs("div",{className:"terminal-error-content",children:[t.jsxs("span",{children:["Terminal UI failed to initialize: ",h]}),t.jsxs("div",{className:"terminal-error-actions",children:[t.jsxs("button",{className:"terminal-retry-btn",onClick:rt,"data-testid":"terminal-reinit-btn",children:[t.jsx(Ss,{size:14}),"Reinitialize"]}),t.jsxs("button",{className:"terminal-retry-btn",onClick:qe,"data-testid":"terminal-xterm-refresh-btn",children:[t.jsx(Ss,{size:14}),"Refresh page"]})]})]})}),t.jsx("div",{ref:R,className:"terminal-xterm","data-testid":"terminal-xterm",onPointerDown:He,onTouchStart:He},z?.sessionId)]}),N&&t.jsxs("div",{className:"terminal-shortcut-panel","data-testid":"terminal-shortcut-panel",children:[t.jsxs("div",{className:"terminal-shortcut-modifier-row",children:[t.jsx("button",{type:"button",className:`terminal-shortcut-btn terminal-shortcut-btn--modifier ${w==="ctrl"?"is-active":""}`,"data-testid":"terminal-modifier-ctrl",onClick:()=>at("ctrl"),"aria-pressed":w==="ctrl",children:"Ctrl"}),t.jsx("button",{type:"button",className:`terminal-shortcut-btn terminal-shortcut-btn--modifier ${w==="alt"?"is-active":""}`,"data-testid":"terminal-modifier-alt",onClick:()=>at("alt"),"aria-pressed":w==="alt",children:"Alt"}),t.jsx("button",{type:"button",className:"terminal-shortcut-btn",onClick:()=>pe("\x1B"),children:"ESC"}),t.jsx("button",{type:"button",className:"terminal-shortcut-btn",onClick:()=>pe(" "),children:"Tab"})]}),Tz.map(Ae=>t.jsx("button",{type:"button",className:"terminal-shortcut-btn",onClick:()=>Se(Ae.key),title:Ae.description,children:Ae.label},Ae.label))]}),t.jsxs("div",{className:"terminal-status-bar","data-testid":"terminal-status-bar",children:[t.jsxs("span",{className:`terminal-connection-status ${fe}`,children:[fe==="connected"&&"Connected",fe==="connecting"&&"Connecting...",fe==="reconnecting"&&"Reconnecting...",fe==="disconnected"&&"Disconnected"]}),l!==null&&t.jsxs("span",{className:"terminal-exit-code","data-testid":"terminal-exit-code",children:["Exit: ",l]}),t.jsxs("span",{className:"terminal-font-size-controls",children:[t.jsx("button",{type:"button",className:"terminal-font-size-btn",onClick:At,"data-testid":"terminal-font-size-decrease","aria-label":"Decrease terminal font size",children:t.jsx(KS,{size:14})}),t.jsxs("span",{className:"terminal-font-size-value","data-testid":"terminal-font-size-value",children:[g,"px"]}),t.jsx("button",{type:"button",className:"terminal-font-size-btn",onClick:Xe,"data-testid":"terminal-font-size-increase","aria-label":"Increase terminal font size",children:t.jsx(os,{size:14})})]}),t.jsx("span",{className:"terminal-shortcuts",children:"Ctrl++/- zoom • ⌨ Shortcuts panel • Esc close"})]})]})})}const sl={name:"",command:""};function gx(e){return/^[a-zA-Z0-9_-]+$/.test(e)}function zz(e,n=60){return e.length<=n?e:e.slice(0,n-3)+"..."}function Bz({isOpen:e,onClose:n,addToast:s,projectId:a,onRunScript:r}){ta(e);const[o,l]=i.useState({}),[c,d]=i.useState(!0),[u,h]=i.useState(!1),[m,f]=i.useState(null),[p,b]=i.useState(sl),[v,x]=i.useState(!1),[y,g]=i.useState(null),[j,N]=i.useState(null),C=Aa(n),w=i.useCallback(async()=>{try{d(!0);const D=await Rl(a);l(D)}catch(D){s(Ce(D)||"Failed to load scripts","error")}finally{d(!1)}},[s,a]);i.useEffect(()=>{e&&w()},[e,w]);const S=i.useCallback(()=>{h(!0),f(null),b(sl),N(null)},[]),R=i.useCallback((D,W)=>{f(D),h(!1),b({name:D,command:W}),N(null)},[]),I=i.useCallback(()=>{f(null),h(!1),b(sl),N(null)},[]),E=i.useCallback(D=>{b(W=>({...W,name:D})),D&&!gx(D)?N("Name must contain only letters, numbers, hyphens, and underscores (no spaces)"):N(null)},[]),M=i.useCallback(async()=>{const D=p.name.trim(),W=p.command.trim();if(!D){s("Script name is required","error");return}if(!gx(D)){s("Script name must contain only letters, numbers, hyphens, and underscores (no spaces)","error");return}if(!W){s("Script command is required","error");return}x(!0);try{await JE(D,W,a),s(m?"Script updated":"Script created","success"),f(null),h(!1),b(sl),N(null),await w()}catch(Y){const L=Ce(Y);L?.includes("already exists")?s("A script with this name already exists","error"):s(L||"Failed to save script","error")}finally{x(!1)}},[p,m,s,w,a]),G=i.useCallback(async D=>{try{await YE(D,a),s("Script deleted","success"),g(null),m===D&&(f(null),b(sl)),await w()}catch(W){s(Ce(W)||"Failed to delete script","error")}},[m,s,w,a]),U=i.useCallback((D,W)=>{r&&r(D,W)},[r]);if(!e)return null;const P=u||m!==null,T=Object.entries(o).map(([D,W])=>({name:D,command:W}));return t.jsx("div",{className:"modal-overlay open",...C,"data-testid":"scripts-modal",children:t.jsxs("div",{className:"modal scripts-modal",role:"dialog","aria-modal":"true","aria-label":"Scripts",children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("h2",{children:[t.jsx(_a,{size:18,style:{marginRight:"8px",verticalAlign:"middle"}}),"Scripts"]}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close",children:"×"})]}),t.jsx("div",{className:"modal-body scripts-modal-body",children:c?t.jsxs("div",{style:{textAlign:"center",padding:"32px",color:"var(--text-muted)"},children:[t.jsx(Ct,{size:24,className:"spin",style:{margin:"0 auto 8px",display:"block"}}),"Loading scripts..."]}):P?t.jsxs("div",{className:"scripts-modal-form",style:{display:"flex",flexDirection:"column",gap:"16px"},children:[t.jsxs("div",{children:[t.jsx("label",{htmlFor:"script-name",style:{display:"block",marginBottom:"4px",fontSize:"13px",fontWeight:500,color:"var(--text)"},children:"Script Name"}),t.jsx("input",{id:"script-name",type:"text",className:"input",value:p.name,onChange:D=>E(D.target.value),placeholder:"e.g., build, test, lint",disabled:v||m!==null,"data-testid":"script-name-input",style:{width:"100%",borderColor:j?"var(--color-error)":void 0}}),j&&t.jsx("div",{style:{fontSize:"12px",color:"var(--color-error)",marginTop:"4px"},"data-testid":"script-name-error",children:j}),t.jsx("div",{style:{fontSize:"11px",color:"var(--text-muted)",marginTop:"4px"},children:"Letters, numbers, hyphens, and underscores only"})]}),t.jsxs("div",{children:[t.jsx("label",{htmlFor:"script-command",style:{display:"block",marginBottom:"4px",fontSize:"13px",fontWeight:500,color:"var(--text)"},children:"Command"}),t.jsx("textarea",{id:"script-command",className:"input",value:p.command,onChange:D=>b(W=>({...W,command:D.target.value})),placeholder:"e.g., npm run build",rows:3,disabled:v,"data-testid":"script-command-input",style:{width:"100%",resize:"vertical",fontFamily:"monospace"}})]}),t.jsxs("div",{className:"scripts-modal-form-actions",style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[t.jsx("button",{className:"btn btn-secondary",onClick:I,disabled:v,"data-testid":"script-cancel-btn",children:"Cancel"}),t.jsx("button",{className:"btn btn-primary",onClick:M,disabled:v||!!j,"data-testid":"script-save-btn",children:v?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:14,className:"spin",style:{marginRight:"6px"}}),"Saving..."]}):m?"Update":"Create"})]})]}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"scripts-modal-list-header",style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"16px"},children:[t.jsx("div",{style:{fontSize:"13px",color:"var(--text-muted)"},children:T.length===0?"No scripts defined":`${T.length} script${T.length===1?"":"s"}`}),t.jsxs("button",{className:"btn btn-primary",onClick:S,"data-testid":"add-script-btn",style:{display:"flex",alignItems:"center",gap:"6px"},children:[t.jsx(os,{size:14}),"Add Script"]})]}),T.length===0?t.jsxs("div",{style:{textAlign:"center",padding:"32px",color:"var(--text-muted)",fontSize:"14px",border:"1px dashed var(--border)",borderRadius:"8px"},"data-testid":"empty-state",children:[t.jsx(_a,{size:32,style:{margin:"0 auto 12px",opacity:.5}}),t.jsx("div",{children:"No scripts defined yet."}),t.jsx("div",{style:{marginTop:"4px",fontSize:"12px"},children:"Add scripts to quickly run common commands from the dashboard."})]}):t.jsx("div",{className:"scripts-modal-list",style:{display:"flex",flexDirection:"column",gap:"8px"},children:T.map(D=>t.jsx("div",{className:"script-card","data-testid":`script-${D.name}`,style:{padding:"12px 16px",border:"1px solid var(--border)",borderRadius:"8px",background:"var(--card)"},children:t.jsxs("div",{className:"script-card-header",style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"},children:[t.jsxs("div",{style:{flex:1,minWidth:0},children:[t.jsx("div",{style:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"4px"},children:t.jsx("span",{style:{fontWeight:600,fontSize:"14px",fontFamily:"monospace"},children:D.name})}),t.jsx("div",{style:{fontSize:"12px",color:"var(--text-muted)",fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:D.command,children:zz(D.command)})]}),t.jsxs("div",{className:"script-card-actions",style:{display:"flex",gap:"4px",marginLeft:"8px",flexShrink:0},children:[t.jsxs("button",{className:"btn btn-secondary",onClick:()=>U(D.name,D.command),title:"Run script","aria-label":`Run ${D.name}`,"data-testid":`run-script-${D.name}`,style:{display:"flex",alignItems:"center",gap:"4px",padding:"4px 10px",fontSize:"12px"},children:[t.jsx(Os,{size:12}),"Run"]}),t.jsx("button",{className:"btn-icon",onClick:()=>R(D.name,D.command),title:"Edit","aria-label":`Edit ${D.name}`,"data-testid":`edit-script-${D.name}`,children:t.jsx(os,{size:14,style:{transform:"rotate(45deg)"}})}),y===D.name?t.jsxs("div",{className:"script-delete-confirm",style:{display:"flex",gap:"4px",alignItems:"center"},children:[t.jsx("button",{className:"btn-icon",onClick:()=>G(D.name),title:"Confirm delete","aria-label":`Confirm delete ${D.name}`,"data-testid":`confirm-delete-script-${D.name}`,style:{color:"var(--color-error)"},children:t.jsx(es,{size:14})}),t.jsx("button",{className:"btn-icon",onClick:()=>g(null),title:"Cancel delete","aria-label":"Cancel delete","data-testid":`cancel-delete-script-${D.name}`,children:t.jsx(Nn,{size:14})})]}):t.jsx("button",{className:"btn-icon",onClick:()=>g(D.name),title:"Delete","aria-label":`Delete ${D.name}`,"data-testid":`delete-script-${D.name}`,children:t.jsx(es,{size:14})})]})]})},D.name))})]})})]})})}function Uz(e,n,s){const[a,r]=i.useState([]),[o,l]=i.useState("."),[c,d]=i.useState(!1),[u,h]=i.useState(null),[m,f]=i.useState(0),p=i.useCallback(()=>{f(v=>v+1)},[]),b=i.useCallback(v=>{l(v),h(null)},[]);return i.useEffect(()=>{l("."),h(null),r([])},[e]),i.useEffect(()=>{if(!n||!e)return;let v=!1;async function x(){d(!0),h(null);try{const y=await cE(e,o==="."?void 0:o,s);v||r(y.entries)}catch(y){v||(h(Ce(y)||"Failed to load files"),r([]))}finally{v||d(!1)}}return x(),()=>{v=!0}},[e,o,n,m,s]),{entries:a,currentPath:o,setPath:b,loading:c,error:u,refresh:p}}function Hz(e,n,s,a){const[r,o]=i.useState(""),[l,c]=i.useState(""),[d,u]=i.useState(null),[h,m]=i.useState(!1),[f,p]=i.useState(!1),[b,v]=i.useState(null),x=i.useCallback(j=>{o(j),v(null)},[]);i.useEffect(()=>{if(!e||!n){o(""),c(""),u(null),v(null);return}let j=!1;async function N(){m(!0),v(null);try{const C=await dE(e,n,a);j||(o(C.content),c(C.content),u(C.mtime))}catch(C){j||(v(Ce(C)||"Failed to load file"),o(""),c(""),u(null))}finally{j||m(!1)}}return N(),()=>{j=!0}},[e,n,s,a]);const y=r!==l,g=i.useCallback(async()=>{if(!(!e||!n||!y)){p(!0),v(null);try{const j=await uE(e,n,r,a);c(r),u(j.mtime)}catch(j){throw v(Ce(j)||"Failed to save file"),j}finally{p(!1)}}},[e,n,r,y,a]);return{content:r,setContent:x,originalContent:l,loading:h,saving:f,error:b,save:g,hasChanges:y,mtime:d}}const qz=1e4;function Vz(e){const s=e.replace(/[\\/]+$/,"").split(/[\\/]/).filter(Boolean);return s[s.length-1]||e||"Project Root"}function Wz(e){return{id:e.id,label:e.id,title:e.title,worktree:e.worktree,kind:"task"}}function Gz(e){const[n,s]=i.useState("Project Root"),[a,r]=i.useState([]),[o,l]=i.useState(!0),[c,d]=i.useState(null);return i.useEffect(()=>{let u=!1;async function h(){try{const f=await lE(e);if(u)return;s(Vz(f.project)),r(f.tasks.map(Wz)),d(null)}catch(f){u||d(Ce(f)||"Failed to load workspaces")}finally{u||l(!1)}}h();const m=window.setInterval(()=>{h()},qz);return()=>{u=!0,window.clearInterval(m)}},[e]),{projectName:n,workspaces:a,loading:o,error:c}}function Kz(e){return e===void 0?"":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function Jz(e){return e?new Date(e).toLocaleDateString():""}function bx(e,n){return TR(e,n)}const il={visible:!1,x:0,y:0,entry:null,entryFullPath:""},am={type:null,entry:null,entryFullPath:""},Yz=200,Xz=500,xx=10;function Qz({x:e,y:n,entry:s,onAction:a,onClose:r}){const o=i.useRef(null),[l,c]=i.useState({x:e,y:n});i.useEffect(()=>{const h=o.current;if(!h)return;const m=h.getBoundingClientRect(),f=window.visualViewport,p=f?.width&&f.width>0?f.width:window.innerWidth,b=f?.height&&f.height>0?f.height:window.innerHeight,v=f?.offsetLeft??0,x=f?.offsetTop??0,y=8;let g=e-v,j=n-x;g+m.width>p-y&&(g=p-y-m.width),j+m.height>b-y&&(j=b-y-m.height),g<y&&(g=y),j<y&&(j=y),c({x:g+v,y:j+x})},[e,n]),i.useEffect(()=>{const h=m=>{m.key==="Escape"&&r()};return document.addEventListener("keydown",h),()=>document.removeEventListener("keydown",h)},[r]);const d=s.type==="directory",u=[{id:"copy",label:"Copy",icon:ga,disabled:!1},{id:"move",label:"Move",icon:XS,disabled:!1},{id:"rename",label:"Rename",icon:xi,disabled:!1},...d?[{id:"download-zip",label:"Download as ZIP",icon:Ar,disabled:!1}]:[{id:"download",label:"Download",icon:TN,disabled:!1}],{id:"divider",label:"",icon:ga,disabled:!0},{id:"delete",label:"Delete",icon:es,disabled:!1}];return t.jsx("div",{className:"context-menu-overlay",onClick:r,children:t.jsx("div",{ref:o,className:"file-browser-context-menu",role:"menu","aria-label":"File operations",style:{left:l.x,top:l.y},onClick:h=>h.stopPropagation(),children:u.map(h=>h.id==="divider"?t.jsx("div",{className:"file-browser-context-menu__divider",role:"separator"},"divider"):t.jsxs("button",{role:"menuitem",className:`file-browser-context-menu__item ${h.disabled?"file-browser-context-menu__disabled":""} ${h.id==="delete"?"file-browser-context-menu__item--danger":""}`,disabled:h.disabled,onClick:()=>a(h.id),children:[t.jsx(h.icon,{size:14,className:"file-browser-context-menu__item-icon"}),t.jsx("span",{children:h.label})]},h.id))})})}function Zz({type:e,entry:n,entryFullPath:s,onConfirm:a,onCancel:r,loading:o,error:l}){const c=i.useRef(null),d=e==="rename"?n.name:"",[u,h]=i.useState(d);i.useEffect(()=>{setTimeout(()=>c.current?.focus(),50)},[]),i.useEffect(()=>{if(e==="rename"&&c.current){const b=n.name.lastIndexOf(".");b>0?c.current.setSelectionRange(0,b):c.current.select()}},[e,n.name]);const m=b=>{b.key==="Enter"&&u.trim()&&a(u.trim()),b.key==="Escape"&&r()};if(e==="delete")return t.jsx("div",{className:"context-menu-overlay",onClick:r,children:t.jsxs("div",{className:"file-browser-dialog",onClick:b=>b.stopPropagation(),children:[t.jsxs("div",{className:"file-browser-dialog-title",children:["Delete ",n.type==="directory"?"Folder":"File"]}),t.jsxs("div",{className:"file-browser-dialog-message",children:["Are you sure you want to delete ",t.jsx("strong",{children:n.name}),"?",n.type==="directory"&&" This will delete all contents recursively."]}),l&&t.jsx("div",{className:"file-browser-dialog-error",children:l}),t.jsxs("div",{className:"file-browser-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:r,disabled:o,children:"Cancel"}),t.jsx("button",{className:"btn btn-danger btn-sm",onClick:()=>a(""),disabled:o,children:o?"Deleting...":"Delete"})]})]})});const p={copy:{title:"Copy",placeholder:"Destination path",confirm:"Copy"},move:{title:"Move",placeholder:"Destination path",confirm:"Move"},rename:{title:"Rename",placeholder:"New name",confirm:"Rename"}}[e];return t.jsx("div",{className:"context-menu-overlay",onClick:r,children:t.jsxs("div",{className:"file-browser-dialog",onClick:b=>b.stopPropagation(),children:[t.jsx("div",{className:"file-browser-dialog-title",children:p.title}),t.jsx("div",{className:"file-browser-dialog-info",children:e==="rename"?n.name:s}),t.jsx("input",{ref:c,className:"file-browser-dialog-input",type:"text",value:u,onChange:b=>h(b.target.value),placeholder:p.placeholder,onKeyDown:m,disabled:o}),l&&t.jsx("div",{className:"file-browser-dialog-error",children:l}),t.jsxs("div",{className:"file-browser-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:r,disabled:o,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>a(u.trim()),disabled:o||!u.trim(),children:o?`${p.confirm}ing...`:p.confirm})]})]})})}function e6({entries:e,currentPath:n,onSelectFile:s,onNavigate:a,loading:r,error:o,onRetry:l,workspace:c,onRefresh:d,projectId:u}){const[h,m]=i.useState(il),[f,p]=i.useState(am),[b,v]=i.useState(!1),[x,y]=i.useState(null),[g,j]=i.useState(!1),[N,C]=i.useState(null),w=i.useRef(null),S=i.useRef(null),R=i.useRef(null),I=i.useRef(!1),E=i.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null),S.current!==null&&(window.clearTimeout(S.current),S.current=null)},[]),M=i.useCallback(()=>{E(),R.current=null,j(!1),C(null)},[E]);i.useEffect(()=>()=>{E()},[E]);const G=i.useCallback((F,ae,k,z)=>{m({visible:!0,x:F,y:ae,entry:k,entryFullPath:z})},[]),U=i.useCallback((F,ae,k)=>{if(F.touches.length!==1)return;const z=F.touches[0];z&&(M(),R.current={x:z.clientX,y:z.clientY},S.current=window.setTimeout(()=>{j(!0),C(k)},Yz),w.current=window.setTimeout(()=>{const J=R.current;J&&(I.current=!0,j(!1),C(null),E(),G(J.x,J.y,ae,k))},Xz))},[M,E,G]),P=i.useCallback(F=>{const ae=R.current,k=F.touches[0];!ae||!k||(Math.abs(k.clientX-ae.x)>xx||Math.abs(k.clientY-ae.y)>xx)&&M()},[M]),T=i.useCallback(()=>{M()},[M]);i.useEffect(()=>{if(!h.visible)return;const F=document.querySelector(".file-browser-list"),ae=()=>{I.current=!1,M(),m(il)};return F?.addEventListener("scroll",ae),()=>F?.removeEventListener("scroll",ae)},[M,h.visible]),i.useEffect(()=>{if(!h.visible)return;const F=ae=>{ae.key==="Escape"&&(I.current=!1,m(il))};return document.addEventListener("keydown",F),()=>document.removeEventListener("keydown",F)},[h.visible]);const D=i.useCallback((F,ae)=>{F.preventDefault(),F.stopPropagation(),M(),I.current=!1,G(F.clientX,F.clientY,ae,bx(n,ae.name))},[M,n,G]),W=i.useCallback(F=>{if(!h.entry)return;I.current=!1;const ae=h.entry,k=h.entryFullPath;if(m(il),F==="download"){if(!c)return;const z=oy(c,k,u);window.open(Qi(z),"_blank");return}if(F==="download-zip"){if(!c)return;const z=bE(c,k,u);window.open(Qi(z),"_blank");return}p({type:F,entry:ae,entryFullPath:k}),y(null)},[h,c,u]),Y=i.useCallback(async F=>{if(!(!f.type||!f.entry||!c)){v(!0),y(null);try{switch(f.type){case"copy":await hE(c,f.entryFullPath,F,u);break;case"move":await fE(c,f.entryFullPath,F,u);break;case"rename":await gE(c,f.entryFullPath,F,u);break;case"delete":await pE(c,f.entryFullPath,u);break}p(am),d?.()}catch(ae){y(Ce(ae)||"Operation failed")}finally{v(!1)}}},[f,c,d,u]),L=i.useCallback(()=>{p(am),y(null)},[]),_=i.useCallback((F,ae)=>{if(I.current){I.current=!1;return}h.visible||(F.type==="directory"?a(ae):s(ae))},[h.visible,a,s]);return r?t.jsxs("div",{className:"file-browser-loading",children:[t.jsx(Ct,{className:"spin",size:24}),t.jsx("span",{children:"Loading files..."})]}):o?t.jsxs("div",{className:"file-browser-error",children:[t.jsxs("p",{children:["Error: ",o]}),l&&t.jsx("button",{className:"btn btn-sm",onClick:l,children:"Retry"})]}):t.jsxs("div",{className:"file-browser",children:[t.jsxs("div",{className:"file-browser-header",children:[n!=="."&&t.jsxs("button",{className:"file-browser-up",onClick:()=>{a(IR(n))},children:[t.jsx(ps,{size:16,style:{transform:"rotate(-90deg)"}}),"Up one level"]}),t.jsx("span",{className:"file-browser-path",children:n==="."?"Root":Oo(n)})]}),t.jsx("div",{className:"file-browser-list",children:e.length===0?t.jsx("div",{className:"file-browser-empty",children:"(empty directory)"}):e.map(F=>{const ae=bx(n,F.name),k=g&&N===ae;return t.jsxs("div",{className:`file-node file-node--${F.type} ${k?"file-node--long-pressing":""}`,onClick:()=>_(F,ae),onContextMenu:z=>D(z,F),onTouchStart:z=>U(z,F,ae),onTouchMove:P,onTouchEnd:T,onTouchCancel:T,children:[t.jsx("div",{className:"file-node-icon",children:F.type==="directory"?t.jsx(Qs,{size:16}):t.jsx(Bv,{size:16})}),t.jsx("div",{className:"file-node-name",children:F.name}),F.type==="file"&&F.size!==void 0&&t.jsx("div",{className:"file-node-size",children:Kz(F.size)}),F.mtime&&t.jsx("div",{className:"file-node-time",children:Jz(F.mtime)})]},F.name)})}),h.visible&&h.entry&&t.jsx(Qz,{x:h.x,y:h.y,entry:h.entry,onAction:W,onClose:()=>{I.current=!1,m(il)}}),f.type&&f.entry&&t.jsx(Zz,{type:f.type,entry:f.entry,entryFullPath:f.entryFullPath,onConfirm:Y,onCancel:L,loading:b,error:x})]})}function t6(e){if(!e)return null;const n=e.toLowerCase();return n.endsWith(".js")||n.endsWith(".mjs")||n.endsWith(".cjs")||n.endsWith(".jsx")?Tf({jsx:!0}):n.endsWith(".ts")||n.endsWith(".tsx")?Tf({jsx:!0,typescript:!0}):n.endsWith(".css")?Pj():n.endsWith(".json")?$j():n.endsWith(".md")||n.endsWith(".markdown")||n.endsWith(".mdx")?Dj():null}function n6(e){if(!e)return!1;const n=e.toLowerCase();return n.endsWith(".md")||n.endsWith(".markdown")||n.endsWith(".mdx")}function vx(){return document.documentElement.dataset.theme!=="light"}function yx(e){return e?[Oj]:[Fj(zj)]}function s6({content:e,onChange:n,readOnly:s,filePath:a,showLineNumbers:r=!1,onToggleLineNumbers:o,canToggleLineNumbers:l=!0,toolbarExpanded:c,toolbarActionsId:d}){const[u,h]=i.useState(!1),[m,f]=i.useState(!0),[p,b]=i.useState(!1),v=c!==void 0,x=v?c:p,y=i.useRef(null),g=i.useRef(null),j=i.useRef(!1),N=i.useRef(n);N.current=n;const C=i.useRef(new Ho),w=i.useRef(new Ho),S=i.useRef(new Ho),R=i.useRef(new Ho),I=i.useRef(new Ho),E=n6(a),M=i.useId(),G=d??M,[U,P]=i.useState(()=>vx()),T=E&&(s?!0:u),D=r&&!s&&!T,W=!!o&&l&&!s&&!T,Y=E||!s||W,L=i.useMemo(()=>t6(a),[a]),_=i.useCallback(()=>h(!1),[]),F=i.useCallback(()=>h(!0),[]),ae=i.useCallback(()=>f(z=>!z),[]),k=i.useCallback(()=>{v||b(z=>!z)},[v]);return i.useEffect(()=>{if(!y.current||T)return;const z=qo.theme({"&":{height:"100%",fontFamily:"var(--font-mono)",backgroundColor:"var(--bg)",color:"var(--text)"},".cm-gutters":{backgroundColor:"var(--surface)",color:"var(--text-muted)",borderRight:"calc(var(--space-xs) * 0.25) solid var(--border)"},"&.cm-focused":{outline:"none"}}),J=If.create({doc:e,extensions:[C.current.of(D?Lj():[]),w.current.of(m?qo.lineWrapping:[]),S.current.of(s?[If.readOnly.of(!0),qo.editable.of(!1)]:[]),R.current.of(L??[]),I.current.of(yx(U)),z,qo.updateListener.of(le=>{!le.docChanged||j.current||N.current(le.state.doc.toString())})]}),oe=new qo({state:J,parent:y.current});return g.current=oe,()=>{g.current=null,oe.destroy()}},[e,T,L,s,D,m]),i.useEffect(()=>{const z=new MutationObserver(()=>{P(vx())});return z.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>z.disconnect()},[]),i.useEffect(()=>{const z=g.current;z&&z.dispatch({effects:I.current.reconfigure(yx(U))})},[U]),i.useEffect(()=>{const z=g.current;!z||z.state.doc.toString()===e||(j.current=!0,z.dispatch({changes:{from:0,to:z.state.doc.length,insert:e}}),j.current=!1)},[e]),t.jsxs("div",{className:"file-editor-container",children:[Y&&(x||!v)?t.jsxs("div",{className:`file-editor-toolbar ${x?"file-editor-toolbar--expanded":""}`,children:[!v&&t.jsx("button",{className:"btn btn-sm btn-icon file-editor-toolbar-button",onClick:k,"aria-label":"Toggle editor options",title:"Toggle editor options","aria-expanded":x,"aria-controls":G,children:x?t.jsx(Pi,{size:14}):t.jsx(Ln,{size:14})}),t.jsxs("div",{className:"file-editor-toolbar-actions",id:G,hidden:!x,children:[E?t.jsxs(t.Fragment,{children:[!s&&t.jsxs("button",{className:`btn btn-sm file-editor-toolbar-button ${T?"":"btn-primary"}`,onClick:_,disabled:!T,"aria-label":"Edit mode",children:[t.jsx(zv,{size:14}),"Edit"]}),t.jsxs("button",{className:`btn btn-sm file-editor-toolbar-button ${T?"btn-primary":""}`,onClick:F,disabled:T,"aria-label":"Preview mode",children:[t.jsx($o,{size:14}),"Preview"]})]}):null,W&&t.jsxs("button",{className:`btn btn-sm file-editor-toolbar-button ${r?"btn-primary":""}`,onClick:o,"aria-label":"Toggle line numbers","aria-pressed":r,title:"Toggle line numbers",children:[t.jsx(TS,{size:14}),t.jsx("span",{children:"Line #"})]}),!s&&t.jsxs("button",{className:`btn btn-sm file-editor-toolbar-button ${m?"btn-primary":""}`,onClick:ae,"aria-label":"Toggle word wrap",title:"Toggle word wrap",children:[t.jsx(Eh,{size:14}),t.jsx("span",{children:"Wrap"})]})]})]}):null,T?t.jsx("div",{className:"file-editor-preview markdown-body",children:t.jsx(ji,{remarkPlugins:[Ni],children:e})}):t.jsx("div",{className:"file-editor-codemirror",ref:y,"aria-label":a?`Editor for ${a}`:"File editor"})]})}function i6(e,n=44){if(e)return e.length<=n?e:`${e.slice(0,n-1)}…`}function a6({currentWorkspace:e,projectName:n,workspaces:s,onSelect:a}){const[r,o]=i.useState(!1),l=typeof e=="string"?e:"project",c=i.useMemo(()=>l==="project"?n||"Project Root":s.find(u=>u.id===l)?.label??l,[l,n,s]);return t.jsxs("div",{className:"workspace-selector",children:[t.jsxs("button",{type:"button",className:"workspace-selector-trigger",onClick:()=>o(d=>!d),"aria-haspopup":"listbox","aria-expanded":r,children:[l==="project"?t.jsx(Lf,{size:14}):t.jsx(Cm,{size:14}),t.jsx("span",{className:"workspace-selector-trigger-label",children:c}),t.jsx(Ln,{size:14,className:`workspace-selector-trigger-icon${r?" open":""}`})]}),r&&t.jsxs("div",{className:"workspace-selector-menu",role:"listbox","aria-label":"Select workspace",children:[t.jsxs("button",{type:"button",className:`workspace-selector-option${l==="project"?" active":""}`,onClick:()=>{a("project"),o(!1)},children:[t.jsxs("div",{className:"workspace-selector-option-main",children:[t.jsx(Lf,{size:14}),t.jsx("span",{children:"Project Root"})]}),t.jsx("span",{className:"workspace-selector-option-meta",children:n})]}),s.length>0&&t.jsxs("div",{className:"workspace-selector-group",children:[t.jsx("div",{className:"workspace-selector-group-label",children:"Task Worktrees"}),s.map(d=>t.jsxs("button",{type:"button",className:`workspace-selector-option${l===d.id?" active":""}`,onClick:()=>{a(d.id),o(!1)},children:[t.jsxs("div",{className:"workspace-selector-option-main",children:[t.jsx(Cm,{size:14}),t.jsx("span",{children:d.id})]}),d.title&&t.jsx("span",{className:"workspace-selector-option-meta",title:d.title,children:i6(d.title)})]},d.id))]})]})]})}const r6=768,o6=280,Ic=180,Pc=500,wx="fusion:file-browser-sidebar-width",kx="kb-files-line-numbers",Ik=new Set([".png",".jpg",".jpeg",".gif",".webp",".ico",".bmp",".svgz"]),l6=new Set([...Ik,".exe",".dll",".so",".dylib",".zip",".tar",".gz",".bz2",".xz",".7z",".rar",".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".mp3",".mp4",".avi",".mov",".webm",".mkv",".flv",".woff",".woff2",".ttf",".otf",".eot",".wasm",".bin"]);function al(e){const n=e.slice(e.lastIndexOf(".")).toLowerCase();return l6.has(n)}function c6(e){const n=e.slice(e.lastIndexOf(".")).toLowerCase();return Ik.has(n)}function d6(e){const n=e.replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/$/,""),s=n.lastIndexOf("/");return s>0?n.slice(0,s):"."}function u6({initialWorkspace:e="project",initialFile:n=null,onClose:s,onWorkspaceChange:a,projectId:r}){const{projectName:o,workspaces:l}=Gz(r),c=i.useRef(null);ea(c,!0,"fusion:files-modal-size");const d=Aa(s),[u,h]=i.useState(e),[m,f]=i.useState(null),[p,b]=i.useState(!1),[v,x]=i.useState("list"),[y,g]=i.useState(o6),[j,N]=i.useState(!1),[C,w]=i.useState(!1),S=i.useId(),{entries:R,currentPath:I,setPath:E,loading:M,error:G,refresh:U}=Uz(u,!0,r),{content:P,setContent:T,originalContent:D,loading:W,saving:Y,error:L,save:_,hasChanges:F,mtime:ae}=Hz(u,m,!0,r);i.useEffect(()=>{h(e)},[e]),i.useEffect(()=>{const O=()=>{b(window.innerWidth<=r6)};return O(),window.addEventListener("resize",O),()=>window.removeEventListener("resize",O)},[]),i.useEffect(()=>{m||x("list"),w(!1)},[m]),i.useEffect(()=>{if(!n){f(null);return}f(n),E(d6(n)),p&&x("editor")},[n,p,E]),i.useEffect(()=>{try{const O=localStorage.getItem(wx);if(!O)return;const se=Number.parseInt(O,10);if(!Number.isNaN(se)){const ve=Math.max(Ic,Math.min(Pc,se));g(ve)}}catch{}},[]),i.useEffect(()=>{const O=ns(kx,r);N(O==="true")},[r]),i.useEffect(()=>{const O=se=>{se.key==="Escape"&&s(),(se.metaKey||se.ctrlKey)&&se.key==="s"&&(se.preventDefault(),F&&!Y&&_())};return document.addEventListener("keydown",O),()=>document.removeEventListener("keydown",O)},[s,F,Y,_]);const k=i.useCallback(O=>{f(O),p&&x("editor")},[p]),z=i.useCallback(()=>{x("list")},[]),J=i.useCallback(()=>{T(D)},[D,T]),oe=i.useCallback(O=>{h(O),f(null),x("list"),a?.(O)},[a]),le=i.useCallback(O=>{try{localStorage.setItem(wx,String(O))}catch{}},[]),we=i.useCallback(O=>{if(p)return;O.preventDefault(),O.stopPropagation();const se=O.currentTarget;typeof se.setPointerCapture=="function"&&se.setPointerCapture(O.pointerId);const ve=O.clientX,A=y;let ne=A;document.body.style.userSelect="none";const ye=ge=>{const Ne=ge.clientX-ve,He=Math.max(Ic,Math.min(Pc,A+Ne));ne=He,g(He)},ee=ge=>{typeof se.releasePointerCapture=="function"&&se.releasePointerCapture(ge.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",ye),document.removeEventListener("pointerup",ee),le(ne)};document.addEventListener("pointermove",ye),document.addEventListener("pointerup",ee)},[p,le,y]),re=i.useCallback(O=>{if(p)return;const se=20;if(O.key!=="ArrowLeft"&&O.key!=="ArrowRight")return;O.preventDefault();const ve=O.key==="ArrowLeft"?-se:se,A=Math.max(Ic,Math.min(Pc,y+ve));g(A),le(A)},[p,le,y]),H=i.useCallback(()=>{N(O=>{const se=!O;return Ns(kx,String(se),r),se})},[r]),Q=`Files — ${i.useMemo(()=>u==="project"?"Project":l.find(O=>O.id===u)?.id??u,[u,l])}`,be=i.useMemo(()=>!m||!c6(m)?null:oy(u,m,r),[m,u,r]),fe=O=>{const se=new Blob([O]).size;return se<1024?`${se} B`:`${(se/1024).toFixed(1)} KB`};return t.jsx("div",{className:"modal-overlay open",...d,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal file-browser-modal",ref:c,children:[t.jsxs("div",{className:"modal-header file-browser-modal-header",children:[t.jsxs("div",{className:"file-browser-header-title",children:[t.jsx(Qs,{size:18}),t.jsx("span",{children:Q}),m&&t.jsx("span",{className:"file-browser-header-path",children:m})]}),t.jsxs("div",{className:"file-browser-header-actions",children:[t.jsx(a6,{currentWorkspace:u,projectName:o,workspaces:l,onSelect:oe}),t.jsx("button",{className:"modal-close",onClick:s,"aria-label":"Close",children:t.jsx(Nn,{size:20})})]})]}),t.jsxs("div",{className:"file-browser-body",children:[t.jsx("div",{className:`file-browser-sidebar ${p?"mobile":""} ${v==="list"?"active":""}`,style:p?void 0:{width:`${y}px`},children:t.jsx(e6,{entries:R,currentPath:I,onSelectFile:k,onNavigate:E,loading:M,error:G,onRetry:U,workspace:u,onRefresh:U,projectId:r})}),!p&&t.jsx("div",{className:"file-browser-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":Ic,"aria-valuemax":Pc,"aria-valuenow":y,"aria-label":"Resize sidebar",tabIndex:0,onPointerDown:we,onKeyDown:re}),t.jsx("div",{className:`file-browser-content ${p?"mobile":""} ${v==="editor"?"active":""}`,children:m?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"file-browser-toolbar",children:[t.jsxs("div",{className:"file-browser-file-info",children:[p&&v==="editor"&&t.jsxs("button",{className:"file-browser-back-button",onClick:z,"aria-label":"Back to file list",children:[t.jsx(Tr,{size:16}),t.jsx("span",{children:"Back"})]}),!al(m)&&t.jsx("button",{className:"btn btn-sm btn-icon file-editor-toolbar-button",onClick:()=>w(O=>!O),"aria-label":"Toggle editor options",title:"Toggle editor options","aria-expanded":C,"aria-controls":S,children:C?t.jsx(Pi,{size:14}):t.jsx(Ln,{size:14})}),m,al(m)&&t.jsxs("span",{className:"file-browser-binary-indicator",children:[t.jsx(YN,{size:12}),"Binary file — read only"]}),ae&&t.jsxs("span",{className:"file-browser-mtime",children:["Modified: ",new Date(ae).toLocaleString()]}),W&&t.jsx("span",{className:"file-browser-loading",children:"Loading..."})]}),t.jsx("div",{className:"file-browser-actions",children:!be&&F&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn-sm",onClick:J,disabled:Y,children:[t.jsx(m0,{size:14}),"Discard"]}),t.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>void _(),disabled:Y,children:[t.jsx(Wv,{size:14}),Y?"Saving...":"Save"]})]})})]}),L&&!be&&t.jsx("div",{className:"file-browser-error-banner",children:L}),be?t.jsx("div",{className:"file-browser-image-preview",children:t.jsx("img",{src:be,alt:m??"",className:"file-browser-image"})}):t.jsx("div",{className:"file-editor-wrapper",children:t.jsx(s6,{content:P,onChange:T,filePath:m,readOnly:al(m),showLineNumbers:j&&!al(m),onToggleLineNumbers:H,canToggleLineNumbers:!al(m),toolbarExpanded:C,toolbarActionsId:S})}),!be&&t.jsxs("div",{className:"file-browser-footer",children:[t.jsx("span",{children:fe(P)}),F&&t.jsx("span",{className:"file-browser-unsaved",children:"Unsaved changes"})]})]}):t.jsxs("div",{className:"file-browser-placeholder",children:[t.jsx(Qs,{size:48,opacity:.3}),t.jsx("p",{children:"Select a file to edit"})]})})]})]})})}const m6=i.lazy(()=>qn(()=>import("./TodoView-PKvJKjtV.js"),__vite__mapDeps([13,1,6,7,8,14])).then(e=>({default:e.TodoView})));function h6({onClose:e,projectId:n,addToast:s,onPlanningMode:a}){const r=Aa(e),l=$i()==="mobile",{keyboardOverlap:c,viewportHeight:d,viewportOffsetTop:u,keyboardOpen:h}=Ia({enabled:l});ta(l);const m=h?{"--keyboard-overlap":`${c}px`,"--vv-offset-top":`${u}px`,...d!==null?{"--vv-height":`${d}px`}:{}}:{};return i.useEffect(()=>{const f=p=>{p.key==="Escape"&&e()};return document.addEventListener("keydown",f),()=>document.removeEventListener("keydown",f)},[e]),t.jsx("div",{className:"modal-overlay open",...r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal todo-modal",style:m,children:[t.jsxs("div",{className:"modal-header todo-modal-header",children:[t.jsxs("div",{className:"todo-modal-header-title",children:[t.jsx(RS,{size:18}),t.jsxs("div",{children:[t.jsx("h2",{children:"Todos"}),t.jsx("p",{children:"Manage reusable todo lists for your project."})]})]}),t.jsx("button",{className:"modal-close",onClick:e,"aria-label":"Close",children:t.jsx(Nn,{size:20})})]}),t.jsx("div",{className:"todo-modal-body",children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(m6,{projectId:n,addToast:s,onPlanningMode:a,onClose:e,mobileKeyboardActive:l&&h})})})]})})}function f6(e={}){const{pollInterval:n=3e4,autoRefresh:s=!0}=e,[a,r]=i.useState({providers:[],loading:!0,error:null,lastUpdated:null}),o=i.useRef(null),l=i.useRef(null),c=i.useCallback(async(u=!1)=>{l.current&&l.current.abort(),l.current=new AbortController,u&&r(h=>({...h,loading:!0,error:null}));try{const{providers:h}=await r1();r({providers:h,loading:!1,error:null,lastUpdated:new Date})}catch(h){if(h instanceof Error&&h.name==="AbortError")return;r(m=>({...m,loading:!1,error:Ce(h)||"Failed to fetch usage data"}))}},[]);i.useEffect(()=>{c()},[c]),i.useEffect(()=>{if(s)return o.current=setInterval(()=>{c(!1)},n),()=>{o.current&&(clearInterval(o.current),o.current=null)}},[s,n,c]),i.useEffect(()=>()=>{l.current&&l.current.abort(),o.current&&clearInterval(o.current)},[]);const d=i.useCallback(()=>c(!0),[c]);return{providers:a.providers,loading:a.loading,error:a.error,lastUpdated:a.lastUpdated,refresh:d}}function p6(e){const n=new Date(e),s=new Date,a=n.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0});if(n.toDateString()===s.toDateString())return a;const o=new Date(s.getFullYear(),s.getMonth(),s.getDate()),l=new Date(n.getFullYear(),n.getMonth(),n.getDate()),c=Math.round((l.getTime()-o.getTime())/(1440*60*1e3));return c>=1&&c<=7?`${n.toLocaleDateString(void 0,{weekday:"short"})} ${a}`:`${n.toLocaleDateString(void 0,{month:"short",day:"numeric"})}, ${a}`}function g6(e){return e>90?"usage-progress-fill--high":e>70?"usage-progress-fill--medium":"usage-progress-fill--low"}const Pk="kb-usage-hidden-windows",$k="kb-usage-modal-size",Dk="kb-usage-provider-order";function jx(e){const n=ns($k,e);if(!n)return null;try{const s=JSON.parse(n);if(s&&typeof s.width=="number"&&typeof s.height=="number"&&s.width>0&&s.height>0)return{width:s.width,height:s.height}}catch{}return null}function Nx(e){const n=ns(Pk,e);if(!n)return{};try{const s=JSON.parse(n);return!s||typeof s!="object"?{}:Object.entries(s).reduce((a,[r,o])=>{if(Array.isArray(o)){const l=o.filter(c=>typeof c=="string");l.length>0&&(a[r]=l)}return a},{})}catch{return{}}}function b6(e,n){Ns(Pk,JSON.stringify(e),n)}function Sx(e){const n=ns(Dk,e);if(!n)return[];try{const s=JSON.parse(n);return Array.isArray(s)?s.filter(a=>typeof a=="string"):[]}catch{return[]}}function Cx(e,n){Ns(Dk,JSON.stringify(e),n)}function Lk(e,n,s){return s[e]?.includes(n)??!1}function x6({window:e,viewMode:n,isHidden:s,onToggleHidden:a}){const r=g6(e.percentUsed),o=n==="remaining",l=Math.round(o?e.percentLeft:e.percentUsed),c=o?`${Math.round(e.percentLeft)}% remaining`:`${Math.round(e.percentUsed)}% used`,d=o?`${Math.round(e.percentUsed)}% used`:`${Math.round(e.percentLeft)}% left`;let u=e.resetText;if(!u&&e.resetAt){const x=new Date(e.resetAt).getTime()-Date.now();if(x>0){const y=Math.floor(x/36e5),g=Math.floor(y/24),j=y%24;g>0&&j>0?u=`resets in ${g}d ${j}h`:g>0?u=`resets in ${g}d`:y>0?u=`resets in ${y}h`:u=`resets in ${Math.floor(x/6e4)}m`}}const h=e.pace,m=h!==void 0;let f=0;m&&(f=o?100-h.percentElapsed:h.percentElapsed);const p=h?.status==="ahead",b=h?.status==="behind",v=h?.status==="on-track";return t.jsxs("div",{className:`usage-window ${s?"usage-window--hidden":""}`,children:[t.jsxs("div",{className:"usage-window-header",children:[t.jsx("span",{className:"usage-window-label",children:e.label}),t.jsxs("div",{className:"usage-window-header-controls",children:[!s&&t.jsx("span",{className:"usage-window-percentage",children:c}),!s&&t.jsx("button",{className:"btn-icon usage-window-hide-btn",onClick:a,"aria-label":`Hide ${e.label}`,"data-testid":"usage-window-hide-btn",children:t.jsx($o,{size:14})})]})]}),t.jsxs("div",{className:"usage-progress-wrapper",children:[t.jsx("div",{className:"usage-progress-bar",children:t.jsx("div",{className:`usage-progress-fill ${r}`,style:{width:`${l}%`},role:"progressbar","aria-valuenow":l,"aria-valuemin":0,"aria-valuemax":100,"aria-label":`${e.label}: ${c}`})}),m&&t.jsx("div",{className:"usage-pace-marker",style:{left:`${f}%`},"aria-hidden":"true","data-testid":"pace-marker"})]}),t.jsxs("div",{className:"usage-window-footer",children:[t.jsx("span",{className:"usage-window-left",children:d}),t.jsxs("span",{className:"usage-window-reset-group",children:[u&&t.jsx("span",{className:"usage-window-reset",children:u}),e.resetAt&&t.jsx("span",{className:"usage-window-reset-at",children:p6(e.resetAt)})]})]}),m&&t.jsxs("div",{className:"usage-pace-row","data-testid":"pace-row",children:[p&&t.jsxs(t.Fragment,{children:[t.jsx(Ma,{size:14,className:"pace-icon pace-ahead"}),t.jsx("span",{className:"pace-text pace-ahead",children:h.message})]}),b&&t.jsxs(t.Fragment,{children:[t.jsx(I0,{size:14,className:"pace-icon pace-behind"}),t.jsx("span",{className:"pace-text pace-behind",children:h.message})]}),v&&t.jsxs(t.Fragment,{children:[t.jsx(gs,{size:14,className:"pace-icon pace-ontrack"}),t.jsx("span",{className:"pace-text pace-ontrack",children:h.message})]})]})]})}function v6(e){const n=e.toLowerCase();return n.includes("claude")||n.includes("anthropic")?"anthropic":n.includes("codex")||n.includes("openai")||n.includes("gpt")?"openai":n.includes("gemini")||n.includes("google")||n.includes("antigravity")?"google":n.includes("ollama")?"ollama":n.includes("minimax")?"minimax":n.includes("zai")||n.includes("zhipu")?"zai":n.includes("kimi")||n.includes("moonshot")?"kimi":n.includes("bedrock")||n.includes("amazon")?"bedrock":n.includes("xai")||n.includes("grok")?"xai":n.includes("opencode")?"opencode":n.includes("copilot")||n==="github copilot"?"github-copilot":e}function y6({provider:e,viewMode:n,hiddenWindows:s,onToggleWindow:a,onShowAllHidden:r,isDragging:o,isDragOver:l,dragOverPosition:c,onDragStart:d,onDragOver:u,onDragLeave:h,onDrop:m,onDragEnd:f,isTouchReorderMode:p,canMoveUp:b,canMoveDown:v,onMoveUp:x,onMoveDown:y}){const g=s[e.name]?.length??0,j=()=>{switch(e.status){case"ok":return null;case"error":return t.jsx("span",{className:"usage-status-badge usage-status-badge--error",children:"Error"});case"no-auth":default:return t.jsx("span",{className:"usage-status-badge usage-status-badge--not-configured",children:"Not configured"})}};return t.jsxs("div",{className:`usage-provider${o?" usage-provider--dragging":""}${l&&c==="before"?" usage-provider--drag-over-before":""}${l&&c==="after"?" usage-provider--drag-over-after":""}`,"data-provider":e.name,"data-status":e.status,draggable:!p,onDragStart:p?void 0:d,onDragOver:p?void 0:u,onDragLeave:p?void 0:h,onDrop:p?void 0:m,onDragEnd:p?void 0:f,children:[t.jsxs("div",{className:"usage-provider-header",children:[t.jsxs("div",{className:"usage-provider-info",children:[t.jsx(rs,{provider:v6(e.name),size:"md"}),t.jsx("span",{className:"usage-provider-name",children:e.name}),g>0&&t.jsxs("button",{className:"btn btn-sm usage-show-hidden-btn",onClick:()=>r(e.name),"data-testid":"usage-show-hidden-btn",children:["Show hidden (",g,")"]})]}),t.jsxs("div",{className:"usage-provider-actions",children:[p&&t.jsxs("div",{className:"usage-provider-reorder-controls",role:"group","aria-label":`Reorder ${e.name}`,children:[t.jsx("button",{className:"btn-icon usage-provider-reorder-btn",type:"button",onClick:x,disabled:!b,"aria-label":`Move ${e.name} up`,children:t.jsx(Pi,{size:14})}),t.jsx("button",{className:"btn-icon usage-provider-reorder-btn",type:"button",onClick:y,disabled:!v,"aria-label":`Move ${e.name} down`,children:t.jsx(Ln,{size:14})})]}),j(),t.jsx("div",{className:"usage-provider-drag-handle","aria-hidden":"true",children:t.jsx(Nd,{size:16})})]})]}),e.error&&t.jsx("div",{className:"usage-provider-error",children:e.error}),e.plan&&t.jsx("div",{className:"usage-provider-meta",children:t.jsx("span",{className:"usage-provider-plan",children:e.plan})}),e.windows.length>0?t.jsx("div",{className:"usage-provider-windows",children:e.windows.map((N,C)=>{const w=Lk(e.name,N.label,s);return t.jsx(x6,{window:N,viewMode:n,isHidden:w,onToggleHidden:()=>a(e.name,N.label)},`${e.name}-${N.label}-${C}`)})}):e.status==="ok"?t.jsx("div",{className:"usage-provider-empty",children:"No usage data available"}):null]})}function w6(){return t.jsx("div",{className:"usage-skeleton",children:[1,2,3].map(e=>t.jsxs("div",{className:"usage-skeleton-provider",children:[t.jsxs("div",{className:"usage-skeleton-header",children:[t.jsx("div",{className:"usage-skeleton-icon"}),t.jsx("div",{className:"usage-skeleton-name"}),t.jsx("div",{className:"usage-skeleton-badge"})]}),t.jsx("div",{className:"usage-skeleton-bar"}),t.jsx("div",{className:"usage-skeleton-text"})]},e))})}function k6({isOpen:e,onClose:n,projectId:s,anchorRect:a}){const{providers:r,loading:o,error:l,lastUpdated:c,refresh:d}=f6({autoRefresh:e}),[u,h]=i.useState(!1),[m,f]=i.useState(()=>typeof window<"u"?window.innerWidth>=769:!1),[p,b]=i.useState(()=>typeof window>"u"?!1:window.matchMedia?.("(pointer: coarse)").matches??!1),[v,x]=i.useState("used"),[y,g]=i.useState(()=>Nx(s)),[j,N]=i.useState(()=>Sx(s)),[C,w]=i.useState(null),[S,R]=i.useState(null),[I,E]=i.useState(null),M=i.useRef(null),G=i.useRef(null),U=i.useRef(e),P=i.useRef(!1),[T,D]=i.useState(()=>jx(s));i.useEffect(()=>{D(jx(s))},[s]),i.useEffect(()=>{if(!e||!m)return;const A=G.current;if(!A||typeof ResizeObserver>"u")return;let ne=null;const ye=new ResizeObserver(ee=>{const ge=ee[0];if(!ge)return;const{width:Ne,height:He}=ge.contentRect;Ne<=0||He<=0||(ne&&clearTimeout(ne),ne=setTimeout(()=>{Ns($k,JSON.stringify({width:Math.round(Ne),height:Math.round(He)}),s)},250))});return ye.observe(A),()=>{ne&&clearTimeout(ne),ye.disconnect()}},[e,m,s]),i.useEffect(()=>{e||(P.current=!1)},[e]),i.useEffect(()=>{r.length>0&&(P.current=!0)},[r.length]),i.useEffect(()=>{if(typeof window>"u")return;const A=window.matchMedia?.("(pointer: coarse)"),ne=()=>{f(window.innerWidth>=769),b(A?.matches??!1)};return ne(),window.addEventListener("resize",ne),A?.addEventListener?.("change",ne),()=>{window.removeEventListener("resize",ne),A?.removeEventListener?.("change",ne)}},[]),i.useEffect(()=>{!U.current&&e&&(!c||Date.now()-c.getTime()>5e3)&&d(),U.current=e},[e,c,d]),i.useEffect(()=>{const A=ns("kb-usage-view-mode",s);if(A==="used"||A==="remaining"){x(A);return}x("used")},[s]);const W=i.useCallback(A=>{x(A),Ns("kb-usage-view-mode",A,s)},[s]);i.useEffect(()=>{g(Nx(s)),N(Sx(s))},[s]),i.useEffect(()=>{b6(y,s)},[y,s]);const Y=i.useCallback((A,ne)=>{g(ye=>{if(Lk(A,ne,ye)){const ee=(ye[A]??[]).filter(ge=>ge!==ne);if(ee.length===0){const{[A]:ge,...Ne}=ye;return Ne}return{...ye,[A]:ee}}return{...ye,[A]:[...ye[A]??[],ne]}})},[]),L=i.useCallback(A=>{g(ne=>{if(!ne[A])return ne;const{[A]:ye,...ee}=ne;return ee})},[]),_=i.useCallback(A=>{if(j.length===0)return A;const ne=new Map(A.map(ee=>[ee.name,ee])),ye=[];for(const ee of j){const ge=ne.get(ee);ge&&(ye.push(ge),ne.delete(ee))}return[...ye,...ne.values()]},[j]),F=i.useCallback((A,ne)=>{A.dataTransfer.effectAllowed="move",A.dataTransfer.setData("text/plain",ne),w(ne)},[]),ae=i.useCallback((A,ne)=>{if(!C||C===ne)return;A.preventDefault(),A.dataTransfer.dropEffect="move";const{top:ye,height:ee}=A.currentTarget.getBoundingClientRect(),ge=ye+ee/2,Ne=A.clientY<ge?"before":"after";R(ne),E(Ne)},[C]),k=i.useCallback((A,ne)=>{A.preventDefault();const ye=C??A.dataTransfer.getData("text/plain");if(!ye||ye===ne){R(null),E(null);return}const ge=_(r).map(Le=>Le.name).filter(Le=>Le!==ye),Ne=ge.indexOf(ne);if(Ne<0){R(null),E(null);return}const He=I==="after"?Ne+1:Ne;ge.splice(He,0,ye),Cx(ge,s),N(ge),R(null),E(null)},[C,I,s,r,_]),z=i.useCallback(()=>{w(null),R(null),E(null)},[]),J=i.useCallback((A,ne)=>{const ye=_(r).map(Le=>Le.name),ee=ye.indexOf(A),ge=ee+ne;if(ee<0||ge<0||ge>=ye.length)return;const Ne=[...ye],[He]=Ne.splice(ee,1);Ne.splice(ge,0,He),Cx(Ne,s),N(Ne)},[s,r,_]),oe=i.useCallback(async()=>{h(!0),await d(),h(!1)},[d]);i.useEffect(()=>{if(!e)return;const A=ne=>{ne.key==="Escape"&&n()};return document.addEventListener("keydown",A),()=>document.removeEventListener("keydown",A)},[e,n]);const le=i.useCallback(A=>{A.target===A.currentTarget&&n()},[n]);if(!e)return null;const we=!!(a&&m),re=8,H=12,Q=T?.width??420,be=we?Math.min((a?.bottom??0)+re,window.innerHeight-H):void 0,fe=we?Math.max(8,(a?.right??0)-Q):void 0,O=m&&T?{width:T.width,height:T.height}:{},se=_(r),ve=t.jsxs("div",{ref:G,className:`usage-modal${we?" usage-modal--popover":" modal"}`,"data-testid":"usage-modal",style:we?{position:"fixed",top:be,left:fe,...O}:O,children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("div",{className:"usage-header",children:[t.jsx(fi,{size:18,className:"usage-header-icon"}),t.jsx("h3",{children:"Usage"})]}),t.jsxs("div",{className:"usage-header-actions",children:[t.jsxs("div",{className:"usage-view-toggle",role:"group","aria-label":"Usage view mode",children:[t.jsx("button",{className:`usage-view-toggle-btn ${v==="used"?"active":""}`,onClick:()=>W("used"),"aria-pressed":v==="used","data-testid":"usage-view-toggle-used",children:"Used"}),t.jsx("button",{className:`usage-view-toggle-btn ${v==="remaining"?"active":""}`,onClick:()=>W("remaining"),"aria-pressed":v==="remaining","data-testid":"usage-view-toggle-remaining",children:"Remaining"})]}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close usage modal","data-testid":"usage-modal-close",children:t.jsx(Nn,{size:20})})]})]}),t.jsx("div",{className:"usage-content",ref:M,children:(o||!P.current&&!l)&&r.length===0?t.jsx(w6,{}):l&&r.length===0?t.jsxs("div",{className:"usage-error",children:[t.jsx("p",{children:"Failed to load usage data"}),t.jsx("p",{className:"usage-error-message",children:l}),t.jsx("button",{className:"btn btn-sm",onClick:oe,children:"Retry"})]}):r.length===0?t.jsxs("div",{className:"usage-empty",children:[t.jsx("p",{children:"No AI providers configured"}),t.jsx("p",{className:"usage-empty-hint",children:"Configure authentication in Settings to see usage data."})]}):t.jsx("div",{className:"usage-providers",children:se.map((A,ne)=>t.jsx(y6,{provider:A,viewMode:v,hiddenWindows:y,onToggleWindow:Y,onShowAllHidden:L,isDragging:C===A.name,isDragOver:S===A.name,dragOverPosition:S===A.name?I:null,onDragStart:ye=>F(ye,A.name),onDragOver:ye=>ae(ye,A.name),onDragLeave:()=>{S===A.name&&(R(null),E(null))},onDrop:ye=>k(ye,A.name),onDragEnd:z,isTouchReorderMode:p,canMoveUp:ne>0,canMoveDown:ne<se.length-1,onMoveUp:()=>J(A.name,-1),onMoveDown:()=>J(A.name,1)},A.name))})}),t.jsxs("div",{className:"modal-actions usage-actions",children:[t.jsx("div",{className:"modal-actions-left usage-actions-left",children:t.jsx("div",{className:"usage-last-updated",children:c&&t.jsxs("span",{children:["Last updated: ",c.toLocaleTimeString()]})})}),t.jsxs("div",{className:"modal-actions-right usage-actions-right",children:[t.jsxs("button",{className:"btn btn-sm",onClick:oe,disabled:o||u,"data-testid":"usage-refresh-btn",children:[t.jsx(Ss,{size:14,className:u?"spin":"",style:{marginRight:6}}),"Refresh"]}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:n,children:"Close"})]})]})]});return we?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"usage-popover-backdrop",onClick:n,"data-testid":"usage-modal-overlay"}),ve]}):t.jsx("div",{className:"modal-overlay open",onClick:le,"data-testid":"usage-modal-overlay",children:ve})}function Ok(e){if(e<1e3)return`${e}ms`;const n=Math.floor(e/1e3);if(n<60)return`${n}s`;const s=Math.floor(n/60),a=n%60;if(s<60)return a>0?`${s}m ${a}s`:`${s}m`;const r=Math.floor(s/60),o=s%60;return o>0?`${r}h ${o}m`:`${r}h`}function pd(e){const n=Date.now(),s=new Date(e).getTime(),a=n-s;if(a<0){const r=Math.abs(a);return r<6e4?"in a moment":r<36e5?`in ${Math.floor(r/6e4)}m`:r<864e5?`in ${Math.floor(r/36e5)}h`:`in ${Math.floor(r/864e5)}d`}return a<6e4?"just now":a<36e5?`${Math.floor(a/6e4)}m ago`:a<864e5?`${Math.floor(a/36e5)}h ago`:`${Math.floor(a/864e5)}d ago`}const j6={cron:"var(--color-blue, #3b82f6)",webhook:"var(--color-purple, #a855f7)",api:"var(--color-green, #22c55e)",manual:"var(--color-gray, #6b7280)"},Fk={cron:"Cron",webhook:"Webhook",api:"API",manual:"Manual"},N6={cron:Lv,webhook:Gv,api:Ov,manual:Bs},S6={parallel:"Concurrent",queue:"Queued",reject:"Exclusive"},C6={run:"Catch up",skip:"Skip missed",run_one:"Catch up (latest)"};function E6({result:e}){const n=e.completedAt&&e.startedAt?new Date(e.completedAt).getTime()-new Date(e.startedAt).getTime():0;return t.jsxs("span",{className:`schedule-run-badge ${e.success?"success":"failure"}`,children:[e.success?t.jsx(gs,{size:12}):t.jsx(Za,{size:12}),t.jsx("span",{children:e.success?"Success":"Failed"}),n>0&&t.jsx("span",{className:"schedule-run-duration",children:Ok(n)})]})}function _6({result:e,index:n}){const[s,a]=i.useState(!1),r=e.completedAt&&e.startedAt?new Date(e.completedAt).getTime()-new Date(e.startedAt).getTime():0;return t.jsxs("div",{className:"schedule-history-item",children:[t.jsxs("button",{className:"schedule-history-header",onClick:()=>a(!s),"aria-expanded":s,"aria-label":`Run #${n+1}: ${e.success?"succeeded":"failed"} ${pd(e.startedAt)}`,children:[t.jsx("span",{className:`schedule-history-status ${e.success?"success":"failure"}`,children:e.success?t.jsx(gs,{size:12}):t.jsx(Za,{size:12})}),t.jsx("span",{className:"schedule-history-time",children:pd(e.startedAt)}),e.triggerType&&t.jsx("span",{className:"routine-history-trigger-type",children:Fk[e.triggerType]}),t.jsx("span",{className:"schedule-history-duration",children:Ok(r)}),s?t.jsx(Pi,{size:12}):t.jsx(Ln,{size:12})]}),s&&t.jsxs("div",{className:"schedule-history-detail",children:[e.output&&t.jsx("pre",{className:"schedule-history-output",children:e.output}),e.error&&t.jsx("div",{className:"schedule-history-error",children:e.error})]})]})}function M6({routine:e,onEdit:n,onDelete:s,onRun:a,onToggle:r,running:o,lastRunOutput:l}){const[c,d]=i.useState(!1),{confirm:u}=Di(),h=i.useCallback(async()=>{await u({title:"Delete Routine",message:`Delete routine "${e.name}"? This cannot be undone.`,danger:!0})&&s(e)},[e,s,u]),m=j6[e.trigger.type],f=N6[e.trigger.type],p=e.trigger.type==="cron"?("cronExpression"in e.trigger?e.trigger.cronExpression:void 0)||e.cronExpression||"":e.cronExpression||"";return t.jsxs("div",{className:`routine-card${e.enabled?"":" disabled"}${o?" running":""}`,children:[t.jsxs("div",{className:"routine-card-header",children:[t.jsxs("div",{className:"routine-card-info",children:[t.jsxs("div",{className:"routine-card-name-row",children:[t.jsx("span",{className:"routine-card-name",children:e.name}),t.jsxs("span",{className:"routine-trigger-badge",style:{borderColor:m,color:m},children:[t.jsx(f,{size:10}),Fk[e.trigger.type]]}),e.scope&&t.jsxs("span",{className:`routine-scope-badge${e.scope==="global"?" global":" project"}`,title:`${e.scope==="global"?"Global":"Project"}-scoped routine`,children:[e.scope==="global"?t.jsx(jd,{size:10}):t.jsx(Qs,{size:10}),e.scope]})]}),e.description&&t.jsx("p",{className:"routine-card-description",children:e.description})]}),t.jsxs("div",{className:"routine-card-actions",children:[t.jsx("button",{className:"btn-icon",onClick:()=>a(e),disabled:o,title:o?"Running…":"Run now","aria-label":o?"Running…":`Run ${e.name} now`,children:o?t.jsx(Ct,{className:"spinner"}):t.jsx(Os,{})}),t.jsx("button",{className:"btn-icon",onClick:()=>r(e),title:e.enabled?"Disable":"Enable","aria-label":e.enabled?`Disable ${e.name}`:`Enable ${e.name}`,"aria-pressed":e.enabled,children:e.enabled?t.jsx(Vi,{}):t.jsx(Os,{})}),t.jsx("button",{className:"btn-icon",onClick:()=>n(e),title:"Edit","aria-label":`Edit ${e.name}`,children:t.jsx(xi,{})}),t.jsx("button",{className:"btn-icon",onClick:h,title:"Delete","aria-label":`Delete ${e.name}`,children:t.jsx(es,{})})]})]}),t.jsxs("div",{className:"routine-card-meta",children:[e.steps&&e.steps.length>0?t.jsxs("div",{className:"routine-meta-item",children:[t.jsx(kr,{size:12}),t.jsxs("span",{className:"routine-policy-badge",children:[e.steps.length," step",e.steps.length===1?"":"s"]})]}):e.command?t.jsx("div",{className:"routine-meta-item routine-meta-command-preview",title:e.command,children:t.jsx("code",{className:"routine-cron",children:e.command})}):null,e.trigger.type==="cron"&&p&&t.jsxs("div",{className:"routine-meta-item",children:[t.jsx(pa,{size:12}),t.jsx("code",{className:"routine-cron",children:p})]}),t.jsx("div",{className:"routine-meta-item",children:t.jsx("span",{className:"routine-policy-badge",title:`Execution policy: ${e.executionPolicy}`,children:S6[e.executionPolicy]})}),t.jsx("div",{className:"routine-meta-item",children:t.jsx("span",{className:"routine-policy-badge",title:`Catch-up policy: ${e.catchUpPolicy}`,children:C6[e.catchUpPolicy]})}),e.nextRunAt&&e.enabled&&t.jsxs("div",{className:"routine-meta-item",children:[t.jsx("span",{className:"routine-meta-label",children:"Next:"}),t.jsx("span",{title:e.nextRunAt,children:pd(e.nextRunAt)})]}),e.lastRunAt&&t.jsxs("div",{className:"routine-meta-item",children:[t.jsx("span",{className:"routine-meta-label",children:"Last:"}),t.jsx("span",{title:e.lastRunAt,children:pd(e.lastRunAt)})]}),e.lastRunResult&&t.jsx(E6,{result:e.lastRunResult}),t.jsxs("div",{className:"routine-meta-item",children:[t.jsx("span",{className:"routine-meta-label",children:"Runs:"}),t.jsx("span",{children:e.runCount})]})]}),l&&t.jsxs("div",{className:`routine-run-output ${l.success?"success":"failure"}`,children:[l.output&&t.jsx("pre",{className:"routine-run-output-text",children:l.output}),l.error&&t.jsx("div",{className:"routine-run-output-error",children:l.error})]}),e.runHistory.length>0&&t.jsxs("div",{className:"routine-card-history",children:[t.jsxs("button",{className:"schedule-history-toggle",onClick:()=>d(b=>!b),"aria-expanded":c,children:[c?t.jsx(Pi,{size:12}):t.jsx(Ln,{size:12}),t.jsxs("span",{children:["Run History (",e.runHistory.length,")"]})]}),c&&t.jsxs("div",{className:"schedule-history-list",children:[e.runHistory.slice(0,10).map((b,v)=>t.jsx(_6,{result:b,index:v},`${b.startedAt}-${v}`)),e.runHistory.length>10&&t.jsxs("div",{className:"schedule-history-more",children:["…and ",e.runHistory.length-10," more"]})]})]})]})}function R6({type:e,size:n=12}){return e==="command"?t.jsxs("span",{className:"step-type-badge step-type-command",title:"Command step",children:[t.jsx(_a,{size:n}),t.jsx("span",{children:"Command"})]}):e==="create-task"?t.jsxs("span",{className:"step-type-badge step-type-create-task",title:"Create Task step",children:[t.jsx(PS,{size:n}),t.jsx("span",{children:"Create Task"})]}):t.jsxs("span",{className:"step-type-badge step-type-ai-prompt",title:"AI Prompt step",children:[t.jsx(Ls,{size:n}),t.jsx("span",{children:"AI Prompt"})]})}function rm(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`step-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}function A6(e){return e==="command"?{id:rm(),type:e,name:"New Command Step",command:"",continueOnFailure:!1}:e==="ai-prompt"?{id:rm(),type:e,name:"New AI Prompt Step",prompt:"",continueOnFailure:!1}:{id:rm(),type:e,name:"New Create Task Step",taskDescription:"",taskColumn:"triage",continueOnFailure:!1}}function T6({step:e,onSave:n,onCancel:s}){const[a,r]=i.useState(e.name),[o,l]=i.useState(e.type),[c,d]=i.useState(e.command??""),[u,h]=i.useState(e.prompt??""),[m,f]=i.useState(e.modelProvider??""),[p,b]=i.useState(e.modelId??""),[v,x]=i.useState(e.taskTitle??""),[y,g]=i.useState(e.taskDescription??""),[j,N]=i.useState(e.taskColumn??"triage"),[C,w]=i.useState(e.timeoutMs),[S,R]=i.useState(e.continueOnFailure??!1),[I,E]=i.useState({}),[M,G]=i.useState([]),[U,P]=i.useState(!1),[T,D]=i.useState(null);i.useEffect(()=>{let F=!1;return P(!0),D(null),Ki().then(ae=>{F||G(ae.models)}).catch(ae=>{F||D(ae instanceof Error?ae.message:"Failed to load models")}).finally(()=>{F||P(!1)}),()=>{F=!0}},[]);const W=i.useCallback(()=>{const F={};return a.trim()||(F.name="Step name is required"),o==="command"&&!c.trim()&&(F.command="Command is required"),o==="ai-prompt"&&!u.trim()&&(F.prompt="Prompt is required"),o==="create-task"&&!y.trim()&&(F.taskDescription="Task description is required"),(o==="ai-prompt"||o==="create-task")&&(m||p)&&(!m||!p)&&(F.modelProvider="Both model provider and model ID must be set together"),C!==void 0&&C<1e3&&(F.timeoutMs="Timeout must be at least 1 second (1000ms)"),E(F),Object.keys(F).length===0},[a,o,c,u,y,m,p,C]),Y=m&&p?`${m}/${p}`:"",L=i.useCallback(F=>{if(!F)f(""),b("");else{const ae=F.indexOf("/");ae!==-1&&(f(F.slice(0,ae)),b(F.slice(ae+1)))}},[]),_=i.useCallback(()=>{if(!W())return;const F={...e,name:a.trim(),type:o,command:o==="command"?c.trim():void 0,prompt:o==="ai-prompt"?u.trim():void 0,taskTitle:o==="create-task"&&v.trim()?v.trim():void 0,taskDescription:o==="create-task"&&y.trim()?y.trim():void 0,taskColumn:o==="create-task"?j:void 0,modelProvider:(o==="ai-prompt"||o==="create-task")&&m.trim()?m.trim():void 0,modelId:(o==="ai-prompt"||o==="create-task")&&p.trim()?p.trim():void 0,timeoutMs:C||void 0,continueOnFailure:S};o!=="ai-prompt"&&delete F.prompt,o!=="create-task"&&(delete F.taskTitle,delete F.taskDescription,delete F.taskColumn),n(F)},[W,n,e,a,o,c,u,v,y,j,m,p,C,S]);return t.jsxs("div",{className:"step-editor",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-name-${e.id}`,children:"Step Name"}),t.jsx("input",{id:`step-name-${e.id}`,type:"text",placeholder:"e.g. Run tests",value:a,onChange:F=>r(F.target.value),"aria-invalid":!!I.name}),I.name&&t.jsx("small",{className:"field-error",children:I.name})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-type-${e.id}`,children:"Step Type"}),t.jsxs("select",{id:`step-type-${e.id}`,value:o,onChange:F=>l(F.target.value),children:[t.jsx("option",{value:"command",children:"Command"}),t.jsx("option",{value:"ai-prompt",children:"AI Prompt"}),t.jsx("option",{value:"create-task",children:"Create Task"})]})]}),o==="command"&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-command-${e.id}`,children:"Command"}),t.jsx("textarea",{id:`step-command-${e.id}`,placeholder:"e.g. npm test",value:c,onChange:F=>d(F.target.value),rows:2,"aria-invalid":!!I.command}),I.command&&t.jsx("small",{className:"field-error",children:I.command})]}),o==="ai-prompt"&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-prompt-${e.id}`,children:"Prompt"}),t.jsx("textarea",{id:`step-prompt-${e.id}`,placeholder:"e.g. Summarize the test results and highlight any failures",value:u,onChange:F=>h(F.target.value),rows:3,"aria-invalid":!!I.prompt}),I.prompt&&t.jsx("small",{className:"field-error",children:I.prompt})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-model-${e.id}`,children:"Model (optional)"}),t.jsx(ri,{id:`step-model-${e.id}`,label:"Model",models:M,value:Y,onChange:L,placeholder:"Use default",disabled:U}),T&&t.jsx("small",{className:"field-error",children:T}),t.jsx("small",{children:"AI model for this step. Uses default if not selected."})]})]}),o==="create-task"&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-task-title-${e.id}`,children:"Task Title (optional)"}),t.jsx("input",{id:`step-task-title-${e.id}`,type:"text",placeholder:"e.g. Review weekly dependencies",value:v,onChange:F=>x(F.target.value)}),t.jsx("small",{children:"Leave blank to auto-summarize from description"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-task-description-${e.id}`,children:"Task Description *"}),t.jsx("textarea",{id:`step-task-description-${e.id}`,placeholder:"e.g. Check all npm dependencies for security vulnerabilities and update outdated packages",value:y,onChange:F=>g(F.target.value),rows:4,"aria-invalid":!!I.taskDescription}),I.taskDescription&&t.jsx("small",{className:"field-error",children:I.taskDescription})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-task-column-${e.id}`,children:"Target Column"}),t.jsxs("select",{id:`step-task-column-${e.id}`,value:j,onChange:F=>N(F.target.value),children:[t.jsx("option",{value:"triage",children:"Triage"}),t.jsx("option",{value:"todo",children:"To Do"})]}),t.jsx("small",{children:"Column where the new task will be created"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-task-model-${e.id}`,children:"Executor Model (optional)"}),t.jsx(ri,{id:`step-task-model-${e.id}`,label:"Model",models:M,value:Y,onChange:L,placeholder:"Use default",disabled:U}),T&&t.jsx("small",{className:"field-error",children:T}),I.modelProvider&&t.jsx("small",{className:"field-error",children:I.modelProvider}),t.jsx("small",{children:"AI model for executing the created task. Uses default if not selected."})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:`step-timeout-${e.id}`,children:"Timeout (ms, optional)"}),t.jsx("input",{id:`step-timeout-${e.id}`,type:"number",min:1e3,step:1e3,placeholder:"Override schedule timeout",value:C??"",onChange:F=>w(F.target.value?Number(F.target.value):void 0),"aria-invalid":!!I.timeoutMs}),I.timeoutMs&&t.jsx("small",{className:"field-error",children:I.timeoutMs})]}),t.jsxs("div",{className:"form-group",children:[t.jsxs("label",{htmlFor:`step-continue-${e.id}`,className:"checkbox-label",children:[t.jsx("input",{id:`step-continue-${e.id}`,type:"checkbox",checked:S,onChange:F=>R(F.target.checked)}),"Continue on failure"]}),t.jsx("small",{children:"If checked, the next step will run even if this one fails"})]}),t.jsxs("div",{className:"step-editor-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:s,children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:_,children:"Save Step"})]})]})}function I6({steps:e,onChange:n,onEditingChange:s}){const[a,r]=i.useState(null);i.useEffect(()=>{s?.(a!==null)},[a,s]);const o=i.useCallback(u=>{const h=A6(u);n([...e,h]),r(h.id)},[e,n]),l=i.useCallback(u=>{n(e.filter(h=>h.id!==u)),a===u&&r(null)},[e,n,a]),c=i.useCallback((u,h)=>{const m=e.findIndex(b=>b.id===u);if(m<0)return;const f=h==="up"?m-1:m+1;if(f<0||f>=e.length)return;const p=[...e];[p[m],p[f]]=[p[f],p[m]],n(p)},[e,n]),d=i.useCallback(u=>{n(e.map(h=>h.id===u.id?u:h)),r(null)},[e,n]);return t.jsxs("div",{className:"steps-editor",children:[t.jsx("div",{className:"steps-editor-header",children:t.jsxs("span",{className:"steps-editor-title",children:["Steps (",e.length,")"]})}),e.length===0&&t.jsx("div",{className:"steps-empty-state",children:t.jsx("p",{children:"No steps added yet. Add a command or AI prompt step to get started."})}),t.jsx("div",{className:"steps-list",children:e.map((u,h)=>t.jsx("div",{className:"step-card",children:a===u.id?t.jsx(T6,{step:u,onSave:d,onCancel:()=>r(null)}):t.jsxs("div",{className:"step-card-row",children:[t.jsx("div",{className:"step-card-drag",children:t.jsx(Nd,{size:14})}),t.jsx("span",{className:"step-card-index",children:h+1}),t.jsx(R6,{type:u.type}),t.jsx("span",{className:"step-card-name",children:u.name}),u.continueOnFailure&&t.jsx("span",{className:"step-card-flag",title:"Continues on failure",children:"⚡"}),t.jsxs("div",{className:"step-card-actions",children:[t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>c(u.id,"up"),disabled:h===0,title:"Move up","aria-label":`Move ${u.name} up`,children:t.jsx(Pi,{})}),t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>c(u.id,"down"),disabled:h===e.length-1,title:"Move down","aria-label":`Move ${u.name} down`,children:t.jsx(Ln,{})}),t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>r(u.id),title:"Edit","aria-label":`Edit ${u.name}`,children:t.jsx(xi,{})}),t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>l(u.id),title:"Delete","aria-label":`Delete ${u.name}`,children:t.jsx(es,{})})]})]})},u.id))}),t.jsxs("div",{className:"steps-add-buttons",children:[t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>o("command"),children:[t.jsx(os,{size:14}),"Add Command Step"]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>o("ai-prompt"),children:[t.jsx(os,{size:14}),"Add AI Prompt Step"]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>o("create-task"),children:[t.jsx(os,{size:14}),"Add Create Task Step"]})]})]})}const zk={hourly:"0 * * * *",daily:"0 0 * * *",weekly:"0 0 * * 1",monthly:"0 0 1 * *"},P6={hourly:"Every hour",daily:"Every day (midnight)",weekly:"Every week (Monday)",monthly:"Every month (1st)",custom:"Custom cron expression"};function $6(e){const n=e.trim();for(const[s,a]of Object.entries(zk))if(a===n)return s;return"custom"}function D6(e){const n=e.trim().split(/\s+/);return n.length!==5?!1:n.every(s=>/^[\d*,/-]+$/.test(s))}function L6(e,n,s,a,r){switch(e){case"cron":return{type:"cron",cronExpression:n};case"webhook":return{type:"webhook",webhookPath:s||"/trigger/"+Math.random().toString(36).slice(2,10),secret:a||void 0};case"api":return{type:"api",endpoint:r||"/api/routine/"+Math.random().toString(36).slice(2,10)};case"manual":return{type:"manual"}}}function O6(e){const n=e.trigger;switch(n.type){case"cron":return{triggerType:"cron",cronExpression:n.cronExpression,webhookPath:"",webhookSecret:"",endpoint:""};case"webhook":return{triggerType:"webhook",cronExpression:"",webhookPath:n.webhookPath,webhookSecret:n.secret||"",endpoint:""};case"api":return{triggerType:"api",cronExpression:"",webhookPath:"",webhookSecret:"",endpoint:n.endpoint};case"manual":return{triggerType:"manual",cronExpression:"",webhookPath:"",webhookSecret:"",endpoint:""}}}const F6=[{value:"parallel",label:"Allow concurrent runs"},{value:"queue",label:"Queue after current (one at a time)"},{value:"reject",label:"Reject new runs while running"}],z6=[{value:"skip",label:"Skip missed runs"},{value:"run_one",label:"Run the most recent missed run"},{value:"run",label:"Run all missed runs"}];function Ex(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`step-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}function _x({routine:e,onSubmit:n,onCancel:s,scope:a,projectId:r,onScopeChange:o}){const l=!!e,c=e?O6(e):{triggerType:"cron",cronExpression:"0 * * * *",webhookPath:"",webhookSecret:"",endpoint:""},[d,u]=i.useState(e?.name??""),[h,m]=i.useState(e?.description??""),[f,p]=i.useState(c.triggerType),[b,v]=i.useState(c.cronExpression),[x,y]=i.useState(()=>c.triggerType!=="cron"?"custom":$6(c.cronExpression)),[g,j]=i.useState(c.webhookPath),[N,C]=i.useState(c.webhookSecret),[w,S]=i.useState(c.endpoint),[R,I]=i.useState(e?.executionPolicy??"queue"),[E,M]=i.useState(e?.catchUpPolicy??"run_one"),[G,U]=i.useState(e?.enabled??!0),P=e?.steps&&e.steps.length===1&&e.steps[0].type==="ai-prompt"&&!e.command,T=e?.steps&&e.steps.length===1&&e.steps[0].type==="create-task"&&!e.command,[D,W]=i.useState(e?.steps&&e.steps.length>0&&!P&&!T?"advanced":"simple"),[Y,L]=i.useState(()=>P?"ai-prompt":T?"create-task":"command"),[_,F]=i.useState(e?.command??""),[ae,k]=i.useState(e?.steps??[]),[z,J]=i.useState(!1),[oe,le]=i.useState(e?.timeoutMs??3e5),[we,re]=i.useState(P?e.steps?.[0]?.prompt??"":""),[H,ue]=i.useState(T?e.steps?.[0]?.taskTitle??"":""),[Q,be]=i.useState(T?e.steps?.[0]?.taskDescription??"":""),[fe,O]=i.useState(T?e.steps?.[0]?.taskColumn??"triage":"triage"),[se,ve]=i.useState(P||T?e.steps?.[0]?.modelProvider??"":""),[A,ne]=i.useState(P||T?e.steps?.[0]?.modelId??"":""),[ye,ee]=i.useState([]),[ge,Ne]=i.useState(!1),[He,Le]=i.useState(null),[de,Re]=i.useState(a??"global"),[Pe,rt]=i.useState({}),[qe,Xe]=i.useState(!1),At=i.useRef(!0);i.useEffect(()=>()=>{At.current=!1},[]),i.useEffect(()=>{a&&Re(a)},[a]),i.useEffect(()=>{let je=!1;return Ne(!0),Le(null),Ki().then(mt=>{je||ee(mt.models)}).catch(mt=>{je||Le(mt instanceof Error?mt.message:"Failed to load models")}).finally(()=>{je||Ne(!1)}),()=>{je=!0}},[]);const at=se&&A?`${se}/${A}`:"",Se=i.useCallback(je=>{if(!je){ve(""),ne("");return}const mt=je.indexOf("/");mt!==-1&&(ve(je.slice(0,mt)),ne(je.slice(mt+1)))},[]),pe=i.useCallback(()=>{const je={};if(d.trim()||(je.name="Name is required"),de==="project"&&!r&&(je.scope="Project-specific entries require an active project."),f==="cron"&&x==="custom"&&(b.trim()?D6(b)||(je.cronExpression="Invalid cron format — expected 5 fields (e.g. '0 */6 * * *')"):je.cronExpression="Cron expression is required"),f==="webhook"&&!g.trim()&&(je.webhookPath="Webhook path is required"),f==="api"&&!w.trim()&&(je.endpoint="API endpoint is required"),D==="simple")Y==="command"&&!_.trim()&&(je.command="Command is required"),Y==="ai-prompt"&&!we.trim()&&(je.prompt="Prompt is required"),Y==="create-task"&&!Q.trim()&&(je.taskDescription="Task description is required"),(se.trim()&&!A.trim()||!se.trim()&&A.trim())&&(je.model="Both model provider and model ID must be set, or both must be empty");else{ae.length===0&&(je.steps="At least one step is required"),z&&(je.stepsEditing="Please save or cancel all step edits before saving the routine");const mt=[];ae.forEach((Et,Te)=>{Et.name?.trim()||mt.push(`Step ${Te+1}: Name is required`),Et.type==="command"&&!Et.command?.trim()&&mt.push(`Step ${Te+1}: Command is required`),Et.type==="ai-prompt"&&!Et.prompt?.trim()&&mt.push(`Step ${Te+1}: Prompt is required`),Et.type==="create-task"&&!Et.taskDescription?.trim()&&mt.push(`Step ${Te+1}: Task description is required`)}),mt.length>0&&(je.steps=mt.join("; "))}return oe<1e3&&(je.timeoutMs="Timeout must be at least 1 second (1000ms)"),rt(je),Object.keys(je).length===0},[d,f,b,x,g,w,de,r,D,Y,_,we,Q,se,A,ae,z,oe]),_e=i.useCallback(async je=>{if(je.preventDefault(),!!pe()){Xe(!0);try{let mt=e?.scope??de??(r?"project":"global");mt==="project"&&!r&&(mt="global");const Et=L6(f,b,g,N,w);let Te,xe;D==="simple"?Y==="command"?Te=_.trim()||void 0:Y==="ai-prompt"?xe=[{id:Ex(),type:"ai-prompt",name:d.trim(),prompt:we.trim(),modelProvider:se.trim()||void 0,modelId:A.trim()||void 0}]:xe=[{id:Ex(),type:"create-task",name:d.trim(),taskTitle:H.trim()||void 0,taskDescription:Q.trim(),taskColumn:fe,modelProvider:se.trim()||void 0,modelId:A.trim()||void 0}]:xe=ae;const gt={name:d.trim(),agentId:e?.agentId??"",description:h.trim()||void 0,trigger:Et,command:Te,steps:xe,timeoutMs:oe,executionPolicy:R,catchUpPolicy:E,enabled:G,scope:mt};await n(gt)}finally{At.current&&Xe(!1)}}},[pe,n,d,h,f,b,g,N,w,D,Y,_,we,se,A,H,Q,fe,ae,oe,R,E,G,de,r,e?.scope,e?.agentId]),et="routine-name-error",Ae="routine-cron-error",it="routine-webhook-error",xt="routine-endpoint-error",Nt="routine-command-error",Ut="routine-prompt-error",Be="routine-task-description-error",Z="routine-model-error",Oe="routine-timeout-error",ht=i.useCallback(je=>{y(je),je!=="custom"&&v(zk[je])},[]);return t.jsxs("form",{className:"routine-form",onSubmit:_e,noValidate:!0,children:[t.jsx("h4",{className:"settings-section-heading",children:l?"Edit Routine":"New Routine"}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-name",children:"Name"}),t.jsx("input",{id:"routine-name",type:"text",placeholder:"e.g. Daily standup reminder",value:d,onChange:je=>u(je.target.value),"aria-invalid":!!Pe.name,"aria-describedby":Pe.name?et:void 0}),Pe.name&&t.jsx("small",{id:et,className:"field-error",children:Pe.name})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-description",children:"Description (optional)"}),t.jsx("textarea",{id:"routine-description",placeholder:"What does this routine do?",value:h,onChange:je=>m(je.target.value),rows:2})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Scope"}),t.jsxs("div",{className:"routine-scope-toggle",role:"radiogroup","aria-label":"Routine scope",children:[t.jsxs("button",{type:"button",className:`routine-scope-btn${de==="global"?" active":""}`,onClick:()=>{Re("global"),o?.("global")},role:"radio","aria-checked":de==="global"?"true":"false",disabled:!!e?.scope,title:e?.scope?`Scope is locked to ${e.scope} for existing routines`:"Global scope",children:[t.jsx(jd,{size:12}),"Global"]}),t.jsxs("button",{type:"button",className:`routine-scope-btn${de==="project"?" active":""}`,onClick:()=>{Re("project"),o?.("project")},role:"radio","aria-checked":de==="project"?"true":"false",disabled:!!e?.scope||!r,title:e?.scope?`Scope is locked to ${e.scope} for existing routines`:r?"Project scope":"Select a project to enable project scope",children:[t.jsx(Qs,{size:12}),"Project"]})]}),t.jsx("small",{children:!r&&!e?.scope?"No active project. Routines will be created at global scope.":de==="project"&&r?"This routine will be scoped to the current project.":"This routine will be created at global scope."}),Pe.scope&&t.jsx("small",{className:"field-error",children:Pe.scope})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Trigger Type"}),t.jsxs("div",{className:"routine-trigger-type-selector",role:"radiogroup","aria-label":"Trigger type",children:[t.jsxs("button",{type:"button",className:`routine-trigger-btn${f==="cron"?" active":""}`,onClick:()=>p("cron"),role:"radio","aria-checked":f==="cron",children:[t.jsx(Lv,{size:14}),"Cron"]}),t.jsxs("button",{type:"button",className:`routine-trigger-btn${f==="webhook"?" active":""}`,onClick:()=>p("webhook"),role:"radio","aria-checked":f==="webhook",children:[t.jsx(Gv,{size:14}),"Webhook"]}),t.jsxs("button",{type:"button",className:`routine-trigger-btn${f==="api"?" active":""}`,onClick:()=>p("api"),role:"radio","aria-checked":f==="api",children:[t.jsx(Ov,{size:14}),"API"]}),t.jsxs("button",{type:"button",className:`routine-trigger-btn${f==="manual"?" active":""}`,onClick:()=>p("manual"),role:"radio","aria-checked":f==="manual",children:[t.jsx(Bs,{size:14}),"Manual"]})]})]}),f==="cron"&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-frequency",children:"Frequency"}),t.jsx("select",{id:"routine-frequency",value:x,onChange:je=>ht(je.target.value),children:Object.entries(P6).map(([je,mt])=>t.jsx("option",{value:je,children:mt},je))}),t.jsx("label",{htmlFor:"routine-cron",children:"Cron Expression"}),t.jsx("input",{id:"routine-cron",type:"text",placeholder:"* * * * *",value:b,onChange:je=>v(je.target.value),disabled:x!=="custom","aria-invalid":!!Pe.cronExpression,"aria-describedby":Pe.cronExpression?Ae:void 0}),Pe.cronExpression?t.jsx("small",{id:Ae,className:"field-error",children:Pe.cronExpression}):t.jsx("small",{children:x==="custom"?t.jsxs(t.Fragment,{children:["min hour day month weekday — ",t.jsx("a",{href:"https://crontab.guru",target:"_blank",rel:"noopener noreferrer",children:"crontab.guru"})]}):`Auto-filled from preset: ${b}`})]}),f==="webhook"&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-webhook-path",children:"Webhook Path"}),t.jsx("input",{id:"routine-webhook-path",type:"text",placeholder:"/trigger/my-routine",value:g,onChange:je=>j(je.target.value),"aria-invalid":!!Pe.webhookPath,"aria-describedby":Pe.webhookPath?it:void 0}),Pe.webhookPath?t.jsx("small",{id:it,className:"field-error",children:Pe.webhookPath}):t.jsx("small",{children:"URL path for the webhook endpoint"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-webhook-secret",children:"Webhook Secret (optional)"}),t.jsx("input",{id:"routine-webhook-secret",type:"password",placeholder:"Optional — leave empty for unauthenticated webhooks",value:N,onChange:je=>C(je.target.value)}),t.jsx("small",{children:"HMAC secret for signature verification. Leave empty for unauthenticated webhooks."})]})]}),f==="api"&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-endpoint",children:"API Endpoint"}),t.jsx("input",{id:"routine-endpoint",type:"text",placeholder:"/api/routine/my-routine",value:w,onChange:je=>S(je.target.value),"aria-invalid":!!Pe.endpoint,"aria-describedby":Pe.endpoint?xt:void 0}),Pe.endpoint?t.jsx("small",{id:xt,className:"field-error",children:Pe.endpoint}):t.jsx("small",{children:"API endpoint path that triggers this routine"})]}),f==="manual"&&t.jsx("div",{className:"form-group",children:t.jsx("small",{className:"routine-trigger-info",children:"This routine will be triggered manually via the dashboard or API."})}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Action Mode"}),t.jsxs("div",{className:"schedule-mode-toggle",role:"radiogroup","aria-label":"Action mode",children:[t.jsx("button",{type:"button",className:`schedule-mode-btn${D==="simple"?" active":""}`,onClick:()=>W("simple"),role:"radio","aria-checked":D==="simple",children:"Simple"}),t.jsx("button",{type:"button",className:`schedule-mode-btn${D==="advanced"?" active":""}`,onClick:()=>W("advanced"),role:"radio","aria-checked":D==="advanced",children:"Multi-Step"})]}),t.jsx("small",{children:D==="simple"?"Run one command, prompt, or task creation action":"Run multiple actions sequentially"})]}),D==="simple"?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Action Type"}),t.jsxs("div",{className:"schedule-mode-toggle",role:"radiogroup","aria-label":"Action type",children:[t.jsx("button",{type:"button",className:`schedule-mode-btn${Y==="command"?" active":""}`,onClick:()=>L("command"),role:"radio","aria-checked":Y==="command",children:"Command"}),t.jsx("button",{type:"button",className:`schedule-mode-btn${Y==="ai-prompt"?" active":""}`,onClick:()=>L("ai-prompt"),role:"radio","aria-checked":Y==="ai-prompt",children:"AI Prompt"}),t.jsx("button",{type:"button",className:`schedule-mode-btn${Y==="create-task"?" active":""}`,onClick:()=>L("create-task"),role:"radio","aria-checked":Y==="create-task",children:"Create Task"})]})]}),Y==="command"?t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-command",children:"Command"}),t.jsx("input",{id:"routine-command",type:"text",placeholder:"e.g. npx runfusion.ai backup --create",value:_,onChange:je=>F(je.target.value),"aria-invalid":!!Pe.command,"aria-describedby":Pe.command?Nt:void 0}),Pe.command?t.jsx("small",{id:Nt,className:"field-error",children:Pe.command}):t.jsx("small",{children:"Shell command to execute."})]}):Y==="ai-prompt"?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-prompt",children:"Prompt"}),t.jsx("textarea",{id:"routine-prompt",placeholder:"e.g. Summarize recent activity and create action items",value:we,onChange:je=>re(je.target.value),rows:3,"aria-invalid":!!Pe.prompt,"aria-describedby":Pe.prompt?Ut:void 0}),Pe.prompt?t.jsx("small",{id:Ut,className:"field-error",children:Pe.prompt}):t.jsx("small",{children:"AI prompt to execute."})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-model",children:"Model (optional)"}),t.jsx(ri,{id:"routine-model",label:"Model",models:ye,value:at,onChange:Se,placeholder:"Use default",disabled:ge}),He&&t.jsx("small",{className:"field-error",children:He}),Pe.model&&t.jsx("small",{id:Z,className:"field-error",children:Pe.model})]})]}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-task-title",children:"Task Title (optional)"}),t.jsx("input",{id:"routine-task-title",type:"text",placeholder:"e.g. Review weekly dependencies",value:H,onChange:je=>ue(je.target.value)})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-task-description",children:"Task Description"}),t.jsx("textarea",{id:"routine-task-description",placeholder:"e.g. Check npm dependencies for security vulnerabilities",value:Q,onChange:je=>be(je.target.value),rows:4,"aria-invalid":!!Pe.taskDescription,"aria-describedby":Pe.taskDescription?Be:void 0}),Pe.taskDescription?t.jsx("small",{id:Be,className:"field-error",children:Pe.taskDescription}):t.jsx("small",{children:"Describes the task that will be created."})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-task-column",children:"Target Column"}),t.jsxs("select",{id:"routine-task-column",value:fe,onChange:je=>O(je.target.value),children:[t.jsx("option",{value:"triage",children:"Triage"}),t.jsx("option",{value:"todo",children:"To Do"})]})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-task-model",children:"Executor Model (optional)"}),t.jsx(ri,{id:"routine-task-model",label:"Executor Model",models:ye,value:at,onChange:Se,placeholder:"Use default",disabled:ge}),He&&t.jsx("small",{className:"field-error",children:He}),Pe.model&&t.jsx("small",{id:Z,className:"field-error",children:Pe.model})]})]})]}):t.jsxs(t.Fragment,{children:[t.jsx(I6,{steps:ae,onChange:k,onEditingChange:J}),Pe.steps&&t.jsx("small",{className:"field-error",children:Pe.steps}),Pe.stepsEditing&&t.jsx("small",{className:"field-error",children:Pe.stepsEditing})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-timeout",children:"Timeout (ms)"}),t.jsx("input",{id:"routine-timeout",type:"number",min:1e3,step:1e3,value:oe,onChange:je=>le(Number(je.target.value)),"aria-invalid":!!Pe.timeoutMs,"aria-describedby":Pe.timeoutMs?Oe:void 0}),Pe.timeoutMs?t.jsx("small",{id:Oe,className:"field-error",children:Pe.timeoutMs}):t.jsx("small",{children:"Maximum execution time in milliseconds."})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-execution-policy",children:"Execution Policy"}),t.jsx("select",{id:"routine-execution-policy",value:R,onChange:je=>I(je.target.value),children:F6.map(je=>t.jsx("option",{value:je.value,children:je.label},je.value))}),t.jsx("small",{children:"How to handle concurrent executions of this routine"})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"routine-catchup-policy",children:"Catch-up Policy"}),t.jsx("select",{id:"routine-catchup-policy",value:E,onChange:je=>M(je.target.value),children:z6.map(je=>t.jsx("option",{value:je.value,children:je.label},je.value))}),t.jsx("small",{children:"What to do when a scheduled run is missed"})]}),t.jsxs("div",{className:"form-group",children:[t.jsxs("label",{htmlFor:"routine-enabled",className:"checkbox-label",children:[t.jsx("input",{id:"routine-enabled",type:"checkbox",checked:G,onChange:je=>U(je.target.checked)}),"Enabled"]}),t.jsx("small",{children:"When disabled, the routine will not run automatically"})]}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:s,disabled:qe,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-primary btn-sm",disabled:qe,children:qe?"Saving…":l?"Save Changes":"Create Routine"})]})]})}const B6=3e4;function U6({onClose:e,addToast:n,projectId:s}){const[a,r]=i.useState(()=>s?"project":"global"),[o,l]=i.useState([]),[c,d]=i.useState("list"),[u,h]=i.useState(),[m,f]=i.useState(null),[p,b]=i.useState({}),v=i.useRef(null);ea(v,!0,"fusion:automation-modal-size");const x=i.useMemo(()=>({scope:a,projectId:a==="project"?s:void 0}),[a,s]),y=i.useCallback(async()=>{try{const P=await OE(x);l(P),b(T=>{const D={...T};for(const W of P){const Y=D[W.id];if(!Y||!W.lastRunResult)continue;const L=W.lastRunResult;L.success===Y.success&&(L.output||"")===Y.output&&(L.error||"")===(Y.error||"")&&delete D[W.id]}return D})}catch(P){n(Ce(P)||"Failed to load routines","error")}},[n,x]);i.useEffect(()=>{y()},[y]),i.useEffect(()=>{const P=setInterval(()=>{y()},B6);return()=>clearInterval(P)},[y]),i.useEffect(()=>{const P=T=>{T.key==="Escape"&&(c!=="list"?(d("list"),h(void 0)):e())};return document.addEventListener("keydown",P),()=>document.removeEventListener("keydown",P)},[e,c]);const g=Aa(e),j=i.useCallback(async P=>{try{await FE(P,x),n("Routine created","success"),d("list"),await y()}catch(T){n(Ce(T)||"Failed to create routine","error")}},[n,y,x]),N=i.useCallback(P=>{h(P),d("edit")},[]),C=i.useCallback(async P=>{if(u)try{await up(u.id,P,x),n("Routine updated","success"),d("list"),h(void 0),await y()}catch(T){n(Ce(T)||"Failed to update routine","error")}},[u,n,y,x]),w=i.useCallback(async P=>{try{await zE(P.id,x),n(`Deleted "${P.name}"`,"success"),await y()}catch(T){n(Ce(T)||"Failed to delete routine","error")}},[n,y,x]),S=i.useCallback(async P=>{f(P.id);try{const{result:T}=await BE(P.id,x);b(D=>({...D,[P.id]:{output:T.output||"",error:T.error,success:T.success}})),T.success?n(`"${P.name}" completed successfully`,"success"):n(`"${P.name}" failed: ${T.error||"Unknown error"}`,"error"),await y()}catch(T){n(Ce(T)||"Failed to run routine","error")}finally{f(null)}},[n,y,x]),R=i.useCallback(async P=>{try{await up(P.id,{enabled:!P.enabled},x),n(`"${P.name}" ${P.enabled?"disabled":"enabled"}`,"success"),await y()}catch(T){n(Ce(T)||"Failed to toggle routine","error")}},[n,y,x]),I=i.useCallback(()=>{d("list"),h(void 0)},[]);i.useEffect(()=>{c!=="list"&&b({})},[c]);const E=i.useCallback(P=>{r(P),d("list"),h(void 0),b({})},[]),M=()=>c==="create"?t.jsx(_x,{onSubmit:j,onCancel:I,scope:a,projectId:s}):c==="edit"&&u?t.jsx(_x,{routine:u,onSubmit:C,onCancel:I,scope:a,projectId:s}):o.length===0?t.jsxs("div",{className:"routine-empty-state",children:[t.jsx(Bs,{size:48,strokeWidth:1}),t.jsx("h4",{children:"No automations yet"}),t.jsx("p",{children:"Create an automation with a schedule, webhook, API, or manual trigger."}),t.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>d("create"),children:[t.jsx(os,{size:14}),"Create your first automation"]})]}):t.jsx("div",{className:"routine-list",children:o.map(P=>t.jsx(M6,{routine:P,onEdit:N,onDelete:w,onRun:S,onToggle:R,running:m===P.id,lastRunOutput:p[P.id]??null},P.id))}),G=()=>M(),U=c==="list"&&o.length>0;return t.jsx("div",{className:"modal-overlay open",...g,children:t.jsxs("div",{ref:v,className:"modal modal-lg automation-modal",role:"dialog","aria-modal":"true","aria-labelledby":"schedules-modal-title",children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("div",{className:"detail-title-row",children:[t.jsx(Bs,{size:20,className:"icon-triage"}),t.jsx("h3",{id:"schedules-modal-title",children:"Automations"})]}),t.jsx("button",{className:"modal-close",onClick:e,"aria-label":"Close",children:t.jsx(Nn,{size:20})})]}),t.jsxs("div",{className:"scheduling-toolbar","aria-live":"polite",children:[t.jsxs("div",{className:"scheduling-toolbar-left",role:"group","aria-label":"Scheduling scope",children:[t.jsxs("div",{className:"scheduling-scope-selector",children:[t.jsxs("button",{type:"button",className:`scope-btn${a==="global"?" active":""}`,onClick:()=>E("global"),"aria-pressed":a==="global",title:"Global (user-level) automations",children:[t.jsx(jd,{size:14}),"Global"]}),t.jsxs("button",{type:"button",className:`scope-btn${a==="project"?" active":""}`,onClick:()=>E("project"),"aria-pressed":a==="project",title:"Project-scoped automations",children:[t.jsx(Qs,{size:14}),"Project"]})]}),t.jsxs("span",{className:"scheduling-count",children:[t.jsx(Bs,{size:14}),o.length," automation",o.length===1?"":"s"]})]}),t.jsx("div",{className:"scheduling-toolbar-right",children:U&&t.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>d("create"),"aria-label":"Create new automation",children:[t.jsx(os,{size:14}),"New Automation"]})})]}),t.jsx("div",{className:"schedule-modal-content",id:"scheduled-tasks-content",children:G()})]})})}const H6=3e4,uh=new Map,om=new Map;function Mx(e){return e??"default"}function Rx(e){const n=uh.get(e);return n?Date.now()>=n.expiresAt?(uh.delete(e),null):n:null}function q6(e,n){const s=e.some(r=>r.id!=="github"&&r.authenticated),a=e.some(r=>r.id==="github"&&r.authenticated)||(n?.authenticated??!1);return{hasAiProvider:s,hasGithub:a}}async function V6(e){const n=om.get(e);if(n)return n;const s=No().then(({providers:a,ghCli:r})=>{const l={...q6(a,r),ghCli:r,expiresAt:Date.now()+H6};return uh.set(e,l),l}).finally(()=>{om.delete(e)});return om.set(e,s),s}function Bk(e){const n=Mx(e),s=Rx(n),[a,r]=i.useState(s?.hasAiProvider??!1),[o,l]=i.useState(s?.hasGithub??!1),[,c]=i.useState(s?.ghCli),[d,u]=i.useState(s==null),h=i.useRef(!!s);return i.useEffect(()=>{let m=!1;const f=Mx(e),p=Rx(f);if(p)return r(p.hasAiProvider),l(p.hasGithub),c(p.ghCli),u(!1),h.current=!0,()=>{m=!0};h.current=!1;async function b(){!h.current&&u(!0);try{const x=await V6(f);if(m)return;r(x.hasAiProvider),l(x.hasGithub),c(x.ghCli)}catch{}finally{m||(h.current=!0,u(!1))}}return b(),()=>{m=!0}},[e]),i.useMemo(()=>({hasAiProvider:a,hasGithub:o,loading:d,hasWarnings:!a||!o}),[a,o,d])}function Uk({hasAiProvider:e,hasGithub:n,compact:s=!1,onDismiss:a}){if(e&&n)return null;const r=a?t.jsx("button",{type:"button",className:"setup-warning-banner__dismiss touch-target","aria-label":"Dismiss setup warning",onClick:a,children:t.jsx(Nn,{size:16,"aria-hidden":"true"})}):null;if(s)return t.jsxs("div",{className:`setup-warning-banner setup-warning-banner--compact${a?" setup-warning-banner--dismissible":""}`,role:"status","aria-live":"polite",children:[t.jsx("p",{className:"setup-warning-banner__compact-text",children:"⚠ Setup incomplete — AI and/or GitHub features will be limited."}),r]});const o=[];return e||o.push({key:"ai",title:"No AI provider connected",description:"AI agents won't be able to work on tasks until you connect a provider. Set one up in Settings → AI Setup."}),n||o.push({key:"github",title:"GitHub not connected",description:"You won't be able to import issues from GitHub, but you can still create tasks manually."}),t.jsxs("div",{className:`setup-warning-banner${a?" setup-warning-banner--dismissible":""}`,role:"status","aria-live":"polite",children:[r,o.map(l=>t.jsxs("div",{className:"setup-warning-banner__item",children:[t.jsx("strong",{className:"setup-warning-banner__title",children:l.title}),t.jsx("p",{className:"setup-warning-banner__description",children:l.description})]},l.key))]})}const lm=new Map,Jc=new Map;function xf(e){return e??"global"}function mh(e){return`${bn.CHAT_AGENTS_MAP_PREFIX}${xf(e)}`}function io(e){return ui(mh(e),{maxAgeMs:eh})}function W6(e,n){for(const s of Jc.get(e)??[])s(n)}async function G6(e){const n=xf(e),s=lm.get(n);if(s)return s;const a=Qa(void 0,e).finally(()=>{lm.delete(n)});return lm.set(n,a),a}function K6(e){const[n,s]=i.useState(()=>io(e)??[]),[a,r]=i.useState(()=>io(e)===null),o=i.useRef(io(e)!==null),l=xf(e);i.useEffect(()=>{const h=io(e)??[];s(h),r(io(e)===null),o.current=io(e)!==null},[e]),i.useEffect(()=>{const h=Jc.get(l)??new Set;return h.add(s),Jc.set(l,h),()=>{h.delete(s),h.size===0&&Jc.delete(l)}},[l]);const c=i.useCallback(async()=>{try{const h=await G6(e);o.current=!0,Wn(mh(e),h,{maxBytes:5e5}),W6(l,h)}catch{o.current||hs(mh(e))}finally{r(!1)}},[e,l]);i.useEffect(()=>{c()},[c]);const d=i.useCallback(async()=>{r(!0),await c()},[c]);return{agentsMap:i.useMemo(()=>{const h=new Map;for(const m of n)h.set(m.id,m);return h},[n]),agents:n,loading:a,refresh:d}}function J6({isOpen:e,onClose:n,projectId:s,tasks:a,onCreateTask:r,addToast:o}){const{confirm:l}=Di(),c=$i();ta(e);const{keyboardOverlap:d,viewportHeight:u,viewportOffsetTop:h,keyboardOpen:m}=Ia({enabled:c==="mobile"}),f=m?{"--keyboard-overlap":`${d}px`,"--vv-offset-top":`${h}px`,...u!==null?{"--vv-height":`${u}px`}:{}}:{},[p,b]=i.useState(""),[v,x]=i.useState([]),[y,g]=i.useState("project-default"),[j,N]=i.useState(""),[C,w]=i.useState(""),[S,R]=i.useState([]),[I,E]=i.useState(!1),[M,G]=i.useState(""),[U,P]=i.useState(""),[T,D]=i.useState(""),[W,Y]=i.useState(""),[L,_]=i.useState(""),[F,ae]=i.useState("default"),[k,z]=i.useState(!1),[J,oe]=i.useState([]),[le,we]=i.useState(!1),[re,H]=i.useState(void 0),[ue,Q]=i.useState(di),[be,fe]=i.useState(void 0),[O,se]=i.useState(!1),[ve,A]=i.useState(""),[ne,ye]=i.useState(null),{agents:ee,loading:ge}=K6(s),[Ne,He]=i.useState(!1),Le=i.useRef(null),[de,Re]=i.useState(!1),[Pe,rt]=i.useState(""),qe=i.useRef(null),{hasAiProvider:Xe,hasGithub:At,loading:at}=Bk(s),{nodes:Se}=Td(),pe=i.useCallback(xe=>{we(!0),oe(xe)},[]),_e=i.useCallback(()=>{we(!1)},[]),et=i.useCallback(()=>{He(!0)},[]);i.useEffect(()=>{if(!Ne)return;const xe=gt=>{Le.current&&!Le.current.contains(gt.target)&&He(!1)};return document.addEventListener("mousedown",xe),()=>document.removeEventListener("mousedown",xe)},[Ne]),i.useEffect(()=>{if(!de)return;const xe=gt=>{qe.current&&!qe.current.contains(gt.target)&&(Re(!1),rt(""))};return document.addEventListener("mousedown",xe),()=>document.removeEventListener("mousedown",xe)},[de]);const Ae=a.filter(xe=>!v.includes(xe.id)).sort((xe,gt)=>{const _t=gt.createdAt.localeCompare(xe.createdAt);if(_t!==0)return _t;const Ft=parseInt(xe.id.slice(xe.id.lastIndexOf("-")+1),10)||0;return(parseInt(gt.id.slice(gt.id.lastIndexOf("-")+1),10)||0)-Ft}),it=Pe?Ae.filter(xe=>xe.id.toLowerCase().includes(Pe.toLowerCase())||xe.title&&xe.title.toLowerCase().includes(Pe.toLowerCase())||xe.description&&xe.description.toLowerCase().includes(Pe.toLowerCase())):Ae,xt=(xe,gt)=>xe.length>gt?xe.slice(0,gt)+"…":xe,Nt=ve.trim(),Ut=Nt.length>0&&!_d.test(Nt),Be=y==="existing"||y==="custom-new",Z=Be&&!j.trim();i.useEffect(()=>{const xe=p.trim()!==""||v.length>0||S.length>0||M!==""||U!==""||T!==""||W!==""||J.length>0||ne!==null||re!==void 0||ue!==di||be!==void 0||y!=="project-default"||j!==""||C!==""||O||Nt!=="";z(xe)},[p,v,S,M,U,T,W,J,ne,re,ue,be,y,j,C,O,Nt]);const Oe=i.useCallback(async()=>{k&&!await l({title:"Discard Changes",message:"You have unsaved changes. Discard them?",danger:!0})||(S.forEach(xe=>URL.revokeObjectURL(xe.previewUrl)),R([]),b(""),x([]),G(""),P(""),D(""),Y(""),_(""),ae("default"),oe([]),we(!1),ye(null),He(!1),H(void 0),Q(di),fe(void 0),g("project-default"),N(""),w(""),z(!1),se(!1),A(""),n())},[k,n,S,l]),ht=i.useCallback(async()=>{const xe=p.trim();if(!(!xe||I||Ut||Z)){E(!0);try{const gt=M.indexOf("/"),_t=U.indexOf("/"),Ft=T.indexOf("/"),Dt={title:void 0,description:xe,column:"triage",dependencies:v.length?v:void 0,enabledWorkflowSteps:le?J.length>0?J:[]:void 0,...ne?{assignedAgentId:ne}:{},modelPresetId:F==="preset"&&L||void 0,modelProvider:M&&gt!==-1?M.slice(0,gt):void 0,modelId:M&&gt!==-1?M.slice(gt+1):void 0,validatorModelProvider:U&&_t!==-1?U.slice(0,_t):void 0,validatorModelId:U&&_t!==-1?U.slice(_t+1):void 0,planningModelProvider:T&&Ft!==-1?T.slice(0,Ft):void 0,planningModelId:T&&Ft!==-1?T.slice(Ft+1):void 0,thinkingLevel:W!==""?W:void 0,reviewLevel:re,priority:ue,nodeId:be,branchSelection:{mode:y,...Be&&j.trim()?{branchName:j.trim()}:{},...C.trim()?{baseBranch:C.trim()}:{}},...O||Nt!==""?{githubTracking:{enabled:O,...Nt!==""?{repoOverride:Nt}:{}}}:{}},nt=await r(Dt);if(S.length>0){const Wt=[];for(const Mt of S)try{await Rd(nt.id,Mt.file,s)}catch{Wt.push(Mt.file.name)}Wt.length>0&&o(`Failed to upload: ${Wt.join(", ")}`,"error")}S.forEach(Wt=>URL.revokeObjectURL(Wt.previewUrl)),R([]),b(""),x([]),G(""),P(""),D(""),Y(""),_(""),ae("default"),oe([]),we(!1),ye(null),He(!1),H(void 0),Q(di),fe(void 0),g("project-default"),N(""),w(""),o(`Created ${nt.id}`,"success"),n()}catch(gt){o(Ce(gt)||"Failed to create task","error")}finally{E(!1)}}},[p,v,S,M,U,T,W,I,Ut,Z,r,o,n,s,F,L,J,le,ne,re,ue,be,y,Be,j,C,O,Nt]),je=i.useCallback(xe=>{xe.key==="Escape"&&(xe.preventDefault(),Oe())},[Oe]),Et=(ne?ee.find(xe=>xe.id===ne):void 0)?.name??ne,Te=t.jsxs("div",{className:"new-task-quick-fields",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Dependencies"}),t.jsxs("div",{className:"dep-trigger-wrap",ref:qe,children:[t.jsx("button",{type:"button",className:"btn btn-sm dep-trigger",onClick:()=>Re(xe=>!xe),disabled:I,"data-testid":"dep-trigger",children:v.length>0?`${v.length} selected`:"Add dependencies"}),de&&t.jsxs("div",{className:"dep-dropdown",children:[t.jsx("input",{className:"dep-dropdown-search",placeholder:"Search tasks…",autoFocus:!0,value:Pe,onChange:xe=>rt(xe.target.value),onClick:xe=>xe.stopPropagation()}),it.length===0?t.jsx("div",{className:"dep-dropdown-empty",children:"No available tasks"}):it.map(xe=>t.jsxs("div",{className:`dep-dropdown-item${v.includes(xe.id)?" selected":""}`,onClick:()=>{x(v.includes(xe.id)?v.filter(gt=>gt!==xe.id):[...v,xe.id]),Re(!1),rt("")},onMouseDown:gt=>gt.preventDefault(),children:[t.jsx("span",{className:"dep-dropdown-id",children:xe.id}),t.jsx("span",{className:"dep-dropdown-title",children:xt(xe.title||xe.description||xe.id,30)})]},xe.id))]})]}),v.length>0&&t.jsx("div",{className:"selected-deps",children:v.map(xe=>t.jsxs("span",{className:"dep-chip",children:[xe,t.jsx("button",{type:"button",className:"dep-chip-remove",onClick:()=>x(v.filter(gt=>gt!==xe)),disabled:I,children:"×"})]},xe))})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Assign Agent"}),t.jsxs("div",{className:"agent-trigger-wrap",ref:Le,children:[t.jsxs("button",{type:"button",className:"btn btn-sm dep-trigger",onClick:()=>{Ne?He(!1):et()},disabled:I,"data-testid":"new-task-agent-button",children:[t.jsx(As,{size:12,style:{verticalAlign:"middle"}}),Et?` ${Et}`:" Assign agent"]}),Ne&&t.jsxs("div",{className:"dep-dropdown agent-picker-dropdown",onMouseDown:xe=>xe.preventDefault(),children:[t.jsx("div",{className:"dep-dropdown-search-header",children:"Select agent"}),ge&&t.jsx("div",{className:"dep-dropdown-empty",children:"Loading agents..."}),!ge&&ee.map(xe=>t.jsxs("div",{className:`dep-dropdown-item${ne===xe.id?" selected":""}`,onMouseDown:gt=>gt.preventDefault(),onClick:()=>{ye(xe.id===ne?null:xe.id),He(!1)},"data-testid":`agent-option-${xe.id}`,children:[t.jsx(As,{size:12,style:{marginRight:6}}),t.jsx("span",{className:"dep-dropdown-id",children:xe.role}),t.jsx("span",{className:"dep-dropdown-title",children:xe.name})]},xe.id)),!ge&&ee.length===0&&t.jsx("div",{className:"dep-dropdown-empty",children:"No agents available"}),ne&&t.jsx("div",{className:"dep-dropdown-item",onMouseDown:xe=>xe.preventDefault(),onClick:()=>{ye(null),He(!1)},children:t.jsx("span",{className:"dep-dropdown-title",children:"Clear selection"})})]})]})]})]});return e?t.jsx("div",{className:"modal-overlay open",onClick:Oe,onKeyDown:je,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal modal-lg new-task-modal",onClick:xe=>xe.stopPropagation(),style:f,children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:"New Task"}),t.jsx("button",{className:"modal-close",onClick:Oe,disabled:I,"aria-label":"Close",children:"×"})]}),t.jsxs("div",{className:"modal-body",children:[!at&&t.jsx(Uk,{hasAiProvider:Xe,hasGithub:At}),t.jsx(xk,{mode:"create",description:p,onDescriptionChange:b,dependencies:v,onDependenciesChange:x,executorModel:M,onExecutorModelChange:G,validatorModel:U,onValidatorModelChange:P,presetMode:F,onPresetModeChange:ae,selectedPresetId:L,onSelectedPresetIdChange:_,selectedWorkflowSteps:J,onWorkflowStepsChange:pe,onDefaultOnApplied:_e,pendingImages:S,onImagesChange:R,tasks:a,projectId:s,disabled:I,addToast:o,isActive:e,onClose:Oe,planningModel:T,onPlanningModelChange:D,thinkingLevel:W,onThinkingLevelChange:Y,reviewLevel:re,onReviewLevelChange:H,priority:ue,onPriorityChange:Q,branch:j,onBranchChange:N,branchMode:y,onBranchModeChange:g,baseBranch:C,onBaseBranchChange:w,nodeId:be,onNodeIdChange:fe,nodeOptions:Se,githubTrackingEnabled:O,onGithubTrackingEnabledChange:se,githubRepoOverride:ve,onGithubRepoOverrideChange:A,renderBelowPrimary:Te,hideDependencies:!0,autoExpandMoreOptionsOnSelection:!1})]}),Z&&t.jsx("div",{className:"form-error new-task-branch-error",children:"Branch name is required for this branch strategy."}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:Oe,disabled:I,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:ht,disabled:!p.trim()||I||Ut||Z,children:I?"Creating...":"Create Task"})]})]})}):null}function Ji(e){if(!Number.isFinite(e)||e<0)return"—";const n=e/(1024*1024);return n<1024?`${n.toFixed(0)} MB`:`${(n/1024).toFixed(2)} GB`}function Ax(e,n){return!Number.isFinite(e)||!Number.isFinite(n)||n<=0?"—":`${(e/n*100).toFixed(1)}%`}function Y6(e,n){if(n<=0)return"normal";const s=e/n;return s>=.85?"critical":s>=.65?"warning":"normal"}function X6(e,n){if(n<=0)return"normal";const s=e/n;return s>=.5?"critical":s>=.25?"warning":"normal"}function Q6(e,n){if(n<=0)return"normal";const s=e/n;return s>=.9?"critical":s>=.75?"warning":"normal"}function Z6(e,n){if(e===null||!Number.isFinite(e)||e<0)return"normal";const s=n>0?e/n:e;return s>=80?"critical":s>=50?"warning":"normal"}function $c(e){return e==="critical"?"system-stats-modal__value--critical":e==="warning"?"system-stats-modal__value--warning":""}function e3(e){if(!e)return"Not yet";const n=new Date(e);return Number.isNaN(n.getTime())?"Not yet":n.toLocaleString()}function t3({isOpen:e,onClose:n,projectId:s}){const[a,r]=i.useState(null),[o,l]=i.useState(!1),[c,d]=i.useState(null),[u,h]=i.useState(!0),[m,f]=i.useState(90),[p,b]=i.useState(!1),[v,x]=i.useState(!1),[y,g]=i.useState(null),[j,N]=i.useState(null),[C,w]=i.useState(null),S=i.useCallback(async H=>{l(!0);try{const ue=await w_(s);r(ue),d(null),w(Date.now()),H?.preserveKillResult||g(null)}catch(ue){d(ue instanceof Error?ue.message:"Failed to load system stats")}finally{l(!1)}},[s]);i.useEffect(()=>{if(!e)return;S();const H=window.setInterval(()=>{S()},5e3);return()=>{window.clearInterval(H)}},[e,S]),i.useEffect(()=>{if(!e)return;(async()=>{try{const ue=await Ra();h(ue.vitestAutoKillEnabled??!0),f(ue.vitestKillThresholdPct??90),N(null)}catch(ue){N(ue instanceof Error?ue.message:"Failed to load vitest settings")}})()},[e]),i.useEffect(()=>{if(!e)return;const H=ue=>{ue.key==="Escape"&&n()};return document.addEventListener("keydown",H),()=>document.removeEventListener("keydown",H)},[e,n]);const R=i.useMemo(()=>{if(!a)return[];const H=a.systemStats,ue=$c(Y6(H.heapUsed,H.heapLimit)),Q=$c(X6(H.rss,H.systemTotalMem));return[{label:"RSS",value:Ji(H.rss),detail:Ax(H.rss,H.systemTotalMem),className:Q},{label:"Heap Used",value:Ji(H.heapUsed),detail:`of ${Ji(H.heapTotal)}`,className:ue},{label:"Heap Limit",value:Ji(H.heapLimit),detail:"V8 limit"},{label:"External",value:Ji(H.external)},{label:"Array Buffers",value:Ji(H.arrayBuffers)}]},[a]),I=i.useCallback(async H=>{h(H);try{await Cs({vitestAutoKillEnabled:H}),N(null)}catch(ue){N(ue instanceof Error?ue.message:"Failed to save vitest settings")}},[]),E=i.useCallback(async H=>{const ue=Math.min(99,Math.max(50,Number.isFinite(H)?Math.round(H):90));f(ue);try{await Cs({vitestKillThresholdPct:ue}),N(null)}catch(Q){N(Q instanceof Error?Q.message:"Failed to save vitest settings")}},[]),M=i.useCallback(async()=>{if(!p){if(!v){x(!0);return}b(!0);try{const H=await k_(s);g(H),x(!1),await S({preserveKillResult:!0})}catch(H){d(H instanceof Error?H.message:"Failed to kill vitest processes")}finally{b(!1)}}},[v,p,S,s]);if(!e)return null;const G=a?.systemStats,U=o&&!!a,P=C?`Updated ${new Date(C).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}`:"Waiting for first update",T=a?.taskStats,D=G?G.systemTotalMem-G.systemFreeMem:0,W=G?Q6(D,G.systemTotalMem):"normal",Y=G?$c(W):"",L=G&&Number.isFinite(G.systemTotalMem)&&G.systemTotalMem>0?Math.max(0,Math.min(100,D/G.systemTotalMem*100)):0,_=G?`System memory used: ${L.toFixed(1)}% (${Ji(D)} of ${Ji(G.systemTotalMem)})`:"System memory usage unavailable",F=a?.vitestProcessCount,ae=Z6(G?.cpuPercent??null,G?.cpuCount??0),k=$c(ae),z=G?.cpuPercent??null,J=z===null?0:Math.max(0,Math.min(100,z)),oe=z===null?"Sampling…":`${z.toFixed(1)}%`,le=z===null?"App CPU usage unavailable: waiting for another sample":`App CPU usage: ${z.toFixed(1)}%`,we=y?y.killed>0?"system-stats-modal__kill-result system-stats-modal__kill-result--success":"system-stats-modal__kill-result system-stats-modal__kill-result--error":"",re=e3(a?.vitestLastAutoKillAt);return t.jsx("div",{className:"modal-overlay open",role:"dialog","aria-modal":"true","aria-labelledby":"system-stats-modal-title",onClick:H=>{H.target===H.currentTarget&&n()},"data-testid":"system-stats-modal-overlay",children:t.jsxs("div",{className:"modal modal-lg system-stats-modal","data-testid":"system-stats-modal",children:[t.jsxs("div",{className:"modal-header system-stats-modal__header",children:[t.jsxs("h2",{id:"system-stats-modal-title",className:"system-stats-modal__title",children:[t.jsx(ko,{}),t.jsx("span",{children:"System Stats"})]}),t.jsxs("div",{className:"system-stats-modal__header-actions",children:[t.jsxs("span",{className:"system-stats-modal__auto-refresh","aria-live":"polite",children:[t.jsx("span",{children:"Auto-refresh · 5s"}),t.jsx("span",{className:"system-stats-modal__auto-refresh-time",children:P})]}),t.jsx("button",{type:"button",className:"btn-icon",onClick:()=>void S(),title:"Refresh","aria-label":"Refresh system stats",children:t.jsx(Ss,{size:16,className:U?"system-stats-modal__refresh--spinning":void 0})}),t.jsx("button",{type:"button",className:"modal-close",onClick:n,"aria-label":"Close",children:t.jsx(Nn,{})})]})]}),o&&!a&&t.jsx("div",{className:"system-stats-modal__state",children:"Loading system stats…"}),c&&!a&&t.jsx("div",{className:"system-stats-modal__state system-stats-modal__state--error",role:"alert",children:c}),a&&t.jsxs("div",{className:"system-stats-modal__content",children:[t.jsxs("section",{className:"system-stats-modal__section","aria-label":"Process stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"Process"}),t.jsx("dl",{className:"system-stats-modal__grid",children:R.map(H=>t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:H.label}),t.jsxs("dd",{children:[t.jsx("span",{className:`system-stats-modal__value ${H.className}`.trim(),children:H.value}),H.detail?t.jsx("span",{className:"system-stats-modal__detail",children:H.detail}):null]})]},H.label))})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"CPU and load stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"CPU & Load"}),t.jsxs("dl",{className:"system-stats-modal__grid",children:[t.jsxs("div",{className:"system-stats-modal__row system-stats-modal__row--cpu-used",children:[t.jsx("dt",{children:"App CPU"}),t.jsxs("dd",{children:[t.jsx("span",{className:`system-stats-modal__value ${k}`.trim(),children:oe}),t.jsx("span",{className:"system-stats-modal__detail",children:z===null?"First sample pending":"process usage"})]}),t.jsx("div",{className:"system-stats-modal__memory-progress-wrapper",children:t.jsx("div",{className:`system-stats-modal__memory-progress-track system-stats-modal__memory-progress-track--${ae}`,role:"progressbar","aria-valuenow":Math.round(J),"aria-valuemin":0,"aria-valuemax":100,"aria-label":le,children:t.jsx("div",{className:`system-stats-modal__memory-progress-fill system-stats-modal__memory-progress-fill--${ae}`,style:{width:`${J}%`}})})})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Load Avg"}),t.jsx("dd",{children:G?.loadAvg.map(H=>H.toFixed(2)).join(" ")??"—"})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Cores"}),t.jsx("dd",{children:G?.cpuCount??"—"})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Platform"}),t.jsx("dd",{children:G?.platform??"—"})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Node"}),t.jsx("dd",{children:G?.nodeVersion??"—"})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"PID"}),t.jsx("dd",{children:G?.pid??"—"})]})]})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"System memory stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"System"}),t.jsxs("dl",{className:"system-stats-modal__grid",children:[t.jsxs("div",{className:"system-stats-modal__row system-stats-modal__row--memory-used",children:[t.jsx("dt",{children:"Memory Used"}),t.jsxs("dd",{children:[t.jsx("span",{className:`system-stats-modal__value ${Y}`.trim(),children:G?Ji(D):"—"}),t.jsx("span",{className:"system-stats-modal__detail",children:G?`${Ax(D,G.systemTotalMem)} of ${Ji(G.systemTotalMem)}`:""})]}),t.jsx("div",{className:"system-stats-modal__memory-progress-wrapper",children:t.jsx("div",{className:`system-stats-modal__memory-progress-track system-stats-modal__memory-progress-track--${W}`,role:"progressbar","aria-valuenow":Math.round(L),"aria-valuemin":0,"aria-valuemax":100,"aria-label":_,children:t.jsx("div",{className:`system-stats-modal__memory-progress-fill system-stats-modal__memory-progress-fill--${W}`,style:{width:`${L}%`}})})})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Memory Free"}),t.jsx("dd",{children:G?Ji(G.systemFreeMem):"—"})]})]})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"Task stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"Tasks"}),t.jsxs("dl",{className:"system-stats-modal__grid",children:[t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Total"}),t.jsx("dd",{children:T?.total??0})]}),Object.entries(T?.byColumn??{}).map(([H,ue])=>t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:H}),t.jsx("dd",{children:ue})]},H))]})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"Agent stats",children:[t.jsx("h3",{className:"system-stats-modal__section-title",children:"Agents"}),t.jsxs("dl",{className:"system-stats-modal__grid",children:[t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"idle"}),t.jsx("dd",{children:T?.agents.idle??0})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"active"}),t.jsx("dd",{children:T?.agents.active??0})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"running"}),t.jsx("dd",{children:T?.agents.running??0})]}),t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"error"}),t.jsx("dd",{children:T?.agents.error??0})]})]})]}),t.jsxs("section",{className:"system-stats-modal__section","aria-label":"Vitest controls",children:[t.jsxs("h3",{className:"system-stats-modal__section-title system-stats-modal__section-title--with-icon",children:[t.jsx(y0,{}),t.jsx("span",{children:"Vitest Controls"})]}),t.jsx("dl",{className:"system-stats-modal__grid system-stats-modal__vitest-controls",children:t.jsxs("div",{className:"system-stats-modal__row",children:[t.jsx("dt",{children:"Vitest Processes"}),t.jsx("dd",{children:F??"—"})]})}),t.jsxs("div",{className:"system-stats-modal__vitest-controls",children:[t.jsx("div",{className:"system-stats-modal__kill-row",children:t.jsxs("button",{type:"button",className:"btn btn-danger",onClick:()=>void M(),disabled:p||F===0,children:[t.jsx(N0,{}),t.jsx("span",{children:v?"Confirm Kill?":"Kill Vitest Processes"})]})}),t.jsxs("label",{className:"system-stats-modal__toggle-row",children:[t.jsx("input",{type:"checkbox",checked:u,onChange:H=>{I(H.target.checked)}}),t.jsx("span",{children:"Auto-kill vitest on memory pressure"})]}),t.jsxs("div",{className:"system-stats-modal__threshold-row",children:[t.jsx("label",{htmlFor:"vitest-threshold-number",children:"Kill threshold (%)"}),t.jsxs("div",{className:"system-stats-modal__threshold-controls",children:[t.jsx("input",{id:"vitest-threshold-range",type:"range",min:50,max:99,value:m,"aria-label":"Kill threshold slider (%)",onChange:H=>{const ue=Number.parseInt(H.target.value,10);E(Number.isNaN(ue)?90:ue)}}),t.jsx("input",{id:"vitest-threshold-number",type:"number",className:"input",min:50,max:99,value:m,"aria-label":"Kill threshold (%)",onChange:H=>{const ue=Number.parseInt(H.target.value,10);E(Number.isNaN(ue)?90:ue)},onBlur:()=>{E(m)}})]})]}),y&&t.jsxs("p",{className:we,children:["Killed ",y.killed," processes"]}),t.jsxs("p",{className:"system-stats-modal__last-kill",children:["Last auto-kill: ",re]}),j&&t.jsx("p",{className:"system-stats-modal__kill-result system-stats-modal__kill-result--error",children:j})]})]})]}),c&&a&&t.jsxs("div",{className:"system-stats-modal__footer-error",children:["Latest refresh failed: ",c]})]})})}const n3=5e3;function s3(e={}){const{projectId:n,type:s,limit:a=50,autoRefresh:r=!0,useCentralFeed:o=!1}=e,[l,c]=i.useState([]),[d,u]=i.useState(!1),[h,m]=i.useState(null),[f,p]=i.useState(!1),b=i.useRef(null),v=i.useRef(void 0),x=i.useCallback(async()=>{try{u(!0),m(null);let j;o?j=await yp({limit:a,projectId:n,type:s}):j=(await mp({limit:a,type:s,projectId:n})).map(C=>({...C,projectId:n??"",projectName:""})),c(j),p(j.length===a),j.length>0&&(v.current=j[j.length-1].timestamp)}catch(j){m(j instanceof Error?j.message:"Failed to load activity log")}finally{u(!1)}},[a,n,s,o]),y=i.useCallback(async()=>{if(v.current)try{u(!0);let j;o?j=await yp({limit:a,projectId:n,type:s,since:v.current}):j=(await mp({limit:a,type:s,since:v.current,projectId:n})).map(C=>({...C,projectId:n??"",projectName:""})),c(N=>[...N,...j]),p(j.length===a),j.length>0&&(v.current=j[j.length-1].timestamp)}catch(j){m(j instanceof Error?j.message:"Failed to load more entries")}finally{u(!1)}},[a,n,s,o]),g=i.useCallback(()=>{c([]),p(!1),v.current=void 0},[]);return i.useEffect(()=>{x()},[x]),i.useEffect(()=>{if(r)return b.current=setInterval(()=>{x()},n3),()=>{b.current&&(clearInterval(b.current),b.current=null)}},[r,x]),{entries:l,loading:d,error:h,refresh:x,clear:g,hasMore:f,loadMore:y}}const cm={"task:created":"Task Created","task:moved":"Task Moved","task:updated":"Task Updated","task:deleted":"Task Deleted","task:merged":"Task Merged","task:failed":"Task Failed","task:duplicate-warning-overridden":"Duplicate Warning Overridden","task:auto-archived-ghost-bug":"Task Auto-Archived (Ghost Bug)","task:auto-archived-duplicate":"Task Auto-Archived (Duplicate)","task:merge-worktree-reacquired":"Merge Worktree Reacquired","task:auto-archived-deterministic-duplicate":"Task Auto-Archived (Deterministic Duplicate)","task:auto-archived-near-duplicate":"Task Auto-Archived (Near-Duplicate)","settings:updated":"Settings Updated","project:isolation-transition":"Project Isolation Transition"},i3={"task:created":t.jsx(os,{size:14,className:"activity-icon created"}),"task:moved":t.jsx(Dl,{size:14,className:"activity-icon moved"}),"task:updated":t.jsx(Ss,{size:14,className:"activity-icon updated"}),"task:deleted":t.jsx(Nn,{size:14,className:"activity-icon deleted"}),"task:merged":t.jsx(gs,{size:14,className:"activity-icon merged"}),"task:failed":t.jsx(Za,{size:14,className:"activity-icon failed"}),"task:duplicate-warning-overridden":t.jsx(oi,{size:14,className:"activity-icon updated"}),"task:auto-archived-ghost-bug":t.jsx(oi,{size:14,className:"activity-icon failed"}),"task:auto-archived-duplicate":t.jsx(es,{size:14,className:"activity-icon deleted"}),"task:auto-archived-deterministic-duplicate":t.jsx(es,{size:14,className:"activity-icon deleted"}),"task:auto-archived-near-duplicate":t.jsx(es,{size:14,className:"activity-icon deleted"}),"task:merge-worktree-reacquired":t.jsx(Ss,{size:14,className:"activity-icon updated"}),"settings:updated":t.jsx(wl,{size:14,className:"activity-icon settings"}),"project:isolation-transition":t.jsx(Qs,{size:14,className:"activity-icon settings"})};function a3(e){const n=new Date(e),a=new Date().getTime()-n.getTime(),r=Math.floor(a/6e4),o=Math.floor(a/36e5),l=Math.floor(a/864e5);return r<1?"Just now":r<60?`${r}m ago`:o<24?`${o}h ago`:l<7?`${l}d ago`:n.toLocaleDateString(void 0,{month:"short",day:"numeric"})}function r3({isOpen:e,onClose:n,tasks:s,onOpenTaskDetail:a,projectId:r,projects:o=[],onProjectFilterChange:l,currentProject:c}){const[d,u]=i.useState("all"),[h,m]=i.useState(r||"all"),[f,p]=i.useState(!1);i.useEffect(()=>{m(r||"all")},[r]);const b=d==="all"?void 0:d,v=h==="all"?void 0:h,x=!c&&o.length>0,{entries:y,loading:g,error:j,refresh:N,hasMore:C}=s3({projectId:v,type:b,limit:100,autoRefresh:e,useCentralFeed:x}),w=y.map(M=>({id:M.id,timestamp:M.timestamp,type:M.type,taskId:M.taskId,taskTitle:M.taskTitle,details:M.details,metadata:M.metadata,projectId:M.projectId,projectName:M.projectName})),S=async()=>{try{await UE(),N(),p(!1)}catch{p(!1)}},R=M=>{a&&a(M)},I=M=>{m(M),l?.(M==="all"?void 0:M)};i.useEffect(()=>{if(!e)return;const M=G=>{G.key==="Escape"&&(f?p(!1):n())};return document.addEventListener("keydown",M),()=>document.removeEventListener("keydown",M)},[e,n,f]);const E=d!=="all"||h!=="all";return e?t.jsx("div",{className:"modal-overlay open",onClick:M=>{M.target===M.currentTarget&&n()},role:"dialog","aria-modal":"true","data-testid":"activity-log-modal-overlay",children:t.jsxs("div",{className:"modal modal-lg activity-log-modal","data-testid":"activity-log-modal",children:[t.jsxs("div",{className:"modal-header activity-log-header",children:[t.jsxs("div",{className:"activity-log-title",children:[t.jsx(wr,{size:18}),t.jsx("span",{children:"Activity Log"})]}),t.jsxs("div",{className:"activity-log-actions",children:[o.length>0&&t.jsxs("div",{className:"activity-log-filter activity-log-filter--project",children:[t.jsx(Qs,{size:14}),t.jsxs("select",{value:h,onChange:M=>I(M.target.value),className:"activity-log-filter-select","data-testid":"activity-project-filter",children:[t.jsx("option",{value:"all",children:"All Projects"}),o.map(M=>t.jsx("option",{value:M.id,children:M.name},M.id))]})]}),t.jsxs("div",{className:"activity-log-filter",children:[t.jsx(Qc,{size:14}),t.jsxs("select",{value:d,onChange:M=>u(M.target.value),className:"activity-log-filter-select","data-testid":"activity-filter",children:[t.jsx("option",{value:"all",children:"All Events"}),Object.entries(cm).map(([M,G])=>t.jsx("option",{value:M,children:G},M))]})]}),t.jsx("button",{className:"activity-log-refresh",onClick:()=>N(),title:"Refresh","data-testid":"activity-refresh",children:g?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ss,{size:14})}),w.length>0&&t.jsx("button",{className:"activity-log-clear",onClick:()=>p(!0),title:"Clear Log","data-testid":"activity-clear",children:t.jsx(es,{size:14})})]}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close",title:"Close","data-testid":"activity-close",children:"×"})]}),E&&t.jsxs("div",{className:"activity-log-active-filters",children:[t.jsx("span",{className:"activity-log-filter-label",children:"Active filters:"}),h!=="all"&&t.jsxs("span",{className:"activity-log-filter-badge",children:["Project: ",o.find(M=>M.id===h)?.name||h]}),d!=="all"&&t.jsxs("span",{className:"activity-log-filter-badge",children:["Type: ",cm[d]]}),t.jsx("button",{className:"activity-log-clear-filters",onClick:()=>{u("all"),m("all"),l?.(void 0)},children:"Clear all"})]}),t.jsxs("div",{className:"activity-log-content","data-testid":"activity-log-content",children:[j&&t.jsxs("div",{className:"activity-log-error","data-testid":"activity-error",children:[t.jsx(oi,{size:16}),t.jsx("span",{children:j})]}),w.length===0&&!g&&!j&&t.jsxs("div",{className:"activity-log-empty","data-testid":"activity-empty",children:[t.jsx(wr,{size:48,className:"activity-log-empty-icon"}),t.jsx("p",{children:E?"No activity matches the current filters":"No activity recorded yet"}),E&&t.jsx("button",{className:"btn btn-secondary",onClick:()=>{u("all"),m("all"),l?.(void 0)},children:"Clear Filters"})]}),t.jsx("div",{className:"activity-log-list",children:w.map(M=>t.jsxs("div",{className:"activity-log-entry","data-testid":"activity-entry",children:[t.jsx("div",{className:"activity-log-entry-icon",children:i3[M.type]}),t.jsxs("div",{className:"activity-log-entry-content",children:[t.jsxs("div",{className:"activity-log-entry-header",children:[t.jsx("span",{className:"activity-log-entry-type",children:cm[M.type]}),t.jsx("span",{className:"activity-log-entry-time",children:a3(M.timestamp)})]}),t.jsxs("div",{className:"activity-log-entry-details",children:[M.taskId&&t.jsx("button",{className:"activity-log-task-link",onClick:()=>R(M.taskId),"data-testid":"activity-task-link",children:M.taskId}),M.taskTitle&&t.jsx("span",{className:"activity-log-task-title",children:M.taskTitle}),t.jsx("span",{className:"activity-log-entry-text",children:zs(M.details??"")})]}),M.metadata&&Object.keys(M.metadata).length>0&&t.jsxs("div",{className:"activity-log-entry-metadata",children:[typeof M.metadata.from=="string"&&typeof M.metadata.to=="string"&&t.jsxs("span",{className:"activity-log-metadata-item",children:[M.metadata.from," → ",M.metadata.to]}),typeof M.metadata.merged=="boolean"&&t.jsx("span",{className:`activity-log-metadata-item ${M.metadata.merged?"success":"error"}`,children:M.metadata.merged?"Merged":"Not merged"})]})]})]},M.id))}),C&&!g&&t.jsx("button",{className:"activity-log-load-more",onClick:N,"data-testid":"activity-load-more",children:"Load More"}),g&&w.length>0&&t.jsx("div",{className:"activity-log-loading",children:t.jsx(Ct,{size:20,className:"spin"})})]}),f&&t.jsx("div",{className:"activity-log-confirm-overlay",children:t.jsxs("div",{className:"activity-log-confirm-dialog",children:[t.jsx("h3",{children:"Clear Activity Log?"}),t.jsx("p",{children:"This will permanently delete all activity log entries. This action cannot be undone."}),t.jsxs("div",{className:"activity-log-confirm-actions",children:[t.jsx("button",{className:"activity-log-confirm-cancel",onClick:()=>p(!1),children:"Cancel"}),t.jsx("button",{className:"activity-log-confirm-clear",onClick:S,children:"Clear Log"})]})]})})]})}):null}const rl=[{id:"status",label:"Status",icon:Vv},{id:"changes",label:"Changes",icon:Sm},{id:"commits",label:"Commits",icon:yo},{id:"branches",label:"Branches",icon:ii},{id:"worktrees",label:"Worktrees",icon:fS},{id:"stashes",label:"Stashes",icon:Ar},{id:"remotes",label:"Remotes",icon:Sh}];function Tx({status:e}){switch(e){case"added":case"untracked":return t.jsx(VN,{size:14,className:"gm-file-icon gm-file-added"});case"modified":return t.jsx(zv,{size:14,className:"gm-file-icon gm-file-modified"});case"deleted":return t.jsx(UN,{size:14,className:"gm-file-icon gm-file-deleted"});case"renamed":case"copied":return t.jsx(Ya,{size:14,className:"gm-file-icon gm-file-renamed"});default:return t.jsx(GN,{size:14,className:"gm-file-icon"})}}function Ix({status:e}){const n=e==="untracked"?"U":e==="added"?"A":e==="modified"?"M":e==="deleted"?"D":e==="renamed"?"R":e==="copied"?"C":"?";return t.jsx("span",{className:`gm-file-badge gm-file-badge-${e}`,children:n})}function o3(e){return i.useCallback(async(n,s)=>{try{await navigator.clipboard.writeText(n),e(`Copied ${s||"to clipboard"}`,"success")}catch{e("Failed to copy","error")}},[e])}function Mo(e){if(!e)return"—";const n=new Date(e);if(isNaN(n.getTime()))return"—";const a=new Date().getTime()-n.getTime(),r=Math.floor(a/6e4);if(r<1)return"just now";if(r<60)return`${r}m ago`;const o=Math.floor(r/60);if(o<24)return`${o}h ago`;const l=Math.floor(o/24);return l<30?`${l}d ago`:n.toLocaleDateString()}function l3({isOpen:e,onClose:n,tasks:s,addToast:a,projectId:r}){const o=Di(),l=$i();ta(e);const{keyboardOverlap:c,viewportHeight:d,viewportOffsetTop:u,keyboardOpen:h}=Ia({enabled:l==="mobile"}),m=h?{"--keyboard-overlap":`${c}px`,"--vv-offset-top":`${u}px`,...d!==null?{"--vv-height":`${d}px`}:{}}:{},f=i.useCallback(()=>{if(l==="mobile"){const Me=document.activeElement;Me instanceof HTMLElement&&Me.blur(),window.scrollTo(0,0),requestAnimationFrame(()=>{window.scrollTo(0,0)})}n()},[n,l]),[p,b]=i.useState("status"),[v,x]=i.useState(!1),[y,g]=i.useState(null),j=i.useRef(null);ea(j,e,"fusion:git-modal-size");const N=Aa(f),C=o3(a),[w,S]=i.useState(null),[R,I]=i.useState(null),[E,M]=i.useState([]),[G,U]=i.useState(new Set),[P,T]=i.useState(""),[D,W]=i.useState(!1),[Y,L]=i.useState(null),[_,F]=i.useState(!1),[ae,k]=i.useState(null),[z,J]=i.useState(null),oe=i.useRef(0),[le,we]=i.useState([]),[re,H]=i.useState(null),[ue,Q]=i.useState(null),[be,fe]=i.useState(!1),[O,se]=i.useState(20),[ve,A]=i.useState(""),[ne,ye]=i.useState([]),[ee,ge]=i.useState(""),[Ne,He]=i.useState(""),[Le,de]=i.useState(""),[Re,Pe]=i.useState(null),[rt,qe]=i.useState([]),[Xe,At]=i.useState(!1),[at,Se]=i.useState(null),[pe,_e]=i.useState(null),[et,Ae]=i.useState(!1),[it,xt]=i.useState([]),[Nt,Ut]=i.useState([]),[Be,Z]=i.useState(""),[Oe,ht]=i.useState(null),[je,mt]=i.useState(null),[Et,Te]=i.useState(null),[xe,gt]=i.useState(!1),[_t,Ft]=i.useState(null),Dt=i.useRef(0),[nt,Wt]=i.useState(null),[Mt,Kt]=i.useState(null),xn=i.useCallback(async()=>{if(e){x(!0),g(null);try{switch(p){case"status":{const Me=await zi(r,{extended:!0});S(Me);break}case"changes":{const[Me,Ke]=await Promise.all([zi(r,{extended:!0}),Xr(r)]);S(Me),M(Ke),U(new Set),J(null),L(null),k(null);break}case"commits":{const Me=await V1(O,r);we(Me);break}case"branches":{const[Me,Ke]=await Promise.all([Vo(r),zi(r,{extended:!0})]);ye(Me),S(Ke);break}case"worktrees":{const Me=await J1(r);xt(Me);break}case"stashes":{const Me=await sc(r);Ut(Me),mt(null),Te(null),Ft(null),Dt.current+=1;break}case"remotes":{const Me=await zi(r,{extended:!0});S(Me);break}}}catch(Me){g(Ce(Me)||"Failed to fetch git data"),a(Ce(Me)||"Failed to fetch git data","error")}finally{x(!1)}}},[p,e,O,a,r]);i.useEffect(()=>{e&&xn()},[xn,e]),i.useEffect(()=>{if(!e)return;const Me=Ke=>{if(Ke.key==="Escape"){f();return}if((Ke.key==="ArrowUp"||Ke.key==="ArrowDown")&&Ke.altKey){Ke.preventDefault();const Qe=rl.findIndex(Lt=>Lt.id===p);Ke.key==="ArrowUp"&&Qe>0?b(rl[Qe-1].id):Ke.key==="ArrowDown"&&Qe<rl.length-1&&b(rl[Qe+1].id)}};return document.addEventListener("keydown",Me),()=>document.removeEventListener("keydown",Me)},[e,f,p]);const Tn=i.useCallback(async Me=>{try{await rp(Me,r),a(`Staged ${Me.length} file(s)`,"success");const Ke=await Xr(r);M(Ke),U(new Set),J(null),L(null),k(null)}catch(Ke){a(Ce(Ke)||"Failed to stage files","error")}},[a,r]),Sn=i.useCallback(async Me=>{try{await rE(Me,r),a(`Unstaged ${Me.length} file(s)`,"success");const Ke=await Xr(r);M(Ke),U(new Set),J(null),L(null),k(null)}catch(Ke){a(Ce(Ke)||"Failed to unstage files","error")}},[a,r]),is=i.useCallback(async Me=>{if(await o.confirm({title:"Discard Changes",message:`Discard changes to ${Me.length} file(s)? This cannot be undone.`,danger:!0}))try{await oE(Me,r),a(`Discarded changes to ${Me.length} file(s)`,"success");const[Qe,Lt]=await Promise.all([Xr(r),zi(r,{extended:!0})]);M(Qe),S(Lt),U(new Set),J(null),L(null),k(null)}catch(Qe){a(Ce(Qe)||"Failed to discard changes","error")}},[a,r,o]),On=i.useCallback(async Me=>{if(Me.preventDefault(),!!P.trim()){W(!0);try{const Ke=await op(P.trim(),r);a(`Committed: ${Ke.hash}`,"success"),T("");const[Qe,Lt]=await Promise.all([Xr(r),zi(r,{extended:!0})]);M(Qe),S(Lt),J(null),L(null),k(null)}catch(Ke){a(Ce(Ke)||"Failed to commit","error")}finally{W(!1)}}},[P,a,r]),un=i.useCallback(async()=>{if(P.trim()){W(!0);try{const Me=E.filter(gn=>!gn.staged).map(gn=>gn.file);Me.length>0&&await rp(Me,r);const Ke=await op(P.trim(),r);a(`Committed: ${Ke.hash}`,"success"),T("");const[Qe,Lt]=await Promise.all([Xr(r),zi(r,{extended:!0})]);M(Qe),S(Lt),J(null),L(null),k(null)}catch(Me){a(Ce(Me)||"Failed to commit","error")}finally{W(!1)}}},[P,E,a,r]),tn=i.useCallback(async(Me,Ke)=>{J({file:Me,staged:Ke}),F(!0),k(null);const Qe=oe.current+1;oe.current=Qe;try{const Lt=await aE(Me,Ke,r);if(oe.current!==Qe)return;L(Lt)}catch(Lt){if(oe.current!==Qe)return;const gn=Ce(Lt)||"Failed to load file diff";L(null),k(gn),a(gn,"error")}finally{oe.current===Qe&&F(!1)}},[a,r]),on=i.useCallback(Me=>{U(Ke=>{const Qe=new Set(Ke);return Qe.has(Me)?Qe.delete(Me):Qe.add(Me),Qe})},[]),pn=i.useCallback(async Me=>{if(re===Me){H(null),Q(null);return}H(Me),fe(!0);try{const Ke=await nd(Me,r);Q(Ke)}catch(Ke){a(Ce(Ke)||"Failed to load diff","error"),Q(null)}finally{fe(!1)}},[re,a,r]),mn=i.useCallback(()=>{se(Me=>Math.min(Me+20,100))},[]),Zn=i.useMemo(()=>{if(!ve.trim())return le;const Me=ve.toLowerCase();return le.filter(Ke=>Ke.message.toLowerCase().includes(Me)||Ke.author.toLowerCase().includes(Me)||Ke.shortHash.toLowerCase().includes(Me))},[le,ve]),In=i.useCallback(async Me=>{if(Me.preventDefault(),!!ee.trim()){x(!0);try{await Y1(ee.trim(),Ne.trim()||void 0,r),a(`Created branch ${ee}`,"success"),ge(""),He("");const Ke=await Vo(r);ye(Ke)}catch(Ke){a(Ce(Ke)||"Failed to create branch","error")}finally{x(!1)}}},[ee,Ne,a,r]),rn=i.useCallback(async Me=>{x(!0);try{await X1(Me,r),a(`Switched to ${Me}`,"success");const[Ke,Qe]=await Promise.all([zi(r,{extended:!0}),Vo(r)]);S(Ke),ye(Qe)}catch(Ke){a(Ce(Ke)||"Failed to checkout branch","error")}finally{x(!1)}},[a,r]),hn=i.useCallback(async Me=>{if(await o.confirm({title:"Delete Branch",message:`Delete branch "${Me}"?`,danger:!0})){x(!0);try{await ap(Me,void 0,r),a(`Deleted branch ${Me}`,"success");const Qe=await Vo(r);ye(Qe)}catch(Qe){if(Ce(Qe).includes("not fully merged")){if(await o.confirm({title:"Force Delete Branch",message:"Branch has unmerged commits. Force delete?",danger:!0}))try{await ap(Me,!0,r),a(`Force deleted branch ${Me}`,"success");const gn=await Vo(r);ye(gn)}catch(gn){a(Ce(gn)||"Failed to delete branch","error")}}else a(Ce(Qe)||"Failed to delete branch","error")}finally{x(!1)}}},[a,r,o]),Pn=i.useMemo(()=>{if(!Le.trim())return ne;const Me=Le.toLowerCase();return ne.filter(Ke=>Ke.name.toLowerCase().includes(Me))},[ne,Le]),nn=i.useCallback(async Me=>{if(Re===Me){Pe(null),qe([]),Se(null),_e(null);return}Pe(Me),qe([]),Se(null),_e(null),At(!0);try{const Ke=await K1(Me,10,r);qe(Ke)}catch{qe([])}finally{At(!1)}},[Re,r]),$t=i.useCallback(async Me=>{if(at===Me){Se(null),_e(null);return}Se(Me),_e(null),Ae(!0);try{const Ke=await nd(Me,r);_e(Ke)}catch{_e(null)}finally{Ae(!1)}},[at,r]),Jt=i.useCallback(()=>{Pe(null),qe([]),Se(null),_e(null)},[]),Qt=i.useCallback(()=>{Dt.current+=1,mt(null),Te(null),Ft(null),gt(!1)},[]),ie=i.useCallback(async Me=>{Me.preventDefault(),ht("create"),Qt();try{await tE(Be.trim()||void 0,r),a("Changes stashed","success"),Z("");const Ke=await sc(r);Ut(Ke)}catch(Ke){a(Ce(Ke)||"Failed to stash changes","error")}finally{ht(null)}},[Be,a,r,Qt]),Fe=i.useCallback(async(Me,Ke=!1)=>{ht(`apply-${Me}`),Qt();try{await nE(Me,Ke,r),a(Ke?"Stash popped":"Stash applied","success");const Qe=await sc(r);Ut(Qe)}catch(Qe){a(Ce(Qe)||"Failed to apply stash","error")}finally{ht(null)}},[a,r,Qt]),Je=i.useCallback(async Me=>{if(await o.confirm({title:"Drop Stash",message:`Drop stash@{${Me}}? This cannot be undone.`,danger:!0})){ht(`drop-${Me}`),Qt();try{await sE(Me,r),a("Stash dropped","success");const Qe=await sc(r);Ut(Qe)}catch(Qe){a(Ce(Qe)||"Failed to drop stash","error")}finally{ht(null)}}},[a,r,o,Qt]),tt=i.useCallback(async Me=>{if(je===Me){Qt();return}const Ke=Dt.current+1;Dt.current=Ke,mt(Me),Te(null),Ft(null),gt(!0);try{const Qe=await iE(Me,r);if(Dt.current!==Ke)return;Te(Qe)}catch(Qe){if(Dt.current!==Ke)return;Te(null),Ft(Ce(Qe)||"Failed to load stash diff")}finally{Dt.current===Ke&&gt(!1)}},[je,r,Qt]),Ye=i.useCallback(async()=>{Wt("fetch");try{const Me=await Q1(void 0,r);Kt(Me),a(Me.message||"Fetch completed",Me.fetched?"success":"info");const Ke=await zi(r,{extended:!0});S(Ke)}catch(Me){a(Ce(Me)||"Fetch failed","error")}finally{Wt(null)}},[a,r]),vt=i.useCallback(async Me=>{Wt("pull");try{const Ke=await Z1(Me,r);if(Kt(Ke),Ke.conflict)a("Merge conflict detected. Resolve manually.","error");else{const Lt=Me?.rebase?"Pull --rebase completed":"Pull completed";a(Ke.message||Lt,"success")}const Qe=await zi(r,{extended:!0});S(Qe)}catch(Ke){a(Ce(Ke)||"Pull failed","error")}finally{Wt(null)}},[a,r]),pt=i.useCallback(async()=>{Wt("push");try{const Me=await eE(r);Kt(Me),a(Me.message||"Push completed","success");const Ke=await zi(r,{extended:!0});S(Ke)}catch(Me){a(Ce(Me)||"Push failed","error")}finally{Wt(null)}},[a,r]);i.useEffect(()=>{ay(r).then(Me=>I(Me.rootDir)).catch(()=>I(null))},[r]);const Zt=i.useCallback(async()=>{if(!w?.integrationBranch||w.isOnIntegrationBranch===!1)return;const Me=R;if(!Me){a("Project root path not available","error");return}Wt("sync-integration");try{const Ke=r?`?projectId=${encodeURIComponent(r)}`:"";await $(`/git/pull${Ke}`,{method:"POST",body:JSON.stringify({worktreePath:Me,integrationBranch:w.integrationBranch,taskId:void 0,skipOriginFetch:!0})}),a("Synced worktree to local integration tip","success");const Qe=await zi(r,{extended:!0});S(Qe)}catch(Ke){a(Ce(Ke)||"Sync failed","error")}finally{Wt(null)}},[a,r,R,w?.integrationBranch,w?.isOnIntegrationBranch]),ce=i.useMemo(()=>E.filter(Me=>Me.staged),[E]),Ge=i.useMemo(()=>E.filter(Me=>!Me.staged),[E]);return e?t.jsx("div",{className:"modal-overlay open git-manager-modal-overlay",...N,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal gm-modal",ref:j,style:m,children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("h3",{children:[t.jsx(Cm,{size:18,style:{marginRight:8,verticalAlign:"middle"}}),"Git Manager"]}),t.jsxs("div",{className:"gm-header-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:xn,disabled:v,title:"Refresh",children:t.jsx(Ss,{size:14,className:v?"spin":""})}),t.jsx("button",{className:"modal-close",onClick:f,"aria-label":"Close",children:t.jsx(Nn,{size:18})})]})]}),t.jsxs("div",{className:"gm-layout",children:[t.jsx("nav",{className:"gm-sidebar",role:"tablist","aria-label":"Git Manager Sections",children:rl.map(Me=>{const Ke=Me.icon;return t.jsxs("button",{role:"tab","aria-selected":p===Me.id,className:`gm-nav-item${p===Me.id?" active":""}`,onClick:()=>b(Me.id),children:[t.jsx(Ke,{size:16}),t.jsx("span",{className:"gm-nav-label",children:Me.label})]},Me.id)})}),t.jsxs("div",{className:"gm-content",role:"tabpanel",children:[v&&t.jsxs("div",{className:"gm-loading",children:[t.jsx(Ct,{size:24,className:"spin"}),t.jsx("span",{children:"Loading..."})]}),y&&!v&&t.jsxs("div",{className:"gm-error",children:[t.jsx(oi,{size:18}),t.jsx("span",{children:y}),t.jsx("button",{className:"btn btn-sm",onClick:xn,children:"Retry"})]}),p==="status"&&!v&&w&&t.jsx(c3,{status:w,copyToClipboard:C,onSyncWorkingTree:Zt,syncing:nt==="sync-integration"}),p==="changes"&&!v&&t.jsx(d3,{status:w,stagedFiles:ce,unstagedFiles:Ge,selectedFiles:G,toggleFileSelection:on,onStageFiles:Tn,onUnstageFiles:Sn,onDiscardChanges:is,onSelectDiffFile:tn,selectedDiffTarget:z,changeDiff:Y,loadingChangeDiff:_,changeDiffError:ae,commitMessage:P,setCommitMessage:T,onCommit:On,onStageAllAndCommit:un,committing:D}),p==="commits"&&!v&&t.jsx(u3,{commits:Zn,commitSearch:ve,setCommitSearch:A,selectedCommit:re,commitDiff:ue,loadingDiff:be,onCommitClick:pn,onLoadMore:mn,canLoadMore:le.length>=O&&O<100,copyToClipboard:C}),p==="branches"&&!v&&t.jsx(m3,{branches:Pn,branchSearch:Le,setBranchSearch:de,newBranchName:ee,setNewBranchName:ge,branchBase:Ne,setBranchBase:He,onCreateBranch:In,onCheckoutBranch:rn,onDeleteBranch:hn,loading:v,allBranches:ne,selectedBranch:Re,branchCommits:rt,loadingBranchCommits:Xe,expandedBranchCommit:at,branchCommitDiff:pe,loadingBranchCommitDiff:et,onSelectBranch:nn,onBranchCommitClick:$t,onCloseBranchDetails:Jt}),p==="worktrees"&&!v&&t.jsx(h3,{worktrees:it}),p==="stashes"&&!v&&t.jsx(f3,{stashes:Nt,stashMessage:Be,setStashMessage:Z,onCreateStash:ie,onApplyStash:Fe,onDropStash:Je,onToggleStashDiff:tt,stashLoading:Oe,expandedStashIndex:je,stashDiff:Et,loadingStashDiff:xe,stashDiffError:_t}),p==="remotes"&&!v&&t.jsx(p3,{status:w,remoteLoading:nt,lastRemoteResult:Mt,onFetch:Ye,onPull:vt,onPush:pt,onSyncIntegrationTip:Zt,syncIntegrationDisabled:!w?.integrationBranch||w?.isOnIntegrationBranch===!1||nt!==null,addToast:a,projectId:r,copyToClipboard:C})]})]})]})}):null}function c3({status:e,copyToClipboard:n,onSyncWorkingTree:s,syncing:a}){const[r,o]=i.useState(!1);return t.jsxs("div",{className:"gm-panel","data-testid":"status-panel",children:[t.jsx("div",{className:"gm-panel-header",children:t.jsx("h4",{children:"Repository Status"})}),t.jsxs("div",{className:"gm-status-grid",children:[t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"Branch"}),t.jsxs("span",{className:"gm-status-value",children:[t.jsx(ii,{size:14}),t.jsx("span",{children:e.branch}),e.integrationBranch&&e.isOnIntegrationBranch===!1&&t.jsxs("span",{className:"gm-status-sub",title:"Currently on a non-integration branch",children:[" ","(not on ",e.integrationBranch,")"]})]})]}),t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"Commit"}),t.jsxs("span",{className:"gm-status-value",children:[t.jsx("code",{className:"gm-hash",children:e.commit}),t.jsx("button",{className:"gm-icon-btn",onClick:()=>n(e.commit,"commit hash"),title:`Copy short commit hash${e.headSha?" (use the full SHA below for git operations)":""}`,children:t.jsx(ga,{size:12})}),e.headSha&&t.jsxs("button",{className:"gm-icon-btn",onClick:()=>n(e.headSha,"full commit hash"),title:"Copy full 40-char SHA",children:[t.jsx(ga,{size:12}),t.jsx("span",{style:{fontSize:10,marginLeft:2},children:"full"})]})]})]}),t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"Working Tree"}),t.jsx("span",{className:`gm-status-badge ${e.isDirty?"dirty":"clean"}`,children:e.isDirty?t.jsxs(t.Fragment,{children:[t.jsx(oi,{size:12}),"Modified"]}):t.jsxs(t.Fragment,{children:[t.jsx(gs,{size:12}),"Clean"]})}),e.dirtyDetails&&e.dirtyDetails.staged+e.dirtyDetails.modified+e.dirtyDetails.untracked+e.dirtyDetails.conflicted>0&&t.jsxs("span",{className:"gm-status-sub",children:[e.dirtyDetails.staged>0&&t.jsxs("span",{title:"Staged",children:[e.dirtyDetails.staged," staged"]}),e.dirtyDetails.staged>0&&e.dirtyDetails.modified+e.dirtyDetails.untracked+e.dirtyDetails.conflicted>0&&" · ",e.dirtyDetails.modified>0&&t.jsxs("span",{title:"Modified",children:[e.dirtyDetails.modified," modified"]}),e.dirtyDetails.modified>0&&e.dirtyDetails.untracked+e.dirtyDetails.conflicted>0&&" · ",e.dirtyDetails.untracked>0&&t.jsxs("span",{title:"Untracked",children:[e.dirtyDetails.untracked," untracked"]}),e.dirtyDetails.untracked>0&&e.dirtyDetails.conflicted>0&&" · ",e.dirtyDetails.conflicted>0&&t.jsxs("span",{title:"Unresolved merge conflicts",className:"gm-status-conflict",children:[e.dirtyDetails.conflicted," conflicted"]})]})]}),t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"vs origin"}),t.jsxs("span",{className:"gm-status-value",children:[e.ahead>0&&t.jsxs("span",{className:"gm-ahead",title:`${e.ahead} commit(s) ahead of upstream`,children:[t.jsx(ua,{size:12}),e.ahead]}),e.behind>0&&t.jsxs("span",{className:"gm-behind",title:`${e.behind} commit(s) behind upstream`,children:[t.jsx(Wa,{size:12}),e.behind]}),e.ahead===0&&e.behind===0&&t.jsxs("span",{className:"gm-in-sync",children:[t.jsx(gs,{size:12}),"Up to date"]})]})]})]}),e.integrationBranch&&t.jsxs("div",{className:"gm-status-grid",children:[t.jsxs("div",{className:"gm-status-card","data-testid":"integration-branch-card",children:[t.jsx("span",{className:"gm-status-label",children:"Integration branch"}),t.jsxs("span",{className:"gm-status-value",children:[t.jsx(ii,{size:14}),t.jsx("span",{children:e.integrationBranch}),e.integrationBranchSource&&t.jsxs("span",{className:"gm-status-sub",title:`Resolved from ${e.integrationBranchSource}`,children:[" ","(",e.integrationBranchSource,")"]})]}),e.integrationTipSha&&t.jsxs("span",{className:"gm-status-sub",children:["tip ",t.jsx("code",{className:"gm-hash",children:e.integrationTipSha.slice(0,8)}),e.integrationTipSource==="remote-only"&&t.jsxs(t.Fragment,{children:[" ",t.jsxs("span",{title:"No local refs/heads/<branch>; using refs/remotes/origin/<branch> as the integration tip.",children:["(remote-only — run ",t.jsxs("code",{children:["git switch ",e.integrationBranch]})," to track locally)"]})]})]}),e.integrationTipSource==="missing"&&t.jsxs("span",{className:"gm-status-sub gm-status-conflict",title:"Neither refs/heads nor refs/remotes/origin has this branch",children:["no ref found for ",e.integrationBranch]})]}),e.integrationTipSha!==void 0&&(e.aheadOfIntegration!==void 0||e.behindIntegration!==void 0)&&t.jsxs("div",{className:"gm-status-card",children:[t.jsxs("span",{className:"gm-status-label",children:["HEAD vs ",e.integrationBranch]}),t.jsx("span",{className:"gm-status-value",children:(e.aheadOfIntegration??0)===0&&(e.behindIntegration??0)===0?t.jsxs("span",{className:"gm-in-sync",children:[t.jsx(gs,{size:12}),"Aligned"]}):t.jsxs(t.Fragment,{children:[(e.aheadOfIntegration??0)>0&&t.jsxs("span",{className:"gm-ahead",title:`HEAD has ${e.aheadOfIntegration} commit(s) not on ${e.integrationBranch}`,children:[t.jsx(ua,{size:12}),e.aheadOfIntegration]}),(e.behindIntegration??0)>0&&t.jsxs("span",{className:"gm-behind",title:`${e.integrationBranch} has ${e.behindIntegration} commit(s) HEAD doesn't`,children:[t.jsx(Wa,{size:12}),e.behindIntegration]})]})})]}),e.originIntegrationTipSha!==void 0&&t.jsxs("div",{className:"gm-status-card",children:[t.jsxs("span",{className:"gm-status-label",children:["Local ",e.integrationBranch," vs origin"]}),t.jsx("span",{className:"gm-status-value",children:e.originIntegrationTipSha===null?t.jsx("span",{className:"gm-status-sub",children:"no origin tracking"}):e.integrationTipSource==="remote-only"?t.jsx("span",{className:"gm-status-sub",title:"No local refs/heads/<branch> exists; nothing to compare against origin.",children:"no local tracking"}):(e.aheadOfOriginIntegration??0)===0&&(e.behindOriginIntegration??0)===0?t.jsxs("span",{className:"gm-in-sync",children:[t.jsx(gs,{size:12}),"Synced"]}):t.jsxs(t.Fragment,{children:[(e.aheadOfOriginIntegration??0)>0&&t.jsxs("span",{className:"gm-ahead",title:`Local ${e.integrationBranch} is ${e.aheadOfOriginIntegration} commit(s) ahead of origin/${e.integrationBranch}`,children:[t.jsx(ua,{size:12}),e.aheadOfOriginIntegration]}),(e.behindOriginIntegration??0)>0&&t.jsxs("span",{className:"gm-behind",title:`Local ${e.integrationBranch} is ${e.behindOriginIntegration} commit(s) behind origin/${e.integrationBranch}`,children:[t.jsx(Wa,{size:12}),e.behindOriginIntegration]})]})})]}),e.integrationTipSource==="remote-only"&&e.aheadOfIntegrationRemote!==void 0&&t.jsxs("div",{className:"gm-status-card",children:[t.jsxs("span",{className:"gm-status-label",children:["HEAD vs origin/",e.integrationBranch]}),t.jsx("span",{className:"gm-status-value",children:(e.aheadOfIntegrationRemote??0)===0&&(e.behindIntegrationRemote??0)===0?t.jsxs("span",{className:"gm-in-sync",children:[t.jsx(gs,{size:12}),"Aligned"]}):t.jsxs(t.Fragment,{children:[(e.aheadOfIntegrationRemote??0)>0&&t.jsxs("span",{className:"gm-ahead",title:`HEAD has ${e.aheadOfIntegrationRemote} commit(s) not on origin/${e.integrationBranch}`,children:[t.jsx(ua,{size:12}),e.aheadOfIntegrationRemote]}),(e.behindIntegrationRemote??0)>0&&t.jsxs("span",{className:"gm-behind",title:`origin/${e.integrationBranch} has ${e.behindIntegrationRemote} commit(s) HEAD doesn't`,children:[t.jsx(Wa,{size:12}),e.behindIntegrationRemote]})]})})]}),(e.stashCount??0)>0&&t.jsxs("div",{className:"gm-status-card",children:[t.jsx("span",{className:"gm-status-label",children:"Stashes"}),t.jsxs("span",{className:"gm-status-value",children:[t.jsx(Ar,{size:14}),t.jsx("span",{children:e.stashCount})]})]})]}),e.indexStaleVsHead===!0&&t.jsxs("div",{className:"gm-status-warning","data-testid":"index-stale-warning",role:"alert",children:[t.jsx(oi,{size:14}),t.jsxs("div",{children:[t.jsx("strong",{children:"Stale index detected."})," ",'HEAD has advanced (typically because Fusion\'s merger updated the integration-branch ref) but the index still reflects the previous tip — `git status` will report the new commits inverted as "staged changes." Enable ',t.jsx("code",{children:"mergeAdvanceAutoSync"})," in Settings to have the merger reconcile automatically, or run ",t.jsx("code",{children:"git reset --hard HEAD"})," to snap forward manually."]})]}),(e.recentMergeAdvances??[]).length>0&&t.jsxs("div",{className:"gm-status-advances","data-testid":"recent-merge-advances",children:[t.jsxs("div",{className:"gm-status-advances-header",children:[t.jsxs("span",{children:["Recent integration-branch advances",t.jsxs("span",{className:"gm-status-sub",children:[" ","(",(e.recentMergeAdvances??[]).filter(l=>l.needsAction).length," need action)"]}),t.jsx("button",{type:"button",className:"gm-icon-btn",style:{marginLeft:6},"aria-expanded":r,"aria-label":r?"Hide explanation":"What does this mean?",onClick:()=>o(l=>!l),title:"What does this mean?",children:t.jsx(wS,{size:13})})]}),(e.recentMergeAdvances??[]).some(l=>l.needsAction)&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:s,disabled:a,"data-testid":"sync-working-tree-btn",title:"Pull the integration branch into your working tree (auto-stashes uncommitted edits and restores them)",children:a?"Syncing…":"Sync working tree"})]}),r&&t.jsxs("div",{className:"gm-status-advances-help","data-testid":"recent-merge-advances-help",children:[t.jsxs("p",{children:["Each entry is a Fusion task whose squash commit advanced the integration branch ref (",t.jsx("code",{children:e.integrationBranch??"main"}),"). The ",t.jsx("em",{children:"auto-sync outcome"})," says whether your working tree was also fast-forwarded to that new tip."]}),t.jsxs("ul",{className:"gm-status-advances-help-list",children:[t.jsxs("li",{children:[t.jsx("code",{children:"clean-sync"})," / ",t.jsx("code",{children:"synced-with-edits-restored"})," — working tree is in sync; nothing to do."]}),t.jsxs("li",{children:[t.jsx("code",{children:"off / not run"})," — auto-sync is disabled in Settings; the branch ref moved but your worktree didn't follow."]}),t.jsxs("li",{children:[t.jsx("code",{children:"stash-failed"})," / ",t.jsx("code",{children:"would-conflict"})," / similar — auto-sync tried but couldn't reconcile (usually local edits collide with the new commit)."]})]}),t.jsxs("p",{children:[t.jsx("strong",{children:"Fix:"})," click ",t.jsx("em",{children:"Sync working tree"})," to catch up now. Pure-local — it auto-stashes any uncommitted edits, hard-resets the worktree to match the local integration tip (the sha the merger advanced ",t.jsxs("code",{children:["refs/heads/",e.integrationBranch??"main"]})," to), and restores your stash. Origin is not touched, so no unrelated remote work gets pulled in. To make this automatic going forward, enable ",t.jsx("code",{children:"mergeAdvanceAutoSync"})," in Settings."]})]}),t.jsx("ul",{children:(e.recentMergeAdvances??[]).map(l=>t.jsxs("li",{className:l.needsAction?"gm-advance-needs-action":"gm-advance-handled",children:[t.jsx("code",{className:"gm-hash",children:l.toSha.slice(0,8)})," ",t.jsx("strong",{children:l.taskId}),l.autoSyncOutcome?t.jsxs("span",{className:"gm-status-sub",children:[" ","auto-sync: ",t.jsx("code",{children:l.autoSyncOutcome})]}):t.jsxs("span",{className:"gm-status-sub",children:[" ","auto-sync: ",t.jsx("em",{children:"off / not run"})]}),t.jsxs("span",{className:"gm-status-sub",children:[" ","· ",new Date(l.advancedAt).toLocaleTimeString()]})]},`${l.taskId}-${l.toSha}`))})]})]})}function d3({status:e,stagedFiles:n,unstagedFiles:s,selectedFiles:a,toggleFileSelection:r,onStageFiles:o,onUnstageFiles:l,onDiscardChanges:c,onSelectDiffFile:d,selectedDiffTarget:u,changeDiff:h,loadingChangeDiff:m,changeDiffError:f,commitMessage:p,setCommitMessage:b,onCommit:v,onStageAllAndCommit:x,committing:y}){const g=s.filter(N=>a.has(`unstaged:${N.file}`)),j=n.filter(N=>a.has(`staged:${N.file}`));return t.jsxs("div",{className:"gm-panel","data-testid":"changes-panel",children:[e&&t.jsxs("div",{className:"gm-changes-header",children:[t.jsxs("span",{className:"gm-branch-indicator",children:[t.jsx(ii,{size:14}),e.branch]}),e.isDirty&&t.jsx("span",{className:"gm-dirty-badge",children:"Modified"})]}),t.jsxs("div",{className:"gm-changes-split",children:[t.jsxs("div",{className:"gm-changes-lists",children:[t.jsxs("div",{className:"gm-file-section",children:[t.jsxs("div",{className:"gm-file-section-header",children:[t.jsxs("h5",{children:["Unstaged Changes (",s.length,")"]}),t.jsxs("div",{className:"gm-file-section-actions",children:[g.length>0&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn-sm btn-primary",onClick:()=>o(g.map(N=>N.file)),title:"Stage selected",children:[t.jsx(os,{size:12})," Stage (",g.length,")"]}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>c(g.map(N=>N.file)),title:"Discard selected",children:t.jsx(Za,{size:12})})]}),s.length>0&&t.jsx("button",{className:"btn btn-sm",onClick:()=>o(s.map(N=>N.file)),title:"Stage all",children:"Stage All"})]})]}),t.jsx("div",{className:"gm-file-list gm-file-list-unstaged","data-testid":"gm-file-list-unstaged",children:s.length===0?t.jsx("div",{className:"gm-empty",children:"No unstaged changes"}):s.map(N=>{const C=u?.file===N.file&&u.staged===!1;return t.jsxs("div",{className:`gm-file-item${C?" active":""}`,onClick:()=>d(N.file,!1),role:"button",tabIndex:0,onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),d(N.file,!1))},children:[t.jsx("label",{className:"gm-file-checkbox",onClick:w=>w.stopPropagation(),children:t.jsx("input",{type:"checkbox",checked:a.has(`unstaged:${N.file}`),onChange:()=>r(`unstaged:${N.file}`)})}),t.jsx(Tx,{status:N.status}),t.jsx("span",{className:"gm-file-name",title:N.file,children:t.jsx("bdo",{dir:"ltr",children:N.file})}),t.jsx(Ix,{status:N.status}),t.jsx("button",{className:"gm-icon-btn",onClick:w=>{w.stopPropagation(),o([N.file])},title:"Stage file",children:t.jsx(os,{size:12})})]},`unstaged:${N.file}`)})})]}),t.jsxs("div",{className:"gm-file-section",children:[t.jsxs("div",{className:"gm-file-section-header",children:[t.jsxs("h5",{children:["Staged Changes (",n.length,")"]}),t.jsxs("div",{className:"gm-file-section-actions",children:[j.length>0&&t.jsxs("button",{className:"btn btn-sm",onClick:()=>l(j.map(N=>N.file)),title:"Unstage selected",children:["Unstage (",j.length,")"]}),n.length>0&&t.jsx("button",{className:"btn btn-sm",onClick:()=>l(n.map(N=>N.file)),title:"Unstage all",children:"Unstage All"})]})]}),t.jsx("div",{className:"gm-file-list gm-file-list-staged","data-testid":"gm-file-list-staged",children:n.length===0?t.jsx("div",{className:"gm-empty",children:"No staged changes"}):n.map(N=>{const C=u?.file===N.file&&u.staged===!0;return t.jsxs("div",{className:`gm-file-item staged${C?" active":""}`,onClick:()=>d(N.file,!0),role:"button",tabIndex:0,onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),d(N.file,!0))},children:[t.jsx("label",{className:"gm-file-checkbox",onClick:w=>w.stopPropagation(),children:t.jsx("input",{type:"checkbox",checked:a.has(`staged:${N.file}`),onChange:()=>r(`staged:${N.file}`)})}),t.jsx(Tx,{status:N.status}),t.jsx("span",{className:"gm-file-name",title:N.file,children:t.jsx("bdo",{dir:"ltr",children:N.file})}),t.jsx(Ix,{status:N.status}),t.jsx("button",{className:"gm-icon-btn",onClick:w=>{w.stopPropagation(),l([N.file])},title:"Unstage file",children:t.jsx(Nn,{size:12})})]},`staged:${N.file}`)})})]})]}),t.jsx("div",{className:"gm-changes-diff",children:u||m||h||f?t.jsxs("div",{className:"gm-diff-section",children:[u&&t.jsxs("div",{className:"gm-diff-target",children:[t.jsx(Sm,{size:14}),t.jsxs("span",{children:[u.staged?"Staged":"Unstaged"," diff: "]}),t.jsx("code",{children:u.file})]}),m&&t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}),f&&!m&&t.jsx("div",{className:"gm-diff-error",children:f}),h&&!m&&t.jsxs("div",{className:"gm-diff-viewer",children:[h.stat&&t.jsx("pre",{className:"gm-diff-stat",children:h.stat}),t.jsx("pre",{className:"gm-diff-patch",children:h.patch})]})]}):t.jsxs("div",{className:"gm-diff-empty",children:[t.jsx(Sm,{size:20}),t.jsx("span",{children:"Select a file to view its diff"})]})})]}),t.jsxs("form",{className:"gm-commit-form",onSubmit:v,children:[t.jsx("textarea",{className:"gm-commit-input",placeholder:"Commit message...",value:p,onChange:N=>b(N.target.value),rows:3,disabled:y}),t.jsxs("div",{className:"gm-commit-actions",children:[t.jsxs("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:y||!p.trim()||n.length===0,title:n.length===0?"No staged changes to commit":"Commit staged changes",children:[y?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(vr,{size:14}),"Commit"]}),s.length>0&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,disabled:y||!p.trim(),title:"Stage all and commit",children:"Stage All & Commit"})]})]})]})}function u3({commits:e,commitSearch:n,setCommitSearch:s,selectedCommit:a,commitDiff:r,loadingDiff:o,onCommitClick:l,onLoadMore:c,canLoadMore:d,copyToClipboard:u}){return t.jsxs("div",{className:"gm-panel","data-testid":"commits-panel",children:[t.jsxs("div",{className:"gm-panel-header",children:[t.jsx("h4",{children:"Commits"}),t.jsxs("div",{className:"gm-search-box",children:[t.jsx(da,{size:14}),t.jsx("input",{type:"text",placeholder:"Search commits...",value:n,onChange:h=>s(h.target.value)})]})]}),t.jsx("div",{className:"gm-commits-list",children:e.length===0?t.jsx("div",{className:"gm-empty",children:n?"No matching commits":"No commits found"}):e.map((h,m)=>t.jsxs("div",{className:"gm-commit-item",children:[t.jsxs("div",{className:"gm-commit-graph",children:[t.jsx("div",{className:"gm-commit-dot"}),m<e.length-1&&t.jsx("div",{className:"gm-commit-line"})]}),t.jsxs("div",{className:"gm-commit-body",children:[t.jsxs("button",{className:"gm-commit-header",onClick:()=>l(h.hash),children:[t.jsxs("div",{className:"gm-commit-top-row",children:[t.jsx("code",{className:"gm-hash",children:h.shortHash}),t.jsx("span",{className:"gm-commit-message",title:h.message,children:h.message})]}),t.jsxs("div",{className:"gm-commit-meta",children:[t.jsx("span",{children:h.author}),t.jsx("span",{children:"•"}),t.jsx("span",{children:Mo(h.date)}),h.parents.length>1&&t.jsx("span",{className:"gm-merge-badge",children:"merge"})]})]}),t.jsx("div",{className:"gm-commit-actions-row",children:t.jsx("button",{className:"gm-icon-btn",onClick:()=>u(h.hash,"commit hash"),title:"Copy full hash",children:t.jsx(ga,{size:12})})}),a===h.hash&&t.jsx("div",{className:"gm-commit-diff",children:o?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}):r?t.jsxs(t.Fragment,{children:[h.body&&t.jsx("div",{className:"gm-commit-message-full",children:h.body}),r.stat&&t.jsx("pre",{className:"gm-diff-stat",children:r.stat}),t.jsx("pre",{className:"gm-diff-patch",children:r.patch})]}):t.jsx("div",{className:"gm-diff-error",children:"Failed to load diff"})})]})]},h.hash))}),d&&t.jsx("button",{className:"gm-load-more",onClick:c,children:"Load more commits"})]})}function m3({branches:e,branchSearch:n,setBranchSearch:s,newBranchName:a,setNewBranchName:r,branchBase:o,setBranchBase:l,onCreateBranch:c,onCheckoutBranch:d,onDeleteBranch:u,loading:h,allBranches:m,selectedBranch:f,branchCommits:p,loadingBranchCommits:b,expandedBranchCommit:v,branchCommitDiff:x,loadingBranchCommitDiff:y,onSelectBranch:g,onBranchCommitClick:j,onCloseBranchDetails:N}){return t.jsxs("div",{className:"gm-panel","data-testid":"branches-panel",children:[t.jsxs("div",{className:"gm-panel-header",children:[t.jsx("h4",{children:"Branches"}),t.jsxs("div",{className:"gm-search-box",children:[t.jsx(da,{size:14}),t.jsx("input",{type:"text",placeholder:"Filter branches...",value:n,onChange:C=>s(C.target.value)})]})]}),t.jsxs("form",{className:"gm-create-form",onSubmit:c,children:[t.jsx("input",{type:"text",placeholder:"New branch name",value:a,onChange:C=>r(C.target.value),disabled:h}),t.jsxs("select",{value:o,onChange:C=>l(C.target.value),disabled:h,className:"gm-branch-select",children:[t.jsx("option",{value:"",children:"Base: HEAD"}),m.map(C=>t.jsx("option",{value:C.name,children:C.name},C.name))]}),t.jsxs("button",{type:"submit",className:"btn btn-primary btn-sm",disabled:h||!a.trim(),children:[t.jsx(os,{size:14}),"Create"]})]}),t.jsx("div",{className:"gm-branches-list",children:e.length===0?t.jsx("div",{className:"gm-empty",children:n?"No matching branches":"No branches found"}):e.map(C=>t.jsxs("div",{children:[t.jsxs("div",{className:`gm-branch-item${C.isCurrent?" current":""}${f===C.name?" selected":""}`,onClick:()=>g(C.name),children:[t.jsxs("div",{className:"gm-branch-info",children:[t.jsxs("span",{className:"gm-branch-name",children:[C.isCurrent&&t.jsx(Js,{size:14,className:"gm-current-icon"}),C.name]}),C.remote&&t.jsxs("span",{className:"gm-branch-remote",children:["→ ",C.remote]}),C.lastCommitDate&&t.jsx("span",{className:"gm-branch-date",children:Mo(C.lastCommitDate)})]}),t.jsx("div",{className:"gm-branch-actions",children:!C.isCurrent&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:w=>{w.stopPropagation(),d(C.name)},disabled:h,title:"Checkout",children:t.jsx(ii,{size:14})}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:w=>{w.stopPropagation(),u(C.name)},disabled:h,title:"Delete",children:t.jsx(es,{size:14})})]})})]}),f===C.name&&t.jsxs("div",{className:"gm-branch-details",children:[t.jsxs("div",{className:"gm-branch-details-header",children:[t.jsxs("span",{className:"gm-branch-details-title",children:[t.jsx(yo,{size:14}),"Commits on ",C.name]}),t.jsx("button",{className:"gm-icon-btn",onClick:N,title:"Close","data-testid":"close-branch-details",children:t.jsx(Nn,{size:14})})]}),b?t.jsxs("div",{className:"gm-branch-details-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading commits..."]}):p.length===0?t.jsx("div",{className:"gm-empty",children:"No commits found"}):t.jsx("div",{className:"gm-branch-commits-list",children:p.map(w=>t.jsxs("div",{className:"gm-branch-commit",children:[t.jsxs("button",{className:"gm-branch-commit-row",onClick:()=>j(w.hash),"data-testid":`branch-commit-${w.shortHash}`,children:[t.jsx("span",{className:"gm-commit-hash",children:w.shortHash}),t.jsx("span",{className:"gm-commit-message",title:w.message,children:w.message}),t.jsxs("div",{className:"gm-commit-meta",children:[t.jsx("span",{children:w.author}),t.jsx("span",{children:"•"}),t.jsx("span",{children:Mo(w.date)}),w.parents.length>1&&t.jsx("span",{className:"gm-merge-badge",children:"merge"})]})]}),v===w.hash&&t.jsx("div",{className:"gm-commit-diff",children:y?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}):x?t.jsxs(t.Fragment,{children:[(w.body||w.message)&&t.jsx("div",{className:"gm-commit-message-full",children:w.body||w.message}),x.stat&&t.jsx("pre",{className:"gm-diff-stat",children:x.stat}),t.jsx("pre",{className:"gm-diff-patch",children:x.patch})]}):t.jsx("div",{className:"gm-diff-error",children:"Failed to load diff"})})]},w.hash))})]})]},C.name))})]})}function h3({worktrees:e}){return t.jsxs("div",{className:"gm-panel","data-testid":"worktrees-panel",children:[t.jsxs("div",{className:"gm-panel-header",children:[t.jsx("h4",{children:"Worktrees"}),t.jsxs("div",{className:"gm-worktree-stats",children:[t.jsxs("span",{children:[e.length," total"]}),t.jsx("span",{className:"gm-stat-separator",children:"•"}),t.jsxs("span",{children:[e.filter(n=>n.taskId).length," in use"]})]})]}),t.jsx("div",{className:"gm-worktrees-list",children:e.map(n=>t.jsx("div",{className:`gm-worktree-item${n.isMain?" main":""}`,children:t.jsxs("div",{className:"gm-worktree-info",children:[t.jsxs("div",{className:"gm-worktree-path-row",children:[n.isMain&&t.jsx("span",{className:"gm-badge main",children:"main"}),n.isBare&&t.jsx("span",{className:"gm-badge bare",children:"bare"}),t.jsx("span",{className:"gm-worktree-path",title:n.path,children:Lh(n.path)||n.path})]}),t.jsxs("div",{className:"gm-worktree-detail",children:[n.branch&&t.jsxs("span",{className:"gm-worktree-branch",children:[t.jsx(ii,{size:12}),n.branch]}),n.taskId&&t.jsx("span",{className:"gm-worktree-task",children:n.taskId})]})]})},n.path))})]})}function f3({stashes:e,stashMessage:n,setStashMessage:s,onCreateStash:a,onApplyStash:r,onDropStash:o,onToggleStashDiff:l,stashLoading:c,expandedStashIndex:d,stashDiff:u,loadingStashDiff:h,stashDiffError:m}){return t.jsxs("div",{className:"gm-panel","data-testid":"stashes-panel",children:[t.jsx("div",{className:"gm-panel-header",children:t.jsx("h4",{children:"Stashes"})}),t.jsxs("form",{className:"gm-create-form",onSubmit:a,children:[t.jsx("input",{type:"text",placeholder:"Stash message (optional)",value:n,onChange:f=>s(f.target.value),disabled:c!==null}),t.jsxs("button",{type:"submit",className:"btn btn-primary btn-sm",disabled:c!==null,children:[c==="create"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ar,{size:14}),"Stash"]})]}),t.jsx("div",{className:"gm-stash-list",children:e.length===0?t.jsx("div",{className:"gm-empty",children:"No stashes"}):e.map(f=>t.jsxs("div",{className:"gm-stash-item",children:[t.jsxs("div",{className:"gm-stash-header",children:[t.jsxs("div",{className:"gm-stash-info",children:[t.jsxs("span",{className:"gm-stash-ref",children:["stash@",`{${f.index}}`]}),t.jsx("span",{className:"gm-stash-message",children:f.message}),t.jsxs("div",{className:"gm-stash-meta",children:[f.branch&&t.jsxs("span",{className:"gm-stash-branch",children:[t.jsx(ii,{size:12}),f.branch]}),t.jsx("span",{children:Mo(f.date)})]})]}),t.jsxs("div",{className:"gm-stash-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>l(f.index),disabled:c!==null,children:d===f.index?"Hide":"View"}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>r(f.index,!1),disabled:c!==null,title:"Apply stash (keep)",children:c===`apply-${f.index}`?t.jsx(Ct,{size:14,className:"spin"}):"Apply"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>r(f.index,!0),disabled:c!==null,title:"Pop stash (apply and drop)",children:"Pop"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>o(f.index),disabled:c!==null,title:"Drop stash",children:c===`drop-${f.index}`?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(es,{size:14})})]})]}),d===f.index&&t.jsx("div",{className:"gm-stash-diff",children:h?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:14,className:"spin"}),"Loading stash diff…"]}):m?t.jsx("div",{className:"gm-diff-error",children:m}):u?t.jsxs("div",{className:"gm-diff-viewer",children:[u.stat&&t.jsx("pre",{className:"gm-diff-stat",children:u.stat}),t.jsx("pre",{className:"gm-diff-patch",children:u.patch})]}):null})]},f.index))})]})}function p3({status:e,remoteLoading:n,lastRemoteResult:s,onFetch:a,onPull:r,onPush:o,onSyncIntegrationTip:l,syncIntegrationDisabled:c,addToast:d,projectId:u,copyToClipboard:h}){const m=Se=>{try{return new URL(Se).hostname}catch{return Se.replace(/^git@/,"").split(":")[0]||Se}},[f,p]=i.useState([]),[b,v]=i.useState(!1),[x,y]=i.useState(null),[g,j]=i.useState(""),[N,C]=i.useState(""),[w,S]=i.useState(null),[R,I]=i.useState(""),[E,M]=i.useState(""),[G,U]=i.useState(!1),[P,T]=i.useState(!1),D=i.useRef(null),[W,Y]=i.useState([]),[L,_]=i.useState(!1),[F,ae]=i.useState(null),[k,z]=i.useState([]),[J,oe]=i.useState(!1),[le,we]=i.useState(null),re=i.useRef(0),H=f.find(Se=>Se.name===F);i.useEffect(()=>{(n!==null||b)&&T(!1)},[n,b]),i.useEffect(()=>{if(!P)return;const Se=_e=>{D.current?.contains(_e.target)||T(!1)},pe=_e=>{_e.key==="Escape"&&T(!1)};return document.addEventListener("mousedown",Se),document.addEventListener("keydown",pe),()=>{document.removeEventListener("mousedown",Se),document.removeEventListener("keydown",pe)}},[P]);const[ue,Q]=i.useState(null),[be,fe]=i.useState(null),[O,se]=i.useState(!1),[ve,A]=i.useState(null),[ne,ye]=i.useState(null),[ee,ge]=i.useState(!1);i.useEffect(()=>{Ne()},[]),i.useEffect(()=>{e&&e.ahead>0?He():e&&e.ahead===0&&Y([])},[e?.ahead]),i.useEffect(()=>{f.length>0&&!F&&ae(f[0].name)},[f]),i.useEffect(()=>{F?Le(F):(z([]),we(null))},[F]),i.useEffect(()=>{!F||!s||Le(F)},[F,s]),i.useEffect(()=>{F&&!f.find(Se=>Se.name===F)&&ae(f.length>0?f[0].name:null)},[f,F]);const Ne=async()=>{v(!0);try{const Se=await T1(u);p(Se)}catch(Se){d(Ce(Se)||"Failed to load remotes","error")}finally{v(!1)}},He=async()=>{_(!0);try{const Se=await W1(u);Y(Se)}catch{Y([])}finally{_(!1)}},Le=async Se=>{const pe=re.current+1;re.current=pe,oe(!0),we(null);try{const _e=await G1(Se,void 0,10,u);if(re.current!==pe)return;z(_e)}catch(_e){if(re.current!==pe)return;we(Ce(_e)||"Failed to load remote commits"),z([])}finally{re.current===pe&&oe(!1)}},de=Di(),Re=async Se=>{if(Se.preventDefault(),!(!g.trim()||!N.trim())){y("add");try{await I1(g.trim(),N.trim(),u),d(`Remote '${g}' added successfully`,"success"),j(""),C(""),U(!1),await Ne()}catch(pe){d(Ce(pe)||"Failed to add remote","error")}finally{y(null)}}},Pe=async Se=>{if(await de.confirm({title:"Remove Remote",message:`Are you sure you want to remove remote '${Se}'?`,danger:!0})){y(`remove-${Se}`);try{await P1(Se,u),d(`Remote '${Se}' removed`,"success"),await Ne()}catch(_e){d(Ce(_e)||"Failed to remove remote","error")}finally{y(null)}}},rt=async Se=>{if(E.trim()){y(`rename-${Se}`);try{await $1(Se,E.trim(),u),d(`Remote renamed to '${E.trim()}'`,"success"),S(null),M(""),await Ne()}catch(pe){d(Ce(pe)||"Failed to rename remote","error")}finally{y(null)}}},qe=async Se=>{if(R.trim()){y(`url-${Se}`);try{await D1(Se,R.trim(),u),d("Remote URL updated","success"),S(null),I(""),await Ne()}catch(pe){d(Ce(pe)||"Failed to update remote URL","error")}finally{y(null)}}},Xe=i.useCallback(async(Se,pe)=>{if(pe==="ahead"){if(ue===Se){Q(null),fe(null);return}Q(Se),fe(null),se(!0);try{const _e=await nd(Se);fe(_e)}catch{fe(null)}finally{se(!1)}}else{if(ve===Se){A(null),ye(null);return}A(Se),ye(null),ge(!0);try{const _e=await nd(Se);ye(_e)}catch{ye(null)}finally{ge(!1)}}},[ue,ve]),At=Se=>{S(`url-${Se.name}`),I(Se.pushUrl||Se.fetchUrl)},at=Se=>{S(`name-${Se.name}`),M(Se.name)};return t.jsx("div",{className:"gm-panel gm-remotes-panel","data-testid":"remotes-panel",children:t.jsxs("div",{className:"gm-remotes-layout",children:[t.jsxs("div",{className:"gm-remote-selector","data-testid":"remote-selector",children:[t.jsxs("div",{className:"gm-remote-selector-header",children:[t.jsx("span",{className:"gm-remote-selector-title",children:"Remotes"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>U(!G),disabled:x!==null,title:G?"Cancel":"Add Remote",children:G?t.jsx(Nn,{size:14}):t.jsx(os,{size:14})})]}),G&&t.jsxs("form",{className:"gm-remote-form",onSubmit:Re,children:[t.jsx("input",{type:"text",placeholder:"Remote name",value:g,onChange:Se=>j(Se.target.value),disabled:x==="add",className:"input gm-input"}),t.jsx("input",{type:"text",placeholder:"Repository URL",value:N,onChange:Se=>C(Se.target.value),disabled:x==="add",className:"input gm-input gm-input-url"}),t.jsxs("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:!g.trim()||!N.trim()||x==="add",children:[x==="add"?t.jsx(Ct,{size:12,className:"spin"}):t.jsx(os,{size:12}),"Add"]})]}),b?t.jsxs("div",{className:"gm-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading..."]}):f.length===0?t.jsx("div",{className:"gm-empty",children:"No remotes"}):f.map(Se=>t.jsxs("div",{className:`gm-remote-selector-item${F===Se.name?" selected":""}`,onClick:()=>ae(Se.name),role:"button",tabIndex:0,onKeyDown:pe=>{(pe.key==="Enter"||pe.key===" ")&&(pe.preventDefault(),ae(Se.name))},children:[t.jsxs("div",{className:"gm-remote-selector-info",children:[t.jsxs("span",{className:"gm-remote-selector-name",children:[t.jsx("span",{className:"gm-remote-selector-name-text",children:Se.name}),Se.name==="origin"&&t.jsx("span",{className:"gm-remote-default-badge",children:"default"})]}),t.jsx("span",{className:"gm-remote-selector-host",title:Se.fetchUrl,children:m(Se.fetchUrl)})]}),t.jsx("button",{className:"btn btn-icon btn-sm gm-remote-remove-btn",onClick:pe=>{pe.stopPropagation(),Pe(Se.name)},disabled:x!==null,title:"Remove remote",children:t.jsx(es,{size:14})})]},Se.name))]}),t.jsxs("div",{className:"gm-remote-detail","data-testid":"remote-detail-panel",children:[F&&H?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"gm-remote-sync-card","data-testid":"remote-sync-card",children:[t.jsxs("div",{className:"gm-remote-sync-card-header",children:[t.jsx("span",{className:"gm-remote-sync-card-title",children:F}),e&&(e.ahead>0||e.behind>0)&&t.jsxs("div",{className:"gm-remote-status",children:[e.ahead>0&&t.jsxs("div",{className:"gm-remote-indicator ahead",children:[t.jsx("span",{className:"status-dot status-dot--online","aria-hidden":"true"}),t.jsx(ua,{size:14}),e.ahead," to push"]}),e.behind>0&&t.jsxs("div",{className:"gm-remote-indicator behind",children:[t.jsx("span",{className:"status-dot status-dot--pending","aria-hidden":"true"}),t.jsx(Wa,{size:14}),e.behind," to pull"]})]})]}),t.jsxs("div",{className:"gm-remote-actions",children:[t.jsxs("button",{className:"btn btn-primary",onClick:a,disabled:n!==null||b,children:[n==="fetch"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Ss,{size:14}),"Fetch"]}),t.jsxs("div",{className:"gm-pull-split",ref:D,children:[t.jsxs("button",{className:"btn btn-primary gm-pull-split-main",onClick:()=>{T(!1),r({rebase:!1})},disabled:n!==null||b,children:[n==="pull"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(yi,{size:14}),"Pull"]}),t.jsx("button",{className:"btn btn-primary btn-icon gm-pull-split-toggle",onClick:()=>T(Se=>!Se),disabled:n!==null||b,"aria-label":"Pull options","aria-haspopup":"menu","aria-expanded":P,children:t.jsx(Ln,{size:14})}),P?t.jsxs("div",{className:"gm-pull-menu",role:"menu","aria-label":"Pull options menu",children:[t.jsx("button",{className:"gm-pull-menu-item",role:"menuitem",onClick:()=>{T(!1),r({rebase:!1})},children:"Pull"}),t.jsx("button",{className:"gm-pull-menu-item",role:"menuitem",onClick:()=>{T(!1),r({rebase:!0})},children:"Pull --rebase"})]}):null]}),t.jsxs("button",{className:"btn btn-primary",onClick:o,disabled:n!==null||b,children:[n==="push"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(ua,{size:14}),"Push"]}),e?.integrationBranch&&t.jsxs("button",{className:"btn gm-sync-integration-btn",onClick:l,disabled:c,title:e.isOnIntegrationBranch===!1?`Not on integration branch (${e.integrationBranch})`:"Sync working tree to local integration tip (same as banner Pull)","data-testid":"remotes-sync-integration-tip-btn",children:[n==="sync-integration"?t.jsx(Ct,{size:14,className:"spin"}):t.jsx(Sh,{size:14}),"Sync local tip"]})]})]}),t.jsxs("div",{className:"gm-remote-detail-card","data-testid":"remote-detail-card",children:[t.jsxs("div",{className:"gm-remote-detail-urls",children:[t.jsxs("div",{className:"gm-remote-detail-url-row",children:[t.jsx("span",{className:"gm-url-label",children:"Fetch:"}),w===`url-${F}`?t.jsxs("div",{className:"gm-remote-edit",children:[t.jsx("input",{type:"text",value:R,onChange:Se=>I(Se.target.value),className:"input gm-input",autoFocus:!0}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>qe(F),disabled:x===`url-${F}`,children:x===`url-${F}`?t.jsx(Ct,{size:12,className:"spin"}):t.jsx(Js,{size:12})}),t.jsx("button",{className:"btn btn-sm",onClick:()=>{S(null),I("")},title:"Cancel",children:t.jsx(Nn,{size:12})})]}):t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"gm-url-value",title:H.fetchUrl,children:t.jsx("bdo",{dir:"ltr",children:H.fetchUrl})}),t.jsxs("div",{className:"gm-remote-inline-actions",children:[t.jsx("button",{className:"btn btn-icon btn-sm",onClick:()=>h(H.fetchUrl,"fetch URL"),title:"Copy fetch URL",children:t.jsx(ga,{size:14})}),t.jsx("button",{className:"btn btn-icon btn-sm",onClick:()=>At(H),disabled:x!==null,title:"Edit remote URL",children:t.jsx(xi,{size:14})})]})]})]}),H.pushUrl&&H.pushUrl!==H.fetchUrl&&t.jsxs("div",{className:"gm-remote-detail-url-row",children:[t.jsx("span",{className:"gm-url-label",children:"Push:"}),t.jsx("span",{className:"gm-url-value",title:H.pushUrl,children:t.jsx("bdo",{dir:"ltr",children:H.pushUrl})}),t.jsx("div",{className:"gm-remote-inline-actions",children:t.jsx("button",{className:"btn btn-icon btn-sm",onClick:()=>h(H.pushUrl,"push URL"),title:"Copy push URL",children:t.jsx(ga,{size:14})})})]})]}),t.jsx("div",{className:"gm-remote-detail-name-row",children:w===`name-${F}`?t.jsxs("div",{className:"gm-remote-edit",children:[t.jsx("input",{type:"text",value:E,onChange:Se=>M(Se.target.value),className:"input gm-input",autoFocus:!0}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>rt(F),disabled:x===`rename-${F}`,children:x===`rename-${F}`?t.jsx(Ct,{size:12,className:"spin"}):t.jsx(Js,{size:12})}),t.jsx("button",{className:"btn btn-sm",onClick:()=>{S(null),M("")},title:"Cancel",children:t.jsx(Nn,{size:12})})]}):t.jsx("button",{className:"btn btn-icon btn-sm",onClick:()=>at(H),disabled:x!==null,title:"Edit remote name",children:t.jsx(xi,{size:14})})})]}),e&&e.ahead>0&&t.jsxs("div",{className:"gm-remote-section","data-testid":"commits-to-push",children:[t.jsx("div",{className:"gm-section-subheader",children:t.jsxs("h5",{children:[t.jsx(ua,{size:14}),"Commits to Push (",e.ahead,")"]})}),L?t.jsxs("div",{className:"gm-loading",children:[t.jsx(Ct,{size:14,className:"spin"}),"Loading..."]}):W.length>0?t.jsx("div",{className:"gm-ahead-commits-list","data-testid":"ahead-commits-list",children:W.map(Se=>t.jsxs("div",{className:"gm-commit-item-compact-wrapper",children:[t.jsxs("div",{className:"gm-commit-item-compact gm-commit-clickable",onClick:()=>Xe(Se.hash,"ahead"),role:"button",tabIndex:0,onKeyDown:pe=>{(pe.key==="Enter"||pe.key===" ")&&(pe.preventDefault(),Xe(Se.hash,"ahead"))},title:"Click to view diff",children:[t.jsx("div",{className:"gm-commit-compact-hash",children:t.jsx("code",{className:"gm-hash",children:Se.shortHash})}),t.jsxs("div",{className:"gm-commit-compact-info",children:[t.jsx("span",{className:"gm-commit-message",title:Se.message,children:Se.message}),t.jsxs("span",{className:"gm-commit-meta",children:[t.jsx("span",{children:Se.author}),t.jsx("span",{children:"•"}),t.jsx("span",{children:Mo(Se.date)})]})]}),t.jsx("span",{className:"gm-commit-expand-icon",children:ue===Se.hash?t.jsx(Ln,{size:14}):t.jsx(ps,{size:14})})]}),ue===Se.hash&&t.jsx("div",{className:"gm-commit-diff gm-commit-diff-compact",children:O?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}):be?t.jsxs(t.Fragment,{children:[(Se.body||Se.message)&&t.jsx("div",{className:"gm-commit-message-full",children:Se.body||Se.message}),be.stat&&t.jsx("pre",{className:"gm-diff-stat",children:be.stat}),t.jsx("pre",{className:"gm-diff-patch",children:be.patch})]}):t.jsx("div",{className:"gm-diff-error",children:"Failed to load diff"})})]},Se.hash))}):t.jsx("div",{className:"gm-empty",children:"No ahead commits found (may need to fetch first)"})]}),t.jsxs("div",{className:"gm-remote-section","data-testid":"remote-commits-section",children:[t.jsx("div",{className:"gm-section-subheader",children:t.jsxs("h5",{children:[t.jsx(Vv,{size:14}),"Recent commits on ",F]})}),J?t.jsxs("div",{className:"gm-loading",children:[t.jsx(Ct,{size:14,className:"spin"}),"Loading commits..."]}):le?t.jsxs("div",{className:"gm-error",children:[t.jsx(oi,{size:14}),le]}):k.length===0?t.jsxs("div",{className:"gm-empty",children:["No commits found on ",F,". Try fetching first."]}):t.jsx("div",{className:"gm-remote-commits-list","data-testid":"remote-commits-list",children:k.map(Se=>t.jsxs("div",{className:"gm-commit-item-compact-wrapper",children:[t.jsxs("div",{className:"gm-commit-item-compact gm-commit-clickable",onClick:()=>Xe(Se.hash,"remote"),role:"button",tabIndex:0,onKeyDown:pe=>{(pe.key==="Enter"||pe.key===" ")&&(pe.preventDefault(),Xe(Se.hash,"remote"))},title:"Click to view diff",children:[t.jsx("div",{className:"gm-commit-compact-hash",children:t.jsx("code",{className:"gm-hash",children:Se.shortHash})}),t.jsxs("div",{className:"gm-commit-compact-info",children:[t.jsx("span",{className:"gm-commit-message",title:Se.message,children:Se.message}),t.jsxs("span",{className:"gm-commit-meta",children:[t.jsx("span",{children:Se.author}),t.jsx("span",{children:"•"}),t.jsx("span",{children:Mo(Se.date)})]})]}),t.jsx("span",{className:"gm-commit-expand-icon",children:ve===Se.hash?t.jsx(Ln,{size:14}):t.jsx(ps,{size:14})})]}),ve===Se.hash&&t.jsx("div",{className:"gm-commit-diff gm-commit-diff-compact",children:ee?t.jsxs("div",{className:"gm-diff-loading",children:[t.jsx(Ct,{size:16,className:"spin"}),"Loading diff..."]}):ne?t.jsxs(t.Fragment,{children:[(Se.body||Se.message)&&t.jsx("div",{className:"gm-commit-message-full",children:Se.body||Se.message}),ne.stat&&t.jsx("pre",{className:"gm-diff-stat",children:ne.stat}),t.jsx("pre",{className:"gm-diff-patch",children:ne.patch})]}):t.jsx("div",{className:"gm-diff-error",children:"Failed to load diff"})})]},Se.hash))})]})]}):t.jsx("div",{className:"gm-empty",children:"Select a remote to view details"}),s&&t.jsx("div",{className:"gm-remote-result",children:s.message})]})]})})}const ao={name:"",description:"",mode:"prompt",phase:"pre-merge",prompt:"",gateMode:"advisory",scriptName:"",enabled:!0,defaultOn:!1,modelProvider:"",modelId:""};function g3(e,n){return e&&n?`${e}/${n}`:""}function b3(e){if(!e)return{provider:"",modelId:""};const n=e.indexOf("/");return n===-1?{provider:"",modelId:""}:{provider:e.slice(0,n),modelId:e.slice(n+1)}}function Px(e){switch(e){case"file-text":return Ya;case"check-circle":return gs;case"shield":return k0;case"zap":return Bs;case"eye":return $o;case"globe":return jd;case"layout-grid":return Xa;case"puzzle":return o0;default:return gs}}function $x(e){switch(e.toLowerCase()){case"quality":return"wfm-badge-category wfm-badge-category-quality";case"security":return"wfm-badge-category wfm-badge-category-security";default:return"wfm-badge-category"}}function x3({isOpen:e,onClose:n,addToast:s,projectId:a}){const[r,o]=i.useState([]),[l,c]=i.useState([]),[d,u]=i.useState({}),[h,m]=i.useState(!0),[f,p]=i.useState(!0),[b,v]=i.useState("my-steps"),[x,y]=i.useState(null),[g,j]=i.useState(!1),[N,C]=i.useState(!1),[w,S]=i.useState(ao),[R,I]=i.useState(!1),[E,M]=i.useState(!1),[G,U]=i.useState(null),[P,T]=i.useState(null),[D,W]=i.useState({}),[Y,L]=i.useState([]),_=i.useRef(null);ea(_,e,"fusion:workflow-steps-modal-size");const F=i.useCallback(async()=>{try{m(!0);const O=await Bl(a);o(O)}catch(O){s(Ce(O)||"Failed to load workflow steps","error")}finally{m(!1)}},[s,a]),ae=i.useCallback(async()=>{try{const O=await Rl(a);W(O||{})}catch{}},[a]),k=i.useCallback(async()=>{try{const O=await Ki();L(O.models||[])}catch{}},[]),z=i.useCallback(async()=>{try{p(!0);const[O,se]=await Promise.all([WE(),GE()]);c(O.templates);const ve=Object.fromEntries(se.templates.map(({pluginId:A,template:ne})=>[ne.id,A]));u(ve)}catch(O){s(Ce(O)||"Failed to load templates","error")}finally{p(!1)}},[s]);i.useEffect(()=>{e&&(F(),z(),ae(),k())},[e,F,z,ae,k]);const J=i.useCallback(()=>{C(!0),j(!1),y(null),S(ao)},[]),oe=i.useCallback(()=>{C(!1),j(!0),y(null),S(ao)},[]),le=i.useCallback(O=>{y(O.id),j(!1),S({name:O.name,description:O.description,mode:O.mode||"prompt",phase:O.phase||"pre-merge",prompt:O.prompt,gateMode:O.gateMode||((O.mode||"prompt")==="script"?"gate":"advisory"),scriptName:O.scriptName||"",enabled:O.enabled,defaultOn:O.defaultOn||!1,modelProvider:O.modelProvider||"",modelId:O.modelId||""})},[]),we=i.useCallback(()=>{y(null),j(!1),C(!1),S(ao)},[]),re=i.useCallback(async()=>{if(!w.name.trim()||!w.description.trim()){s("Name and description are required","error");return}I(!0);try{const O=w.mode==="prompt"&&w.modelProvider&&w.modelId?{modelProvider:w.modelProvider,modelId:w.modelId}:w.mode==="prompt"?{modelProvider:void 0,modelId:void 0}:{};if(g){const se={name:w.name.trim(),description:w.description.trim(),mode:w.mode,phase:w.phase,prompt:w.mode==="prompt"&&w.prompt.trim()||void 0,gateMode:w.gateMode,scriptName:w.mode==="script"?w.scriptName.trim():void 0,enabled:w.enabled,defaultOn:w.defaultOn||void 0,...O};await hp(se,a),s("Workflow step created","success")}else x&&(await HE(x,{name:w.name.trim(),description:w.description.trim(),mode:w.mode,phase:w.phase,prompt:w.mode==="prompt"?w.prompt:"",gateMode:w.gateMode,scriptName:w.mode==="script"?w.scriptName.trim():void 0,enabled:w.enabled,defaultOn:w.defaultOn,...O},a),s("Workflow step updated","success"));j(!1),y(null),S(ao),await F()}catch(O){s(Ce(O)||"Failed to save workflow step","error")}finally{I(!1)}},[w,g,x,s,F]),H=i.useCallback(async O=>{try{await qE(O,a),s("Workflow step deleted","success"),U(null),x===O&&(y(null),S(ao)),await F()}catch(se){s(Ce(se)||"Failed to delete workflow step","error")}},[x,s,F]),ue=i.useCallback(async()=>{if(!(!x&&!g)&&w.mode==="prompt"){if(g){if(!w.name.trim()||!w.description.trim()){s("Name and description are required before refining","error");return}I(!0);try{const O=w.modelProvider&&w.modelId?{modelProvider:w.modelProvider,modelId:w.modelId}:{},se={name:w.name.trim(),description:w.description.trim(),mode:"prompt",prompt:w.prompt.trim()||void 0,gateMode:w.gateMode,enabled:w.enabled,defaultOn:w.defaultOn||void 0,...O},ve=await hp(se,a);j(!1),y(ve.id),M(!0);const A=await fp(ve.id,a);S(ne=>({...ne,prompt:A.prompt})),s("Prompt refined with AI","success"),await F()}catch(O){s(Ce(O)||"Failed to refine prompt","error")}finally{I(!1),M(!1)}return}if(x){M(!0);try{const O=await fp(x,a);S(se=>({...se,prompt:O.prompt})),s("Prompt refined with AI","success"),await F()}catch(O){s(Ce(O)||"Failed to refine prompt","error")}finally{M(!1)}}}},[x,g,w,s,F]),Q=i.useCallback(async O=>{T(O.id);try{await KE(O.id,a),s(`Added ${O.name} workflow step`,"success"),await F(),v("my-steps"),C(!1)}catch(se){const ve=Ce(se);ve?.includes("already exists")?s(`A workflow step named '${O.name}' already exists`,"error"):s(ve||"Failed to add workflow step from template","error")}finally{T(null)}},[s,F]),be=Aa(n);if(!e)return null;const fe=g||x!==null;return t.jsx("div",{className:"modal-overlay open",...be,"data-testid":"workflow-step-manager",children:t.jsxs("div",{ref:_,className:"modal workflow-step-manager-modal",role:"dialog","aria-modal":"true","aria-label":"Workflow Steps",children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h2",{children:"Workflow Steps"}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close",children:"×"})]}),t.jsx("div",{className:"wfm-body",children:h?t.jsx("div",{className:"wfm-loading",children:"Loading..."}):t.jsxs(t.Fragment,{children:[!fe&&t.jsxs("div",{className:"wfm-tab-row",children:[t.jsxs("button",{className:`btn ${b==="my-steps"?"btn-primary":"btn-secondary"} wfm-tab-btn`,onClick:()=>v("my-steps"),"data-testid":"tab-my-steps",children:[t.jsx(sN,{size:14}),"My Workflow Steps (",r.length,")"]}),t.jsxs("button",{className:`btn ${b==="templates"?"btn-primary":"btn-secondary"} wfm-tab-btn`,onClick:()=>v("templates"),"data-testid":"tab-templates",children:[t.jsx(Xa,{size:14}),"Templates (",l.length,")"]})]}),b==="my-steps"&&!fe&&!N&&t.jsxs(t.Fragment,{children:[r.length===0&&t.jsx("div",{className:"wfm-empty","data-testid":"empty-state",children:"No workflow steps defined. Create one to get started, or add one from the Templates tab."}),r.length>0&&t.jsx("div",{className:"wfm-step-list",children:r.map(O=>t.jsx("div",{className:"wfm-step-card","data-testid":`workflow-step-${O.id}`,children:t.jsxs("div",{className:"wfm-step-card-top",children:[t.jsxs("div",{className:"wfm-step-card-info",children:[t.jsxs("div",{className:"wfm-step-card-title-row",children:[t.jsx("span",{className:"wfm-step-card-name",children:O.name}),t.jsx("span",{className:`wfm-badge ${O.enabled?"wfm-badge-enabled":"wfm-badge-disabled"}`,children:O.enabled?"Enabled":"Disabled"}),t.jsx("span",{className:`wfm-badge ${(O.mode||"prompt")==="script"?"wfm-badge-script":"wfm-badge-prompt"}`,children:(O.mode||"prompt")==="script"?"Script":"AI Prompt"}),t.jsx("span",{className:`wfm-badge ${(O.phase||"pre-merge")==="post-merge"?"wfm-badge-post-merge":"wfm-badge-pre-merge"}`,children:(O.phase||"pre-merge")==="post-merge"?"Post-merge":"Pre-merge"}),t.jsx("span",{className:`wfm-badge ${(O.gateMode||((O.mode||"prompt")==="script"?"gate":"advisory"))==="gate"?"wfm-badge-gate":"wfm-badge-advisory"}`,children:(O.gateMode||((O.mode||"prompt")==="script"?"gate":"advisory"))==="gate"?"Gate":"Advisory"}),O.defaultOn&&t.jsx("span",{className:"wfm-badge wfm-badge-default-on",children:"Default on"})]}),t.jsx("div",{className:"wfm-step-card-desc",children:O.description})]}),t.jsxs("div",{className:"wfm-step-card-actions",children:[t.jsx("button",{className:"btn-icon",onClick:()=>le(O),title:"Edit","aria-label":`Edit ${O.name}`,children:t.jsx(xi,{size:14})}),G===O.id?t.jsxs("div",{className:"wfm-delete-confirm",children:[t.jsx("button",{className:"btn-icon wfm-delete-confirm-btn",onClick:()=>H(O.id),title:"Confirm delete","aria-label":`Confirm delete ${O.name}`,children:t.jsx(Js,{size:14})}),t.jsx("button",{className:"btn-icon",onClick:()=>U(null),title:"Cancel delete","aria-label":"Cancel delete",children:t.jsx(Nn,{size:14})})]}):t.jsx("button",{className:"btn-icon",onClick:()=>U(O.id),title:"Delete","aria-label":`Delete ${O.name}`,children:t.jsx(es,{size:14})})]})]})},O.id))})]}),b==="templates"&&!fe&&!N&&t.jsx(t.Fragment,{children:f?t.jsxs("div",{className:"wfm-loading",children:[t.jsx(Ct,{size:24,className:"spin wfm-spinner"}),"Loading templates..."]}):l.length===0?t.jsx("div",{className:"wfm-empty","data-testid":"no-templates-state",children:"No templates available."}):t.jsx("div",{className:"wfm-template-list",children:l.map(O=>{const se=Px(O.icon),ve=$x(O.category),A=P===O.id;return t.jsx("div",{className:"wfm-template-card","data-testid":`template-${O.id}`,children:t.jsxs("div",{className:"wfm-template-inner",children:[t.jsx("div",{className:"wfm-template-icon",children:t.jsx(se,{size:20})}),t.jsxs("div",{className:"wfm-template-content",children:[t.jsxs("div",{className:"wfm-template-title-row",children:[t.jsx("span",{className:"wfm-template-name",children:O.name}),t.jsx("span",{className:ve,children:O.category}),d[O.id]&&t.jsx("span",{className:"wfm-badge-category wfm-badge-category-plugin",children:d[O.id]})]}),t.jsx("div",{className:"wfm-template-desc",children:O.description}),t.jsx("button",{className:"btn btn-primary wfm-template-add-btn",onClick:()=>Q(O),disabled:A,"data-testid":`add-template-${O.id}`,children:A?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:12,className:"spin"}),"Adding..."]}):t.jsxs(t.Fragment,{children:[t.jsx(os,{size:12}),"Add"]})})]})]})},O.id)})})}),N&&!fe&&t.jsxs("div",{className:"wfm-create-chooser","data-testid":"workflow-step-create-chooser",children:[t.jsx("h3",{className:"wfm-form-title",children:"How would you like to create this workflow step?"}),t.jsx("p",{className:"wfm-create-chooser-hint",children:"Start from a built-in template or create a fully custom workflow step."}),t.jsxs("button",{className:"btn wfm-create-custom-btn",onClick:oe,"data-testid":"create-custom-step",children:[t.jsx(os,{size:14}),"Custom workflow step"]}),f?t.jsxs("div",{className:"wfm-loading","data-testid":"create-chooser-template-loading",children:[t.jsx(Ct,{size:24,className:"spin wfm-spinner"}),"Loading built-in templates..."]}):l.length===0?t.jsx("div",{className:"wfm-empty","data-testid":"create-chooser-no-templates",children:"No built-in templates are available right now. You can still create a custom step."}):t.jsx("div",{className:"wfm-template-list","data-testid":"create-chooser-templates",children:l.map(O=>{const se=Px(O.icon),ve=$x(O.category),A=P===O.id;return t.jsx("div",{className:"wfm-template-card","data-testid":`chooser-template-${O.id}`,children:t.jsxs("div",{className:"wfm-template-inner",children:[t.jsx("div",{className:"wfm-template-icon",children:t.jsx(se,{size:20})}),t.jsxs("div",{className:"wfm-template-content",children:[t.jsxs("div",{className:"wfm-template-title-row",children:[t.jsx("span",{className:"wfm-template-name",children:O.name}),t.jsx("span",{className:ve,children:O.category}),d[O.id]&&t.jsx("span",{className:"wfm-badge-category wfm-badge-category-plugin",children:d[O.id]})]}),t.jsx("div",{className:"wfm-template-desc",children:O.description}),t.jsx("button",{className:"btn btn-primary wfm-template-add-btn",onClick:()=>Q(O),disabled:A,"data-testid":`chooser-add-template-${O.id}`,children:A?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:12,className:"spin"}),"Adding..."]}):t.jsxs(t.Fragment,{children:[t.jsx(os,{size:12}),"Add template"]})})]})]})},O.id)})})]}),fe&&t.jsxs("div",{className:"wfm-form","data-testid":"workflow-step-form",children:[t.jsx("h3",{className:"wfm-form-title",children:g?"New Workflow Step":"Edit Workflow Step"}),t.jsxs("div",{className:"wfm-form-fields",children:[t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Name"}),t.jsx("input",{type:"text",value:w.name,onChange:O=>S(se=>({...se,name:O.target.value})),placeholder:"e.g. Documentation Review","data-testid":"workflow-step-name"})]}),t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Description"}),t.jsx("textarea",{value:w.description,onChange:O=>S(se=>({...se,description:O.target.value})),placeholder:"Brief description of what this step does",rows:2,"data-testid":"workflow-step-description"})]}),t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Execution Mode"}),t.jsxs("div",{className:"wfm-mode-selector","data-testid":"workflow-step-mode-selector",children:[t.jsxs("button",{className:`btn ${w.mode==="prompt"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,mode:"prompt",gateMode:O.gateMode||"advisory",scriptName:""})),"data-testid":"mode-prompt",children:[t.jsx(fa,{size:14}),"AI Prompt"]}),t.jsxs("button",{className:`btn ${w.mode==="script"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,mode:"script",gateMode:"gate",prompt:"",modelProvider:"",modelId:""})),"data-testid":"mode-script",children:[t.jsx(_a,{size:14}),"Run Script"]})]})]}),t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Execution Phase"}),t.jsxs("div",{className:"wfm-mode-selector","data-testid":"workflow-step-phase-selector",children:[t.jsx("button",{className:`btn ${w.phase==="pre-merge"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,phase:"pre-merge"})),"data-testid":"phase-pre-merge",children:"Pre-merge"}),t.jsx("button",{className:`btn ${w.phase==="post-merge"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,phase:"post-merge"})),"data-testid":"phase-post-merge",children:"Post-merge"})]}),t.jsx("div",{className:"wfm-field-hint",children:w.phase==="pre-merge"?"Runs before merge — can block merge on failure":"Runs after merge success — failures are logged but do not block"})]}),t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Failure Behavior"}),t.jsxs("div",{className:"wfm-mode-selector","data-testid":"workflow-step-gate-mode-selector",children:[t.jsx("button",{className:`btn ${w.gateMode==="advisory"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,gateMode:"advisory"})),"data-testid":"gate-mode-advisory",children:"Advisory"}),t.jsx("button",{className:`btn ${w.gateMode==="gate"?"btn-primary":"btn-secondary"} wfm-mode-btn`,onClick:()=>S(O=>({...O,gateMode:"gate"})),"data-testid":"gate-mode-gate",children:"Gate"})]}),t.jsx("div",{className:"wfm-field-hint",children:w.gateMode==="gate"?"Failures block merge and request remediation.":"Failures are recorded as advisory and do not block merge."})]}),w.mode==="prompt"&&t.jsxs("div",{className:"wfm-field",children:[t.jsxs("div",{className:"wfm-prompt-header",children:[t.jsx("label",{children:"Agent Prompt"}),t.jsxs("button",{className:"btn-icon wfm-refine-btn",onClick:ue,disabled:!w.description.trim()||E,title:"Refine with AI","aria-label":"Refine prompt with AI","data-testid":"refine-btn",children:[E?t.jsx(Ct,{size:12,className:"spin"}):t.jsx(Ls,{size:12}),t.jsx("span",{children:"Refine with AI"})]})]}),t.jsx("textarea",{value:w.prompt,onChange:O=>S(se=>({...se,prompt:O.target.value})),placeholder:"Leave empty to use AI refinement",rows:6,className:"wfm-prompt-textarea","data-testid":"workflow-step-prompt"})]}),w.mode==="prompt"&&t.jsxs("div",{className:"wfm-field","data-testid":"workflow-step-model-field",children:[t.jsxs("div",{className:"wfm-model-header",children:[t.jsx("label",{children:"Model Override"}),w.modelProvider&&w.modelId&&t.jsxs("button",{type:"button",className:"btn-icon wfm-model-clear-btn",onClick:()=>S(O=>({...O,modelProvider:"",modelId:""})),title:"Clear model override (use global default)","data-testid":"clear-model-override",children:[t.jsx(Nn,{size:12}),t.jsx("span",{children:"Use default"})]})]}),t.jsx("span",{className:"wfm-model-hint",children:w.modelProvider&&w.modelId?`Using ${w.modelProvider}/${w.modelId}`:"Using global default model"}),t.jsx("div",{"data-testid":"workflow-step-model-select",children:t.jsx(ri,{models:Y,value:g3(w.modelProvider,w.modelId),onChange:O=>{const se=b3(O);S(ve=>({...ve,modelProvider:se.provider,modelId:se.modelId}))},placeholder:"Select a model override…",label:"Model override for this workflow step"})})]}),w.mode==="script"&&t.jsxs("div",{className:"wfm-field",children:[t.jsx("label",{children:"Script"}),Object.keys(D).length===0?t.jsx("div",{className:"wfm-no-scripts","data-testid":"no-scripts-message",children:"No scripts configured. Add scripts in Settings → Scripts first."}):t.jsxs("select",{value:w.scriptName,onChange:O=>S(se=>({...se,scriptName:O.target.value})),"data-testid":"workflow-step-script-select",children:[t.jsx("option",{value:"",children:"Select a script…"}),Object.entries(D).map(([O,se])=>t.jsxs("option",{value:O,children:[O," (",se,")"]},O))]})]}),t.jsxs("label",{className:"wfm-checkbox-label",children:[t.jsx("input",{type:"checkbox",checked:w.enabled,onChange:O=>S(se=>({...se,enabled:O.target.checked})),"data-testid":"workflow-step-enabled"}),"Enabled (available for selection on new tasks)"]}),t.jsxs("label",{className:"wfm-checkbox-label",children:[t.jsx("input",{type:"checkbox",checked:w.defaultOn,onChange:O=>S(se=>({...se,defaultOn:O.target.checked})),"data-testid":"workflow-step-default-on"}),"Default on for new tasks"]}),t.jsxs("div",{className:"wfm-form-actions",children:[t.jsx("button",{className:"btn btn-secondary",onClick:we,disabled:R,children:"Cancel"}),t.jsx("button",{className:"btn btn-primary",onClick:re,disabled:R||!w.name.trim()||!w.description.trim()||w.mode==="script"&&!w.scriptName.trim(),"data-testid":"save-workflow-step",children:R?"Saving...":g?"Create":"Save"})]})]})]})]})}),!fe&&!N&&t.jsx("div",{className:"wfm-footer",children:t.jsxs("button",{className:"btn btn-primary wfm-footer-add-btn",onClick:J,"data-testid":"add-workflow-step",children:[t.jsx(os,{size:14}),"Add Workflow Step"]})})]})})}const v3=36e5,y3=3e5,dm=[{value:3e5,label:"5m"},{value:9e5,label:"15m"},{value:18e5,label:"30m"},{value:36e5,label:"1h"},{value:108e5,label:"3h"},{value:216e5,label:"6h"},{value:432e5,label:"12h"},{value:864e5,label:"24h"},{value:1728e5,label:"48h"},{value:2592e5,label:"72h"},{value:6048e5,label:"1w"}];function w3(e){return e<1e3?`${e}ms`:e<6e4?`${Math.round(e/1e3)}s`:e<36e5?`${Math.round(e/6e4)}m`:e<864e5?`${Math.round(e/36e5)}h`:e<6048e5?`${Math.round(e/864e5)}d`:`${Math.round(e/6048e5)}w`}function k3(e){return typeof e!="number"||!Number.isFinite(e)?v3:Math.max(y3,Math.round(e))}function aq(e){if(dm.some(s=>s.value===e))return[...dm];const n={value:e,label:`${w3(e)} (custom)`};return[...dm,n].sort((s,a)=>s.value-a.value)}const j3=4,N3=5*6e4;function S3(e){const n=k3(e?.heartbeatIntervalMs);return Math.max(n*j3,N3)}function Dx(e){const n=Math.floor(e/6e4);if(n<1)return"<1m";const s=Math.floor(n/60),a=n%60;return s>0&&a>0?`${s}h ${a}m`:s>0?`${s}h`:`${a}m`}function C3(e){const n=e.metadata;return n&&(n.agentKind==="task-worker"||n.taskWorker===!0||n.managedBy==="task-executor")?!0:!!(e.role==="executor"&&e.name?.startsWith("executor-")&&e.taskId)}function E3(e){const s=e.metadata?.heartbeatTimerRepair;if(!s||typeof s!="object")return{};const a=s;return{repairedAt:typeof a.repairedAt=="string"?a.repairedAt:void 0,staleAtRepair:typeof a.staleAtRepair=="boolean"?a.staleAtRepair:void 0,staleRepairReason:typeof a.staleRepairReason=="string"?a.staleRepairReason:void 0}}function _3(e){const{state:n,lastHeartbeatAt:s,lastError:a,pauseReason:r,runtimeConfig:o}=e,l=C3(e),c=l||o?.enabled!==!1;if(n==="error")return{label:a??"Error",icon:t.jsx(fi,{size:14}),color:"var(--state-error-text)",stateDerived:!a};if(n==="paused")return{label:r?`Paused: ${r}`:"Paused",icon:t.jsx(Vi,{size:14}),color:"var(--state-paused-text)",stateDerived:!r};if(n==="running"||l&&n==="active")return{label:"Running",icon:t.jsx(fi,{size:14}),color:"var(--state-active-text)",stateDerived:!0};if(!c)return{label:"Heartbeat Disabled",icon:t.jsx(Vi,{size:14}),color:"var(--state-paused-text)",stateDerived:!1};if(!s)return{label:n==="active"?"Starting...":"Idle",icon:t.jsx(As,{size:14}),color:"var(--text-muted)",stateDerived:!1};const d=E3(e);if(d.staleAtRepair&&d.repairedAt){const f=Date.parse(d.repairedAt),p=Date.parse(s);if(Number.isFinite(f)&&Number.isFinite(p)&&p<f)return{label:"Unresponsive",icon:t.jsx(fi,{size:14}),color:"var(--state-error-text)",stateDerived:!1,reason:d.staleRepairReason??"Heartbeat scheduler repaired a missing timer; waiting for recovery heartbeat"}}const u=new Date(s).getTime(),h=Date.now()-u,m=S3(o);if(h>m){const f=`No heartbeat for ${Dx(h)} (threshold: ${Dx(m)})`;return{label:"Unresponsive",icon:t.jsx(fi,{size:14}),color:"var(--state-error-text)",stateDerived:!1,reason:f}}return{label:"Healthy",icon:t.jsx(bS,{size:14}),color:"var(--state-active-text)",stateDerived:!1}}function gd({agent:e,size:n=36,className:s}){const[a,r]=i.useState(!1);i.useEffect(()=>{r(!1)},[e.imageUrl]);const o=i.useMemo(()=>{if(!e.imageUrl)return;const l=encodeURIComponent(e.updatedAt??""),c=e.imageUrl.includes("?")?"&":"?";return`${e.imageUrl}${c}t=${l}`},[e.imageUrl,e.updatedAt]);return t.jsx("span",{className:`agent-avatar${s?` ${s}`:""}`,style:{width:`${n}px`,height:`${n}px`},"aria-label":`${e.name} avatar`,children:o&&!a?t.jsx("img",{src:o,alt:`${e.name} avatar`,onError:()=>r(!0)}):e.icon?.trim()?t.jsx("span",{className:"agent-avatar-emoji",style:{fontSize:`calc(${n}px * 0.58)`},"aria-hidden":"true",children:e.icon}):t.jsx(As,{size:Math.max(14,Math.round(n*.55)),"aria-hidden":"true"})})}const M3="https://github.com/Runfusion/Fusion/issues/new";function R3(e,n){const s=`[Agent Error] ${n.surface}${n.agentName?` - ${n.agentName}`:""}`,a=["## Agent Error Report","",`- Surface: ${n.surface}`,`- Agent ID: ${n.agentId??"unknown"}`,`- Agent Name: ${n.agentName??"unknown"}`,`- Agent State: ${n.agentState??"unknown"}`,`- Run ID: ${n.runId??"n/a"}`,`- Task ID: ${n.taskId??"n/a"}`,`- Timestamp: ${n.timestamp??new Date().toISOString()}`,"","## Error","```text",e,"```"],r=new URLSearchParams({title:s,body:a.join(`
741
741
  `)});return`${M3}?${r.toString()}`}function A3({open:e,onClose:n,errorText:s,issueContext:a}){const[r,o]=i.useState(!1),l=i.useMemo(()=>R3(s,a),[s,a]);return e?t.jsx("div",{className:"modal-overlay open",onClick:c=>c.target===c.currentTarget&&n(),role:"dialog","aria-modal":"true","aria-label":"Agent error details",children:t.jsxs("div",{className:"modal agent-error-modal",children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("h2",{className:"modal-title",children:[t.jsx(oi,{size:16}),"Agent Error Details"]}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close",children:"×"})]}),t.jsx("div",{className:"agent-error-modal__content",children:t.jsx("pre",{className:"agent-error-modal__error",children:s})}),t.jsxs("div",{className:"modal-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>{navigator.clipboard.writeText(s).then(()=>{o(!0),setTimeout(()=>o(!1),1500)})},"aria-label":r?"Copied error to clipboard":"Copy error to clipboard",children:[r?t.jsx(Js,{size:14}):t.jsx(ga,{size:14}),r?"Copied":"Copy"]}),t.jsxs("a",{className:"btn btn-sm btn-warning",href:l,target:"_blank",rel:"noreferrer",onClick:c=>{c.preventDefault(),window.open(l,"_blank","noopener,noreferrer")},children:[t.jsx(jh,{size:14}),"Report on GitHub"]})]})]})}):null}function T3({errorText:e,issueContext:n,summaryPrefix:s="Error"}){const[a,r]=i.useState(!1);return t.jsxs(t.Fragment,{children:[t.jsxs("button",{type:"button",className:"agent-error-indicator",onClick:()=>r(!0),"aria-label":"Open error details",children:[t.jsx(oi,{size:14}),t.jsx("span",{className:"agent-error-indicator__label",children:s})]}),t.jsx(A3,{open:a,onClose:()=>r(!1),errorText:e,issueContext:n})]})}const Dc=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}];function I3({isOpen:e,onClose:n,addToast:s,projectId:a}){const[r,o]=i.useState([]),[l,c]=i.useState(!1),[d,u]=i.useState(!1),[h,m]=i.useState(""),[f,p]=i.useState("custom"),[b,v]=i.useState("all"),[x,y]=i.useState(()=>{if(typeof window>"u")return"list";const k=ns("fn-agent-view",a);return k==="board"||k==="list"?k:"list"});i.useEffect(()=>{const k=ns("fn-agent-view",a);if(k==="board"||k==="list"){y(k);return}y("list")},[a]),i.useEffect(()=>{Ns("fn-agent-view",x,a)},[a,x]);const[g,j]=i.useState(null),N=i.useRef(null),[C,w]=i.useState(new Set),[S,R]=i.useState(new Map),{confirm:I}=Di(),E=i.useMemo(()=>S.size===0?r:r.map(k=>{const z=S.get(k.id);return z?{...k,state:z}:k}),[r,S]),M=i.useMemo(()=>b!=="all"?E:[...E].sort((k,z)=>{const J=k.state==="paused"?1:0,oe=z.state==="paused"?1:0;return J!==oe?J-oe:(z.updatedAt??"").localeCompare(k.updatedAt??"")}),[E,b]),G=i.useRef(0),U=i.useCallback(async(k=!1)=>{const z=++G.current;c(!0);try{const J=b!=="all"?{state:b}:void 0,oe=k?await Qa(J,a,{forceFresh:!0}):await Qa(J,a);if(z!==G.current)return;o(oe)}catch(J){s(`Failed to load agents: ${Ce(J)}`,"error")}finally{z===G.current&&c(!1)}},[b,s,a]);i.useEffect(()=>{e&&U()},[e,U]),i.useEffect(()=>{if(!e)return;const k=setInterval(()=>{U()},3e4);return()=>{clearInterval(k)}},[e,U]);const P=async()=>{if(h.trim())try{await s_({name:h.trim(),role:f},a),s(`Agent "${h}" created`,"success"),m(""),u(!1),U(!0)}catch(k){s(`Failed to create agent: ${Ce(k)}`,"error")}},T=async(k,z)=>{if(!C.has(k)){w(J=>new Set(J).add(k)),R(J=>{const oe=new Map(J);return oe.set(k,z),oe});try{await a_(k,z,a),s(`Agent state updated to ${z}`,"success"),await U(!0),R(J=>{const oe=new Map(J);return oe.delete(k),oe})}catch(J){R(oe=>{const le=new Map(oe);return le.delete(k),le}),s(`Failed to update state: ${Ce(J)}`,"error")}finally{w(J=>{const oe=new Set(J);return oe.delete(k),oe})}}},D=async(k,z)=>{if(await I({title:"Delete Agent",message:`Delete agent "${z}"? This cannot be undone.`,danger:!0}))try{await r_(k,a),s(`Agent "${z}" deleted`,"success"),U(!0)}catch(oe){s(`Failed to delete agent: ${Ce(oe)}`,"error")}},W=async(k,z)=>{const J=r.find(oe=>oe.id===k);if(J){if(J.role===z){j(null);return}try{await i_(k,{role:z},a),s(`Agent role updated to ${Dc.find(oe=>oe.value===z)?.label??z}`,"success"),j(null),U(!0)}catch(oe){s(`Failed to update role: ${Ce(oe)}`,"error")}}},Y=(k,z)=>{k.key==="Escape"&&j(null)},L=k=>Dc.find(z=>z.value===k)?.label??k,_=k=>_3(k),F=k=>k.color==="var(--state-active-text)"?"active":k.color==="var(--state-paused-text)"?"paused":k.color==="var(--state-error-text)"?"error":"muted",ae=(k,z)=>k.state==="error"?{title:void 0,label:"Error"}:{title:z.reason??z.label,label:z.stateDerived?null:z.label};return e?t.jsx("div",{className:"modal-overlay open",onClick:k=>k.target===k.currentTarget&&n(),role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"modal modal--wide agent-list-modal",children:[t.jsxs("div",{className:"modal-header",children:[t.jsxs("h2",{className:"modal-title",children:[t.jsx(As,{size:20}),"Agents"]}),t.jsxs("div",{className:"modal-actions",children:[t.jsxs("div",{className:"view-toggle",children:[t.jsx("button",{className:`view-toggle-btn${x==="board"?" active":""}`,onClick:()=>y("board"),title:"Board view","aria-label":"Board view","aria-pressed":x==="board",children:t.jsx(Xa,{size:16})}),t.jsx("button",{className:`view-toggle-btn${x==="list"?" active":""}`,onClick:()=>y("list"),title:"List view","aria-label":"List view","aria-pressed":x==="list",children:t.jsx(Em,{size:16})})]}),t.jsx("button",{className:"btn-icon",onClick:()=>void U(),title:"Refresh",disabled:l,children:t.jsx(Ss,{size:16,className:l?"spin":""})}),t.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close",children:"×"})]})]}),t.jsxs("div",{className:"modal-content agent-modal-content",children:[t.jsxs("div",{className:"agent-controls",children:[t.jsxs("div",{className:"agent-state-filter",children:[t.jsx(Qc,{size:14}),t.jsxs("select",{className:"agent-state-filter-select",value:b,onChange:k=>v(k.target.value),"aria-label":"Filter agents by state",children:[t.jsx("option",{value:"all",children:"All States"}),t.jsx("option",{value:"idle",children:"Idle"}),t.jsx("option",{value:"active",children:"Active"}),t.jsx("option",{value:"running",children:"Running"}),t.jsx("option",{value:"paused",children:"Paused"}),t.jsx("option",{value:"error",children:"Error"})]})]}),t.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>u(!d),children:[t.jsx(os,{size:16}),d?"Cancel":"New Agent"]})]}),d&&t.jsxs("div",{className:"agent-create-form",children:[t.jsx("input",{type:"text",placeholder:"Agent name...",value:h,onChange:k=>m(k.target.value),onKeyDown:k=>k.key==="Enter"&&P(),className:"input",autoFocus:!0}),t.jsx("select",{className:"select",value:f,onChange:k=>p(k.target.value),children:Dc.map(k=>t.jsxs("option",{value:k.value,children:[k.icon," ",k.label]},k.value))}),t.jsx("button",{className:"btn btn-task-create btn-sm",onClick:()=>void P(),children:"Create"})]}),t.jsx("div",{className:x==="board"?"agent-board":"agent-list",children:M.length===0?t.jsxs("div",{className:"agent-empty",children:[t.jsx(As,{size:48,opacity:.3}),t.jsx("p",{children:"No agents found"}),t.jsx("p",{className:"text-secondary",children:"Create an agent to get started"})]}):x==="board"?M.map(k=>{const z=_(k),J=ae(k,z),oe=F(z);return t.jsxs("div",{className:"agent-board-card","data-state":k.state,children:[t.jsxs("div",{className:"agent-board-header",children:[t.jsx("span",{className:"agent-board-icon",children:t.jsx(gd,{agent:k,size:20})}),t.jsx("span",{className:"agent-board-badge","data-state":k.state,children:k.state}),t.jsx("span",{className:"agent-board-health","data-health":oe,title:J.title,children:z.icon})]}),t.jsx("div",{className:"agent-board-name",title:k.name,children:k.name}),t.jsx("div",{className:"agent-board-id",children:k.id}),t.jsxs("div",{className:"agent-board-actions",children:[k.state==="idle"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"active"),disabled:C.has(k.id),title:"Activate",children:t.jsx(Os,{size:14})}),t.jsx("button",{className:"btn btn--sm btn--danger",onClick:()=>void D(k.id,k.name),title:"Delete",children:t.jsx(es,{size:14})})]}),k.state==="active"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Pause",children:t.jsx(Vi,{size:14})}),t.jsx("button",{className:"btn btn--sm btn--danger",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Stop",children:t.jsx(ca,{size:14})})]}),k.state==="paused"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"active"),disabled:C.has(k.id),title:"Resume",children:t.jsx(Os,{size:14})}),t.jsx("button",{className:"btn btn--sm btn--danger",onClick:()=>void D(k.id,k.name),title:"Delete",children:t.jsx(es,{size:14})})]}),k.state==="running"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Pause",children:t.jsx(Vi,{size:14})}),t.jsx("button",{className:"btn btn--sm btn--danger",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Stop",children:t.jsx(ca,{size:14})})]}),k.state==="error"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"active"),disabled:C.has(k.id),title:"Retry",children:t.jsx(Os,{size:14})}),t.jsx("button",{className:"btn btn--sm btn--danger",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Stop",children:t.jsx(ca,{size:14})})]})]})]},k.id)}):M.map(k=>{const z=_(k),J=ae(k,z),oe=F(z);return t.jsxs("div",{className:"agent-card","data-state":k.state,children:[t.jsxs("div",{className:"agent-card-header",children:[t.jsxs("div",{className:"agent-info",children:[g===k.id?t.jsx("select",{ref:N,className:"select agent-role-select",value:k.role,onChange:le=>void W(k.id,le.target.value),onKeyDown:le=>Y(le,k.id),onBlur:()=>j(null),autoFocus:!0,children:Dc.map(le=>t.jsxs("option",{value:le.value,children:[le.icon," ",le.label]},le.value))}):t.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:()=>j(k.id),title:"Click to change role",role:"button",tabIndex:0,onKeyDown:le=>{(le.key==="Enter"||le.key===" ")&&j(k.id)},children:t.jsx(gd,{agent:k,size:20})}),t.jsxs("div",{className:"agent-meta",children:[t.jsx("span",{className:"agent-name",children:k.name}),t.jsx("span",{className:"agent-id text-secondary",children:k.id})]})]}),t.jsxs("div",{className:"agent-badges",children:[t.jsx("span",{className:"badge agent-list-state-badge","data-state":k.state,children:k.state}),t.jsxs("span",{className:"badge agent-list-health-badge","data-health":oe,title:J.title,children:[z.icon,J.label?` ${J.label}`:""]}),t.jsx("span",{className:"badge text-secondary",children:L(k.role)})]})]}),t.jsxs("div",{className:"agent-card-body",children:[k.state==="error"&&k.lastError?t.jsx(T3,{errorText:k.lastError,issueContext:{surface:"AgentListModal list",agentId:k.id,agentName:k.name,agentState:k.state,taskId:k.taskId}}):null,k.taskId&&t.jsxs("div",{className:"agent-task",children:[t.jsx("span",{className:"text-secondary",children:"Working on:"}),t.jsx("span",{className:"badge",children:k.taskId})]}),k.lastHeartbeatAt&&t.jsxs("div",{className:"agent-heartbeat",children:[t.jsx("span",{className:"text-secondary",children:"Last heartbeat:"}),t.jsx("span",{children:new Date(k.lastHeartbeatAt).toLocaleString()})]})]}),t.jsxs("div",{className:"agent-card-actions",children:[k.state==="idle"&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"active"),disabled:C.has(k.id),title:"Activate",children:[t.jsx(Os,{size:14})," Start"]}),t.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void D(k.id,k.name),title:"Delete",children:[t.jsx(es,{size:14})," Delete"]})]}),k.state==="active"&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Pause",children:[t.jsx(Vi,{size:14})," Pause"]}),t.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Stop",children:[t.jsx(ca,{size:14})," Stop"]})]}),k.state==="paused"&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"active"),disabled:C.has(k.id),title:"Resume",children:[t.jsx(Os,{size:14})," Resume"]}),t.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void D(k.id,k.name),title:"Delete",children:[t.jsx(es,{size:14})," Delete"]})]}),k.state==="running"&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Pause",children:[t.jsx(Vi,{size:14})," Pause"]}),t.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Stop",children:[t.jsx(ca,{size:14})," Stop"]})]}),k.state==="error"&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"btn btn--sm",onClick:()=>void T(k.id,"active"),disabled:C.has(k.id),title:"Retry",children:[t.jsx(Os,{size:14})," Retry"]}),t.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void T(k.id,"paused"),disabled:C.has(k.id),title:"Stop",children:[t.jsx(ca,{size:14})," Stop"]})]})]})]},k.id)})})]})]})}):null}function P3({authenticated:e,onToggled:n,compact:s=!1}){const[a,r]=i.useState(null),[o,l]=i.useState(null),[c,d]=i.useState(null),u=i.useRef(!0);i.useEffect(()=>(u.current=!0,()=>{u.current=!1}),[]);const h=i.useCallback(async()=>{try{const y=await o1();return u.current&&r(y),y}catch(y){return u.current&&d({kind:"error",message:y instanceof Error?y.message:String(y)}),null}},[]);i.useEffect(()=>{h()},[h]);const m=i.useCallback(async()=>{l("testing"),d(null),await h(),u.current&&l(null)},[h]),f=i.useCallback(async y=>{l(y?"enabling":"disabling"),d(null);try{const g=await h1(y);u.current&&d({kind:g.enabled?"enabled":"disabled",restartRequired:g.restartRequired}),n?.(g.enabled),await h()}catch(g){u.current&&d({kind:"error",message:g instanceof Error?g.message:String(g)})}finally{u.current&&l(null)}},[n,h]),p=a?.binary.available??!1,b=a?.enabled??e,v=t.jsxs("span",{className:"onboarding-provider-card__description",children:["Route AI calls through your locally-installed ",t.jsx("code",{children:"claude"})," CLI. Uses your existing Claude subscription / quota instead of an API key."]}),x=t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:m,disabled:o!==null,children:o==="testing"?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:12,className:"animate-spin"}),"Testing…"]}):"Test"}),b?t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void f(!1),disabled:o!==null,children:o==="disabling"?"Disabling…":"Disable"}):t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:()=>void f(!0),disabled:o!==null||!p,title:p?void 0:"`claude` binary not detected on PATH — install Claude CLI first.",children:o==="enabling"?"Enabling…":"Enable"})]});return s?t.jsxs("div",{className:`auth-provider-card auth-provider-card--cli${e?" auth-provider-card--authenticated":""}`,"data-testid":"claude-cli-provider-card",children:[t.jsxs("div",{className:"auth-provider-header",children:[t.jsxs("div",{className:"auth-provider-info",children:[t.jsx(rs,{provider:"claude-cli",size:"sm"}),t.jsx("strong",{children:"Anthropic — via Claude CLI"}),t.jsx($3,{status:a,authenticated:e})]}),t.jsx("div",{className:"auth-provider-cli-actions",children:x})]}),t.jsxs("details",{className:"auth-provider-cli-details",children:[t.jsx("summary",{children:"Details"}),t.jsxs("div",{className:"auth-provider-cli-details-body",children:[v,t.jsx(Lx,{status:a,authenticated:e}),c&&t.jsx(Ox,{action:c})]})]})]}):t.jsxs("div",{className:`onboarding-provider-card${e?" onboarding-provider-card--connected":""}`,"data-testid":"claude-cli-provider-card",children:[t.jsx("div",{className:"onboarding-provider-card__icon",children:t.jsx(rs,{provider:"claude-cli",size:"md"})}),t.jsxs("div",{className:"onboarding-provider-card__body",children:[t.jsx("strong",{className:"onboarding-provider-card__name",children:"Anthropic — via Claude CLI"}),v,t.jsx(Lx,{status:a,authenticated:e})]}),t.jsx("div",{className:"onboarding-provider-card__actions",children:x}),c&&t.jsx(Ox,{action:c})]})}function $3({status:e,authenticated:n}){const s=e?.enabled??n,a=e?.binary.available??!1;return s?t.jsx("span",{className:"auth-status-badge authenticated",children:"✓ Active"}):!a&&e?t.jsx("span",{className:"auth-status-badge not-authenticated",children:"✗ Not installed"}):t.jsx("span",{className:"auth-status-badge not-authenticated",children:"✗ Not connected"})}function Lx({status:e,authenticated:n}){if(!e)return t.jsxs("small",{className:"settings-muted",children:[t.jsx(Ct,{size:10,className:"animate-spin"})," Probing local CLI…"]});const{binary:s,enabled:a,extension:r,ready:o}=e;return s.available?a?r&&r.status!=="ok"?t.jsxs("small",{className:"onboarding-provider-card__status onboarding-provider-card__status--warning",children:["⚠ Extension load failed: ",r.reason??r.status]}):o||n?t.jsxs("small",{className:"onboarding-provider-card__status onboarding-provider-card__status--connected",children:["✓ Connected",s.version?` — ${s.version}`:""]}):t.jsx("small",{className:"settings-muted",children:"Enabled. Validating…"}):t.jsxs("small",{className:"settings-muted",children:[t.jsx("code",{children:"claude"})," ",s.version?`(${s.version})`:""," detected",s.binaryPath?` at ${s.binaryPath}`:"",". Click Enable to route AI calls through it."]}):t.jsxs("small",{className:"onboarding-provider-card__status onboarding-provider-card__status--error",children:["✗ ",s.reason??"`claude` not found on PATH"]})}function Ox({action:e}){if(e.kind==="error")return t.jsx("p",{className:"onboarding-helper-text onboarding-helper-text--error",children:e.message});const n=e.kind==="enabled"?"Enabled":"Disabled";return t.jsxs("p",{className:"onboarding-helper-text",children:[n,"."," ",e.kind==="enabled"?"Claude-CLI-routed models are now visible in the model picker.":"Claude-CLI-routed models are hidden from the model picker."]})}function D3({authenticated:e,compact:n=!1,onToggled:s}){const[a,r]=i.useState(null),[o,l]=i.useState(null),c=i.useRef(!0);i.useEffect(()=>(c.current=!0,()=>{c.current=!1}),[]);const d=i.useCallback(async()=>{try{const b=await u1();return c.current&&r(b),b}catch{return null}},[]);i.useEffect(()=>{d()},[d]);const u=i.useCallback(async b=>{l(b?"enabling":"disabling");try{const v=await p1(b);s?.(v.enabled),await d()}finally{c.current&&l(null)}},[s,d]),h=a?.enabled??e,m=a?.binary.available??!1,f=t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>{l("testing"),d().finally(()=>{c.current&&l(null)})},disabled:o!==null,children:o==="testing"?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:12,className:"animate-spin"})," Testing…"]}):"Test"}),h?t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void u(!1),disabled:o!==null,children:o==="disabling"?"Disabling…":"Disable"}):t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:()=>void u(!0),disabled:o!==null||!m,children:o==="enabling"?"Enabling…":"Enable"})]}),p=a?a.binary.available?h?`Connected${a.binary.version?` — ${a.binary.version}`:""}`:"Detected. Click Enable to route calls through Cursor CLI.":a.binary.reason??"`cursor-agent` not found on PATH":"Probing local CLI…";return n?t.jsxs("div",{className:`cursor-cli-provider-card auth-provider-card auth-provider-card--cli${e?" auth-provider-card--authenticated":""}`,"data-testid":"cursor-cli-provider-card",children:[t.jsxs("div",{className:"auth-provider-header",children:[t.jsxs("div",{className:"auth-provider-info",children:[t.jsx(rs,{provider:"cursor-cli",size:"sm"}),t.jsx("strong",{children:"Cursor — via Cursor CLI"}),t.jsx("span",{className:`auth-status-badge ${h?"authenticated":"not-authenticated"}`,children:h?"✓ Active":"✗ Not connected"})]}),t.jsx("div",{className:"auth-provider-cli-actions",children:f})]}),t.jsx("small",{className:"settings-muted",children:p})]}):t.jsxs("div",{className:`cursor-cli-provider-card onboarding-provider-card${e?" onboarding-provider-card--connected":""}`,"data-testid":"cursor-cli-provider-card",children:[t.jsx("div",{className:"onboarding-provider-card__icon",children:t.jsx(rs,{provider:"cursor-cli",size:"md"})}),t.jsxs("div",{className:"onboarding-provider-card__body",children:[t.jsx("strong",{className:"onboarding-provider-card__name",children:"Cursor — via Cursor CLI"}),t.jsx("span",{className:"onboarding-provider-card__description",children:"Route AI calls through your local Cursor agent runtime."}),t.jsx("small",{className:"settings-muted",children:p})]}),t.jsx("div",{className:"onboarding-provider-card__actions",children:f})]})}function L3({authenticated:e,onToggled:n,compact:s=!1}){const[a,r]=i.useState(null),[o,l]=i.useState(null),c=i.useRef(!0);i.useEffect(()=>(c.current=!0,()=>{c.current=!1}),[]);const d=i.useCallback(async()=>{const v=await m1();return c.current&&r(v),v},[]);i.useEffect(()=>{d()},[d]);const u=i.useCallback(async v=>{l(v?"enabling":"disabling");try{const x=await g1(v);n?.(x.enabled),await d()}finally{c.current&&l(null)}},[n,d]),h=i.useCallback(async()=>{l("testing");try{await d()}finally{c.current&&l(null)}},[d]),m=a?.enabled??e,f=a?.server.available??!1,p=a?a.server.available?`Server reachable at ${a.server.url}`:`Server unavailable: ${a.server.reason??"not reachable"}`:"Probing llama.cpp server…",b=t.jsxs("div",{className:"auth-provider-cli-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void h(),disabled:o!==null,children:o==="testing"?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:12,className:"animate-spin"}),"Testing…"]}):"Test"}),m?t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void u(!1),disabled:o!==null,children:o==="disabling"?"Disabling…":"Disable"}):t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:()=>void u(!0),disabled:o!==null||!f,children:o==="enabling"?"Enabling…":"Enable"})]});return s?t.jsxs("div",{className:`auth-provider-card auth-provider-card--cli llama-cpp-provider-card llama-cpp-provider-card--compact${m?" auth-provider-card--authenticated":""}`,"data-testid":"llama-cpp-provider-card",children:[t.jsxs("div",{className:"auth-provider-header",children:[t.jsxs("div",{className:"auth-provider-info",children:[t.jsx(rs,{provider:"llama-cpp",size:"sm"}),t.jsx("strong",{children:"llama.cpp — via HTTP server"})]}),b]}),t.jsx("small",{className:`auth-hint llama-cpp-status${a?.ready?" llama-cpp-status--ok":""}`,children:p})]}):t.jsxs("div",{className:"onboarding-provider-card llama-cpp-provider-card llama-cpp-provider-card--full","data-testid":"llama-cpp-provider-card",children:[t.jsxs("div",{className:"auth-provider-info",children:[t.jsx(rs,{provider:"llama-cpp",size:"md"}),t.jsx("strong",{children:"llama.cpp — via HTTP server"})]}),t.jsx("small",{className:`llama-cpp-status${a?.ready?" llama-cpp-status--ok":""}`,children:p}),b]})}function O3(e){const n="([A-Z0-9]{2,}(?:-[A-Z0-9]{2,})+|[A-Z0-9]{6,9})",s=new RegExp(`\\b(?:device\\s+code|your\\s+code|code)\\s*(?:is|:)?\\s*${n}\\b`,"i"),a=new RegExp(`\\b(?:enter|use)\\s+${n}\\b`,"i"),r=/\b([A-Z0-9]{2,}(?:-[A-Z0-9]{2,})+)\b/,o=e.match(s);if(o?.[1])return o[1];const l=e.match(a);if(l?.[1])return l[1];const c=e.match(r);return c?.[1]?c[1]:null}function um({instructions:e,"data-testid":n}){const[s,a]=i.useState(!1),r=O3(e),o=i.useRef(null),l=i.useCallback(()=>{a(!0),setTimeout(()=>a(!1),2e3)},[]),c=i.useCallback(async()=>{const d=r??e;try{await navigator.clipboard.writeText(d),l()}catch{}},[r,e,l]);return i.useEffect(()=>{const d=o.current===null&&r!==null;if(o.current=r,!d)return;(async()=>{try{await navigator.clipboard.writeText(r),l()}catch{}})()},[r,l]),t.jsx("p",{className:"auth-login-instructions","data-testid":n,children:r?t.jsx(t.Fragment,{children:e.split(r).map((d,u,h)=>t.jsxs("span",{children:[d,u<h.length-1&&t.jsxs("span",{className:"device-code-wrapper",children:[t.jsx("code",{className:"device-code",children:r}),t.jsx("button",{className:"device-code-copy-btn",onClick:c,title:s?"Copied!":"Copy code","aria-label":s?"Copied to clipboard":"Copy device code",type:"button",children:s?t.jsx(Js,{size:12}):t.jsx(ga,{size:12})})]})]},u))}):e})}function F3({value:e,onChange:n,onSubmit:s,prompt:a,placeholder:r,helpText:o,disabled:l=!1,submitLabel:c="Submit code","data-testid":d}){const u=i.useRef(null),h=i.useRef(null),[m,f]=i.useState(!1),p=i.useCallback(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return!1;const x=window.matchMedia("(max-width: 768px)").matches,y=window.matchMedia("(pointer: coarse)").matches;return x||y},[]),b=i.useCallback(()=>typeof window>"u"||typeof window.matchMedia!="function"||window.matchMedia("(prefers-reduced-motion: reduce)").matches?"auto":"smooth",[]),v=i.useCallback(()=>{if(!p())return;const x=h.current??u.current;if(!x||typeof x.scrollIntoView!="function")return;const y=b();requestAnimationFrame(()=>{x.scrollIntoView({block:"center",behavior:y,inline:"nearest"}),window.setTimeout(()=>{x.scrollIntoView({block:"center",behavior:y,inline:"nearest"})},120)})},[b,p]);return i.useEffect(()=>{if(!m||!p())return;v();const x=window.visualViewport;if(!x)return;const y=()=>{document.activeElement===h.current&&v()};return x.addEventListener("resize",y),x.addEventListener("scroll",y),()=>{x.removeEventListener("resize",y),x.removeEventListener("scroll",y)}},[m,v,p]),t.jsxs("div",{ref:u,className:"oauth-manual-code","data-testid":d,children:[t.jsx("p",{className:"oauth-manual-code__prompt",children:a}),t.jsx("textarea",{ref:h,className:"form-input oauth-manual-code__input",value:e,onChange:x=>n(x.target.value),onFocus:()=>{f(!0),v()},onBlur:()=>f(!1),placeholder:r,rows:3,spellCheck:!1,disabled:l}),t.jsx("div",{className:"oauth-manual-code__actions",children:t.jsx("button",{type:"button",className:"btn btn-sm",onClick:s,disabled:l,children:c})}),o&&t.jsx("p",{className:"oauth-manual-code__help",children:o})]})}const z3=new Set(["anthropic","claude-cli","pi-claude-cli","openai","openai-codex","google","gemini","google-antigravity","antigravity","google-vertex","vertex","google-cloud-code","cloud-code","google-gemini-cli","google-generative-ai","ollama","github","github-copilot","openrouter","minimax","minimax-cn","zai","kimi","moonshot","kimi-coding","bedrock","amazon-bedrock","xai","grok","opencode","opencode-go","qwen","qwen-ai","qwen-coder","alibaba","tongyi","lmstudio","lm-studio","huggingface","hugging-face","hf","mistral","mistral-ai","azure","azure-openai","azure-openai-responses","fireworks","fireworks-ai","fireworksai","cerebras","groq","vercel","vercel-ai-gateway","hermes","hermes-agent","hermesagent","openclaw","open-claw","paperclip","paperclipai","paperclip-ai"]),B3=/^[a-z][a-z0-9-]*$/,Fx=["openai-completions","openai-responses","anthropic-messages","google-generative-ai"];function zx(){return{id:"",name:"",reasoning:!1}}function U3({initialConfig:e,onSave:n,onCancel:s,saving:a=!1,error:r}){const o=!!e,[l,c]=i.useState(e?.id??""),[d,u]=i.useState(e?.name??""),[h,m]=i.useState(e?.baseUrl??""),[f,p]=i.useState(e?.api??"openai-completions"),[b,v]=i.useState(e?.apiKey??""),[x,y]=i.useState(e?.models?.length?e.models:[zx()]),[g,j]=i.useState(null),[N,C]=i.useState(!1),[w,S]=i.useState(null),R=x.length>1,I=i.useMemo(()=>g??r??null,[g,r]);function E(D,W){y(Y=>Y.map((L,_)=>_===D?{...L,...W}:L))}function M(D){y(W=>W.length<=1?W:W.filter((Y,L)=>L!==D))}const G=f==="anthropic-messages"?"anthropic-compatible":f==="google-generative-ai"?"google-generative-ai":"openai-compatible",U=i.useCallback(async()=>{const D=h.trim();if(!D){S("Base URL is required to detect models.");return}C(!0),S(null);try{const W=await y1({baseUrl:D,apiKey:b.trim()||void 0,apiType:G});if(W.models.length===0){S("No models found. The provider may require an API key.");return}const Y=new Set(x.map(_=>_.id.trim())),L=W.models.filter(_=>!Y.has(_.id.trim())).map(_=>({id:_.id,name:_.name||_.id,reasoning:!!_.reasoning,contextWindow:_.contextWindow,maxTokens:_.maxTokens}));L.length>0?y(_=>[..._.filter(ae=>ae.id.trim().length>0),...L]):S("All discovered models are already in the list.")}catch(W){S(W instanceof Error?W.message:"Failed to detect models")}finally{C(!1)}},[h,b,G,x]);function P(){if(!l.trim())return"Provider ID is required.";if(!B3.test(l.trim()))return"Provider ID must be kebab-case.";if(!o&&z3.has(l.trim()))return"Provider ID conflicts with a built-in provider.";if(!h.trim())return"Base URL is required.";try{const D=new URL(h.trim());if(D.protocol!=="http:"&&D.protocol!=="https:")return"Base URL must use http or https."}catch{return"Base URL must be a valid URL."}return Fx.includes(f)?x.length===0?"At least one model is required.":x.some(D=>!D.id?.trim())?"Each model must have a model ID.":null:"API type is required."}async function T(D){D.preventDefault();const W=P();j(W),!W&&await n({id:l.trim(),name:d.trim()||void 0,baseUrl:h.trim(),api:f,apiKey:b.trim()||void 0,models:x.map(Y=>({id:Y.id.trim(),name:Y.name?.trim()||void 0,reasoning:!!Y.reasoning,contextWindow:Y.contextWindow,maxTokens:Y.maxTokens}))})}return t.jsxs("form",{onSubmit:T,className:"custom-provider-form","aria-label":"custom-provider-form",children:[t.jsxs("div",{className:"form-group custom-provider-form__group",children:[t.jsx("label",{htmlFor:"custom-provider-id",children:"Provider ID"}),t.jsx("input",{id:"custom-provider-id",className:"input",value:l,onChange:D=>c(D.target.value),disabled:o||a})]}),t.jsxs("div",{className:"form-group custom-provider-form__group",children:[t.jsx("label",{htmlFor:"custom-provider-name",children:"Display Name"}),t.jsx("input",{id:"custom-provider-name",className:"input",value:d,onChange:D=>u(D.target.value),disabled:a})]}),t.jsxs("div",{className:"form-group custom-provider-form__group",children:[t.jsx("label",{htmlFor:"custom-provider-base-url",children:"Base URL"}),t.jsx("input",{id:"custom-provider-base-url",className:"input",value:h,onChange:D=>m(D.target.value),disabled:a})]}),t.jsxs("div",{className:"form-group custom-provider-form__group",children:[t.jsx("label",{htmlFor:"custom-provider-api",children:"API Type"}),t.jsx("select",{id:"custom-provider-api",className:"select",value:f,onChange:D=>p(D.target.value),disabled:a,children:Fx.map(D=>t.jsx("option",{value:D,children:D},D))})]}),t.jsxs("div",{className:"form-group custom-provider-form__group",children:[t.jsx("label",{htmlFor:"custom-provider-api-key",children:"API Key"}),t.jsx("input",{id:"custom-provider-api-key",className:"input",placeholder:"sk-..., MY_API_KEY, or !command",value:b,onChange:D=>v(D.target.value),disabled:a})]}),t.jsxs("div",{className:"form-group custom-provider-form__group",children:[t.jsx("label",{children:"Models"}),t.jsx("div",{className:"custom-provider-form__models",children:x.map((D,W)=>t.jsxs("div",{className:"custom-provider-form__model-row",children:[t.jsx("input",{className:"input","aria-label":`Model ID ${W+1}`,placeholder:"Model ID",value:D.id,onChange:Y=>E(W,{id:Y.target.value}),disabled:a}),t.jsx("input",{className:"input","aria-label":`Model name ${W+1}`,placeholder:"Display name",value:D.name??"",onChange:Y=>E(W,{name:Y.target.value}),disabled:a}),t.jsxs("label",{className:"checkbox-label custom-provider-form__toggle",children:[t.jsx("input",{type:"checkbox",checked:!!D.reasoning,onChange:Y=>E(W,{reasoning:Y.target.checked}),disabled:a}),"Reasoning"]}),t.jsx("input",{className:"input","aria-label":`Context window ${W+1}`,placeholder:"Context window",type:"number",value:D.contextWindow??"",onChange:Y=>E(W,{contextWindow:Y.target.value?Number(Y.target.value):void 0}),disabled:a}),t.jsx("input",{className:"input","aria-label":`Max tokens ${W+1}`,placeholder:"Max tokens",type:"number",value:D.maxTokens??"",onChange:Y=>E(W,{maxTokens:Y.target.value?Number(Y.target.value):void 0}),disabled:a}),t.jsx("button",{type:"button",className:"btn btn-icon btn-sm",onClick:()=>M(W),disabled:a||!R,"aria-label":`Remove model ${W+1}`,children:"×"})]},`${W}-model`))}),t.jsxs("div",{className:"custom-provider-form__model-actions",style:{display:"flex",gap:"8px",alignItems:"center"},children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>y(D=>[...D,zx()]),disabled:a,children:"+ Add model"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void U(),disabled:a||N||!h.trim(),title:"Call the provider's /models endpoint to discover available models",children:N?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{className:"spin",size:14})," Detecting…"]}):t.jsxs(t.Fragment,{children:[t.jsx(da,{size:14})," Detect Models"]})})]}),w?t.jsx("div",{className:"form-error",style:{marginTop:"4px"},children:w}):null]}),I?t.jsx("div",{className:"form-error",children:I}):null,t.jsxs("div",{className:"custom-provider-form__actions",children:[s?t.jsx("button",{type:"button",className:"btn",onClick:s,disabled:a,children:"Cancel"}):null,t.jsx("button",{type:"submit",className:"btn btn-primary",disabled:a,children:a?"Saving...":"Save Provider"})]})]})}async function Bx(e){if(typeof navigator<"u"&&typeof window<"u"&&window.isSecureContext!==!1&&navigator.clipboard?.writeText)try{return await navigator.clipboard.writeText(e),!0}catch{}if(typeof document>"u"||!document.body)return!1;const n=document.createElement("textarea");n.value=e,n.setAttribute("readonly",""),n.style.position="fixed",n.style.left="-9999px",n.style.top="0",n.style.opacity="0",n.style.pointerEvents="none",document.body.appendChild(n);try{return n.focus(),n.select(),n.setSelectionRange(0,e.length),document.execCommand("copy")}catch{return!1}finally{n.remove()}}const H3=new Set(["google-antigravity","antigravity","google-gemini-cli"]);function q3(e){return!H3.has(e)}function Ux(e){return e.filter(n=>q3(n.id))}const Hk={host:"web",activeProfileId:null,profiles:[]},qk=i.createContext({shellApi:null,state:Hk,ready:!0,openConnectionManagerSignal:0});function V3({children:e}){const n=i.useMemo(()=>typeof window<"u"?window.fusionShell??null:null,[]),[s,a]=i.useState(Hk),[r,o]=i.useState(!n),[l,c]=i.useState(0);return i.useEffect(()=>{if(!n)return;let d=!1;n.getState().then(m=>{d||(a(m),o(!0))});const u=n.subscribe(m=>{a(m)}),h=()=>{c(m=>m+1)};return window.addEventListener("shell:open-connection-manager",h),()=>{d=!0,u(),window.removeEventListener("shell:open-connection-manager",h)}},[n]),t.jsx(qk.Provider,{value:{shellApi:n,state:s,ready:r,openConnectionManagerSignal:l},children:e})}function W3(){return i.useContext(qk)}const G3={host:"web",activeProfileId:null,profiles:[]};function K3(e){if(!e)return G3;const n=Array.isArray(e.profiles)?e.profiles.filter(a=>!!(a&&a.id&&a.serverUrl)):[],s=e.activeProfileId&&n.some(a=>a.id===e.activeProfileId)?e.activeProfileId:null;return{...e,activeProfileId:s,profiles:n}}function vf(e){return new Error(`${e} is only available in native shell mode`)}async function J3(e,n){if(!e)throw vf("Saving connection profiles");return e.saveProfile(n)}async function Y3(e,n){if(!e)throw vf("Deleting connection profiles");await e.deleteProfile(n)}async function X3(e,n){if(!e)throw vf("Switching connection profiles");return e.setActiveProfile(n)}function Vk(){const e=W3(),n=i.useMemo(()=>K3(e.state),[e.state]),s=i.useCallback(o=>J3(e.shellApi,o),[e.shellApi]),a=i.useCallback(o=>Y3(e.shellApi,o),[e.shellApi]),r=i.useCallback(o=>X3(e.shellApi,o),[e.shellApi]);return{...e,state:n,saveProfile:s,removeProfile:a,setActiveProfile:r}}const Rr="fusion_model_onboarding_state",Ro=[],Ao=[],bd=!1,xd=!1,To={},Q3=void 0,qa=["ai-setup","github","project-setup","first-task"],Z3={"ai-setup":"AI Setup",github:"GitHub","project-setup":"Project","first-task":"First Task",complete:"Complete"};function Ii(){if(typeof window>"u")return null;try{const e=localStorage.getItem(Rr);if(!e)return null;const n=JSON.parse(e);return n&&typeof n=="object"&&"currentStep"in n&&typeof n.currentStep=="string"?e5(n):null}catch{return null}}function e5(e){const n=e.postOnboardingDismissedAt??Q3;return{...e,completedSteps:e.completedSteps??Ro,skippedSteps:e.skippedSteps??Ao,dismissed:e.dismissed??bd,completed:e.completed??xd,stepData:e.stepData??To,...n?{postOnboardingDismissedAt:n}:{}}}function Lc(e,n){if(!(typeof window>"u")){if(!n){const s={currentStep:e,updatedAt:new Date().toISOString(),completedSteps:Ro,skippedSteps:Ao,dismissed:bd,completed:xd,stepData:To};try{localStorage.setItem(Rr,JSON.stringify(s))}catch{}return}try{const s=Ii(),a=new Date().toISOString(),r=n.completed??xd;let o=n.dismissed??bd;r&&(o=!1);const l=n.completedSteps??s?.completedSteps??Ro,c=n.skippedSteps??s?.skippedSteps??Ao,d={...s?.stepData??To};if(n.stepData)for(const[h,m]of Object.entries(n.stepData))m!==void 0&&(d[h]={...d[h]??{},...m});const u={currentStep:e,updatedAt:a,completedSteps:l,skippedSteps:c,dismissed:o,completed:r,stepData:d};localStorage.setItem(Rr,JSON.stringify(u))}catch{}}}function t5(e){if(!(typeof window>"u"))try{const n=Ii(),s=new Date().toISOString();if(!n){const o={currentStep:e,updatedAt:s,completedSteps:Ro,skippedSteps:[e],dismissed:bd,completed:xd,stepData:To};localStorage.setItem(Rr,JSON.stringify(o));return}const a=n.skippedSteps.includes(e)?n.skippedSteps:[...n.skippedSteps,e],r={...n,skippedSteps:a,completedSteps:n.completedSteps.filter(o=>o!==e),updatedAt:s};localStorage.setItem(Rr,JSON.stringify(r))}catch{}}function Hx(){if(!(typeof window>"u"))try{const e=Ii(),n=new Date().toISOString(),s=e?{...e,completedAt:n,completed:!0,dismissed:!1,updatedAt:n}:{currentStep:"complete",updatedAt:n,completedAt:n,completedSteps:Ro,skippedSteps:Ao,dismissed:!1,completed:!0,stepData:To};localStorage.setItem(Rr,JSON.stringify(s))}catch{}}function Io(){const e=Ii();return e?e.completed===!0?!0:typeof e.completedAt=="string"&&e.completedAt.length>0:!1}function n5(){if(!(typeof window>"u"))try{const e=Ii(),n=new Date().toISOString(),s=e?{...e,updatedAt:n,postOnboardingDismissedAt:n}:{currentStep:"complete",updatedAt:n,completedSteps:Ro,skippedSteps:Ao,dismissed:!1,completed:!1,stepData:To,postOnboardingDismissedAt:n};localStorage.setItem(Rr,JSON.stringify(s))}catch{}}function Wk(){const e=Ii();return e?typeof e.postOnboardingDismissedAt=="string"&&e.postOnboardingDismissedAt.length>0:!1}function s5(){const e=Ii();return!e||Io()?!1:e.currentStep!=="complete"}function i5(){const e=Ii();if(!e||Io()||e.currentStep==="complete")return null;const n=e.currentStep,s=Z3[n]??o5(e.currentStep);return{currentStep:e.currentStep,label:s,completedSteps:e.completedSteps}}function a5(){const e=Ii();return e?e.skippedSteps:Ao}function r5(e){const n=Ii();return!n||!n.stepData?null:n.stepData[e]??null}function o5(e){return e.replace(/[-_]/g," ").replace(/\b\w/g,n=>n.toUpperCase())}const Gk="fusion_onboarding_events",qx="fusion_onboarding_session_id",l5=200,c5=50;function Bi(e,n={}){if(!(typeof window>"u"))try{const s=u5(),a=f5(n.step),r={type:e,timestamp:new Date().toISOString(),...a?{step:a}:{},metadata:n,sessionId:d5()},o=h5([...s,r]);m5(o)}catch{}}function d5(){if(typeof window>"u")return"server-session";try{const e=sessionStorage.getItem(qx);if(e)return e;const n=Vx();return sessionStorage.setItem(qx,n),n}catch{return Vx()}}function Vx(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`onboarding-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,12)}`}function u5(){try{const e=localStorage.getItem(Gk);if(!e)return[];const n=JSON.parse(e);return Array.isArray(n)?n.filter(p5):[]}catch{return[]}}function m5(e){try{localStorage.setItem(Gk,JSON.stringify(e))}catch{}}function h5(e){const n=[...e];for(;n.length>l5;)n.splice(0,c5);return n}function f5(e){if(e==="ai-setup"||e==="github"||e==="first-task"||e==="complete")return e}function p5(e){if(!e||typeof e!="object")return!1;const n=e;return typeof n.type=="string"&&typeof n.timestamp=="string"&&typeof n.sessionId=="string"&&!!n.metadata&&typeof n.metadata=="object"}const g5=e=>({id:e.id,name:e.name,baseUrl:e.baseUrl,api:"api"in e?e.api:e.apiType==="anthropic-compatible"?"anthropic-messages":"openai-responses",apiKey:e.apiKey,models:e.models?.map(n=>({id:n.id,name:n.name}))??[]}),b5={anthropic:{description:"Claude models — strong at reasoning, analysis, and code"},openai:{description:"GPT models — versatile for a wide range of tasks",apiKeyInfo:{fieldLabel:"OpenAI API Key",setupInstructions:"Create an API key from your OpenAI dashboard under API keys.",dashboardUrl:"https://platform.openai.com/api-keys",inputPlaceholder:"sk-...",usageDescription:"Used for GPT models in task execution and planning"}},"openai-codex":{description:"Codex models by OpenAI — optimized for coding tasks"},google:{description:"Gemini models — multimodal with strong reasoning"},gemini:{description:"Gemini models — multimodal with strong reasoning"},ollama:{description:"Run open-source models locally on your machine",apiKeyInfo:{fieldLabel:"Ollama Endpoint",setupInstructions:"Enter your Ollama endpoint URL (for example http://localhost:11434).",inputPlaceholder:"http://localhost:11434",usageDescription:"Connects to your local Ollama instance"}},minimax:{description:"MiniMax models — cost-effective for high-volume usage",apiKeyInfo:{fieldLabel:"MiniMax API Key",setupInstructions:"Generate an API key from the MiniMax platform developer console.",dashboardUrl:"https://platform.minimaxi.com/",inputPlaceholder:"Enter your MiniMax API key",usageDescription:"Used for MiniMax models in task execution"}},zai:{description:"GLM models by Zhipu AI — strong multilingual support",apiKeyInfo:{fieldLabel:"Zhipu AI API Key",setupInstructions:"Create an API key in the Zhipu AI open platform account settings.",dashboardUrl:"https://open.bigmodel.cn/",inputPlaceholder:"Enter your Zhipu AI API key",usageDescription:"Used for GLM models in task execution"}},kimi:{description:"Kimi by Moonshot AI — long-context capabilities"},moonshot:{description:"Kimi by Moonshot AI — long-context capabilities"},"kimi-coding":{description:"Kimi by Moonshot AI — long-context capabilities",apiKeyInfo:{fieldLabel:"Kimi API Key",setupInstructions:"Create your API key in the Moonshot platform account settings.",dashboardUrl:"https://platform.moonshot.cn/",inputPlaceholder:"Enter your Kimi API key",usageDescription:"Used for Kimi/Moonshot AI models in task execution and planning"}},openrouter:{description:"OpenRouter — route requests across multiple AI providers",apiKeyInfo:{fieldLabel:"OpenRouter API Key",setupInstructions:"Create an API key from your OpenRouter account key management page.",dashboardUrl:"https://openrouter.ai/keys",inputPlaceholder:"sk-or-v1-...",usageDescription:"Routes to multiple AI model providers through a single key"}}},Kk={anthropic:{pattern:/^sk-ant-/,hint:"Starts with sk-ant-",example:"sk-ant-api03-..."},openai:{pattern:/^sk-/,hint:"Starts with sk-",example:"sk-..."},"openai-codex":{pattern:/^sk-/,hint:"Starts with sk-",example:"sk-..."},openrouter:{pattern:/^sk-or-/,hint:"Starts with sk-or-",example:"sk-or-v1-..."},google:{pattern:/^AIza/,hint:"Starts with AIza",example:"AIza..."},gemini:{pattern:/^AIza/,hint:"Starts with AIza",example:"AIza..."},minimax:{pattern:/^.{8,}$/,hint:"At least 8 characters",example:"..."},ollama:{pattern:/^.+$/,hint:"Any non-empty value",example:"ollama"},zai:{pattern:/^.{8,}$/,hint:"At least 8 characters",example:"..."},kimi:{pattern:/^.{8,}$/,hint:"At least 8 characters",example:"..."},"kimi-coding":{pattern:/^.{8,}$/,hint:"At least 8 characters",example:"..."},moonshot:{pattern:/^.{8,}$/,hint:"At least 8 characters",example:"..."}},x5={pattern:/^.{8,}$/,hint:"At least 8 characters",example:"..."},Wx={anthropic:"Anthropic",openai:"OpenAI","openai-codex":"OpenAI Codex",openrouter:"OpenRouter",google:"Google",gemini:"Gemini",minimax:"MiniMax",ollama:"Ollama",zai:"Zhipu AI",kimi:"Kimi","kimi-coding":"Kimi Coding",moonshot:"Moonshot"},v5=e=>`After you sign in with ${e}, the browser will try to redirect to a localhost address that this dashboard can't reach. The redirect tab will look like it failed. Before that happens, copy the full URL from the browser address bar — you'll paste it back here to finish login. Continue?`;function hh(e){if(Wx[e])return Wx[e];const n=e.trim();return n?n.split(/[-_\s]+/).filter(Boolean).map(s=>s.charAt(0).toUpperCase()+s.slice(1)).join(" "):"This provider"}const mm=["anthropic","openai","google","gemini","ollama"],y5=["anthropic","claude-cli","droid-cli","cursor-cli","llama-cpp","openai-codex","gemini","minimax","kimi","zai"],w5={anthropic:"anthropic","claude-cli":"claude-cli","droid-cli":"droid-cli","llama-cpp":"llama-cpp","openai-codex":"openai-codex",google:"gemini",gemini:"gemini",minimax:"minimax",kimi:"kimi",moonshot:"kimi","kimi-coding":"kimi",zai:"zai"},k5={gemini:["google","gemini"],kimi:["kimi","moonshot","kimi-coding"]};function fh(e){return w5[e]??e}function Gx(e){const n=fh(e),s=y5.indexOf(n);return s===-1?Number.POSITIVE_INFINITY:s}function Kx(e,n){if(e.authenticated!==n.authenticated)return e.authenticated?-1:1;const s=Gx(e.id),a=Gx(n.id);if(s!==a)return s-a;const r=fh(e.id),o=fh(n.id);if(r!==o)return r.localeCompare(o);const l=k5[r];if(l){const d=l.indexOf(e.id),u=l.indexOf(n.id);if(d!==u)return(d===-1?Number.POSITIVE_INFINITY:d)-(u===-1?Number.POSITIVE_INFINITY:u)}const c=e.name.localeCompare(n.name);return c!==0?c:e.id.localeCompare(n.id)}function j5(e,n){const s=n.trim();if(!s)return"API key is required";const a=Kk[e]??x5;return a.pattern.test(s)?null:`${hh(e)} keys should follow this format: ${a.hint} (e.g. ${a.example})`}const Jk={fieldLabel:"API Key",setupInstructions:"Enter your API key for this provider.",inputPlaceholder:"Enter API key",usageDescription:"Used by Fusion to authenticate requests to this provider"},N5={description:"AI provider — connect to start using AI models",apiKeyInfo:Jk};function ph(e){return b5[e]??N5}function S5(e){return ph(e.id).apiKeyInfo??Jk}function C5({items:e}){return e.some(s=>s.status!=="connected")?t.jsxs("div",{className:"onboarding-readiness-summary","data-testid":"readiness-summary",role:"status",children:[t.jsx("p",{className:"onboarding-readiness-header",children:"Setup Summary"}),e.map(s=>{const a=s.status==="connected"?"✓":s.status==="missing"?"⚠":"○";return t.jsxs("div",{className:`onboarding-readiness-item onboarding-readiness-item--${s.status}`,"data-status":s.status,children:[t.jsx("span",{className:"onboarding-readiness-icon","aria-hidden":"true",children:a}),t.jsxs("span",{className:"onboarding-readiness-content",children:[t.jsx("span",{className:"onboarding-readiness-label",children:s.label}),s.detail&&t.jsx("span",{className:"onboarding-readiness-detail",children:s.detail})]})]},s.label)})]}):t.jsx("div",{className:"onboarding-readiness-summary","data-testid":"readiness-summary",role:"status",children:t.jsx("p",{className:"onboarding-readiness-all-connected",children:"✓ All integrations connected"})})}function E5({provider:e,apiKeyInfo:n,inputValue:s,isSaving:a,error:r,success:o,isConnected:l,onInputChange:c,onSave:d,onClear:u}){const h=`onboarding-apikey-input-${e.id}`,m=a||!s.trim(),f=Kk[e.id],p=`input onboarding-apikey-input${r?" onboarding-apikey-input--error":""}${o?" onboarding-apikey-input--success":""}`,b=t.jsxs(t.Fragment,{children:[f&&t.jsxs("small",{className:"onboarding-apikey-hint",children:["Format: ",f.hint]}),t.jsx("p",{className:"onboarding-apikey-instructions",children:n.setupInstructions}),n.dashboardUrl&&t.jsx("a",{href:n.dashboardUrl,target:"_blank",rel:"noreferrer",className:"onboarding-apikey-dashboard-link",children:"Get your API key →"}),t.jsx("p",{className:"onboarding-apikey-usage",children:n.usageDescription})]});return l?t.jsxs("div",{className:"onboarding-apikey-form","data-testid":`onboarding-apikey-form-${e.id}`,children:[t.jsxs("div",{className:"onboarding-apikey-connected-header",children:[t.jsx("strong",{className:"onboarding-provider-card__name",children:n.fieldLabel}),t.jsx("span",{className:"auth-status-badge connected",children:"✓ API key saved"})]}),t.jsx("button",{className:"btn btn-sm",onClick:()=>u(e.id),disabled:a,children:a?"Removing…":"Remove Key"}),t.jsx(Ui,{summary:"Advanced setup details",children:b}),r&&t.jsx("small",{className:"field-error",children:r})]}):t.jsxs("div",{className:"onboarding-apikey-form","data-testid":`onboarding-apikey-form-${e.id}`,children:[t.jsx("label",{htmlFor:h,className:"onboarding-apikey-field-label",children:n.fieldLabel}),t.jsxs("div",{className:"onboarding-apikey-input-row",children:[t.jsx("input",{id:h,type:"password",className:p,placeholder:n.inputPlaceholder??"Enter API key",value:s,onChange:v=>c(e.id,v.target.value),onKeyDown:v=>{v.key==="Enter"&&d(e.id,s)},"data-testid":h}),t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>d(e.id,s),disabled:m,"data-testid":`onboarding-apikey-save-${e.id}`,children:a?"Saving…":"Save"})]}),r&&t.jsx("small",{className:"field-error",children:r}),o&&!r&&t.jsx("small",{className:"onboarding-apikey-success","data-testid":`onboarding-apikey-success-${e.id}`,children:o}),t.jsx(Ui,{summary:"Advanced setup details",children:b})]})}const _5=150;function M5({onComplete:e,addToast:n,projectId:s,onOpenSetupWizard:a,onOpenNewTask:r,onOpenGitHubImport:o,firstCreatedTask:l,onViewTask:c}){const{confirm:d}=Di(),u=Ii(),h=u?.currentStep,m=h==="complete"?"ai-setup":qa.includes(h)?h:"ai-setup",f=u?.completedSteps??[],p=u?.skippedSteps??a5(),[b,v]=i.useState(!0),[x,y]=i.useState(m),[g,j]=i.useState(f),[N,C]=i.useState(p),[w,S]=i.useState(!1),[R,I]=i.useState(""),[E,M]=i.useState(!1),[G,U]=i.useState(null),[P,T]=i.useState(null),[D,W]=i.useState([]),[Y,L]=i.useState(void 0),[_,F]=i.useState(!0),[ae,k]=i.useState(null),[z,J]=i.useState({}),[oe,le]=i.useState({}),[we,re]=i.useState({}),[H,ue]=i.useState({}),[Q,be]=i.useState(null),[fe,O]=i.useState([]),[se,ve]=i.useState(""),[A,ne]=i.useState(!1),[ye,ee]=i.useState({}),[ge,Ne]=i.useState({}),[He,Le]=i.useState({}),[de,Re]=i.useState([]),[Pe,rt]=i.useState(!1),[qe,Xe]=i.useState(!1),[At,at]=i.useState(),[Se,pe]=i.useState("Remote Server"),[_e,et]=i.useState(""),[Ae,it]=i.useState(""),[xt,Nt]=i.useState(!1),[Ut,Be]=i.useState(null),Z=i.useRef({}),Oe=i.useRef(null),ht=i.useRef(null),je=i.useRef(null),[mt,Et]=i.useState({}),Te=i.useRef({}),[xe,gt]=i.useState(()=>Ii()?.stepData?.github?.skipped===!0),_t=i.useRef(0),Ft=i.useRef(l),{shellApi:Dt,state:nt}=Vk(),Wt=i.useRef(!1),Mt=u?.currentStep,Kt=!!u&&u.currentStep!=="complete";ea(ht,b,"fusion:model-onboarding-modal-size"),i.useEffect(()=>{const V=Oe.current;V&&(V.scrollTop=0)},[x]),i.useEffect(()=>{const V=we["github-copilot"];V?.userCode&&Te.current["github-copilot"]!==V.userCode&&(Te.current["github-copilot"]=V.userCode,Bx(V.userCode))},[we]);const[xn,Tn]=i.useState(()=>Ii()?.stepData?.["ai-setup"]?.skippedProviders??{}),Sn=[{key:"ai-setup",label:"AI Setup"},{key:"github",label:"GitHub"},{key:"project-setup",label:"Project"},{key:"first-task",label:"First Task"}],is=Sn.findIndex(V=>V.key===x),On=x==="complete"?Sn.length:is;i.useEffect(()=>{x!=="complete"&&Lc(x,{completedSteps:g,skippedSteps:N})},[x,g,N]),i.useEffect(()=>{Wt.current||(Wt.current=!0,Bi("onboarding:wizard-opened",{source:Kt?"resume":"initial",resumedFromStep:Mt}))},[Kt,Mt]),i.useEffect(()=>{const V=Ft.current!=null,We=l!=null;!V&&We&&S(!0),We||S(!1),Ft.current=l},[l]);const un=i.useRef(m);i.useEffect(()=>{if(un.current==="ai-setup"&&x!=="ai-setup"&&!D.some(We=>We.id!=="github"&&We.authenticated)){const We={};for(const wt of D)wt.id!=="github"&&!wt.authenticated&&!xn[wt.id]&&(We[wt.id]=!0);if(Object.keys(We).length>0){const wt={...xn,...We};Tn(wt),Lc(x,{stepData:{"ai-setup":{skippedProviders:wt}}})}}un.current=x},[x,D,xn]);const tn=i.useCallback(async()=>{try{const{providers:V,ghCli:We}=await No(),wt=Ux(V);W(wt),L(We),J(ut=>{const Bt={};for(const[en,jn]of Object.entries(ut)){const ts=wt.find(vs=>vs.id===en);ts&&!ts.authenticated&&ts.loginInProgress&&(Bt[en]=jn)}return Object.keys(Bt).length===Object.keys(ut).length?ut:Bt}),Et(ut=>{let Bt=!1;const en={...ut};for(const[jn,ts]of Object.entries(ut)){if(ts!=="pending")continue;wt.find(Ps=>Ps.id===jn)?.loginInProgress||(delete en[jn],Bt=!0)}return Bt?en:ut}),Tn(ut=>{const Bt={...ut};for(const en of wt)en.authenticated&&Bt[en.id]&&delete Bt[en.id];return Object.keys(Bt).length===Object.keys(ut).length?ut:Bt})}catch{}},[]),on=i.useCallback(async()=>{try{const V=await b1();Re((V.providers??[]).map(g5))}catch{}},[]),pn=i.useCallback(async V=>{Xe(!0),at(void 0);try{await v1(V),await on(),await Ki().then(We=>O(We.models??[])),rt(!1)}catch(We){at(Ce(We)||"Failed to create custom provider")}finally{Xe(!1)}},[on]),mn=i.useRef(!1);i.useEffect(()=>{x==="ai-setup"&&on(),mn.current&&tn(),mn.current=x!=="ai-setup"},[x,tn,on]),i.useEffect(()=>{if(!D.some(wt=>wt.loginInProgress))return;const We=setInterval(()=>{tn()},2e3);return()=>clearInterval(We)},[D,tn]);const Zn=D.find(V=>V.id==="github"),In=!!Zn,rn=Zn?.authenticated??!1,hn=Zn?.loginInProgress??!1,Pn=Y?.authenticated??!1,nn=rn||Pn,$t=!rn&&Pn,Jt=i.useCallback(V=>{if(V.authenticated)return"connected";const We=mt?.[V.id];return We==="timeout"||We==="failed"?"retry":xn[V.id]?"skipped":"not-connected"},[mt,xn]);function Qt({status:V}){const We={connected:{text:"✓ Connected",className:"auth-status-badge connected"},"not-connected":{text:"Not connected",className:"auth-status-badge not-connected"},skipped:{text:"Skipped",className:"auth-status-badge skipped"},retry:{text:"Retry",className:"auth-status-badge retry"}},{text:wt,className:ut}=We[V];return t.jsx("span",{"data-testid":"provider-status-badge",className:ut,"data-status":V,children:wt})}const ie=i.useCallback(()=>{if(nn)return"connected";const V=mt.github;return V==="pending"?"pending":V==="failed"||V==="timeout"?"failed":xe?"skipped":"not-connected"},[nn,mt,xe]);function Fe({status:V}){const We={connected:{text:"✓ Connected",className:"auth-status-badge connected"},pending:{text:"⏳ Connecting…",className:"auth-status-badge pending"},failed:{text:"✗ Connection failed",className:"auth-status-badge retry"},skipped:{text:"Skipped",className:"auth-status-badge skipped"},"not-connected":{text:"Not connected",className:"auth-status-badge not-connected"}},{text:wt,className:ut}=We[V];return t.jsx("span",{"data-testid":"github-status-badge",className:ut,"data-status":V,children:wt})}const Je=i.useCallback(async()=>{try{const V=await Ki();O(V.models)}catch{}},[]),tt=i.useCallback(async()=>{try{const V=await Ra();if(V.defaultProvider&&V.defaultModelId){const We=`${V.defaultProvider}/${V.defaultModelId}`;ve(We)}}catch{}},[]);i.useEffect(()=>{Promise.all([tn(),Je(),tt()]).finally(()=>F(!1))},[tn,Je,tt]),i.useEffect(()=>{const V=r5("ai-setup");if(V?.loginOutcomes){const We=V.loginOutcomes,wt={};for(const[ut,Bt]of Object.entries(We))Bt!=="pending"&&(wt[ut]=Bt);Object.keys(wt).length>0&&Et(wt)}},[]);const Ye=i.useCallback((V,We)=>{Lc(x,{completedSteps:g,stepData:{"ai-setup":{loginOutcomes:{[V]:We}}}})},[x,g]);i.useEffect(()=>{const V=Object.entries(mt).filter(([We,wt])=>wt!=="pending");for(const[We,wt]of V)Ye(We,wt)},[mt,Ye]),i.useEffect(()=>()=>{je.current&&clearInterval(je.current),Object.values(Z.current).forEach(clearTimeout),Z.current={}},[]);const vt=i.useCallback(V=>{gt(V),Lc(x,{completedSteps:g,stepData:{github:{skipped:V}}})},[x,g]),pt=i.useCallback(V=>V==="complete"?-1:qa.indexOf(V),[]),Zt=i.useCallback(()=>{j(We=>[...new Set([...We,x])]),C(We=>We.filter(wt=>wt!==x)),Bi("onboarding:step-completed",{step:x}),x==="github"&&!rn&&vt(!1);const V=pt(x);V>=0&&V<qa.length-1&&y(qa[V+1])},[x,rn,vt,pt]),ce=i.useCallback(()=>{C(We=>[...new Set([...We,x])]),t5(x),Bi("onboarding:step-skipped",{step:x}),x==="github"&&!rn&&vt(!0);const V=pt(x);V>=0&&V<qa.length-1&&y(qa[V+1])},[x,rn,vt,pt]),Ge=i.useCallback(()=>{const V=x;j(wt=>wt.filter(ut=>ut!==V)),C(wt=>wt.filter(ut=>ut!==V)),V==="github"&&!rn&&vt(!1);const We=pt(x);We>0&&y(qa[We-1])},[x,rn,vt,pt]),Me=i.useCallback(()=>{ce()},[ce]),Ke=i.useCallback(async V=>{const We=D.find(ut=>ut.id===V);if(We?.requiresManualCode===!0&&!await d({title:"Heads up — manual paste-back required",message:v5(We.name),confirmLabel:"Continue to login",cancelLabel:"Cancel"}))return;Et(ut=>{const Bt=ut[V];if(Bt&&Bt!=="pending"){const{[V]:en,...jn}=ut;return jn}return ut});const wt=()=>{if(V in Te.current){const ut={...Te.current};delete ut[V],Te.current=ut}J(ut=>{if(!(V in ut))return ut;const Bt={...ut};return delete Bt[V],Bt}),le(ut=>{if(!(V in ut))return ut;const Bt={...ut};return delete Bt[V],Bt}),ue(ut=>{if(!(V in ut))return ut;const Bt={...ut};return delete Bt[V],Bt}),re(ut=>{if(!(V in ut))return ut;const Bt={...ut};return delete Bt[V],Bt})};wt(),Et(ut=>({...ut,[V]:"pending"})),k(V),_t.current=0;try{const{url:ut,instructions:Bt,manualCode:en,deviceCode:jn}=await w1(V);Bt?.trim()&&!(V==="github-copilot"&&jn)&&J(ts=>({...ts,[V]:Bt})),en&&le(ts=>({...ts,[V]:en})),jn&&V==="github-copilot"&&re(ts=>({...ts,[V]:jn})),(V!=="github-copilot"||!jn)&&window.open(Qi(jn?.verificationUri??ut),"_blank"),je.current=setInterval(async()=>{if(_t.current++,_t.current>=_5){je.current&&(clearInterval(je.current),je.current=null),k(null),W(ts=>ts.map(vs=>vs.id===V?{...vs,loginInProgress:!1}:vs)),Et(ts=>({...ts,[V]:"timeout"})),wt(),n("Login timed out. Please try again.","warning");return}try{const{providers:ts,ghCli:vs}=await No(),Ps=Ux(ts);W(Ps),L(vs);const te=Ps.find(Ie=>Ie.id===V);if(te?.authenticated){je.current&&(clearInterval(je.current),je.current=null),k(null),Et(Ie=>({...Ie,[V]:"success"})),wt(),V==="github"&&vt(!1),n("Login successful","success"),window.dispatchEvent(new CustomEvent(Im,{detail:{providerId:V}}));return}te?.loginInProgress||(je.current&&(clearInterval(je.current),je.current=null),k(null),Et(Ie=>({...Ie,[V]:"failed"})),wt(),n("Login did not complete. Please try again.","error"))}catch{}},2e3)}catch(ut){ut instanceof Error&&ut.message.includes("already in progress")||ut&&typeof ut=="object"&&"status"in ut&&ut.status===409?(n("Login already in progress. Cancel it to retry.","warning"),Et(en=>({...en,[V]:"pending"})),tn()):(n(ut instanceof Error?ut.message:"Login failed","error"),Et(en=>({...en,[V]:"failed"}))),k(null),wt()}},[n,D,d,tn,vt]),Qe=i.useCallback(async V=>{const We=H[V]?.trim();if(!We){n("Paste the full redirect URL or authorization code first.","warning");return}be(V);try{(await k1(V,We)).submitted?(ue(ut=>{if(!(V in ut))return ut;const Bt={...ut};return delete Bt[V],Bt}),n("Authorization code received. Finishing login…","success")):n("That authorization code was already submitted. Waiting for login…","warning")}catch(wt){n(Ce(wt)||"Failed to submit authorization code","error")}finally{be(null)}},[n,H]),Lt=i.useCallback(async V=>{je.current&&(clearInterval(je.current),je.current=null),k(V),_t.current=0,W(We=>We.map(wt=>wt.id===V?{...wt,loginInProgress:!1}:wt)),Et(We=>({...We,[V]:"cancelled"}));try{await N1(V),await tn().catch(()=>{}),n("Login cancelled","success")}catch(We){n(Ce(We)||"Failed to cancel login","error")}finally{k(null),J(We=>{if(!(V in We))return We;const wt={...We};return delete wt[V],wt}),le(We=>{if(!(V in We))return We;const wt={...We};return delete wt[V],wt}),ue(We=>{if(!(V in We))return We;const wt={...We};return delete wt[V],wt}),be(We=>We===V?null:We),re(We=>{if(!(V in We))return We;const wt={...We};return delete wt[V],wt})}},[n,tn]),gn=i.useCallback((V,We)=>{ee(ut=>({...ut,[V]:We}));const wt=Z.current[V];wt&&(clearTimeout(wt),delete Z.current[V]),Ne(ut=>{if(!ut[V])return ut;const Bt={...ut};return delete Bt[V],Bt}),Le(ut=>{if(!ut[V])return ut;const Bt={...ut};return delete Bt[V],Bt})},[]),Bn=i.useCallback(()=>{const V=Oe.current;if(!V)return;const We=typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;try{if(typeof V.scrollTo=="function"){V.scrollTo({top:0,behavior:We?"auto":"smooth"});return}}catch{}V.scrollTop=0},[]),wn=i.useCallback(async(V,We)=>{const wt=(We??ye[V]??"").trim(),ut=j5(V,wt);if(ut){Ne(en=>({...en,[V]:ut}));return}const Bt=Z.current[V];Bt&&(clearTimeout(Bt),delete Z.current[V]),k(V),Ne(en=>{const jn={...en};return delete jn[V],jn}),Le(en=>{if(!en[V])return en;const jn={...en};return delete jn[V],jn});try{await S1(V,wt),await tn(),Bn(),ee(en=>{const jn={...en};return delete jn[V],jn}),Ne(en=>{if(!en[V])return en;const jn={...en};return delete jn[V],jn}),Le(en=>({...en,[V]:"✓ Key saved"})),Z.current[V]=setTimeout(()=>{Le(en=>{if(!en[V])return en;const jn={...en};return delete jn[V],jn}),delete Z.current[V]},3e3),n("API key saved","success")}catch(en){const jn=en instanceof TypeError&&en.message.includes("Failed to fetch")?"Could not reach the server. Check your connection and try again.":en instanceof Error?en.message:"Failed to save API key";Ne(ts=>({...ts,[V]:jn})),Le(ts=>{if(!ts[V])return ts;const vs={...ts};return delete vs[V],vs}),n(jn,"error")}finally{k(null)}},[ye,n,tn,Bn]),Yt=i.useCallback(async V=>{k(V);try{await C1(V),await tn(),n("API key removed","success")}catch(We){n(We instanceof Error?We.message:"Failed to clear API key","error")}finally{k(null)}},[n,tn]),$n=i.useCallback(async V=>{k(V);try{await j1(V),await tn(),n("Logged out","success")}catch(We){n(We instanceof Error?We.message:"Logout failed","error")}finally{k(null)}},[n,tn]),dn=i.useCallback(V=>{ve(V)},[]),me=i.useCallback(async()=>{try{const V={modelOnboardingComplete:!0};if(se){const We=se.indexOf("/"),wt=We!==-1?se.slice(0,We):void 0,ut=We!==-1?se.slice(We+1):se,Bt=fe.find(en=>en.id===ut);Bt?(V.defaultProvider=Bt.provider,V.defaultModelId=Bt.id):wt&&ut&&(V.defaultProvider=wt,V.defaultModelId=ut)}await Cs(V),Hx()}catch{}},[se,fe,Cs,Hx]),jt=i.useCallback(async()=>{const V=[...new Set([...g,"first-task"])];ne(!0);try{await me(),Bi("onboarding:completed",{completedSteps:V,skippedSteps:N}),j(V),C(We=>We.filter(wt=>wt!=="first-task")),y("complete")}finally{ne(!1)}},[me,g,N]),Cn=i.useCallback(async()=>{if(!s)return;const V=R.trim();if(!V){U("Please enter a task description.");return}U(null),M(!0);let We=!1;try{const wt=await ny({description:V,source:{sourceType:"dashboard_ui"}},s);T(wt),S(!0),Bi("onboarding:first-task-created",{taskId:wt?.id}),n("Task created","success"),We=!0}catch(wt){const ut=wt instanceof Error?wt.message:"Something went wrong creating your task. Please try again.";U(ut),n(ut,"error")}finally{M(!1)}We&&me()},[s,R,n,me]),bs=i.useCallback(async()=>{ne(!0);try{await me()}finally{ne(!1)}Bi("onboarding:open-new-task",{}),r?.()},[me,r]),Ts=i.useCallback(async()=>{if(nn){ne(!0);try{await me()}finally{ne(!1)}v(!1),e(),Bi("onboarding:open-github-import",{}),o?.()}},[me,nn,e,o]),kn=i.useCallback(async()=>{Bi("onboarding:dismissed",{currentStep:x,completedSteps:g,skippedSteps:N}),ne(!0);try{await Cs({modelOnboardingComplete:!0})}catch{}v(!1),e()},[x,g,N,e]),ls=i.useCallback(()=>{Bi("onboarding:finished",{}),v(!1),e()},[e]),cs=i.useCallback(()=>{const V=l??P;V&&(me(),c?.(V),e())},[l,P,me,c,e]),ys=i.useCallback(()=>{me(),e()},[me,e]),xs=ie(),he=D.filter(V=>V.id!=="github"),bt=nt.host!=="web"&&!nt.activeProfileId,ot=[...he].sort(Kx),St=ot.some(V=>!V.type||V.type==="oauth"),lt=ot.some(V=>V.type==="api_key"),Tt=he.filter(V=>V.authenticated),Xt=Tt.length>0,zt=!!s,Ee=x==="github"&&!Xt,yt=i.useCallback(async()=>{if(Dt){Be(null),Nt(!0);try{const V=await Dt.saveProfile({name:Se,serverUrl:_e,authToken:Ae.trim()?Ae:null});try{await Dt.setActiveProfile(V.id)}catch(We){Be(Ce(We)||"Saved profile but failed to activate it");return}et(""),it(""),n("Remote server profile saved","success")}catch(V){Be(Ce(V)||"Failed to save shell connection")}finally{Nt(!1)}}},[Dt,Se,_e,Ae,n]);if(!b)return null;const Rt=(()=>{if(!se)return"";const V=se.indexOf("/"),We=V===-1?void 0:se.slice(0,V),wt=V===-1?se:se.slice(V+1),ut=fe.find(Bt=>Bt.id===wt&&(!We||Bt.provider===We));return ut?.name?ut.name:We?`${hh(We)} ${wt}`:se})(),yn=[];if(zt?yn.push({label:"Project",status:"connected",detail:"Project selected — task creation and imports are available"}):yn.push({label:"Project",status:"missing",detail:"Register a project to enable task creation and imports"}),Xt){const V=hh(Tt[0]?.id??"");yn.push({label:"AI Provider",status:"connected",detail:`${V} connected — AI agents can work on tasks`})}else he.length>0&&he.some(V=>xn[V.id])?yn.push({label:"AI Provider",status:"skipped",detail:"AI agents won't be available until you connect a provider"}):yn.push({label:"AI Provider",status:"missing",detail:"Connect a provider in Settings → AI Setup"});nn?yn.push({label:"GitHub",status:"connected",detail:$t?"Connected via GitHub CLI — imports and PR tracking are available":"Issues and PRs can be imported"}):!In||xe?yn.push({label:"GitHub",status:"skipped",detail:"You can connect anytime from Settings"}):yn.push({label:"GitHub",status:"missing",detail:"Connect to import issues as tasks"}),Rt&&yn.push({label:"Default Model",status:"connected",detail:Rt});const _n=l??P,Dn=_n?.description?.split(`
742
- `)[0]?.trim()||_n?.title||"",an=new Set(mm),En=ot.filter(V=>an.has(V.id)).sort((V,We)=>{const wt=mm.indexOf(V.id),ut=mm.indexOf(We.id);return wt!==ut?wt-ut:Kx(V,We)}),ws=ot.filter(V=>V.authenticated&&!an.has(V.id)),Is=ot.filter(V=>!V.authenticated&&!an.has(V.id)),ks=V=>{const We=mt[V.id]==="timeout"||mt[V.id]==="failed"||mt[V.id]==="cancelled",wt=V.loginInProgress&&!We;if(V.id==="llama-cpp"&&V.type==="cli")return t.jsx(L3,{authenticated:V.authenticated,onToggled:()=>{tn()}},V.id);if(V.id==="claude-cli"&&V.type==="cli")return t.jsx(P3,{authenticated:V.authenticated,onToggled:()=>{tn()}},V.id);if(V.id==="cursor-cli"&&V.type==="cli")return t.jsx(D3,{authenticated:V.authenticated,onToggled:()=>{tn()}},V.id);if(V.type==="api_key"){const ut=ph(V.id),Bt=S5(V);return t.jsxs("div",{"data-testid":`onboarding-provider-card-${V.id}`,className:`onboarding-provider-card${V.authenticated?" onboarding-provider-card--connected":""}`,children:[t.jsx("div",{className:"onboarding-provider-card__icon","data-testid":`onboarding-provider-icon-${V.id}`,"aria-hidden":"true",children:t.jsx(rs,{provider:V.id,size:"md"})}),t.jsxs("div",{className:"onboarding-provider-card__body",children:[t.jsxs("strong",{className:"onboarding-provider-card__name",children:[t.jsx(Hv,{size:14,className:"onboarding-provider-key-icon"}),V.name]}),t.jsx("span",{className:"onboarding-provider-card__description",children:ut.description}),t.jsx(Qt,{status:Jt(V)}),V.authenticated&&V.keyHint&&t.jsxs("span",{className:"auth-key-hint",children:["Key: ",V.keyHint]})]}),t.jsx("div",{className:"onboarding-provider-card__actions onboarding-provider-card__actions--api-key",children:t.jsx(E5,{provider:V,apiKeyInfo:Bt,inputValue:ye[V.id]??"",isSaving:ae===V.id,error:ge[V.id],success:He[V.id],isConnected:V.authenticated,onInputChange:gn,onSave:wn,onClear:Yt})})]},V.id)}return t.jsxs("div",{"data-testid":`onboarding-provider-card-${V.id}`,className:`onboarding-provider-card${V.authenticated?" onboarding-provider-card--connected":""}`,children:[t.jsx("div",{className:"onboarding-provider-card__icon","data-testid":`onboarding-provider-icon-${V.id}`,"aria-hidden":"true",children:t.jsx(rs,{provider:V.id,size:"md"})}),t.jsxs("div",{className:"onboarding-provider-card__body",children:[t.jsx("strong",{className:"onboarding-provider-card__name",children:V.name}),t.jsx("span",{className:"onboarding-provider-card__description",children:ph(V.id).description}),t.jsx(Qt,{status:Jt(V)})]}),t.jsx("div",{className:"onboarding-provider-card__actions",children:ae===V.id?V.authenticated?t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Logging out…"}):t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Waiting for login…"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>void Lt(V.id),children:"Cancel"})]}):wt?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Waiting for login…"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>void Lt(V.id),children:"Cancel"})]}):V.authenticated?t.jsx("button",{className:"btn btn-sm",onClick:()=>$n(V.id),children:"Logout"}):t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>Ke(V.id),children:"Login"})}),(ae===V.id||wt)&&V.id==="github-copilot"&&we[V.id]&&t.jsxs("div",{className:"auth-device-code-panel","data-testid":`onboarding-device-code-${V.id}`,children:[t.jsx("strong",{children:"Enter this code on GitHub"}),t.jsx("div",{className:"auth-device-code-pill",children:we[V.id].userCode}),t.jsxs("div",{className:"auth-provider-actions-row",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>{(async()=>{if(await Bx(we[V.id].userCode)){n("Copied code to clipboard","success");return}n("Failed to copy code — copy it manually from the box above","error")})()},children:"Copy code"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>window.open(Qi(we[V.id].verificationUri),"_blank"),children:"Open GitHub"})]})]}),(ae===V.id||wt)&&z[V.id]&&t.jsx(um,{instructions:z[V.id],"data-testid":`onboarding-login-instructions-${V.id}`}),(ae===V.id||wt)&&oe[V.id]&&t.jsx(F3,{value:H[V.id]??"",onChange:ut=>ue(Bt=>({...Bt,[V.id]:ut})),onSubmit:()=>void Qe(V.id),prompt:oe[V.id].prompt,placeholder:oe[V.id].placeholder,helpText:oe[V.id].helpText,disabled:Q===V.id,submitLabel:Q===V.id?"Submitting…":"Submit code","data-testid":`onboarding-manual-code-${V.id}`}),mt[V.id]==="timeout"&&ae!==V.id&&t.jsx("p",{className:"onboarding-helper-text onboarding-inline-feedback",children:"Login timed out. Please try again."}),mt[V.id]==="failed"&&ae!==V.id&&t.jsx("p",{className:"field-error onboarding-inline-feedback",children:"Login failed. Please try again."})]},V.id)};return t.jsx("div",{className:"modal-overlay open",role:"dialog","aria-modal":"true","aria-labelledby":"onboarding-title",children:t.jsxs("div",{className:"modal model-onboarding-modal",ref:ht,children:[t.jsxs("div",{className:"model-onboarding-header",children:[t.jsxs("h2",{id:"onboarding-title",className:"model-onboarding-title",children:[x==="ai-setup"&&t.jsxs(t.Fragment,{children:[t.jsx(Bs,{size:24})," Set Up AI ",t.jsx("span",{className:"onboarding-optional-badge",children:"Optional"})]}),x==="github"&&t.jsxs(t.Fragment,{children:[t.jsx(yi,{size:24})," Connect GitHub ",t.jsx("span",{className:"onboarding-optional-badge",children:"Optional"})]}),x==="project-setup"&&t.jsxs(t.Fragment,{children:[t.jsx(Of,{size:24})," Set Up Your Project"]}),x==="first-task"&&t.jsxs(t.Fragment,{children:[t.jsx(Of,{size:24})," Create Your First Task"]}),x==="complete"&&t.jsxs(t.Fragment,{children:[t.jsx(gs,{size:24})," All Set!"]})]}),x!=="complete"&&t.jsx("button",{className:"modal-close",onClick:kn,"aria-label":"Skip onboarding",title:"Skip for now",children:t.jsx(Nn,{size:20})})]}),t.jsx("div",{className:"model-onboarding-steps",children:Sn.map((V,We)=>{const wt=On>We,ut=g.includes(V.key)&&wt,Bt=N.includes(V.key)&&!g.includes(V.key)&&wt,en=ut||Bt;return t.jsxs("div",{className:"onboarding-step-wrapper",children:[We>0&&t.jsx("div",{className:`model-onboarding-step-connector ${We<=On?"done":""}`}),en?t.jsxs("button",{className:`model-onboarding-step-indicator ${x===V.key?"active":""} ${ut?"done":""} ${Bt?"skipped":""}`,onClick:()=>y(V.key),"aria-label":`Go back to ${V.label}`,title:`Review ${V.label}`,children:[t.jsx("span",{className:"step-number",children:ut?t.jsx(gs,{size:14}):Bt?t.jsx("span",{className:"onboarding-step-skip-mark",children:"–"}):We+1}),t.jsx("span",{className:"step-label",children:V.label})]}):t.jsxs("div",{className:`model-onboarding-step-indicator ${x===V.key?"active":""} ${ut?"done":""} ${Bt?"skipped":""}`,children:[t.jsx("span",{className:"step-number",children:ut?t.jsx(gs,{size:14}):Bt?t.jsx("span",{className:"onboarding-step-skip-mark",children:"–"}):We+1}),t.jsx("span",{className:"step-label",children:V.label})]})]},V.key)})}),t.jsxs("div",{className:"model-onboarding-content",ref:Oe,children:[x==="ai-setup"&&t.jsxs("div",{className:"model-onboarding-ai-setup",children:[t.jsx("p",{className:"model-onboarding-description",children:"Fusion uses AI models to plan, write, and review code for you. Connect an AI provider below to get started — you can use a hosted service or enter an API key."}),t.jsx("p",{className:"onboarding-helper-text model-onboarding-primary-helper",children:"You only need one provider to get started."}),t.jsx("p",{className:"onboarding-helper-text",children:"Research runs require provider credentials and an enabled Research View. After onboarding, verify these in Settings → Authentication and Settings → Experimental Features."}),bt&&t.jsxs("div",{className:"card",children:[t.jsx("h3",{className:"onboarding-section-title",children:"Connect remote Fusion server"}),t.jsx("p",{className:"onboarding-helper-text",children:"Your native shell needs an active remote profile before dashboard handoff can complete."}),t.jsx("label",{htmlFor:"onboarding-shell-profile-name",className:"onboarding-apikey-field-label",children:"Profile name"}),t.jsx("input",{id:"onboarding-shell-profile-name",className:"input",value:Se,onChange:V=>pe(V.target.value)}),t.jsx("label",{htmlFor:"onboarding-shell-server-url",className:"onboarding-apikey-field-label",children:"Server URL"}),t.jsx("input",{id:"onboarding-shell-server-url",className:"input",placeholder:"https://your-fusion-host",value:_e,onChange:V=>et(V.target.value)}),t.jsx("label",{htmlFor:"onboarding-shell-token",className:"onboarding-apikey-field-label",children:"Auth token (optional)"}),t.jsx("input",{id:"onboarding-shell-token",className:"input",type:"password",value:Ae,onChange:V=>it(V.target.value)}),Ut&&t.jsx("small",{className:"field-error",children:Ut}),t.jsxs("div",{className:"onboarding-apikey-input-row",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void Dt?.openConnectionManager(),children:"Open manager"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:()=>void yt(),disabled:!_e.trim()||xt,children:xt?"Saving…":"Save remote server"})]})]}),!_&&D.length>0&&(()=>{const V=D.filter(en=>en.id!=="github"&&en.authenticated).length,We=D.filter(en=>en.id!=="github").length,wt=Object.keys(xn).filter(en=>!D.find(jn=>jn.id===en)?.authenticated).length;if(We===0)return null;let ut="onboarding-provider-summary",Bt="";return V>0?(ut+=" onboarding-provider-summary--connected",Bt=`✓ ${V} of ${We} provider${We!==1?"s":""} connected`):wt>0?(ut+=" onboarding-provider-summary--skipped",Bt=`${wt} provider${wt!==1?"s":""} skipped`):(ut+=" onboarding-provider-summary--none",Bt="No providers connected yet"),t.jsx("div",{className:ut,"data-testid":"provider-summary",children:Bt})})(),t.jsx(Ka,{slotId:"onboarding-recommendation-card",projectId:s}),t.jsx(Ui,{summary:"What are AI providers?",children:t.jsx("p",{className:"onboarding-helper-text",children:"AI providers like OpenAI and Anthropic power the AI capabilities in Fusion. Connecting a provider lets Fusion's agents use AI models to help with your tasks."})}),D.length>0&&!D.some(V=>V.authenticated)&&t.jsx("p",{className:"onboarding-helper-text",children:"Skip this step if you'd like — you can always add providers later from Settings."}),_?t.jsxs("div",{className:"model-onboarding-loading",children:[t.jsx(Ct,{size:24,className:"animate-spin"}),t.jsx("span",{children:"Loading providers…"})]}):D.length===0?t.jsx("div",{className:"model-onboarding-empty",children:"No AI providers are configured. Please check your Fusion configuration."}):t.jsxs(t.Fragment,{children:[t.jsx(Ka,{slotId:"onboarding-provider-card",projectId:s,renderPlaceholder:!1,actions:{refreshAuthProviders:()=>{tn()}}}),t.jsxs("section",{className:"onboarding-provider-section","data-testid":"onboarding-quick-start-providers",children:[t.jsx("h3",{className:"onboarding-section-title",children:"Quick start providers"}),En.length>0?t.jsx("div",{className:"model-onboarding-providers",children:En.map(V=>ks(V))}):t.jsx("p",{className:"onboarding-helper-text",children:"No quick-start providers are available in this environment."})]}),ws.length>0&&t.jsxs("section",{className:"onboarding-provider-section","data-testid":"onboarding-connected-providers",children:[t.jsx("h3",{className:"onboarding-section-title",children:"Connected providers"}),t.jsx("div",{className:"model-onboarding-providers",children:ws.map(V=>ks(V))})]}),t.jsxs("div",{className:"onboarding-model-section",children:[t.jsx("h3",{className:"onboarding-section-title",children:"Default Model (Optional)"}),t.jsx("p",{className:"model-onboarding-description",children:"Pick a default model for AI tasks, or leave this blank to choose later. Models vary in speed, capability, and cost."}),t.jsx(Ui,{summary:"How do I choose a model?",children:t.jsx("p",{className:"onboarding-helper-text",children:"Models vary in speed, capability, and cost. A good default is usually the latest model from your connected provider. You can always change this later in Settings."})}),fe.length===0?t.jsx("div",{className:"model-onboarding-empty",children:"No models available yet. Connect a provider above to see model options."}):t.jsx("div",{className:"onboarding-model-selector",children:t.jsx(ri,{models:fe,value:se,onChange:dn,placeholder:"Select a default model…",label:"Default model"})}),se&&t.jsx("div",{className:"onboarding-model-preview",children:t.jsxs("small",{className:"settings-muted",children:["Selected:"," ",fe.find(V=>V.id===se)?.name??se]})})]}),t.jsx(Ui,{summary:"Advanced provider settings",className:"onboarding-provider-advanced",children:t.jsxs("div",{"data-testid":"onboarding-advanced-provider-settings",children:[Is.length>0?t.jsx("div",{className:"model-onboarding-providers",children:Is.map(V=>ks(V))}):t.jsx("p",{className:"onboarding-helper-text",children:"All currently available providers are already shown above."}),de.length>0?t.jsx("div",{className:"onboarding-custom-provider-list",children:de.map(V=>t.jsxs("div",{className:"onboarding-custom-provider-item",children:[t.jsx(rs,{provider:V.id,size:"sm"}),t.jsx("span",{children:V.name||V.id})]},V.id))}):null,Pe?t.jsx(U3,{onSave:pn,onCancel:()=>{rt(!1),at(void 0)},saving:qe,error:At}):t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>rt(!0),children:"Add custom provider"})]})}),St&&t.jsx(Ui,{summary:"How does login work?",children:t.jsx("p",{className:"onboarding-helper-text",children:"Clicking Login opens the provider's website in a new tab where you sign in. Once you authorize Fusion, this page will automatically detect the connection. Your credentials are never stored in Fusion."})}),lt&&t.jsx(Ui,{summary:"What is an API key?",children:t.jsx("p",{className:"onboarding-helper-text",children:"An API key is a secret token that authenticates Fusion with the provider. You can find your key in the provider's dashboard under API settings. Keys are stored securely on your machine."})}),t.jsx(Ka,{slotId:"onboarding-setup-help",projectId:s})]})]}),x==="github"&&t.jsxs("div",{className:"model-onboarding-github",children:[nn?t.jsx("p",{className:"model-onboarding-description",children:$t?"GitHub CLI is already authenticated — issue imports and pull request tracking work right now. You're all set; no further action needed.":"GitHub is connected — issue imports and pull request tracking are available. You're all set; no further action needed."}):t.jsx("p",{className:"model-onboarding-description",children:"Connecting GitHub unlocks issue imports and pull request tracking. You can skip this — task creation works without it."}),!nn&&t.jsx("div",{className:"onboarding-feature-list",children:t.jsxs("ul",{children:[t.jsx("li",{className:"onboarding-feature-list-heading",children:t.jsx("strong",{children:"Without GitHub (available now):"})}),t.jsx("li",{className:"onboarding-helper-text",children:"Create tasks manually"}),t.jsx("li",{className:"onboarding-helper-text",children:"Describe work for AI agents"}),t.jsx("li",{className:"onboarding-helper-text",children:"Track progress on the board"}),t.jsx("li",{className:"onboarding-feature-list-heading",children:t.jsx("strong",{children:"With GitHub (after connecting):"})}),t.jsx("li",{className:"onboarding-helper-text onboarding-feature-list-item--with-github",children:"Import issues as tasks"}),t.jsx("li",{className:"onboarding-helper-text onboarding-feature-list-item--with-github",children:"Sync pull request status"}),t.jsx("li",{className:"onboarding-helper-text onboarding-feature-list-item--with-github",children:"Link code changes to tasks"})]})}),Ee&&t.jsxs("div",{className:"onboarding-skip-banner",role:"status",children:[t.jsx("strong",{children:"No AI provider connected"}),t.jsx("p",{children:"AI features like task planning and code generation won't be available until you connect one. You can set this up later in Settings."})]}),t.jsx(Ui,{summary:"What does GitHub integration do?",children:t.jsx("p",{className:"onboarding-helper-text",children:"Without GitHub, you can still create and manage tasks manually. GitHub integration adds the ability to import issues as tasks, track pull request status alongside your work, and automatically link commits to tasks. Connect anytime from Settings → Authentication."})}),In?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"onboarding-provider-row",children:[t.jsxs("div",{className:"onboarding-provider-info",children:[t.jsxs("strong",{children:[t.jsx(yi,{size:16,className:"onboarding-provider-title-icon"}),"GitHub"]}),t.jsx("span",{"data-testid":"onboarding-auth-status-github",children:t.jsx(Fe,{status:xs})})]}),rn&&(ae==="github"?t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Logging out…"}):t.jsx("button",{className:"btn btn-sm",onClick:()=>$n("github"),children:"Disconnect"}))]}),(xs==="not-connected"||xs==="pending")&&t.jsxs("div",{className:"onboarding-github-connect-cta","data-testid":"onboarding-github-connect-cta",children:[ae==="github"||hn?t.jsxs("div",{className:"onboarding-github-connect-actions",children:[t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Waiting for login…"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>void Lt("github"),children:"Cancel"})]}):t.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>Ke("github"),children:[t.jsx(yi,{size:16}),"Connect"]}),(ae==="github"||hn)&&z.github&&t.jsx(um,{instructions:z.github,"data-testid":"onboarding-login-instructions-github"})]}),xs==="connected"&&t.jsx("div",{className:"onboarding-github-feedback onboarding-github-feedback--success",children:$t?"GitHub CLI is authenticated. Imports and pull request tracking are available. Connect OAuth in Settings → Authentication if you want dashboard-managed sign-in controls.":"GitHub OAuth is connected. You can import issues and track pull requests."}),xs==="failed"&&t.jsxs("div",{className:"onboarding-github-feedback onboarding-github-feedback--error",children:[t.jsx("p",{children:"Connection failed or timed out."}),t.jsxs("div",{className:"onboarding-github-feedback-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Ke("github"),children:"Retry"}),t.jsx("button",{className:"onboarding-skip-step-link",onClick:Me,children:"Skip for now"})]})]}),xs==="pending"&&t.jsx("div",{className:"onboarding-github-feedback onboarding-github-feedback--info",children:"Waiting for GitHub authorization…"}),xs==="skipped"&&t.jsxs("div",{className:"onboarding-github-feedback onboarding-github-feedback--info",children:[t.jsx("p",{children:"GitHub was skipped. You can connect anytime from Settings → Authentication."}),t.jsx("div",{className:"onboarding-github-feedback-actions",children:t.jsx("button",{className:"btn btn-sm",onClick:()=>Ke("github"),children:"Connect anyway"})})]}),xs==="not-connected"&&t.jsx("p",{className:"onboarding-helper-text",children:"No worries if you're not ready — connect GitHub anytime from Settings → Authentication."})]}):t.jsxs("div",{className:"model-onboarding-github-optional",children:[t.jsx("div",{className:"optional-icon optional-icon--github","aria-hidden":"true",children:t.jsx(rs,{provider:"github",size:"lg"})}),$t?t.jsx("p",{children:"GitHub CLI is already authenticated, so imports and PR tracking work now. OAuth from the dashboard is optional and only controls dashboard-managed connect/disconnect."}):t.jsx("p",{children:"GitHub OAuth isn't connected yet. You can set it up in Settings → Authentication, or continue now and connect later."}),t.jsxs("div",{className:"model-onboarding-github-optional__actions",children:[t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>y("project-setup"),children:$t?"Continue with gh CLI auth →":"Continue without GitHub →"}),$t&&(ae==="github"||hn?t.jsxs("button",{className:"btn btn-sm",disabled:!0,children:[t.jsx(Ct,{size:14,className:"onboarding-spinner"}),"Waiting for OAuth login…"]}):t.jsxs("button",{className:"btn btn-sm",onClick:()=>Ke("github"),children:[t.jsx(rs,{provider:"github",size:"sm"}),"Connect OAuth (optional)"]}))]}),$t&&(ae==="github"||hn)&&z.github&&t.jsx(um,{instructions:z.github,"data-testid":"onboarding-login-instructions-github"})]})]}),x==="project-setup"&&t.jsxs("div",{className:"model-onboarding-project-setup",children:[t.jsx("p",{className:"model-onboarding-description",children:"Choose your first project before creating or importing tasks. You can register an existing local directory or clone a GitHub repository URL through the setup wizard."}),zt?t.jsx("div",{className:"onboarding-project-ready","data-testid":"onboarding-project-ready",role:"status",children:t.jsx("p",{children:"Project selected — task creation and imports are available."})}):t.jsxs("div",{className:"onboarding-project-prerequisite","data-testid":"onboarding-project-prerequisite",children:[t.jsx("p",{className:"onboarding-helper-text",children:"A project is required before first-task actions are available."}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:a,"data-testid":"onboarding-open-setup-wizard",children:"Set Up Project"}),t.jsx("p",{className:"onboarding-helper-text",children:"In the setup wizard, pick an existing directory or paste a GitHub clone URL."})]}),t.jsx(Ui,{summary:"What does project setup do?",children:t.jsx("p",{className:"onboarding-helper-text",children:"Project setup registers a workspace so Fusion knows where to read files, run commands, and track task changes."})})]}),x==="first-task"&&t.jsxs("div",{className:"model-onboarding-first-task",children:[t.jsx("p",{className:"model-onboarding-description",children:"Create your first task to start the board and launch AI execution."}),w&&_n?t.jsxs("div",{className:"onboarding-task-created",children:[t.jsx(gs,{size:56,className:"success-icon"}),t.jsx("h3",{className:"onboarding-task-created__title",children:"Your first task is ready!"}),t.jsx("div",{className:"onboarding-task-created__task-id",children:_n.id}),Dn&&t.jsx("p",{className:"onboarding-task-created__description",children:Dn}),t.jsx("p",{className:"onboarding-task-created__hint",children:"Your task has been created and will appear on the board."}),t.jsxs("div",{className:"onboarding-task-created__actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:cs,children:"View Task"}),t.jsx("button",{type:"button",className:"btn",onClick:ys,children:"Go to Dashboard"})]})]}):t.jsxs(t.Fragment,{children:[zt?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"onboarding-first-task-form",children:[t.jsx("label",{className:"onboarding-first-task-form__label",htmlFor:"onboarding-first-task-input",children:"Describe your first task"}),t.jsx("textarea",{id:"onboarding-first-task-input",className:"input onboarding-first-task-form__input","data-testid":"onboarding-first-task-input",value:R,onChange:V=>{I(V.target.value),U(null)},placeholder:"Example: Build a login page with email and password",rows:4}),t.jsx("div",{className:"onboarding-first-task-form__actions",children:t.jsx("button",{type:"button",className:"btn btn-primary",onClick:Cn,disabled:E,"data-testid":"onboarding-first-task-submit",children:E?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:16,className:"animate-spin"}),t.jsx("span",{children:"Creating task…"})]}):"Create First Task"})})]}),G&&t.jsxs("div",{className:"onboarding-task-error",role:"alert","data-testid":"onboarding-task-error",children:[t.jsx("p",{className:"field-error",children:G}),t.jsx("p",{className:"onboarding-helper-text",children:"Your text has been preserved — fix the issue and try again."})]})]}):t.jsxs("div",{className:"onboarding-project-prerequisite","data-testid":"onboarding-project-prerequisite",children:[t.jsx("p",{className:"onboarding-helper-text",children:"A project must be selected before you can create tasks or import from GitHub."}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:a,"data-testid":"onboarding-open-setup-wizard",children:"Set Up Project"})]}),t.jsx(C5,{items:yn}),zt&&t.jsxs(t.Fragment,{children:[t.jsx(Ui,{summary:"What happens when I create a task?",children:t.jsx("p",{className:"onboarding-helper-text",children:"A task describes something you want done. Fusion's AI agents will read your description and work on implementing it. You can track progress on the board and review the results."})}),t.jsxs("div",{className:"onboarding-cta-options",children:[t.jsxs("button",{className:"onboarding-cta-card primary",onClick:bs,disabled:A,children:[t.jsx("div",{className:"cta-icon",children:t.jsx(os,{size:24})}),t.jsxs("div",{className:"cta-content",children:[t.jsx("strong",{children:"Create a New Task"}),t.jsx("span",{children:"Describe what you need built and AI will work on it"})]})]}),t.jsxs("button",{className:`onboarding-cta-card${nn?"":" onboarding-cta-card--disabled"}`,"data-testid":"cta-github-import",onClick:Ts,disabled:A||!nn,children:[t.jsx("div",{className:"cta-icon",children:t.jsx(yi,{size:24})}),t.jsxs("div",{className:"cta-content",children:[t.jsx("strong",{children:"Import from GitHub"}),t.jsx("span",{children:"Turn GitHub issues into tasks you can track here"}),!nn&&t.jsx("small",{className:"onboarding-cta-note",children:"Requires GitHub connection"})]})]})]}),t.jsxs("p",{className:"onboarding-skip-note",children:["You can create tasks anytime from the board, or use"," ",t.jsx("code",{children:"fn task create"})," in the terminal."]})]})]})]}),x==="complete"&&t.jsxs("div",{className:"model-onboarding-complete",children:[t.jsx(gs,{size:48,className:"success-icon"}),t.jsx("p",{children:"Setup complete! Head to the board to create your first task, or explore the dashboard to see what's available."})]})]}),t.jsxs("div",{className:"model-onboarding-footer",children:[x==="ai-setup"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:kn,disabled:A,children:"Skip for now"}),t.jsx("button",{className:"onboarding-skip-step-link",onClick:ce,children:"Skip setup →"}),t.jsx("button",{className:"btn btn-primary",onClick:Zt,children:"Next →"})]}),x==="github"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:Ge,children:"← Back"}),t.jsx("button",{className:"onboarding-skip-step-link",onClick:ce,children:"Skip GitHub →"}),t.jsx("button",{className:"btn btn-primary",onClick:Zt,children:"Next →"})]}),x==="project-setup"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:Ge,children:"← Back"}),t.jsx("button",{className:"btn btn-primary",onClick:Zt,disabled:!zt,children:"Next →"})]}),x==="first-task"&&!w&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:Ge,children:"← Back"}),t.jsx("button",{className:"btn btn-primary",onClick:jt,disabled:A,children:A?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:16,className:"animate-spin"}),t.jsx("span",{children:"Saving…"})]}):"Finish Setup"})]}),x==="complete"&&t.jsxs("button",{className:"btn btn-primary",onClick:ls,children:[t.jsx(gs,{size:16}),t.jsx("span",{children:"Get Started"})]})]})]})})}function Yk({toasts:e}){return t.jsx("div",{className:"toast-container",id:"toasts",children:e.map(n=>t.jsx("div",{className:`toast toast-${n.type}`,children:n.message},n.id))})}const R5=i.lazy(()=>qn(()=>import("./SetupWizardModal-BFD9E0H_.js"),__vite__mapDeps([15,1,16,17,18,19,6,7,8,20])).then(e=>({default:e.SetupWizardModal}))),A5=i.lazy(()=>qn(()=>import("./SettingsModal-DdrXxMPW.js"),__vite__mapDeps([21,1,22,23,24,2,3,25,6,7,8,26,27])).then(e=>({default:e.SettingsModal})));function T5(){(typeof window<"u"&&window.requestIdleCallback||(n=>globalThis.setTimeout(n,200)))(()=>{qn(()=>import("./SettingsModal-DdrXxMPW.js"),__vite__mapDeps([21,1,22,23,24,2,3,25,6,7,8,26,27]))},{timeout:1500})}function I5({projectId:e,tasks:n,projects:s,currentProject:a,addToast:r,toasts:o,removeToast:l,modalManager:c,projectActions:d,taskHandlers:u,taskOperations:h,deepLink:m,settings:f,onSettingsClose:p,onReopenOnboarding:b,onOpenApprovals:v}){const{pushNav:x}=ff(),[y,g]=i.useState(null),j=c.detailTask?(()=>{const E=n.find(M=>M.id===c.detailTask?.id);return E?"prompt"in c.detailTask?{...c.detailTask,...E,prompt:c.detailTask.prompt,log:c.detailTask.log}:E:c.detailTask})():null,N=p??c.closeSettings,C=i.useCallback(()=>{c.openNewTask()},[c]),w=i.useCallback(()=>{c.openGitHubImport()},[c]),S=i.useCallback((E,M)=>{c.openDetailTask(E,M),x({type:"modal",close:c.closeDetailTask})},[c,x]),R=i.useCallback(E=>{g(null),c.closeModelOnboarding(),S(E)},[c,S]),I=i.useCallback(async E=>{const M=await u.handleModalCreate(E);return c.modelOnboardingOpen&&g(M),M},[u.handleModalCreate,c.modelOnboardingOpen]);return i.useEffect(()=>{!c.modelOnboardingOpen&&y&&g(null)},[c.modelOnboardingOpen,y]),i.useEffect(()=>{T5()},[]),t.jsxs(t.Fragment,{children:[j&&t.jsx(hr,{children:t.jsx(IO,{task:j,projectId:e,tasks:n,onClose:m.handleDetailClose,onOpenDetail:S,mobileHeaderMode:c.detailTaskOrigin==="list-mobile"?"back":"close",onMoveTask:h.moveTask,onDeleteTask:h.deleteTask,onMergeTask:h.mergeTask,onArchiveTask:h.archiveTask,onRetryTask:h.retryTask,onResetTask:h.resetTask,onDuplicateTask:h.duplicateTask,onTaskUpdated:c.updateDetailTask,addToast:r,prAuthAvailable:f.prAuthAvailable,initialTab:c.detailTaskInitialTab})}),c.settingsOpen&&t.jsx(hr,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(A5,{onClose:N,addToast:r,initialSection:c.settingsInitialSection,projectId:e,themeMode:f.themeMode,colorTheme:f.colorTheme,onThemeModeChange:f.setThemeMode,onColorThemeChange:f.setColorTheme,dashboardFontScalePct:f.dashboardFontScalePct,onDashboardFontScaleChange:f.setDashboardFontScalePct,onReopenOnboarding:b,onOpenApprovals:v})})}),t.jsx(tz,{isOpen:c.githubImportOpen,onClose:c.closeGitHubImport,onImport:u.handleGitHubImport,tasks:n,projectId:e}),t.jsx(hr,{children:t.jsx(oz,{isOpen:c.isPlanningOpen,onClose:c.closePlanning,onTaskCreated:u.handlePlanningTaskCreated,onTasksCreated:u.handlePlanningTasksCreated,tasks:n,initialPlan:c.planningInitialPlan??void 0,projectId:e,resumeSessionId:c.planningResumeSessionId})}),t.jsx(hr,{children:t.jsx(bz,{isOpen:c.isSubtaskOpen,onClose:c.closeSubtask,initialDescription:c.subtaskInitialDescription??"",onTasksCreated:u.handleSubtaskTasksCreated,projectId:e,resumeSessionId:c.subtaskResumeSessionId})}),t.jsx(Fz,{isOpen:c.terminalOpen,onClose:c.closeTerminal,initialCommand:c.terminalInitialCommand,projectId:e}),t.jsx(Bz,{isOpen:c.scriptsOpen,onClose:c.closeScripts,addToast:r,onRunScript:c.runScript,projectId:e}),c.filesOpen&&t.jsx(u6,{initialWorkspace:c.fileBrowserWorkspace,initialFile:c.fileBrowserInitialFile,isOpen:!0,onClose:c.closeFiles,onWorkspaceChange:c.setFileWorkspace,projectId:e}),c.todosOpen&&t.jsx(h6,{isOpen:!0,onClose:c.closeTodos,addToast:r,projectId:e,onPlanningMode:c.openPlanningWithInitialPlan}),t.jsx(k6,{isOpen:c.usageOpen,onClose:c.closeUsage,projectId:e,anchorRect:c.usageAnchorRect}),t.jsx(t3,{isOpen:c.systemStatsOpen,onClose:c.closeSystemStats,projectId:e}),c.schedulesOpen&&t.jsx(U6,{onClose:c.closeSchedules,addToast:r,projectId:e}),t.jsx(hr,{children:t.jsx(J6,{isOpen:c.newTaskModalOpen,onClose:c.closeNewTask,tasks:n,onCreateTask:I,addToast:r,projectId:e})}),t.jsx(r3,{isOpen:c.activityLogOpen,onClose:c.closeActivityLog,tasks:n,projectId:e,projects:s,currentProject:a,onOpenTaskDetail:E=>{const M=n.find(G=>G.id===E);M&&S(M)}}),t.jsx(hr,{children:t.jsx(l3,{isOpen:c.gitManagerOpen,onClose:c.closeGitManager,tasks:n,addToast:r,projectId:e})}),t.jsx(hr,{children:t.jsx(x3,{isOpen:c.workflowStepsOpen,onClose:c.closeWorkflowSteps,addToast:r,projectId:e})}),t.jsx(I3,{isOpen:c.agentsOpen,onClose:c.closeAgents,addToast:r,projectId:e}),c.setupWizardOpen&&t.jsx(i.Suspense,{fallback:null,children:t.jsx(R5,{onProjectRegistered:d.handleSetupComplete,onClose:c.closeSetupWizard})}),c.modelOnboardingOpen&&t.jsx(M5,{onComplete:d.handleModelOnboardingComplete,addToast:r,projectId:e??"",onOpenSetupWizard:d.handleAddProject,onOpenNewTask:C,onOpenGitHubImport:w,firstCreatedTask:y,onViewTask:R}),t.jsx(Yk,{toasts:o,onRemove:l})]})}function P5(){return typeof window>"u"?!1:typeof window.fusionShell?.resetDesktopMode=="function"}async function $5(){const e=typeof window<"u"?window.fusionShell:void 0;try{await e?.resetDesktopMode?.()}catch{}const n=new URL(window.location.href);n.searchParams.delete("serverBaseUrl"),n.searchParams.delete("shellMode"),window.location.replace(n.toString())}function D5({errorMessage:e,isRetrying:n,onRetry:s,onManageConnection:a}){const r=P5();return t.jsxs("div",{className:"project-overview-empty",role:"alert","aria-live":"polite",children:[t.jsx("h2",{children:"Can't reach the Fusion backend"}),t.jsx("p",{className:"settings-muted",children:"Fusion couldn't load your projects right now. Please make sure the backend is running and try again."}),t.jsxs("p",{className:"settings-muted",children:["Error: ",e]}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:s,disabled:n,children:n?"Retrying…":"Retry Connection"}),r&&t.jsx("button",{type:"button",className:"btn",onClick:()=>void $5(),children:"Change Launch Mode…"}),a&&t.jsx("button",{type:"button",className:"btn",onClick:a,children:"Manage Connection"})]})]})}const gh=[{id:"projects",label:"Loading projects"},{id:"project",label:"Selecting project"},{id:"tasks",label:"Fetching tasks"}];function L5(e,n){if(n==="ready")return"done";const s=gh.findIndex(r=>r.id===n),a=gh.findIndex(r=>r.id===e);return a<s?"done":a===s?"active":"pending"}function O5({stage:e}){const[n]=i.useState(()=>{const s=q0();return s&&(hs(bn.TASKS_PREFIX),hs(bn.PROJECTS),hs(bn.CURRENT_PROJECT_ID),hs(bn.AGENTS),hs(bn.AGENT_STATS),hs(bn.DOCUMENTS_PREFIX),hs(bn.TODO_LISTS_PREFIX),hs(bn.CHAT_ROOMS),hs(bn.ACTIVE_CHAT_ROOM_ID),hs(bn.CHAT_SESSIONS_PREFIX),hs(bn.CHAT_MESSAGES_PREFIX),hs(bn.CHAT_AGENTS_MAP_PREFIX),hs(bn.MODELS),hs(bn.DISCOVERED_SKILLS_PREFIX),hs(bn.INSIGHTS_PREFIX),hs(bn.INSIGHT_LATEST_RUN_PREFIX),hs(bn.RESEARCH_RUNS_PREFIX),hs(bn.RESEARCH_SELECTED_ID_PREFIX),hs(bn.EVALS_RUNS_PREFIX),hs(bn.EVALS_RESULTS_PREFIX),hs(bn.MISSIONS_PREFIX),hs(bn.MISSIONS_SELECTED_ID_PREFIX),hs(bn.MAILBOX_INBOX_PREFIX),hs(bn.MAILBOX_OUTBOX_PREFIX),hs(bn.MAILBOX_UNREAD_COUNT_PREFIX)),s});return t.jsx("div",{className:"dashboard-loader",role:"status","aria-live":"polite","aria-label":n?"Updating Fusion dashboard":"Loading Fusion dashboard","data-stage":e,"data-version-update":n?"true":void 0,children:t.jsxs("div",{className:"dashboard-loader__content",children:[t.jsx("h1",{className:"dashboard-loader__logo",children:"Fusion"}),n?t.jsx("p",{className:"dashboard-loader__message dashboard-loader__message--update",children:"Updating to a new frontend version..."}):t.jsx("p",{className:"dashboard-loader__message",children:"Initializing dashboard..."}),t.jsx("ol",{className:"dashboard-loader__steps","aria-label":"Dashboard loading progress",children:gh.map(s=>{const a=L5(s.id,e);return t.jsxs("li",{className:`dashboard-loader__step dashboard-loader__step--${a}`,"data-testid":`dashboard-loader-step-${s.id}`,children:[t.jsx("span",{className:"dashboard-loader__step-icon","aria-hidden":"true",children:a==="done"?"✓":a==="active"?t.jsx(Ct,{className:"dashboard-loader__spinner animate-spin",size:14}):"•"}),t.jsx("span",{className:"dashboard-loader__step-label",children:s.label})]},s.id)})})]})})}function F5({visible:e}){return t.jsx("div",{className:"top-progress-bar","data-visible":e?"true":"false",role:"progressbar","aria-busy":e,"aria-label":"Loading",children:t.jsx("div",{className:"top-progress-bar__indicator"})})}const z5=5e3;function B5(e,n,s){return e||n&&s===0?"idle":n&&s>0?"paused":s>0?"running":"idle"}function U5(e,n,s){let a=0,r=0,o=0,l=0,c=0;for(const d of e){switch(d.column){case"in-progress":a++,ad(d,n,s)&&o++;break;case"todo":l++;break;case"in-review":c++;break}d.blockedBy&&d.blockedBy.length>0&&r++}return{runningTaskCount:a,blockedTaskCount:r,stuckTaskCount:o,queuedTaskCount:l,inReviewCount:c}}function H5(e,n,s,a){const[r,o]=i.useState({globalPause:!1,enginePaused:!1,maxConcurrent:2}),[l,c]=i.useState(!0),[d,u]=i.useState(null),h=i.useRef(null),m=i.useRef(null),f=i.useCallback(async()=>{m.current&&m.current.abort(),m.current=new AbortController;try{c(!0),u(null);const x=await y_(n);o(x)}catch(x){if(x instanceof Error&&x.name==="AbortError")return;u(x instanceof Error?x.message:"Failed to fetch executor stats")}finally{c(!1)}},[n]);i.useEffect(()=>(f(),()=>{m.current&&m.current.abort()}),[f]),i.useEffect(()=>(h.current&&clearInterval(h.current),h.current=setInterval(()=>{f()},z5),()=>{h.current&&(clearInterval(h.current),h.current=null)}),[f]);const p=U5(e,s,a),b=B5(r.globalPause,r.enginePaused,p.runningTaskCount);return{stats:{...p,executorState:b,maxConcurrent:r.maxConcurrent,lastActivityAt:r.lastActivityAt},loading:l,error:d,refresh:f}}const q5={planning:ba,subtask:kr,mission_interview:Ys,milestone_interview:Ys,slice_interview:Ys},V5={planning:"Planning",subtask:"Subtask Breakdown",mission_interview:"Mission Interview",milestone_interview:"Milestone Interview",slice_interview:"Slice Interview"};function W5({sessions:e,generating:n,needsInput:s,onOpenSession:a,onDismissSession:r}){const{confirm:o}=Di(),[l,c]=i.useState(!1),[d,u]=i.useState(new Set),h=i.useRef(null),m=i.useRef(new Map),f=i.useRef(null),{activeTabMap:p}=Bo(),b=i.useMemo(()=>Pr(),[]);if(i.useEffect(()=>{if(!l)return;const y=g=>{h.current&&!h.current.contains(g.target)&&c(!1)};return document.addEventListener("mousedown",y),()=>document.removeEventListener("mousedown",y)},[l]),i.useEffect(()=>{const y=new Set,g=new Map;for(const j of e){const N=p.get(j.id),C=[j.status,j.updatedAt,N?.tabId??j.lockedByTab??"",N?.stale?"stale":"fresh"].join("|"),w=m.current.get(j.id);w&&w!==C&&y.add(j.id),g.set(j.id,C)}if(m.current=g,y.size!==0)return u(y),f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{u(new Set),f.current=null},500),()=>{f.current&&(clearTimeout(f.current),f.current=null)}},[p,e]),e.length===0)return null;const v=e.length,x=s>0;return t.jsxs("div",{ref:h,className:"background-tasks-indicator",children:[t.jsxs("button",{className:`background-tasks-indicator__pill${x?" background-tasks-indicator__pill--attention":""}`,onClick:()=>c(y=>!y),title:`${v} background AI task${v!==1?"s":""}${s>0?` (${s} need${s!==1?"":"s"} input)`:""}`,children:[n>0&&t.jsx(Ct,{size:12,style:{animation:"spin 1s linear infinite"}}),s>0&&n===0&&t.jsx(jm,{size:12}),t.jsxs("span",{children:["AI ",v]})]}),l&&t.jsxs("div",{className:"background-tasks-indicator__popover",children:[t.jsx("div",{className:"background-tasks-indicator__popover-header",children:"Background Tasks"}),t.jsx("div",{className:"background-tasks-indicator__popover-list",children:e.map(y=>{const g=q5[y.type],j=y.status==="generating",N=y.status==="awaiting_input",C=y.status==="error",w=p.get(y.id),S=w?.tabId??y.lockedByTab??null,R=!!(S&&S!==b&&!w?.stale),I=d.has(y.id);return t.jsxs("div",{className:`background-tasks-indicator__item${I?" background-tasks-indicator__item--updated":""}`,style:{transition:"background-color 220ms ease, transform 220ms ease",backgroundColor:I?"var(--color-accent-soft, rgba(59, 130, 246, 0.14))":void 0,transform:I?"translateY(-1px)":void 0},onClick:async()=>{R&&!await o({title:"Open Active Session",message:"This session is active in another tab. Open anyway?"})||(a(y),c(!1))},children:[C?t.jsx(oi,{size:14,className:"background-tasks-indicator__session-icon",style:{color:"var(--color-error)"}}):t.jsx(g,{size:14,className:"background-tasks-indicator__session-icon"}),t.jsxs("div",{className:"background-tasks-indicator__session-content",children:[t.jsx("div",{className:"background-tasks-indicator__session-title",children:y.title}),t.jsxs("div",{className:"background-tasks-indicator__session-meta",children:[C?"Failed":V5[y.type],j&&" — generating...",N&&!R&&" — needs input",N&&R&&" — active in another tab"]})]}),j&&t.jsx(Ct,{size:14,className:"background-tasks-indicator__session-icon",style:{animation:"spin 1s linear infinite",color:"var(--color-success)"}}),N&&!R&&t.jsx(jm,{size:14,className:"background-tasks-indicator__session-icon",style:{color:"var(--triage)"}}),N&&R&&t.jsx(Do,{size:14,className:"background-tasks-indicator__session-icon",style:{color:"var(--text-muted)"}}),t.jsx("button",{className:"background-tasks-indicator__item-dismiss",onClick:E=>{E.stopPropagation(),r(y.id)},title:"Dismiss",children:t.jsx(Nn,{size:12})})]},y.id)})})]})]})}function G5(e){if(!e)return"no activity";const n=Date.now(),s=new Date(e).getTime(),a=n-s,r=Math.floor(a/1e3),o=Math.floor(r/60),l=Math.floor(o/60),c=Math.floor(l/24);return c>0?`${c}d ago`:l>0?`${l}h ago`:o>0?`${o}m ago`:r>10?`${r}s ago`:"just now"}function K5(e){switch(e){case"running":return{label:"Running",color:"var(--color-success)",icon:Os};case"paused":return{label:"Paused",color:"var(--triage)",icon:Vi};case"idle":default:return{label:"Idle",color:"var(--text-muted)",icon:Bs}}}function J5({tasks:e,projectId:n,taskStuckTimeoutMs:s,staleHighFanoutBlockerAgeThresholdMs:a,backgroundSessions:r,backgroundGenerating:o,backgroundNeedsInput:l,onOpenBackgroundSession:c,onDismissBackgroundSession:d,lastFetchTimeMs:u,currentProjectPath:h,onOpenProjectDirectory:m,keyboardOpen:f,hideWhenKeyboardOpen:p}){if(p)return null;const{stats:b,loading:v,error:x}=H5(e,n,s,u),[y,g]=i.useState(!1),j=i.useMemo(()=>K5(b.executorState),[b.executorState]),N=i.useMemo(()=>G5(b.lastActivityAt),[b.lastActivityAt]),C=i.useMemo(()=>{const S=zh(e,{staleHighFanoutAgeThresholdMs:a??Qv});return Array.from(S.entries()).map(([I,E])=>({blockerId:I,entry:E})).filter(({entry:I})=>I.isHighFanout).sort((I,E)=>{if(E.entry.overlapBlockedTodoCount!==I.entry.overlapBlockedTodoCount)return E.entry.overlapBlockedTodoCount-I.entry.overlapBlockedTodoCount;const M=I.entry.escalation?.blockingAgeMs??0,G=E.entry.escalation?.blockingAgeMs??0;return G!==M?G-M:I.blockerId.localeCompare(E.blockerId,"en",{numeric:!0,sensitivity:"base"})})[0]??null},[e,a]),w=j.icon;return x?t.jsx("div",{className:"executor-status-bar executor-status-bar--error",role:"status","aria-label":"Executor status",children:t.jsxs("span",{className:"executor-status-bar__error",children:[t.jsx(Ma,{size:14}),x]})}):v&&b.runningTaskCount===0?t.jsx("div",{className:"executor-status-bar executor-status-bar--loading",role:"status","aria-label":"Executor status",children:t.jsx("span",{className:"executor-status-bar__loading-text",children:"Loading..."})}):t.jsxs("div",{className:`executor-status-bar ${b.executorState==="running"?"executor-status-bar--running":""}${f?" executor-status-bar--keyboard-open":""}`,role:"status","aria-label":"Executor status",children:[r&&r.length>0&&c&&d&&t.jsxs(t.Fragment,{children:[t.jsx(W5,{sessions:r,generating:o??0,needsInput:l??0,onOpenSession:c,onDismissSession:d}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"})]}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx("span",{className:"executor-status-bar__indicator executor-status-bar__indicator--queued","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Queued"}),t.jsx("span",{className:"executor-status-bar__count",children:b.queuedTaskCount})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx("span",{className:`executor-status-bar__indicator executor-status-bar__indicator--running ${b.runningTaskCount>0?"executor-status-bar__indicator--active":""}`,"aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Running"}),t.jsx("span",{className:"executor-status-bar__count",children:b.runningTaskCount}),t.jsx("span",{className:"executor-status-bar__separator","aria-hidden":"true",children:"/"}),t.jsx("span",{className:"executor-status-bar__max",children:b.maxConcurrent})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),b.stuckTaskCount>0&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"executor-status-bar__segment executor-status-bar__segment--stuck",children:[t.jsx("span",{className:"executor-status-bar__indicator executor-status-bar__indicator--stuck executor-status-bar__indicator--active","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Stuck"}),t.jsx("span",{className:"executor-status-bar__count executor-status-bar__count--error",children:b.stuckTaskCount})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"})]}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx("span",{className:`executor-status-bar__indicator executor-status-bar__indicator--blocked ${b.blockedTaskCount>0?"executor-status-bar__indicator--active":""}`,"aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Blocked"}),t.jsx("span",{className:`executor-status-bar__count ${b.blockedTaskCount>0?"executor-status-bar__count--warning":""}`,children:b.blockedTaskCount})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx("span",{className:"executor-status-bar__indicator executor-status-bar__indicator--review","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"In Review"}),t.jsx("span",{className:"executor-status-bar__count",children:b.inReviewCount})]}),C&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment executor-status-bar__segment--fanout",children:[t.jsx("span",{className:"executor-status-bar__indicator executor-status-bar__indicator--fanout executor-status-bar__indicator--active","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Overlap queue"}),t.jsxs("span",{className:"executor-status-bar__fanout-summary",title:`${C.entry.escalation?"Escalated":"Temporary"} overlap bottleneck ${C.blockerId}: ${C.entry.overlapBlockedTodoCount} todo blocked via blockedBy (threshold ${Ah})`,children:[C.blockerId," · ",C.entry.overlapBlockedTodoCount," todo",C.entry.escalation?" (escalated)":""]})]})]}),h&&m&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment executor-status-bar__segment--project-directory",children:[t.jsx("button",{className:`executor-status-bar__folder-toggle${y?" executor-status-bar__folder-toggle--active":""}`,onClick:()=>g(S=>!S),"aria-label":y?"Hide project directory":"Show project directory","aria-expanded":y,"data-testid":"executor-project-path-toggle",title:y?"Hide project directory":"Show project directory",children:t.jsx(Qs,{size:12,"aria-hidden":"true"})}),y&&t.jsx("button",{className:"executor-status-bar__project-path",onClick:m,title:h,"data-testid":"executor-project-path-link",children:h})]})]}),t.jsx("div",{className:"executor-status-bar__spacer"}),t.jsxs("div",{className:"executor-status-bar__segment executor-status-bar__segment--time",children:[t.jsx(pa,{size:12,className:"executor-status-bar__icon","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__time",children:N})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx(w,{size:12,style:{color:j.color},"aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__state",style:{color:j.color},children:j.label})]})]})}const Y5={planning:ba,subtask:kr,mission_interview:Ys,milestone_interview:Ys,slice_interview:Ys},X5={planning:"Planning",subtask:"Subtask Breakdown",mission_interview:"Mission Interview",milestone_interview:"Milestone Interview",slice_interview:"Slice Interview"},Xk="fusion:session-banner-dismissed";function vl(e){if(!e)return 0;const n=Date.parse(e);return Number.isFinite(n)?n:0}function Q5(){if(typeof window>"u")return new Map;try{const e=window.localStorage.getItem(Xk);if(!e)return new Map;const n=JSON.parse(e),s=new Map;for(const[a,r]of Object.entries(n)){const o=typeof r=="number"?r:vl(r);s.set(a,o)}return s}catch{return new Map}}function Z5(e){if(!(typeof window>"u"))try{const n={};for(const[s,a]of e)n[s]=a;window.localStorage.setItem(Xk,JSON.stringify(n))}catch{}}const Ca=Q5();function eB({sessions:e,onResumeSession:n,onDismissSession:s,onDismissAll:a}){const[r,o]=i.useState(0),l=()=>{Z5(Ca),o(b=>b+1)};i.useEffect(()=>{if(Ca.size===0)return;const b=new Map(e.map(x=>[x.id,x]));let v=!1;for(const[x,y]of Ca){const g=b.get(x);if(!g)continue;if(!(g.status==="awaiting_input"||g.status==="error")){Ca.delete(x),v=!0;continue}vl(g.updatedAt)>y&&(Ca.delete(x),v=!0)}v&&l()},[e]);const c=i.useMemo(()=>e.filter(b=>{if(b.status!=="awaiting_input"&&b.status!=="error")return!1;const v=Ca.get(b.id);return v===void 0?!0:vl(b.updatedAt)>v}),[e,r]);if(c.length===0)return null;const d=c.filter(b=>b.status==="awaiting_input").length,u=c.filter(b=>b.status==="error").length;let h="";d>0&&u>0?h=`${d} AI session${d===1?"":"s"} need${d===1?"s":""} your input, ${u} failed`:d>0?h=`${d} AI session${d===1?"":"s"} need${d===1?"s":""} your input`:u>0&&(h=`${u} AI session${u===1?"":"s"} failed`);const m=b=>{Ca.set(b.id,Math.max(vl(b.updatedAt),Date.now())),l()},f=b=>{Ca.delete(b.id),l(),n(b)},p=()=>{const b=Date.now();for(const v of c)Ca.set(v.id,Math.max(vl(v.updatedAt),b));l(),a()};return t.jsxs("section",{className:"session-notification-banner",role:"region","aria-live":"polite","aria-label":"AI sessions needing input or failed",children:[t.jsxs("div",{className:"session-notification-banner__header",children:[t.jsxs("div",{className:"session-notification-banner__headline",children:[t.jsx(oi,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:h})]}),t.jsxs("button",{className:"session-notification-banner__dismiss-all",onClick:p,children:[t.jsx(Nn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:"Dismiss all"})]})]}),t.jsx("div",{className:"session-notification-banner__list",children:c.map(b=>{const v=Y5[b.type],x=b.status==="error";return t.jsxs("article",{className:`session-notification-banner__item${x?" session-notification-banner__item--error":""}`,"data-session-type":b.type,"data-session-status":b.status,children:[t.jsxs("div",{className:"session-notification-banner__item-main",children:[x?t.jsx(oi,{size:16,className:"session-notification-banner__type-icon session-notification-banner__type-icon--error","aria-hidden":"true"}):t.jsx(v,{size:16,className:"session-notification-banner__type-icon","aria-hidden":"true"}),t.jsxs("div",{className:"session-notification-banner__text",children:[t.jsx("p",{className:"session-notification-banner__title",title:b.title,children:b.title}),t.jsx("p",{className:"session-notification-banner__meta",children:x?"Failed":X5[b.type]})]})]}),t.jsxs("div",{className:"session-notification-banner__actions",children:[t.jsx("button",{className:"session-notification-banner__resume",onClick:()=>f(b),children:x?"Retry":"Resume"}),t.jsx("button",{className:"session-notification-banner__dismiss",onClick:()=>{m(b),s(b.id)},"aria-label":`Dismiss ${b.title}`,children:t.jsx(Nn,{size:14,"aria-hidden":"true"})})]})]},b.id)})})]})}const Qk="fusion:cli-binary-banner-dismissed";function tB(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(Qk)==="1"}catch{return!1}}function nB(){if(!(typeof window>"u"))try{window.localStorage.setItem(Qk,"1")}catch{}}function sB({onOpenSettings:e}){const[n,s]=i.useState(null),[a,r]=i.useState(()=>tB()),[o,l]=i.useState(!1),[c,d]=i.useState(null);i.useEffect(()=>{if(a)return;let g=!1;return l1().then(j=>{g||s(j)}).catch(()=>{}),()=>{g=!0}},[a]);const u=i.useCallback(async()=>{l(!0),d(null);try{const g=await c1();s({binary:g.binary,expectedVersion:g.expectedVersion,state:g.state,install:g.install}),g.installResult.success||d(g.installResult.permissionsHint||g.installResult.stderr||`Install failed (exit ${g.installResult.exitCode??"n/a"})`)}catch(g){d(g instanceof Error?g.message:String(g))}finally{l(!1)}},[]),h=i.useCallback(()=>{nB(),r(!0)},[]);if(a||!n||n.state==="installed"||n.state==="skipped")return null;const m=n.state==="version-mismatch",f=n.binary.version,p=n.expectedVersion,b=m?"Update the Fusion CLI":"Install the Fusion CLI",v=m?t.jsxs(t.Fragment,{children:["Your installed ",t.jsx("code",{children:"fn"}),"/",t.jsx("code",{children:"fusion"})," CLI is"," ",t.jsxs("strong",{children:["v",f??"unknown"]})," but this dashboard expects"," ",t.jsxs("strong",{children:["v",p]}),". Update to stay in sync."]}):t.jsxs(t.Fragment,{children:["Get the ",t.jsx("code",{children:"fn"})," and ",t.jsx("code",{children:"fusion"})," commands on your terminal so you can drive Fusion from anywhere. One click below or copy the command into your shell."]}),x=m?"Update with npm":"Install with npm",y=m?"Updating…":"Installing…";return t.jsxs("div",{className:"cli-binary-banner",role:"status",children:[t.jsxs("div",{className:"cli-binary-banner__body",children:[t.jsx("div",{className:"cli-binary-banner__title",children:b}),t.jsx("div",{className:"cli-binary-banner__text",children:v}),t.jsxs("div",{className:"cli-binary-banner__actions",children:[t.jsx("button",{type:"button",className:"cli-binary-banner__primary",onClick:()=>void u(),disabled:o,children:o?y:x}),t.jsx("button",{type:"button",className:"cli-binary-banner__secondary",onClick:e,children:"Open Settings"})]}),c&&t.jsx("div",{className:"cli-binary-banner__error",children:c})]}),t.jsx("button",{type:"button",className:"cli-binary-banner__dismiss","aria-label":"Dismiss",onClick:h,children:t.jsx(Nn,{size:16})})]})}function iB({signal:e,onDismiss:n}){return!e||!e.atRisk?null:t.jsxs("div",{className:`capacity-risk-banner${n?" capacity-risk-banner--dismissible":""}`,role:"status","aria-live":"polite",children:[t.jsxs("div",{className:"capacity-risk-banner__content",children:[t.jsx("strong",{children:"Capacity risk:"})," Todo ",e.todoCount," (threshold ",e.threshold,") · In Progress ",e.inProgressCount," · In Review ",e.inReviewCount," · Idle agents ",e.idleNonEphemeralAgentCount]}),n?t.jsx("button",{type:"button",className:"capacity-risk-banner__dismiss touch-target","aria-label":"Dismiss capacity warning",onClick:n,children:t.jsx(Nn,{"aria-hidden":"true"})}):null]})}function aB({isActive:e}){return e?t.jsxs("div",{className:"test-mode-banner",role:"status","aria-live":"polite",children:[t.jsx(tS,{"aria-hidden":"true"}),t.jsx("span",{children:"Test mode — no real AI calls"})]}):null}const Zk="fusion:oauth-relogin-dismissed";function rB(){if(typeof window>"u")return new Set;try{const e=JSON.parse(window.localStorage.getItem(Zk)??"[]");return Array.isArray(e)?new Set(e.filter(n=>typeof n=="string")):new Set}catch{return new Set}}function Jx(e){typeof window>"u"||window.localStorage.setItem(Zk,JSON.stringify(Array.from(e)))}function oB({onReLogin:e,pollIntervalMs:n}){const[s,a]=i.useState([]),[r,o]=i.useState(()=>rB()),l=i.useCallback(async()=>{try{const{providers:m}=await No(),f=m.filter(p=>p.type==="oauth"&&p.expired===!0).map(p=>({id:p.id,name:p.name}));a(f),o(p=>{const b=new Set(f.map(x=>x.id)),v=new Set(Array.from(p).filter(x=>b.has(x)));return v.size===p.size?p:(Jx(v),v)})}catch{}},[]);i.useEffect(()=>{l();const m=window.setInterval(l,n??3600*1e3);return()=>{window.clearInterval(m)}},[n,l]),i.useEffect(()=>{const m=f=>{const{detail:p}=f;p?.providerId&&a(b=>b.filter(v=>v.id!==p.providerId)),l()};return window.addEventListener(Im,m),()=>{window.removeEventListener(Im,m)}},[l]);const c=i.useMemo(()=>s.filter(m=>!r.has(m.id)),[r,s]);if(c.length===0)return null;const d=c.length===1,u=c.map(m=>m.name).join(", "),h=()=>{const m=new Set(r);for(const f of c)m.add(f.id);o(m),Jx(m)};return t.jsxs("section",{className:"oauth-relogin-banner",role:"status","aria-live":"polite",children:[t.jsxs("div",{className:"oauth-relogin-banner__content",children:[t.jsx(Ma,{"aria-hidden":"true"}),t.jsx("p",{className:"oauth-relogin-banner__message",children:d?`Re-login required: ${u}. Your ${u} session expired — sign in again to keep agents running.`:`Re-login required: ${u}`})]}),t.jsxs("div",{className:"oauth-relogin-banner__actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>e(d?c[0]?.id:void 0),children:"Re-login"}),t.jsx("button",{type:"button",className:"btn-icon oauth-relogin-banner__dismiss","aria-label":"Dismiss OAuth re-login banner",onClick:h,children:t.jsx(Nn,{"aria-hidden":"true"})})]})]})}const lB={duplicate_active_id:"Duplicate active task ID",id_in_active_and_archived:"Task ID present in active and archived storage",next_sequence_at_or_below_used:"Allocator next sequence overlaps an existing task ID",task_row_outside_known_prefix:"Task row uses a prefix outside allocator state"};function cB(e){return e.length<=5?e.join(", "):`${e.slice(0,5).join(", ")} +${e.length-5} more`}function dB({report:e,recommendedAction:n,onRefresh:s}){const[a,r]=i.useState(!1),[o,l]=i.useState(null);if(e.status!=="anomaly")return null;const c=async()=>{r(!0),l(null);try{const d=await ey();s?.(d.taskIdIntegrity,d.taskIdIntegrity.recommendedAction)}catch(d){l(d instanceof Error?d.message:"Failed to refresh integrity status.")}finally{r(!1)}};return t.jsxs("section",{className:"task-id-integrity-banner",role:"alert","aria-live":"assertive",children:[t.jsxs("div",{className:"task-id-integrity-banner__header",children:[t.jsxs("div",{className:"task-id-integrity-banner__headline-wrap",children:[t.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),t.jsx(Ma,{"aria-hidden":"true"}),t.jsx("h2",{className:"task-id-integrity-banner__headline",children:"Task ID integrity anomaly detected"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm task-id-integrity-banner__refresh",onClick:()=>{c()},disabled:a,children:[t.jsx(Ss,{className:a?"task-id-integrity-banner__refresh-icon task-id-integrity-banner__refresh-icon--spinning":"task-id-integrity-banner__refresh-icon","aria-hidden":"true"}),a?"Re-checking…":"Re-check"]})]}),t.jsx("p",{className:"task-id-integrity-banner__body",children:"Fusion found allocator state that can cause task IDs to be reused or overwrite live task records."}),t.jsx("ul",{className:"task-id-integrity-banner__list",children:e.anomalies.map(d=>t.jsxs("li",{className:"task-id-integrity-banner__item",children:[t.jsx("strong",{className:"task-id-integrity-banner__item-title",children:lB[d.kind]}),t.jsx("span",{className:"task-id-integrity-banner__item-detail",children:d.details}),t.jsx("code",{className:"task-id-integrity-banner__ids",children:cB(d.affectedIds)})]},`${d.kind}:${d.prefix}:${d.affectedIds.join(",")}`))}),t.jsx("p",{className:"task-id-integrity-banner__footer",children:n}),o?t.jsx("p",{className:"task-id-integrity-banner__error",children:o}):null]})}function uB({errors:e,lastCheckedAt:n,onRefresh:s,refreshing:a,refreshError:r}){if(e.length===0)return null;const o=e.slice(0,5),l=n?new Date(n).toLocaleString():null;return t.jsxs("section",{className:"db-corruption-banner",role:"alert","aria-live":"assertive",children:[t.jsxs("div",{className:"db-corruption-banner__header",children:[t.jsxs("div",{className:"db-corruption-banner__headline-wrap",children:[t.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),t.jsx(Ma,{"aria-hidden":"true"}),t.jsxs("div",{className:"db-corruption-banner__headline-copy",children:[t.jsx("h2",{className:"db-corruption-banner__headline",children:"Database corruption detected"}),l?t.jsxs("p",{className:"db-corruption-banner__meta",children:["Last checked: ",l]}):null]})]}),t.jsxs("button",{type:"button",className:"btn btn-sm db-corruption-banner__refresh",onClick:()=>{s()},disabled:a,children:[t.jsx(Ss,{className:a?"db-corruption-banner__refresh-icon db-corruption-banner__refresh-icon--spinning":"db-corruption-banner__refresh-icon","aria-hidden":"true"}),a?"Refreshing…":"Refresh health"]})]}),t.jsx("p",{className:"db-corruption-banner__body",children:"Fusion's background SQLite integrity check reported corruption. Review the failing objects below before continuing critical operations."}),t.jsx("ul",{className:"db-corruption-banner__list",children:o.map((c,d)=>t.jsx("li",{className:"db-corruption-banner__item",children:t.jsx("code",{className:"db-corruption-banner__error-code",children:c})},`${d}:${c}`))}),t.jsxs("p",{className:"db-corruption-banner__footer",children:[t.jsx("strong",{className:"db-corruption-banner__footer-label",children:"What to do:"})," ","Back up the project, try ",t.jsx("code",{className:"db-corruption-banner__inline-code",children:"fn db --vacuum"})," if the database still opens cleanly, and restore from a known-good backup if corruption persists. See"," ",t.jsx("a",{href:"docs/storage.md",target:"_blank",rel:"noreferrer",className:"db-corruption-banner__link",children:"docs/storage.md"})," ","for the storage layout and recovery guidance."]}),r?t.jsx("p",{className:"db-corruption-banner__error",children:r}):null]})}function mB({latestVersion:e,currentVersion:n,onDismiss:s}){return t.jsxs("div",{className:"update-available-banner",role:"status","aria-live":"polite",children:[t.jsxs("p",{className:"update-available-banner__text",children:["Update available: v",e," (current: v",n,"). Run ",t.jsx("code",{children:"fn update"})," for an installed CLI, or pull this source checkout."," ",t.jsx("a",{className:"update-available-banner__link",href:"https://github.com/Runfusion/Fusion/blob/main/CHANGELOG.md",target:"_blank",rel:"noreferrer",children:"Release notes"})," ","·"," ",t.jsx("a",{className:"update-available-banner__link",href:"https://runfusion.ai",target:"_blank",rel:"noreferrer",children:"Learn more"})]}),t.jsx("button",{type:"button",className:"update-available-banner__dismiss touch-target","aria-label":"Dismiss update notice",onClick:s,children:t.jsx(Nn,{size:16,"aria-hidden":"true"})})]})}function hB(e){return e.length>7?e.slice(0,7):e}function hm(e){return e instanceof Nr?e.message||"Request failed":e instanceof Error&&e.message?e.message:"Request failed"}function Yx(e){const n=["button","[href]","input","select","textarea",'[tabindex]:not([tabindex="-1"])'].join(",");return Array.from(e.querySelectorAll(n)).filter(s=>!(s.hasAttribute("disabled")||s.getAttribute("aria-hidden")==="true"))}function fB({open:e,onClose:n,worktreePath:s,integrationBranch:a,stashSha:r,stashLabel:o,conflictedFiles:l,autostashOutcome:c,taskId:d}){const u=lk(),h=i.useRef(null),m=i.useRef(null),[f,p]=i.useState(c==="failed"?[]:l),[b,v]=i.useState(!1),[x,y]=i.useState(null),[g,j]=i.useState("idle");i.useEffect(()=>{e&&(p(c==="failed"?[]:l),y(null),j("idle"))},[c,l,e]),i.useEffect(()=>{if(!e)return;m.current=document.activeElement instanceof HTMLElement?document.activeElement:null;const I=h.current;if(I){const M=Yx(I),G=M.find(U=>U.getAttribute("aria-label")==="Copy stash reference")??M[0];G?G.focus():I.focus()}const E=M=>{if(M.key==="Escape"){M.preventDefault(),n(!1);return}if(M.key!=="Tab")return;const G=h.current;if(!G)return;const U=Yx(G);if(U.length===0){M.preventDefault(),G.focus();return}const P=U[0],T=U[U.length-1],D=document.activeElement;M.shiftKey&&D===P?(M.preventDefault(),T.focus()):!M.shiftKey&&D===T&&(M.preventDefault(),P.focus())};return document.addEventListener("keydown",E),()=>{document.removeEventListener("keydown",E);const M=m.current;M&&M.isConnected&&M.focus(),m.current=null}},[e,n]);const N=i.useMemo(()=>`Stash ref: ${hB(r)} (${o})`,[o,r]);if(!e)return null;const C=async(I,E)=>{v(!0),y(null);try{const M=await $("/git/stash-resolve",{method:"POST",body:JSON.stringify({worktreePath:s,stashSha:r,file:I,choice:E,taskId:d})});p(Array.isArray(M.remainingConflicts)?M.remainingConflicts:[])}catch(M){y(hm(M))}finally{v(!1)}},w=async()=>{v(!0),y(null);try{(await $("/git/stash-drop",{method:"POST",body:JSON.stringify({worktreePath:s,stashSha:r,taskId:d})})).dropped&&n(!0)}catch(I){y(hm(I))}finally{v(!1)}},S=async()=>{v(!0),y(null);try{const I=await $("/git/stash-apply",{method:"POST",body:JSON.stringify({worktreePath:s,stashSha:r,taskId:d})});I.conflict&&p(Array.isArray(I.conflictedFiles)?I.conflictedFiles:[])}catch(I){y(hm(I))}finally{v(!1)}},R=async()=>{try{await navigator.clipboard.writeText(r),j("copied")}catch{j("failed")}};return t.jsx("div",{className:"modal-overlay open",role:"dialog","aria-modal":"true","aria-labelledby":"stash-conflict-modal-title",children:t.jsxs("div",{className:"modal stash-conflict-modal",ref:h,tabIndex:-1,children:[t.jsx("div",{className:"modal-header",children:t.jsx("h3",{id:"stash-conflict-modal-title",children:"Resolve auto-stash conflicts"})}),t.jsxs("p",{className:"stash-conflict-modal__summary",children:["Pulled ",t.jsx("strong",{children:a}),", but restoring local edits from stash produced conflicts."]}),c==="failed"?t.jsxs("p",{className:"stash-conflict-modal__warning",children:["Automatic restore failed. Your changes are preserved in the stash above; use ",t.jsx("code",{children:"git stash apply <ref>"})," to recover manually, or use Retry below."]}):null,t.jsxs("div",{className:"stash-conflict-modal__stash-row",children:[t.jsx("span",{children:N}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:R,"aria-label":"Copy stash reference",children:t.jsx(ga,{"aria-hidden":"true"})})]}),g==="copied"?t.jsx("p",{className:"stash-conflict-modal__hint",role:"status",children:"Stash SHA copied."}):null,g==="failed"?t.jsx("p",{className:"stash-conflict-modal__error",role:"alert",children:"Could not copy stash SHA."}):null,f.length>0?t.jsx("div",{className:"stash-conflict-modal__list",role:"list",children:f.map(I=>t.jsxs("div",{className:"stash-conflict-row",role:"listitem",children:[t.jsx("code",{className:"stash-conflict-row__path",children:I}),t.jsxs("div",{className:"stash-conflict-row__actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",disabled:b,onClick:()=>void C(I,"ours"),children:"Keep mine"}),t.jsx("button",{type:"button",className:"btn btn-sm",disabled:b,onClick:()=>void C(I,"theirs"),children:"Keep incoming"}),t.jsx("button",{type:"button",className:"btn btn-sm",disabled:b,onClick:()=>u?.openFile(I,{workspace:s}),children:"Open in editor"})]})]},I))}):null,x?t.jsx("p",{className:"stash-conflict-modal__error",role:"alert",children:x}):null,t.jsxs("div",{className:"modal-actions",children:[t.jsx("div",{className:"modal-actions-left",children:t.jsx("button",{type:"button",className:"btn",disabled:b,onClick:()=>void S(),children:"Retry restore"})}),t.jsxs("div",{className:"modal-actions-right",children:[t.jsx("button",{type:"button",className:"btn",disabled:b,onClick:()=>n(!1),children:"Close"}),t.jsx("button",{type:"button",className:"btn btn-warning",disabled:b||f.length>0,onClick:()=>void w(),children:"Drop stash"})]})]})]})})}function ej(e){return`kb:merge-advance-notice-dismissed:${e??"default"}`}function tj(e){return`kb:${e??"default"}:merge-advance-force-with-lease`}function Xx(e){try{const n=window.localStorage.getItem(ej(e));if(!n)return[];const s=JSON.parse(n);return Array.isArray(s)?s.filter(a=>typeof a=="string"):[]}catch{return[]}}function pB(e,n){try{window.localStorage.setItem(ej(e),JSON.stringify(n.slice(-50)))}catch{}}function Qx(e){try{return window.sessionStorage.getItem(tj(e))==="1"}catch{return!1}}function gB(e,n){try{window.sessionStorage.setItem(tj(e),n?"1":"0")}catch{}}function bB({projectId:e,apiBase:n="/api"}){const[s,a]=i.useState([]),[r,o]=i.useState(()=>Xx(e)),[l,c]=i.useState("idle"),[d,u]=i.useState(null),[h,m]=i.useState(null),[f,p]=i.useState("idle"),[b,v]=i.useState(()=>Qx(e)),x=i.useRef(null);i.useEffect(()=>{o(Xx(e)),v(Qx(e))},[e]),i.useEffect(()=>()=>{x.current!==null&&window.clearTimeout(x.current)},[]);const y=i.useCallback(async()=>{try{const I=new URLSearchParams({limit:"5"});e&&I.set("projectId",e);const E=await $(`/tasks/merge-advance-events?${I.toString()}`);a(Array.isArray(E.events)?E.events:[])}catch{a([])}},[e]),g=i.useCallback(async()=>{if(!e){m(null);return}try{const I=await $(`/projects/${encodeURIComponent(e)}/merge-advance/push-status`);m(I)}catch{m(null)}},[e]);i.useEffect(()=>{y(),g();const I=e?`?projectId=${encodeURIComponent(e)}`:"",E=Si(`${n}/events${I}`,{events:{"task:merged":()=>{y(),g()}}});return()=>E()},[n,y,g,e]);const j=i.useMemo(()=>{const I=new Set(r);return s.find(E=>{if(E.succeeded!==!0||E.userCheckout===null||E.userCheckout.worktreePath.trim().length===0||I.has(E.toSha))return!1;const M=E.userCheckout.worktreePath,G=new Set(["clean-sync","synced-with-edits-restored"]);return!(E.autoSync??[]).some(P=>P.worktreePath===M&&G.has(P.outcome))})},[r,s]),N=i.useCallback(()=>{if(!j)return;const I=[...r.filter(E=>E!==j.toSha),j.toSha].slice(-50);o(I),pB(e,I)},[r,j,e]),C=i.useCallback(async()=>{if(j?.userCheckout){c(j.userCheckout.dirty||j.userCheckout.untrackedCount>0?"stashing":"pending");try{const I=e?`?projectId=${encodeURIComponent(e)}`:"",E=await $(`/git/pull${I}`,{method:"POST",body:JSON.stringify({worktreePath:j.userCheckout.worktreePath,integrationBranch:j.integrationBranch,taskId:j.taskId})});E.kind==="stash-conflict"?u({stashSha:E.stashSha,stashLabel:E.stashLabel,conflictedFiles:E.conflictedFiles,autostashOutcome:E.autostashOutcome}):N(),c("idle"),await g()}catch(I){I instanceof Nr?c({error:I.message||"Pull failed"}):I instanceof Error&&I.message?c({error:I.message}):c({error:"Pull failed"})}}},[N,g,j,e]),w=i.useCallback(I=>{v(I),gB(e,I)},[e]),S=i.useCallback(()=>{p("idle")},[]),R=i.useCallback(async()=>{if(e){p("pending");try{const I=await $(`/projects/${encodeURIComponent(e)}/merge-advance/push-origin`,{method:"POST",body:JSON.stringify({forceWithLease:b,expectedLocalSha:h?.localSha})});if(I.ok){p("ok"),await g(),x.current!==null&&window.clearTimeout(x.current),x.current=window.setTimeout(()=>p("idle"),2e3);return}p({error:I.message??I.outcome,outcome:I.outcome==="ok"?"failed":I.outcome,stderr:I.stderrPreview})}catch(I){const E=I instanceof Error?I.message:"Push failed";p({error:E,outcome:"failed"})}}},[g,b,e,h?.localSha]);return{notice:j,dismiss:N,pull:C,pullState:l,conflictState:d,setConflictState:u,pushStatus:h,pushState:f,push:R,clearPushError:S,forceWithLease:b,setForceWithLease:w}}function Zx(e){return e?e.length>7?e.slice(0,7):e:""}const ev={"no-remote":"No `origin` remote configured.","no-upstream":"Branch has no upstream on origin.","merge-locked":"Push paused — a Fusion merge is in progress."};function xB({projectId:e,apiBase:n="/api"}){const s=i.useRef(null),{notice:a,dismiss:r,pull:o,pullState:l,conflictState:c,setConflictState:d,pushStatus:u,pushState:h,push:m,clearPushError:f,forceWithLease:p,setForceWithLease:b}=bB({projectId:e,apiBase:n});if(!a||!a.userCheckout)return null;const v=a.userCheckout,x=v.dirty||v.untrackedCount>0,y=l==="pending"||l==="stashing",g=typeof l=="object"?l.error:null,j=()=>{const C=document.activeElement,w=C instanceof HTMLElement&&s.current?.contains(C);r(),w&&document.body.focus()},N=()=>{if(!u||u.aheadCount<=0)return null;const C=h==="pending"||u.canPush===!1||y,w=p?"Push (force-with-lease)":"Push to origin";return t.jsxs("section",{className:"merge-advance-notice__push",children:[t.jsxs("p",{className:"merge-advance-notice__push-heading",children:["Push ",u.integrationBranch," to origin — ahead by ",u.aheadCount," commit",u.aheadCount===1?"":"s","."]}),t.jsxs("div",{className:"merge-advance-notice__push-actions",children:[h==="ok"?t.jsxs("span",{children:["Pushed to origin/",u.integrationBranch," @ ",Zx(u.remoteSha),"."]}):t.jsx("button",{type:"button",className:`btn btn-sm ${p?"btn-warning":""}`.trim(),disabled:C,onClick:()=>{m()},children:h==="pending"?"Pushing…":w}),!u.canPush&&u.disabledReason&&u.disabledReason in ev?t.jsx("span",{className:"merge-advance-notice__push-error",children:ev[u.disabledReason]}):null]}),typeof h=="object"&&(h.outcome==="rejected-non-ff"||h.outcome==="sha-mismatch")?t.jsxs("div",{className:"merge-advance-notice__push-error",role:"alert",children:[t.jsx("span",{children:h.error})," ",t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>{o()},children:"Smart Pull"})]}):null,typeof h=="object"&&(h.outcome==="rejected-other"||h.outcome==="failed")?t.jsxs("div",{className:"merge-advance-notice__push-error",role:"alert",children:[t.jsx("span",{children:h.error}),h.stderr?t.jsx("pre",{children:h.stderr}):null,t.jsx("button",{type:"button",className:"btn btn-sm",onClick:f,children:"Dismiss"})]}):null,t.jsxs("details",{className:"merge-advance-notice__push-advanced",children:[t.jsx("summary",{children:"Advanced"}),t.jsxs("label",{children:[t.jsx("input",{type:"checkbox",checked:p,onChange:S=>b(S.target.checked)})," ","Allow force-with-lease (use only when you know origin diverged intentionally)"]})]})]})};return t.jsxs(t.Fragment,{children:[t.jsxs("div",{ref:s,className:"merge-advance-notice",role:"status","aria-live":"polite",children:[t.jsxs("div",{className:"merge-advance-notice__content",children:[t.jsxs("strong",{children:[a.integrationBranch," advanced to ",Zx(a.toSha),"."]})," ","Your checked-out copy at ",v.worktreePath," is behind.",x?" (local changes will be auto-stashed and restored)":"",g?t.jsxs("span",{className:"merge-advance-notice__error",role:"alert",children:[" ",g]}):null,y?t.jsx("span",{className:"merge-advance-notice__hint",children:" Pulling…"}):null,N()]}),t.jsxs("div",{className:"merge-advance-notice__actions",children:[c?null:t.jsx("button",{type:"button",className:"btn btn-sm",disabled:y,onClick:()=>{o()},children:"Pull"}),t.jsx("button",{type:"button",className:"merge-advance-notice__dismiss touch-target","aria-label":"Dismiss merge advance notice",onClick:j,children:t.jsx(Nn,{"aria-hidden":"true"})})]})]}),t.jsx(fB,{open:c!==null,onClose:C=>{d(null),C&&j()},worktreePath:v.worktreePath,integrationBranch:a.integrationBranch,stashSha:c?.stashSha??"",stashLabel:c?.stashLabel??"",conflictedFiles:c?.conflictedFiles??[],autostashOutcome:c?.autostashOutcome??"conflict-needs-manual",taskId:a.taskId})]})}function vB({pendingCount:e,onOpenMailbox:n,onDismiss:s}){const a=e===1?"request":"requests";return t.jsx("section",{className:"approval-notification-banner",role:"region","aria-live":"polite","aria-label":"Approval requests",children:t.jsxs("div",{className:"approval-notification-banner__content",children:[t.jsxs("div",{className:"approval-notification-banner__headline",children:[t.jsx("span",{className:"status-dot","aria-hidden":"true"}),t.jsx(Ma,{"aria-hidden":"true"}),t.jsxs("span",{children:[e," approval ",a," need your attention"]})]}),t.jsxs("div",{className:"approval-notification-banner__actions",children:[t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:n,children:[t.jsx(Va,{"aria-hidden":"true"}),t.jsx("span",{children:"Open Mailbox"})]}),t.jsx("button",{type:"button",className:"btn-icon approval-notification-banner__dismiss",onClick:s,"aria-label":"Dismiss approval notification banner",children:t.jsx(Nn,{"aria-hidden":"true"})})]})]})})}function yB({onResume:e}){const n=i5();if(!n)return null;const s=n.completedSteps.length,a=qa.length,r=s>0?`${s} of ${a} step${s!==1?"s":""} complete — You're on the `:"You're on the ";return t.jsxs("section",{className:"onboarding-resume-card",role:"region","aria-label":"Resume onboarding",children:[t.jsxs("div",{className:"onboarding-resume-card__main",children:[t.jsx("div",{className:"onboarding-resume-card__icon","aria-hidden":"true",children:t.jsx(Ls,{size:20})}),t.jsxs("div",{className:"onboarding-resume-card__content",children:[t.jsx("h2",{className:"onboarding-resume-card__title",children:"Continue Setup"}),t.jsxs("p",{className:"onboarding-resume-card__description",children:[r,t.jsx("strong",{children:n.label})," step. Continue where you left off to complete your dashboard setup."]})]})]}),t.jsx("div",{className:"onboarding-resume-card__actions",children:t.jsxs("button",{className:"onboarding-resume-card__resume-btn btn btn-primary btn-sm",onClick:()=>{Bi("onboarding:resumed",{source:"resume-card",resumedFromStep:n.currentStep}),e()},children:[t.jsx(Os,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:"Continue onboarding"})]})})]})}function wB({onOpenSettings:e,onOpenModelOnboarding:n}){const s=Io(),a=Wk(),[r,o]=i.useState(!0),[l,c]=i.useState(!1),[d,u]=i.useState(!1),[h,m]=i.useState({needsAiProvider:!1,needsDefaultModel:!1,needsGitHub:!1});i.useEffect(()=>{if(!s||a){o(!1);return}let y=!1;return(async()=>{try{o(!0),c(!1);const[j,N]=await Promise.all([No(),Ra()]);if(y)return;const C=j.providers??[],w=C.find(M=>M.id==="github"),R=!C.some(M=>M.id!=="github"&&M.authenticated),I=!N.defaultProvider&&!N.defaultModelId,E=w?!w.authenticated:!1;m({needsAiProvider:R,needsDefaultModel:I,needsGitHub:E})}catch{y||c(!0)}finally{y||o(!1)}})(),()=>{y=!0}},[s,a]);const f=i.useCallback(()=>{n5(),u(!0)},[]),p=i.useCallback(()=>{n()},[n]),b=i.useCallback(()=>{e("global-models")},[e]),v=i.useCallback(()=>{e("authentication")},[e]),x=i.useMemo(()=>{const y=[];return h.needsAiProvider&&y.push({id:"ai-provider",title:"Connect AI Provider",description:"Connect an AI provider to enable AI agents for task planning and code generation",actionLabel:"Set Up AI",onAction:p,icon:Bs}),h.needsDefaultModel&&y.push({id:"default-model",title:"Select Default Model",description:"Choose a default AI model for task execution",actionLabel:"Choose Model",onAction:b,icon:Hv}),h.needsGitHub&&y.push({id:"github",title:"Connect GitHub",description:"Connect GitHub to import issues and track pull requests",actionLabel:"Connect GitHub",onAction:v,icon:yi}),y},[h.needsAiProvider,h.needsDefaultModel,h.needsGitHub,v,b,p]);return!s||a||d||r||l||x.length===0?null:t.jsxs("section",{className:"post-onboarding-recommendations",role:"region","aria-label":"Setup recommendations",children:[t.jsxs("div",{className:"post-onboarding-recommendations__main",children:[t.jsx("div",{className:"post-onboarding-recommendations__icon","aria-hidden":"true",children:t.jsx(ba,{size:18,"aria-hidden":!0})}),t.jsxs("div",{className:"post-onboarding-recommendations__content",children:[t.jsx("h2",{className:"post-onboarding-recommendations__title",children:"Recommended Next Steps"}),t.jsx("p",{className:"post-onboarding-recommendations__description",children:"Complete these setup items to get the most out of Fusion."}),t.jsx("ul",{className:"post-onboarding-recommendations__list",children:x.map(y=>{const g=y.icon;return t.jsxs("li",{className:"post-onboarding-recommendations__item",children:[t.jsx("span",{className:"post-onboarding-recommendations__item-icon","aria-hidden":"true",children:t.jsx(g,{size:14,"aria-hidden":!0})}),t.jsxs("span",{className:"post-onboarding-recommendations__item-text",children:[t.jsx("strong",{children:y.title}),t.jsx("span",{children:y.description})]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-primary",onClick:y.onAction,children:y.actionLabel})]},y.id)})}),t.jsx(Ka,{slotId:"post-onboarding-recommendation",renderPlaceholder:!1,actions:{openSettingsSection:e,openModelOnboarding:n}})]})]}),t.jsx("button",{type:"button",className:"post-onboarding-recommendations__dismiss",onClick:f,"aria-label":"Dismiss recommendations",children:t.jsx(Nn,{size:16,"aria-hidden":!0})})]})}function kB({size:e=20}){return t.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",children:t.jsx("path",{d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.203 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.942.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"})})}function ol(e){return e>99?"99+":String(e)}function jB({view:e,onChangeView:n,footerVisible:s,modalOpen:a=!1,keyboardOpen:r=!1,onOpenSettings:o,onOpenActivityLog:l,onOpenSystemStats:c,onOpenMailbox:d,mailboxUnreadCount:u=0,mailboxPendingApprovalCount:h=0,chatHasUnreadResponse:m=!1,stashOrphanCount:f=0,onOpenGitManager:p,onOpenWorkflowSteps:b,onOpenSchedules:v,onOpenScripts:x,onToggleTerminal:y,onOpenFiles:g,onOpenTodos:j,todosOpen:N=!1,onOpenGitHubImport:C,onOpenPlanning:w,onResumePlanning:S,activePlanningSessionCount:R=0,onOpenUsage:I,onRunScript:E,projectId:M,onViewAllProjects:G,showSkillsTab:U,experimentalFeatures:P,onOpenNodes:T,pluginDashboardViews:D=[],shellConnectionControl:W}){const Y=$i(),[L,_]=i.useState(!1),[F,ae]=i.useState(!1),[k,z]=i.useState({}),[J,oe]=i.useState(!1),le=i.useRef(null),we=i.useMemo(()=>Object.entries(k).sort(([ge],[Ne])=>ge.localeCompare(Ne)),[k]);i.useEffect(()=>{if(!F)return;let ge=!1;return oe(!0),Rl(M).then(Ne=>{ge||z(Ne)}).catch(()=>{ge||z({})}).finally(()=>{ge||oe(!1)}),()=>{ge=!0}},[F,M]);const re=i.useCallback(()=>_(!1),[]),H=i.useCallback(ge=>{re(),ge?.()},[re]);if(i.useEffect(()=>{if(!L)return;const ge=Ne=>{Ne.key==="Escape"&&_(!1)};return document.addEventListener("keydown",ge),()=>document.removeEventListener("keydown",ge)},[L]),i.useLayoutEffect(()=>{const ge=le.current;if(!ge||typeof document>"u")return;const Ne=()=>{const Le=window.getComputedStyle(ge),de=Number.parseFloat(Le.paddingBottom)||0,Re=ge.offsetHeight-de,Pe=Math.max(44,Math.ceil(Re));document.documentElement.style.setProperty("--mobile-nav-height",`${Pe}px`)};Ne();let He=null;return typeof ResizeObserver<"u"&&(He=new ResizeObserver(()=>{Ne()}),He.observe(ge)),()=>{He?.disconnect(),document.documentElement.style.removeProperty("--mobile-nav-height")}},[]),Y!=="mobile"||a)return null;const ue=R>0&&S?S:w,Q=!!U,be=!!P?.todoView,fe=Q,O=Q&&!fe,A=D.filter(ge=>ge.view.placement==="primary").sort((ge,Ne)=>(ge.view.order??Number.MAX_SAFE_INTEGER)-(Ne.view.order??Number.MAX_SAFE_INTEGER)).slice(0,1),ne=new Set(A.map(ge=>`${ge.pluginId}:${ge.view.viewId}`)),ye=D.filter(ge=>!ne.has(`${ge.pluginId}:${ge.view.viewId}`)).sort((ge,Ne)=>(ge.view.order??Number.MAX_SAFE_INTEGER)-(Ne.view.order??Number.MAX_SAFE_INTEGER)),ee=e==="documents"||e==="reliability"||!!P?.evalsView&&e==="evals"||!!P?.goalsView&&e==="goalsView"||e==="research"||e==="insights"||e==="memory"||e==="secrets"||e==="devserver"||e==="dev-server"||N&&be||e==="skills"&&!fe||e==="graph"||e==="stash-recovery"||go(e)&&!A.some(ge=>kl(ge.pluginId,ge.view.viewId)===e);return t.jsxs(t.Fragment,{children:[t.jsxs("nav",{ref:le,className:`mobile-nav-bar${s?" mobile-nav-bar--with-footer":""}${r?" mobile-nav-bar--keyboard-open":""}`,role:"tablist","aria-label":"Primary navigation",children:[t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="board"||e==="list"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-tasks",role:"tab","aria-selected":e==="board"||e==="list",onClick:()=>{n(e==="board"||e==="list"?e:"board")},children:[t.jsx(Xa,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Tasks"})]}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="agents"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-agents",role:"tab","aria-selected":e==="agents",onClick:()=>n("agents"),children:[t.jsx(As,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Agents"})]}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="missions"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-missions",role:"tab","aria-selected":e==="missions",onClick:()=>n("missions"),children:[t.jsx(Ys,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Missions"})]}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="chat"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-chat",role:"tab","aria-selected":e==="chat",onClick:()=>n("chat"),children:[t.jsxs("span",{className:"mobile-nav-tab-icon-wrapper",children:[t.jsx(fa,{}),m&&e!=="chat"&&t.jsx("span",{className:"status-dot status-dot--pending mobile-nav-chat-unread-dot","aria-label":"Unread chat response"})]}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Chat"})]}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="mailbox"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-mailbox",role:"tab","aria-selected":e==="mailbox",onClick:()=>n("mailbox"),children:[t.jsxs("span",{className:"mobile-nav-tab-icon-wrapper",children:[t.jsx(jr,{}),h>0&&e!=="mailbox"&&t.jsx("span",{className:"status-dot status-dot--pending mobile-nav-chat-unread-dot","aria-label":"Pending approvals"})]}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Mailbox"}),u>0&&t.jsx("span",{className:"mobile-nav-tab-badge",children:ol(u)})]}),fe&&t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="skills"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-skills",role:"tab","aria-selected":e==="skills",onClick:()=>n("skills"),children:[t.jsx(Bs,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Skills"})]}),A.map(ge=>{const Ne=kl(ge.pluginId,ge.view.viewId),He=id(ge.view.icon);return t.jsxs("button",{type:"button",className:`mobile-nav-tab${e===Ne||e==="graph"&&ge.pluginId==="fusion-plugin-dependency-graph"&&ge.view.viewId==="graph"?" mobile-nav-tab--active":""}`,"data-testid":`mobile-nav-tab-plugin-${ge.pluginId}-${ge.view.viewId}`,role:"tab","aria-selected":e===Ne||e==="graph"&&ge.pluginId==="fusion-plugin-dependency-graph"&&ge.view.viewId==="graph",onClick:()=>n(ge.pluginId==="fusion-plugin-dependency-graph"&&ge.view.viewId==="graph"?"graph":Ne),children:[t.jsx(He,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:ge.view.label})]},`${ge.pluginId}:${ge.view.viewId}`)}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${ee?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-more",role:"tab","aria-selected":!1,onClick:()=>_(ge=>!ge),children:[t.jsx(Nm,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"More"})]})]}),L&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"mobile-more-sheet-backdrop",onClick:re}),t.jsxs("div",{className:"mobile-more-sheet",children:[t.jsx("div",{className:"mobile-more-sheet-handle"}),t.jsx("div",{className:"mobile-more-sheet-title",children:"Navigate"}),W?t.jsx("div",{className:"mobile-more-shell-connection","data-testid":"mobile-more-shell-connection",children:W}):null,t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-mailbox",onClick:()=>H(d),children:[t.jsx(jr,{}),t.jsx("span",{children:"Mailbox"}),u>0&&t.jsx("span",{className:"mobile-more-item-badge mobile-more-item-badge--unread",children:ol(u)}),h>0&&t.jsx("span",{className:"mobile-more-item-badge",children:ol(h)})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-activity",onClick:()=>H(l),children:[t.jsx(fi,{}),t.jsx("span",{children:"Activity Log"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-system-stats",onClick:()=>H(c),children:[t.jsx(ko,{}),t.jsx("span",{children:"System Stats"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-git",onClick:()=>H(p),children:[t.jsx(ii,{}),t.jsx("span",{children:"Git Manager"})]}),t.jsxs("div",{className:"mobile-more-split-row",children:[t.jsxs("button",{type:"button",className:"mobile-more-item mobile-more-split-primary","data-testid":"mobile-more-item-terminal",onClick:()=>H(y),children:[t.jsx(_a,{}),t.jsx("span",{children:"Terminal"})]}),t.jsx("button",{type:"button",className:"mobile-more-split-toggle","data-testid":"mobile-more-terminal-split-toggle",onClick:()=>ae(ge=>!ge),"aria-expanded":F,"aria-haspopup":"menu","aria-label":"Show scripts",children:t.jsx(ps,{size:14,className:`mobile-more-chevron${F?" mobile-more-chevron--open":""}`})})]}),F&&t.jsx("div",{className:"mobile-more-submenu",role:"menu","aria-label":"Scripts submenu",children:J?t.jsxs("div",{className:"mobile-more-submenu-loading","data-testid":"mobile-more-scripts-loading",children:[t.jsx(Ct,{className:"animate-spin"}),t.jsx("span",{children:"Loading scripts…"})]}):we.length>0?t.jsxs(t.Fragment,{children:[we.map(([ge,Ne])=>t.jsxs("button",{type:"button",className:"mobile-more-item mobile-more-subitem","data-testid":`mobile-more-script-item-${ge}`,onClick:()=>{E&&E(ge,Ne),re(),ae(!1)},children:[t.jsx(Os,{}),t.jsx("span",{children:ge})]},ge)),x&&t.jsxs("button",{type:"button",className:"mobile-more-item mobile-more-subitem mobile-more-subitem--manage","data-testid":"mobile-more-scripts-manage",onClick:()=>{re(),ae(!1),x()},children:[t.jsx(Yi,{}),t.jsx("span",{children:"Manage Scripts…"})]})]}):x&&t.jsxs("button",{type:"button",className:"mobile-more-item mobile-more-subitem","data-testid":"mobile-more-scripts-manage",onClick:()=>{re(),ae(!1),x()},children:[t.jsx(Yi,{}),t.jsx("span",{children:"No scripts — add one…"})]})}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-files",onClick:()=>H(g),children:[t.jsx(Qs,{}),t.jsx("span",{children:"Files"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-planning",onClick:()=>H(ue),children:[t.jsx(ba,{}),t.jsx("span",{children:"Planning"}),R>0&&t.jsx("span",{className:"mobile-more-item-badge",children:ol(R)})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-workflow",onClick:()=>H(b),children:[t.jsx(Zc,{}),t.jsx("span",{children:"Workflow Steps"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-schedules",onClick:()=>H(v),children:[t.jsx(pa,{}),t.jsx("span",{children:"Automation"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-github",onClick:()=>H(C),children:[t.jsx(kB,{}),t.jsx("span",{children:"Import from GitHub"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-usage",onClick:()=>H(I),children:[t.jsx(fi,{}),t.jsx("span",{children:"Usage"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-projects",onClick:()=>H(G),children:[t.jsx(_l,{}),t.jsx("span",{children:"Projects"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-documents",onClick:()=>H(()=>n("documents")),children:[t.jsx(Ya,{}),t.jsx("span",{children:"Documents"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-reliability",onClick:()=>H(()=>n("reliability")),children:[t.jsx(fi,{}),t.jsx("span",{children:"Reliability"})]}),P?.evalsView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-evals",onClick:()=>H(()=>n("evals")),children:[t.jsx(Ys,{}),t.jsx("span",{children:"Evals"})]}),P?.goalsView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-goals",onClick:()=>H(()=>n("goalsView")),children:[t.jsx(Ys,{}),t.jsx("span",{children:"Goals"})]}),O&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-skills",onClick:()=>H(()=>n("skills")),children:[t.jsx(Bs,{}),t.jsx("span",{children:"Skills"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-stash-recovery",onClick:()=>H(()=>n("stash-recovery")),children:[t.jsx(wr,{}),t.jsx("span",{children:"Stash Recovery"}),f>0?t.jsx("span",{className:"mobile-more-item-badge",children:ol(f)}):null]}),P?.researchView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-research",onClick:()=>H(()=>n("research")),children:[t.jsx(da,{}),t.jsx("span",{children:"Research"})]}),P?.insights&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-insights",onClick:()=>H(()=>n("insights")),children:[t.jsx(Ls,{}),t.jsx("span",{children:"Insights"})]}),P?.memoryView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-memory",onClick:()=>H(()=>n("memory")),children:[t.jsx(El,{}),t.jsx("span",{children:"Memory"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-secrets",onClick:()=>H(()=>n("secrets")),children:[t.jsx(Do,{}),t.jsx("span",{children:"Secrets"})]}),P?.devServerView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-dev-server",onClick:()=>{H(()=>n("dev-server"))},children:[t.jsx(ko,{}),t.jsx("span",{children:"Dev Server"})]}),P?.nodesView&&T&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-nodes",onClick:()=>H(T),children:[t.jsx(ZS,{}),t.jsx("span",{children:"Nodes"})]}),be&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-todos",onClick:()=>H(()=>j?.()),children:[t.jsx(Ch,{}),t.jsx("span",{children:"Todos"})]}),ye.map(ge=>{const Ne=kl(ge.pluginId,ge.view.viewId),He=id(ge.view.icon);return t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":`mobile-more-item-plugin-${ge.pluginId}-${ge.view.viewId}`,onClick:()=>H(()=>n(ge.pluginId==="fusion-plugin-dependency-graph"&&ge.view.viewId==="graph"?"graph":Ne)),children:[t.jsx(He,{}),t.jsx("span",{children:ge.view.label})]},`${ge.pluginId}:${ge.view.viewId}`)}),t.jsx("div",{className:"mobile-more-separator"}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-settings",onClick:()=>H(o),children:[t.jsx(wl,{}),t.jsx("span",{children:"Settings"})]})]})]})]})}function tv(e){return e.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function nj(e,n){const s=n.trim();if(!s)return!0;const a=tv(s);return tv(e).includes(a)||e.toLowerCase().includes(s.toLowerCase())}function NB({agents:e,filter:n,highlightedIndex:s,visible:a,onSelect:r,position:o="below",roomMemberIds:l,roomName:c}){const d=i.useMemo(()=>e.filter(b=>nj(b.name,n)),[e,n]),u=!!l,h=u&&n.trim().length>0,m=i.useMemo(()=>u?d.filter(b=>l?.has(b.id)):d,[d,l,u]),f=i.useMemo(()=>u?d.filter(b=>!l?.has(b.id)):[],[d,l,u]),p=h?[...m,...f]:m;return a?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${o}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":"Agent mention suggestions",children:p.length===0?t.jsx("div",{className:"agent-mention-empty",children:"No agents found"}):t.jsxs(t.Fragment,{children:[u&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:c?`Members of #${c}`:"Room members"}),m.map((b,v)=>t.jsxs("button",{type:"button",className:`agent-mention-item${v===s?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${b.id}`,onMouseDown:x=>x.preventDefault(),onClick:()=>r(b),role:"option","aria-selected":v===s,children:[t.jsx(gd,{agent:b,size:20}),u&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":"Room member"}),t.jsx("span",{className:"agent-mention-name",children:b.name}),t.jsx("span",{className:"agent-mention-role",children:b.role})]},b.id)),u&&!h&&f.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:"Type to search other agents"}),u&&h&&f.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:"Other agents"}),f.map((b,v)=>{const x=m.length+v;return t.jsxs("button",{type:"button",className:`agent-mention-item${x===s?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${b.id}`,onMouseDown:y=>y.preventDefault(),onClick:()=>r(b),role:"option","aria-selected":x===s,children:[t.jsx(gd,{agent:b,size:20}),t.jsx("span",{className:"agent-mention-name",children:b.name}),t.jsx("span",{className:"agent-mention-role",children:b.role})]},b.id)})]})]})}):null}function nv(e){const{sessionId:n,tempUserMessageId:s,setStreamingText:a,setStreamingThinking:r,setStreamingToolCalls:o,cancelStreamingFlushesRef:l,addToast:c,onDone:d,onError:u,onFallbackSession:h}=e;let m="",f="",p=[],b,v=null,x=null;const y=()=>{v=null,a(m)},g=()=>{x=null,r(f)},j=()=>{v!==null&&(cancelAnimationFrame(v),v=null),x!==null&&(cancelAnimationFrame(x),x=null)};return l.current=j,{handlers:{onThinking:C=>{f+=C,x===null&&(x=requestAnimationFrame(g))},onText:C=>{m+=C,v===null&&(v=requestAnimationFrame(y))},onToolStart:C=>{p=[...p,{toolName:C.toolName,args:C.args,isError:!1,status:"running"}],o(p)},onToolEnd:C=>{const w=[...p];for(let S=w.length-1;S>=0;S--){const R=w[S];if(R?.toolName===C.toolName&&R.status==="running"){w[S]={...R,status:"completed",isError:C.isError,result:C.result},p=w,o(w);return}}p=[...w,{toolName:C.toolName,isError:C.isError,result:C.result,status:"completed"}],o(p)},onFallback:C=>{b=C,h?.(C,n),c?.(`Primary model unavailable. Switched to fallback ${C.fallbackModel}.`,"warning")},onDone:C=>{j(),d({messageId:C.messageId,message:C.message,accumulated:{text:m,thinking:f,toolCalls:p,fallbackInfo:b}})},onError:C=>{j(),u(C,s)}},cancelFlushes:j}}let sv=null,iv=null;const SB=["load failed","failed to fetch","networkerror when attempting to fetch resource.","connection aborted","connection closed unexpectedly","network error"];function CB(e){const n=e.trim().toLowerCase();return n?SB.some(s=>n.includes(s)):!1}function EB(){const e=i.useRef(sv),n=i.useRef(iv),s=i.useRef(new Set);i.useEffect(()=>{if(typeof document>"u")return;let l=document.visibilityState;const c=()=>{const d=Date.now(),u=document.visibilityState;if(u==="hidden"&&(e.current=d,sv=d),u==="visible"&&(n.current=d,iv=d,l==="hidden"))for(const h of s.current)h();l=u};return c(),document.addEventListener("visibilitychange",c),()=>document.removeEventListener("visibilitychange",c)},[]);const a=i.useCallback(()=>typeof document<"u"&&document.visibilityState==="hidden",[]),r=i.useCallback((l=5e3)=>{const c=e.current;if(c===null)return!1;const d=Date.now();if(a())return d-c<=l;const u=n.current;return u===null||u<c?!1:d-u<=l},[a]),o=i.useCallback(l=>(s.current.add(l),()=>{s.current.delete(l)}),[]);return i.useMemo(()=>({isHiddenNow:a,wasRecentlyHidden:r,onBecameVisible:o}),[a,o,r])}const xr="__fn_agent__";function sj(e,n){const s=typeof e=="string"?e.trim():"",a=typeof n=="string"?n.trim():"";return!s||!a?{}:{modelProvider:s,modelId:a}}function Oc(e,n,s){const a=typeof e=="string"?e.trim():"",r=sj(n,s),o=a||(r.modelProvider&&r.modelId?xr:"");return o?{agentId:o,...r}:null}function Fc(e,n,s){const a=sj(n,s),r=a.modelProvider??"",o=a.modelId??"";return`${e}::${r}/${o}`}function av(e){const n=typeof e=="string"?e.trim():"",s=n.indexOf("/");return!n||s<=0||s>=n.length-1?{}:{modelProvider:n.slice(0,s),modelId:n.slice(s+1)}}function _B(e){const n=e?.toolCalls;if(!Array.isArray(n))return;const s=n.map(a=>{if(!a||typeof a!="object")return null;const r=a,o=typeof r.toolName=="string"?r.toolName:"";if(!o)return null;const l=r.args;return{toolName:o,...l&&typeof l=="object"?{args:l}:{},isError:!!r.isError,result:r.result,status:"completed"}}).filter(a=>a!==null);return s.length>0?s:void 0}function MB(e){const n=e?.fallback;if(!n||typeof n!="object")return;const s=n,a=typeof s.primaryModel=="string"?s.primaryModel:"",r=typeof s.fallbackModel=="string"?s.fallbackModel:"",o=s.triggerPoint;if(!(!a||!r||o!=="session-creation"&&o!=="prompt-time"))return{primaryModel:a,fallbackModel:r,triggerPoint:o}}function ro(e){return{id:e.id,sessionId:e.sessionId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput,toolCalls:_B(e.metadata),fallbackInfo:MB(e.metadata),createdAt:e.createdAt}}function RB(e,n){const[s,a]=i.useState(null),[r,o]=i.useState([]),[l,c]=i.useState(!1),[d,u]=i.useState([]),[h,m]=i.useState(!1),[f,p]=i.useState(!1),[b,v]=i.useState(""),[x,y]=i.useState(""),[g,j]=i.useState([]),[N,C]=i.useState(""),w=i.useRef(null),S=i.useRef(null),R=i.useRef(!1),I=i.useRef(null),E=i.useRef(""),M=i.useRef(f);M.current=f;const G=i.useRef(null),U=i.useRef(null),P=i.useRef(""),T=i.useRef(null),D=i.useRef(s);D.current=s;const W=i.useRef(0),Y=3,L=i.useRef(!1);i.useEffect(()=>{E.current=N},[N]),i.useEffect(()=>{S.current=null},[e]);const _=i.useCallback(async()=>{c(!0);try{const A=await Np(e);o(A.sessions)}catch(A){console.error("[useQuickChat] Failed to refresh sessions:",A)}finally{c(!1)}},[e]),F=i.useCallback(async A=>{const ne={agentId:A.agentId};return A.modelProvider&&A.modelId&&(ne.modelProvider=A.modelProvider,ne.modelId=A.modelId),(await VM(ne,e)).session},[e]),ae=i.useCallback(()=>{E.current="",C("")},[]),k=i.useCallback(()=>{const A=E.current.trim();if(!A)return;E.current="",C("");const ne=U.current;U.current=null;const ye=fe.current(A);ne&&ye.then(ne.resolve).catch(ne.reject)},[]),z=i.useCallback((A,ne,ye)=>{if(w.current||!A)return!0;R.current=!1,ne&&(v(ne.streamingText),y(ne.streamingThinking),j(ne.toolCalls)),p(!0);const{handlers:ee}=nv({sessionId:A,tempUserMessageId:"",setStreamingText:v,setStreamingThinking:y,setStreamingToolCalls:j,cancelStreamingFlushesRef:I,addToast:ye?.silent?void 0:n,onFallbackSession:(ge,Ne)=>{const He=av(ge.fallbackModel);o(Le=>Le.map(de=>de.id===Ne?{...de,...He}:de)),a(Le=>Le&&Le.id===Ne?{...Le,...He}:Le)},onDone:()=>{v(""),y(""),j([]),p(!1),M.current=!1,w.current=null,S.current=null,Wo(A,{limit:50,order:"desc"},e).then(ge=>{D.current?.id===A&&u(ge.messages.slice().reverse().map(ro))}).catch(()=>{}),k()},onError:ge=>{v(""),y(""),j([]),p(!1),M.current=!1,w.current=null,S.current=null;const Ne=typeof ge=="string"&&ge.trim()?ge:"Failed to get response";ye?.silent||n?.(Ne,"error"),Wo(A,{limit:50,order:"desc"},e).then(He=>{D.current?.id===A&&u(He.messages.slice().reverse().map(ro))}).catch(()=>{}),k()}});return w.current=sR(A,ee,e,{...typeof ne?.replayFromEventId=="number"?{lastEventId:ne.replayFromEventId}:{}}),S.current={sessionId:A,replayFromEventId:typeof ne?.replayFromEventId=="number"?ne.replayFromEventId:null},!0},[n,e,k]),J=i.useCallback(async(A,ne,ye)=>{const ee=Oc(A,ne,ye);if(!ee)return;const ge=Fc(ee.agentId,ee.modelProvider,ee.modelId);c(!0);try{const{session:Ne}=await qM({agentId:ee.agentId,modelProvider:ee.modelProvider,modelId:ee.modelId},e);if(Ne)a(Ne),P.current=ge,Ne.isGenerating&&z(Ne.id,Ne.inFlightGeneration);else{const He=await F(ee);a(He),P.current=ge}W.current=0}catch(Ne){console.error("[useQuickChat] Failed to initialize session:",Ne),W.current+=1,W.current<=Y&&n?.("Failed to initialize chat","error")}finally{c(!1)}},[z,e,n,F]),oe=i.useCallback(async()=>{if(s){m(!0);try{const A=s.id,ne=await Wo(A,{limit:50,order:"desc"},e);D.current?.id===A&&u(ne.messages.slice().reverse().map(ro))}catch(A){console.error("[useQuickChat] Failed to load messages:",A)}finally{m(!1)}}},[s,e]);i.useEffect(()=>{s?oe():u([])},[s,oe]),i.useEffect(()=>{if(!s?.isGenerating||(w.current||z(s.id,s.inFlightGeneration),!M.current||w.current||!s))return;const A=setInterval(async()=>{if(!M.current||w.current||!s){clearInterval(A);return}try{if(!(await rc(s.id,e)).session.isGenerating){clearInterval(A);const ye=s.id,ee=await Wo(ye,{limit:50,order:"desc"},e);D.current?.id===ye&&u(ee.messages.slice().reverse().map(ro)),v(""),y(""),j([]),p(!1),M.current=!1,k()}}catch{}},3e3);return()=>clearInterval(A)},[s,z,e,k]);const le=i.useCallback(async()=>{if(s){m(!0);try{const A=s.id,ne=await Wo(A,{limit:50,order:"desc"},e);D.current?.id===A&&u(ne.messages.slice().reverse().map(ro))}catch(A){console.error("[useQuickChat] Failed to reload messages:",A)}finally{m(!1)}}},[s,e]),we=i.useCallback(()=>{I.current?.(),I.current=null,E.current="",C(""),U.current?.resolve(),U.current=null,v(""),y(""),j([]),p(!1)},[]),re=i.useCallback(async(A,ne,ye)=>{const ee=Oc(A,ne,ye);if(!ee)return;const ge=Fc(ee.agentId,ee.modelProvider,ee.modelId);T.current=ee;const Ne=ge===P.current&&D.current;if(Ne||(w.current&&(w.current.close(),w.current=null),S.current=null,we()),Ne){await le();return}a(null),u([]),P.current=ge,await J(ee.agentId,ee.modelProvider,ee.modelId)},[J,le,we]),H=i.useCallback(async A=>{const ne=Oc(A.agentId,A.modelProvider??void 0,A.modelId??void 0);ne&&(T.current=ne,P.current=Fc(ne.agentId,ne.modelProvider,ne.modelId),w.current&&(w.current.close(),w.current=null),S.current=null,we(),a(A),Promise.resolve(rc(A.id,e)).then(({session:ye})=>{!ye.isGenerating||!ye.inFlightGeneration||a(ee=>!ee||ee.id!==A.id?ee:{...ee,...ye})}).catch(()=>{}),A.isGenerating&&z(A.id,A.inFlightGeneration))},[z,e,we]),ue=i.useCallback(async(A,ne)=>{await re(xr,A,ne)},[re]),Q=i.useCallback(async(A,ne,ye)=>{const ge=Oc(A??"",ne,ye)??T.current;if(!ge)return;T.current=ge;const Ne=Fc(ge.agentId,ge.modelProvider,ge.modelId);L.current=!0,W.current=0,w.current&&(w.current.close(),w.current=null),S.current=null,we(),u([]),a(null),c(!0);try{const He=await F(ge);a(He),P.current=Ne;const Le=await Np(e);o(Le.sessions)}catch(He){console.error("[useQuickChat] Failed to start a fresh session:",He),n?.("Failed to start a new chat","error")}finally{L.current=!1,c(!1)}},[n,F,e,we]),be=i.useCallback(()=>{s&&(R.current=!0,I.current?.(),I.current=null,w.current?.close(),w.current=null,S.current=null,eR(s.id,e).catch(()=>{}),p(!1),M.current=!1,v(""),y(""),j([]),k())},[s,e,k]),fe=i.useRef(()=>Promise.resolve()),O=EB(),se=i.useCallback(async A=>{try{await _();const ye=(await rc(A,e)).session;D.current?.id===A&&a(ee=>!ee||ee.id!==A?ee:{...ee,...ye}),ye.isGenerating?(v(""),y(""),j([]),p(!0),M.current=!0,z(A,ye.inFlightGeneration,{silent:!0})):(v(""),y(""),j([]),p(!1),M.current=!1,await le())}catch{}},[z,e,_,le]),ve=i.useCallback((A,ne)=>{if(!A.trim()&&(!ne||ne.length===0))return Promise.resolve();if(!s)return ne&&ne.length>0?Promise.reject(new Error("Cannot send attachments before chat session is ready")):new Promise((ee,ge)=>{U.current?.resolve(),U.current={resolve:ee,reject:ge},E.current=A,C(A),D.current&&!M.current&&!w.current&&queueMicrotask(()=>{!M.current&&!w.current&&k()})});if(M.current)return ne&&ne.length>0?Promise.reject(new Error("Cannot send attachments while a response is streaming")):(E.current=A,C(A),Promise.resolve());const ye=new Promise((ee,ge)=>{G.current={resolve:ee,reject:ge},R.current=!1,w.current&&(w.current.close(),w.current=null),S.current=null;const Ne=`temp-${Date.now()}`,He={id:Ne,sessionId:s.id,role:"user",content:A,createdAt:new Date().toISOString()};u(de=>[...de,He]),v(""),y(""),j([]),p(!0);const{handlers:Le}=nv({sessionId:s.id,tempUserMessageId:Ne,setStreamingText:v,setStreamingThinking:y,setStreamingToolCalls:j,cancelStreamingFlushesRef:I,addToast:n,onFallbackSession:(de,Re)=>{const Pe=av(de.fallbackModel);o(rt=>rt.map(qe=>qe.id===Re?{...qe,...Pe}:qe)),a(rt=>rt&&rt.id===Re?{...rt,...Pe}:rt)},onDone:({messageId:de,message:Re,accumulated:Pe})=>{const rt=Re?{...ro(Re),...Pe.text.length>0?{content:Pe.text}:{}}:{id:de||`msg-${Date.now()}`,sessionId:s.id,role:"assistant",content:Pe.text,thinkingOutput:Pe.thinking||void 0,toolCalls:Pe.toolCalls.length>0?Pe.toolCalls:void 0,fallbackInfo:Pe.fallbackInfo,createdAt:new Date().toISOString()};u(qe=>[...qe,rt]),v(""),y(""),j([]),p(!1),M.current=!1,w.current=null,S.current=null,G.current?.resolve(),G.current=null,k()},onError:de=>{v(""),y(""),j([]),p(!1),M.current=!1,w.current=null,S.current=null,console.error("[useQuickChat] Stream error:",de);const Re=typeof de=="string"&&de.trim()?de:"Failed to get response",Pe=CB(Re);Pe?(console.info("[useQuickChat] Suppressed tab-suspension stream error:",de),s?.id&&(v(""),y(""),j([]),p(!0),M.current=!0,se(s.id)),G.current?.resolve()):(n?.(Re,"error"),G.current?.reject(new Error(Re))),G.current=null,R.current||k(),Pe||le()}});w.current=nR(s.id,A,Le,ne,e)});return ye.catch(()=>{}),ye},[s,e,n,le,se,k]);return fe.current=ve,i.useEffect(()=>{if(!s?.id||s.isGenerating!==!0||w.current)return;const A=typeof s.inFlightGeneration?.replayFromEventId=="number"?s.inFlightGeneration.replayFromEventId:null,ne=S.current;ne?.sessionId===s.id&&ne.replayFromEventId===A||z(s.id,s.inFlightGeneration,{silent:!0})},[s?.id,s?.isGenerating,s?.inFlightGeneration,z]),i.useEffect(()=>O.onBecameVisible(()=>{if(L.current)return;const ne=D.current;!ne||w.current||Promise.resolve(rc(ne.id,e)).then(ye=>{if(!(w.current||D.current?.id!==ne.id)){if(ye.session.isGenerating){v(""),y(""),j([]),p(!0),M.current=!0,z(ne.id,ye.session.inFlightGeneration,{silent:!0});return}M.current&&(v(""),y(""),j([]),p(!1),M.current=!1,k(),le())}}).catch(()=>{})}),[z,e,le,O,k]),i.useEffect(()=>{!s||M.current||w.current||E.current.trim().length!==0&&k()},[s,k]),i.useEffect(()=>()=>{w.current&&(w.current.close(),w.current=null),S.current=null},[]),i.useMemo(()=>({activeSession:s,sessions:r,sessionsLoading:l,messages:d,messagesLoading:h,isStreaming:f,streamingText:b,streamingThinking:x,streamingToolCalls:g,pendingMessage:N,sendMessage:ve,stopStreaming:be,clearPendingMessage:ae,switchSession:re,selectSession:H,startModelChat:ue,startFreshSession:Q,refreshSessions:_,loadMessages:oe,reloadMessages:le,skipNextSessionInitRef:L}),[s,r,l,d,h,f,b,x,g,N,ve,be,ae,re,H,ue,Q,_,oe,le])}const AB=250;function ij(e,n){const[s,a]=i.useState(()=>{const x=ui(bn.AGENTS,{maxAgeMs:_r});return Array.isArray(x)?x:[]}),[r,o]=i.useState(()=>ui(bn.AGENT_STATS,{maxAgeMs:_r})??null),[l,c]=i.useState(!1),d=i.useRef(s.length>0||r!==null),u=i.useRef(0),h=i.useRef(0),m=i.useCallback(async(x,y)=>{const g=++u.current;d.current||c(!0);try{const j=n?.filterState,N=j&&j!=="all"?{state:j}:void 0,C=n?.showSystemAgents??!1,w={...N,...x,includeEphemeral:x?.includeEphemeral??C},S=y?.forceFresh?await Qa(w,e,{forceFresh:!0}):await Qa(w,e);if(g!==u.current)return;const R=Array.from(new Map(S.map(I=>[I.id,I])).values());a(R),Wn(bn.AGENTS,R,{maxBytes:5e5}),d.current=d.current||R.length>0}catch(j){console.error("Failed to load agents:",j)}finally{g===u.current&&c(!1)}},[e,n?.filterState,n?.showSystemAgents]),f=i.useCallback(async x=>{const y=++h.current;try{const g=x?.forceFresh?await pp(e,{forceFresh:!0}):await pp(e);if(y!==h.current)return;o(g),Wn(bn.AGENT_STATS,g,{maxBytes:5e5}),d.current=!0}catch(g){console.error("Failed to load agent stats:",g)}},[e]);i.useEffect(()=>{m(),f()},[m,f]),i.useEffect(()=>{const x=e?`?projectId=${encodeURIComponent(e)}`:"";let y=null,g=!1,j=!1,N=!1;const C=async()=>{g=!0,j=!1;try{await Promise.all([m(void 0,{forceFresh:!0}),f({forceFresh:!0})])}finally{g=!1,!N&&j&&w()}},w=()=>{if(y||g){g&&(j=!0);return}y=setTimeout(()=>{y=null,C()},AB)},S=()=>{if(g){j=!0;return}w()},R=Si(`/api/events${x}`,{events:{"agent:created":S,"agent:updated":S,"agent:deleted":S,"agent:stateChanged":S,"approval:requested":S,"approval:updated":S,"approval:decided":S}});return()=>{N=!0,y&&clearTimeout(y),R()}},[e,m,f]);const p=i.useCallback(async()=>{await Promise.all([m(void 0,{forceFresh:!0}),f({forceFresh:!0})])},[m,f]),b=n?.showSystemAgents??!1,v=s.filter(x=>x.state!=="active"&&x.state!=="running"?!1:b||!xC(x));return{agents:s,activeAgents:v,stats:r,isLoading:l,loadAgents:m,loadStats:f,refreshAgents:p}}const fm=new Map,Yc=new Map;function yf(e){return e??"global"}function bh(e){return`${bn.DISCOVERED_SKILLS_PREFIX}${yf(e)}`}function oo(e){return ui(bh(e),{maxAgeMs:_r})}function TB(e,n){for(const s of Yc.get(e)??[])s(n)}async function IB(e){const n=yf(e),s=fm.get(n);if(s)return s;const a=HM(e).finally(()=>{fm.delete(n)});return fm.set(n,a),a}function PB(e){const[n,s]=i.useState(()=>oo(e)??[]),[a,r]=i.useState(()=>oo(e)===null),o=i.useRef(oo(e)!==null),l=yf(e);i.useEffect(()=>{const u=oo(e)??[];s(u),r(oo(e)===null),o.current=oo(e)!==null},[e]),i.useEffect(()=>{const u=Yc.get(l)??new Set;return u.add(s),Yc.set(l,u),()=>{u.delete(s),u.size===0&&Yc.delete(l)}},[l]);const c=i.useCallback(async()=>{try{const u=await IB(e);o.current=!0,Wn(bh(e),u,{maxBytes:5e5}),TB(l,u)}catch{o.current||hs(bh(e))}finally{r(!1)}},[e,l]);i.useEffect(()=>{c()},[c]);const d=i.useCallback(async()=>{r(!0),await c()},[c]);return{skills:n,loading:a,refresh:d}}function $B(e,n){return e+n}function DB({visible:e,position:n,tasks:s,files:a,selectedIndex:r,onSelectTask:o,onSelectFile:l,loading:c}){if(!e)return null;const d=s.length>0,u=a.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:n.top,left:n.left},"data-testid":"file-mention-popup",onMouseDown:h=>{h.preventDefault()},children:[c&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!c&&!d&&!u&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:"No tasks or files found"}),!c&&(d||u)&&t.jsxs("div",{className:"file-mention-popup-groups",children:[d&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:"Tasks"}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":"Task matches",children:s.map((h,m)=>{const f=m;return t.jsxs("li",{className:`file-mention-popup-item${f===r?" file-mention-popup-item--selected":""}`,onClick:()=>o(h),role:"option","aria-selected":f===r,"data-testid":`task-mention-item-${f}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Uv,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsxs("div",{className:"file-mention-popup-task-row",children:[t.jsx("span",{className:"file-mention-popup-task-id",children:h.id}),t.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${h.column}`,children:h.column})]}),t.jsx("span",{className:"file-mention-popup-item-path",children:h.title})]})]},h.id)})})]}),u&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:"Files"}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":"File matches",children:a.map((h,m)=>{const f=$B(s.length,m),p=AR(h.path);return t.jsxs("li",{className:`file-mention-popup-item${f===r?" file-mention-popup-item--selected":""}`,onClick:()=>l(h),role:"option","aria-selected":f===r,"data-testid":`file-mention-item-${f}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Bv,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:h.name}),p&&t.jsx("span",{className:"file-mention-popup-item-path",children:p})]})]},h.path)})})]})]})]})}const LB=200,OB=8,FB=8;function rv(){return new DOMException("The operation was aborted.","AbortError")}function ov(e,n){return n.aborted?Promise.reject(rv()):new Promise((s,a)=>{const r=()=>a(rv());n.addEventListener("abort",r,{once:!0}),e.then(o=>{n.removeEventListener("abort",r),s(o)},o=>{n.removeEventListener("abort",r),a(o)})})}function lv(e,n,s){const a=e.slice(0,n),r=e.slice(n+1),o=r.match(/[\s]|$/),l=o?o.index??r.length:r.length,c=r.slice(l);return`${a}${s}${c}`}function zB(e={}){const{projectId:n,workspace:s="project"}=e,[a,r]=i.useState(!1),[o,l]=i.useState(""),[c,d]=i.useState(-1),[u,h]=i.useState([]),[m,f]=i.useState([]),[p,b]=i.useState(!1),[v,x]=i.useState(0),y=i.useRef(null),g=i.useRef(null),j=[...u.map(E=>({kind:"task",task:E})),...m.map(E=>({kind:"file",file:E}))];i.useEffect(()=>()=>{y.current&&clearTimeout(y.current),g.current?.abort()},[]);const N=i.useCallback((E,M)=>{if(M<0||M>E.length){r(!1);return}const G=U=>/[a-zA-Z0-9/_.-]/.test(U);for(let U=M-1;U>=0;U--){if(E[U]==="#"){if(U===0){const T=E.slice(U+1,M);d(U),l(T),x(0),r(!0);return}const P=E[U-1];if(/[\s,.;:!?'"()[\]{}]/.test(P)){const T=E.slice(U+1,M);d(U),l(T),x(0),r(!0);return}r(!1);return}if(!G(E[U])){r(!1);return}}r(!1)},[]),C=i.useCallback(()=>{g.current?.abort(),r(!1),l(""),d(-1),h([]),f([]),x(0),b(!1)},[]),w=i.useCallback(async E=>{if(!E.trim()){h([]),f([]),b(!1);return}g.current?.abort();const M=new AbortController;g.current=M;try{b(!0);const[G,U]=await Promise.allSettled([ov(ty(20,0,n,E),M.signal),ov(mE(E,s,n),M.signal)]);if(M.signal.aborted)return;const P=G.status==="fulfilled"?G.value.slice(0,OB).map(D=>({id:D.id,title:D.title??"",column:D.column})):[],T=U.status==="fulfilled"?U.value.files.slice(0,FB):[];h(P),f(T),x(0)}catch(G){G.name!=="AbortError"&&(h([]),f([]))}finally{M.signal.aborted||b(!1)}},[s,n]);i.useEffect(()=>{if(a)return y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{w(o)},LB),()=>{y.current&&clearTimeout(y.current)}},[o,a,w]);const S=i.useCallback((E,M)=>!a||c<0?M:lv(M,c,`#${E.id}`),[a,c]),R=i.useCallback((E,M)=>!a||c<0?M:lv(M,c,`#${E.path}`),[a,c]),I=i.useCallback((E,M)=>{if(!a||j.length===0)return!1;switch(E.key){case"ArrowDown":return E.preventDefault(),x(G=>Math.min(G+1,j.length-1)),!0;case"ArrowUp":return E.preventDefault(),x(G=>Math.max(G-1,0)),!0;case"Enter":case"Tab":return j[v]?(E.preventDefault(),!0):!1;case"Escape":return E.preventDefault(),C(),!0;default:return!1}},[a,j,v,C]);return{mentionActive:a,tasks:u,files:m,combinedItems:j,loading:p,mentionQuery:o,selectedIndex:v,setSelectedIndex:x,detectMention:N,selectTask:S,selectFile:R,dismissMention:C,handleKeyDown:I}}function aj(e){const[n,s]=i.useState(2),[a,r]=i.useState("."),[o,l]=i.useState(!0),[c,d]=i.useState(!1),[u,h]=i.useState(!1),[m,f]=i.useState(!1),[p,b]=i.useState(!1),[v,x]=i.useState(void 0),[y,g]=i.useState(7200*1e3),[j,N]=i.useState(!1),[C,w]=i.useState(20),[S,R]=i.useState(!1),[I,E]=i.useState(25),[M,G]=i.useState(!1),[U,P]=i.useState(!1),[T,D]=i.useState({}),[W,Y]=i.useState(!1),[L,_]=i.useState(!1),[F,ae]=i.useState(!1),[k,z]=i.useState(!1),[J,oe]=i.useState(!1),[le,we]=i.useState(!0),re=i.useCallback(async()=>{const[O,se]=await Promise.allSettled([ay(e),Md(e)]);if(O.status==="fulfilled"&&(s(O.value.maxConcurrent),r(O.value.rootDir)),se.status==="fulfilled"){const ve=se.value;l(!!ve.autoMerge);const A=ve.testMode===!0,ne=A||ve.defaultProvider?.trim().toLowerCase()==="mock";d(A),h(ne),f(!!ve.globalPause),b(!!ve.enginePaused),G(!!ve.prAuthAvailable),x(ve.taskStuckTimeoutMs),g(ve.staleHighFanoutBlockerAgeThresholdMs??7200*1e3),R(ve.showQuickChatFAB===!0),E(ve.maxTotalRetriesBeforeFail??25),N(ve.capacityRiskBannerEnabled===!0),w(ve.capacityRiskTodoThreshold??20),D(ve.experimentalFeatures??{});const ye=ve.experimentalFeatures??{};Y(ye.insights===!0),_(ye.memoryView===!0),ae(ye.devServerView===!0||ye.devServer===!0),z(ye.todoView===!0),oe(ye.goalsView===!0);const ee=ve.autoReloadOnVersionChange!==!1;we(ee),Yd(ee)}P(!0)},[e]);i.useEffect(()=>{P(!1),D({}),Y(!1),_(!1),ae(!1),z(!1),oe(!1),re()},[re]);const H=i.useCallback(async()=>{const O=!o;l(O);try{await tc({autoMerge:O},e)}catch{l(!O)}},[o,e]),ue=i.useCallback(async()=>{const O=!m;f(O);try{await tc({globalPause:O,globalPauseReason:O?"manual":void 0},e)}catch{f(!O)}},[m,e]),Q=i.useCallback(async()=>{const O=!p;b(O);try{await tc({enginePaused:O},e)}catch{b(!O)}},[p,e]),be=i.useCallback(async()=>{const O=!S;R(O);try{await tc({showQuickChatFAB:O},e)}catch{R(!O)}},[S,e]),fe=i.useCallback(async()=>{const O=!le;we(O),Yd(O);try{await Cs({autoReloadOnVersionChange:O})}catch{we(!O),Yd(!O)}},[le]);return{maxConcurrent:n,rootDir:a,autoMerge:o,testMode:c,isTestMode:u,globalPaused:m,enginePaused:p,taskStuckTimeoutMs:v,staleHighFanoutBlockerAgeThresholdMs:y,capacityRiskBannerEnabled:j,capacityRiskTodoThreshold:C,showQuickChatFAB:S,maxTotalRetriesBeforeFail:I,prAuthAvailable:M,settingsLoaded:U,experimentalFeatures:T,insightsEnabled:W,memoryEnabled:L,devServerEnabled:F,todosEnabled:k,goalsEnabled:J,autoReloadOnVersionChange:le,toggleAutoMerge:H,toggleGlobalPause:ue,toggleEnginePause:Q,toggleShowQuickChatFAB:be,toggleAutoReloadOnVersionChange:fe,refresh:re}}function zc(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function BB(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function pm(e,n){const s=BB(),a=n?.warm===!0,r=zc(),o=new Map;let l=!1,c=!1;return{mark(u){l||c||!s||o.has(u)||o.set(u,zc())},complete:u=>{if(!s||l||c){l=!0;return}l=!0,o.set("complete",zc());const h=Array.from(o.entries()).sort((b,v)=>b[1]-v[1]);let m=r;const f={};for(const[b,v]of h)f[b]=Math.max(0,v-m),m=v;const p=Math.max(0,zc()-r);try{console.debug("[room-open]",{roomId:e,warm:a,totalMs:p,phases:f,...u??{}})}catch{}},cancel(){c=!0,l=!0}}}const Ha="fusion:chat-active-room";class UB extends Error{roomId;constructor(n,s){super(n),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=s}}function xh(e){return[...e].sort((n,s)=>new Date(s.updatedAt).getTime()-new Date(n.updatedAt).getTime())}function lo(e,n){const s=e.findIndex(r=>r.id===n.id);if(s===-1)return xh([n,...e]);const a=[...e];return a[s]=n,xh(a)}function Ea(e){try{return JSON.parse(e.data)}catch{return null}}function HB(e,n,s){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:e,role:"user",content:n,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...s?.length?{attachments:s}:{},createdAt:new Date().toISOString()}}function qB(e,n){const s=`${bn.CHAT_ROOMS}:${e??"global"}`,a=`${bn.ACTIVE_CHAT_ROOM_ID}:${e??"global"}`,r=i.useCallback(T=>`${bn.CHAT_ROOM_MESSAGES_PREFIX}${e??"global"}:${T}`,[e]),o=i.useCallback(T=>`${bn.CHAT_ROOM_MEMBERS_PREFIX}${e??"global"}:${T}`,[e]),[l,c]=i.useState(()=>{const T=ui(s,{maxAgeMs:_r});return Array.isArray(T)?T:[]}),[d,u]=i.useState(()=>l.length===0),[h,m]=i.useState(null),[f,p]=i.useState(()=>{const T=ui(a,{maxAgeMs:th});return T?l.find(D=>D.id===T)??null:null}),[b,v]=i.useState([]),[x,y]=i.useState([]),[g,j]=i.useState(!1),N=i.useRef(l),C=i.useRef(f),w=i.useRef(0),S=i.useRef(e);N.current=l,C.current=f,S.current!==e&&(S.current=e,w.current+=1);const R=i.useCallback(async T=>{if(!T){v([]),y([]),j(!1);return}const D=pm(T.id,{warm:!1});D.mark("select");const W=ui(r(T.id),{maxAgeMs:c4}),Y=ui(o(T.id),{maxAgeMs:_r}),L=Array.isArray(W)&&W.length>0,_=Array.isArray(Y)&&Y.length>0;L||_?(D.mark("cache-hit"),L&&(y(W),D.mark("hydrate")),_&&v(Y),j(!1)):(y([]),j(!0));try{const[F,ae]=await Promise.all([JM(T.id,e),nu(T.id,{limit:100,order:"desc"},e)]);D.mark("members-fetch"),D.mark("messages-fetch"),Wn(o(T.id),F.members,{maxBytes:5e5}),Wn(r(T.id),ae.messages,{maxBytes:5e5}),C.current?.id===T.id&&(v(F.members),y(ae.messages),D.mark("hydrate"))}catch{!L&&!_&&(v([]),y([]))}finally{j(!1),D.complete({warm:L,membersCached:_})}},[o,r,e]),I=i.useCallback(async()=>{N.current.length===0&&u(!0);try{const T=await WM({},e),D=xh(T.rooms);c(D),Wn(s,D,{maxBytes:5e5}),m(null);const W=ui(a,{maxAgeMs:th})??ns(Ha,e);if(W){const Y=D.find(L=>L.id===W)??null;Y?(p(Y),R(Y)):(qi(Ha,e),Wn(a,"",{maxBytes:5e5}))}}catch(T){const D=T instanceof Error?T.message:"Failed to load chat rooms";m(D),n?.(D,"error")}finally{u(!1)}},[a,n,R,e,s]),E=i.useCallback(T=>{if(!T){C.current=null,p(null),qi(Ha,e),Wn(a,"",{maxBytes:5e5}),R(null);return}const D=N.current.find(W=>W.id===T)??null;C.current=D,p(D),D&&(Ns(Ha,D.id,e),Wn(a,D.id,{maxBytes:5e5}),R(D))},[a,R,e]),M=i.useCallback(async T=>{const W=(await GM({name:T.name,memberAgentIds:T.memberAgentIds},e)).room;return c(Y=>lo(Y,W)),C.current=W,p(W),Ns(Ha,W.id,e),Wn(a,W.id,{maxBytes:5e5}),await R(W),W},[a,R,e]),G=i.useCallback(async T=>{await KM(T,e),c(D=>D.filter(W=>W.id!==T)),Wn(r(T),[],{maxBytes:5e5}),Wn(o(T),[],{maxBytes:5e5}),C.current?.id===T&&(C.current=null,p(null),v([]),y([]),qi(Ha,e),Wn(a,"",{maxBytes:5e5}))},[a,o,r,e]),U=i.useCallback(async(T,D)=>{const W=C.current,Y=W?.id;if(!Y)throw new Error("Select a room before sending a message");const L=pm(Y,{warm:!1}),_=D?.files?.map(k=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:k.name,originalName:k.name,mimeType:k.type||"application/octet-stream",size:k.size,createdAt:new Date().toISOString()})),F=HB(Y,T,_?.length?_:D?.attachments);C.current?.id===Y&&y(k=>{const z=[...k,F];return Wn(r(Y),z,{maxBytes:5e5}),z});let ae=!1;try{const k=[];if(D?.files?.length)for(const le of D.files)try{const we=await YM(Y,le,e);k.push(we.attachment)}catch{throw new Error(`Failed to upload attachment: ${le.name}`)}const z=[...D?.attachments??[],...k],J=await QM(Y,{content:T,...z.length?{attachments:z}:{}},e);ae=!0,J.message?.createdAt&&W&&c(le=>lo(le,{...W,updatedAt:J.message.createdAt})),C.current?.id===Y&&y(le=>{const we=le.map(re=>re.id===F.id?J.message:re);return Wn(r(Y),we,{maxBytes:5e5}),we});const oe=await nu(Y,{limit:100,order:"desc"},e);if(Wn(r(Y),oe.messages,{maxBytes:5e5}),C.current?.id!==Y)return;y(oe.messages),L.mark("hydrate")}catch(k){try{const z=await nu(Y,{limit:100,order:"desc"},e);Wn(r(Y),z.messages,{maxBytes:5e5}),C.current?.id===Y&&(y(z.messages),L.mark("hydrate"))}catch{C.current?.id===Y&&y(z=>{const J=z.filter(oe=>oe.id!==F.id);return Wn(r(Y),J,{maxBytes:5e5}),J})}if(ae){const z=k instanceof Error&&k.message.trim()?k.message:"Message delivered, but failed to refresh room replies";throw new UB(z,Y)}throw k}finally{L.complete({source:"send-room-message"})}},[r,e]),P=i.useCallback(async T=>{!T||!N.current.some(D=>D.id===T)||(await ZM(T,e),Wn(r(T),[],{maxBytes:5e5}),C.current?.id===T&&y([]))},[r,e]);return i.useEffect(()=>{I()},[I]),i.useEffect(()=>{const T=w.current,D=e?`/api/events?projectId=${encodeURIComponent(e)}`:"/api/events";return Si(D,{onReconnect:()=>{qs({view:"useChatRooms",trigger:"sse-reconnect",projectId:e,replayAttempted:!1});const W=C.current?.id;if(W){const Y=pm(W,{warm:!0});Y.mark("sse-reconnect-refresh"),I().finally(()=>Y.complete({source:"sse-reconnect"}));return}I()},events:{"chat:room:created":W=>{if(w.current!==T)return;const Y=Ea(W);Y&&c(L=>lo(L,Y))},"chat:room:updated":W=>{if(w.current!==T)return;const Y=Ea(W);Y&&(c(L=>lo(L,Y)),C.current?.id===Y.id&&p(Y))},"chat:room:deleted":W=>{if(w.current!==T)return;const Y=Ea(W);Y?.id&&(c(L=>L.filter(_=>_.id!==Y.id)),Wn(r(Y.id),[],{maxBytes:5e5}),Wn(o(Y.id),[],{maxBytes:5e5}),C.current?.id===Y.id&&(C.current=null,p(null),v([]),y([]),qi(Ha,e),Wn(a,"",{maxBytes:5e5})))},"chat:room:member:added":W=>{if(w.current!==T)return;const Y=Ea(W);!Y||C.current?.id!==Y.roomId||v(L=>{if(L.some(F=>F.agentId===Y.agentId))return L;const _=[...L,Y];return Wn(o(Y.roomId),_,{maxBytes:5e5}),_})},"chat:room:member:removed":W=>{if(w.current!==T)return;const Y=Ea(W);!Y||C.current?.id!==Y.roomId||v(L=>{const _=L.filter(F=>F.agentId!==Y.agentId);return Wn(o(Y.roomId),_,{maxBytes:5e5}),_})},"chat:room:message:added":W=>{if(w.current!==T)return;const Y=Ea(W);Y&&(c(L=>{const _=L.find(F=>F.id===Y.roomId);return _?lo(L,{..._,updatedAt:Y.createdAt}):L}),C.current?.id===Y.roomId&&y(L=>{if(L.some(F=>F.id===Y.id))return L;if(Y.role==="user"){const F=L.findIndex(ae=>ae.role==="user"&&ae.id.startsWith("temp-")&&ae.content.trim()===Y.content.trim());if(F>=0){const ae=[...L];return ae[F]=Y,Wn(r(Y.roomId),ae,{maxBytes:5e5}),ae}}const _=[...L,Y];return Wn(r(Y.roomId),_,{maxBytes:5e5}),_}))},"chat:room:message:updated":W=>{if(w.current!==T)return;const Y=Ea(W);!Y||C.current?.id!==Y.roomId||y(L=>{const _=L.map(F=>F.id===Y.id?Y:F);return Wn(r(Y.roomId),_,{maxBytes:5e5}),_})},"chat:room:message:deleted":W=>{if(w.current!==T)return;const Y=Ea(W);Y?.id&&y(L=>{const _=L.filter(ae=>ae.id!==Y.id),F=C.current?.id;return F&&Wn(r(F),_,{maxBytes:5e5}),_})},"chat:room:messages:cleared":W=>{if(w.current!==T)return;const Y=Ea(W);Y?.roomId&&(Wn(r(Y.roomId),[],{maxBytes:5e5}),C.current?.id===Y.roomId&&y([]),c(L=>{const _=L.find(F=>F.id===Y.roomId);return _?lo(L,{..._,updatedAt:new Date().toISOString()}):L}))}}})},[a,o,r,e,I]),i.useEffect(()=>{f&&(l.some(T=>T.id===f.id)||(C.current=null,p(null),v([]),y([]),qi(Ha,e),Wn(a,"",{maxBytes:5e5})))},[f,a,e,l]),{rooms:l,roomsLoading:d,roomsError:h,activeRoom:f,activeRoomMembers:b,messages:x,messagesLoading:g,selectRoom:E,createRoom:M,deleteRoom:G,sendRoomMessage:U,clearRoom:P,refreshRooms:I}}const ll={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},cv=200;function vh(e){if(!e)return null;const n=new Date(e).getTime();return Number.isFinite(n)?n:null}function rj(e){const n=Object.entries(e);if(n.length<=cv)return e;const s=n.map(([a,r])=>({id:a,timestamp:r,value:vh(r)??0})).sort((a,r)=>r.value-a.value).slice(0,cv);return Object.fromEntries(s.map(({id:a,timestamp:r})=>[a,r]))}function Bc(e){if(!e)return{};try{const n=JSON.parse(e);if(!n||typeof n!="object")return{};const s={};for(const[a,r]of Object.entries(n))typeof a=="string"&&typeof r=="string"&&(s[a]=r);return rj(s)}catch{return{}}}function VB(e){const[n,s]=i.useState(()=>{try{return Bc(ns(ll.direct,e))}catch{return{}}}),[a,r]=i.useState(()=>{try{return Bc(ns(ll.room,e))}catch{return{}}});i.useEffect(()=>{try{s(Bc(ns(ll.direct,e)))}catch{s({})}try{r(Bc(ns(ll.room,e)))}catch{r({})}},[e]);const o=i.useMemo(()=>({direct:n,room:a}),[n,a]),l=i.useCallback((m,f)=>{const p=rj(f);try{Ns(ll[m],JSON.stringify(p),e)}catch{}return p},[e]),c=i.useCallback((m,f)=>{if(m==="direct"){s(p=>l(m,f(p)));return}r(p=>l(m,f(p)))},[l]),d=i.useCallback((m,f,p)=>{const b=vh(p);if(b===null)return!1;const v=o[m][f],x=vh(v);return x===null?!0:b>x},[o]),u=i.useCallback((m,f,p)=>{if(!f)return;const b=p??new Date().toISOString();c(m,v=>({...v,[f]:b}))},[c]),h=i.useCallback((m,f)=>{f.length!==0&&c(m,p=>{const b={...p};for(const v of f)v.id&&(b[v.id]=v.lastActivityAt??new Date().toISOString());return b})},[c]);return{isUnread:d,markRead:u,markAllRead:h}}function WB(e){return`${e.name?.trim()||e.id} (${e.role})`}function cl(e){const n=e.trim(),s=n.indexOf("/");return!n||s<=0||s>=n.length-1?null:{modelProvider:n.slice(0,s),modelId:n.slice(s+1)}}function GB(e,n){return n?e?.name?.trim()?e.name.trim():n.modelId.replace(/[-_]/g," ").replace(/\s+/g," ").replace(/^\w/,s=>s.toUpperCase()).trim():null}function KB(e){return Math.max(40,Math.min(e,640))}function Xc(e,n){return e.length<=n?e:`${e.slice(0,n)}…`}function JB(e){if(!e)return null;const n=Object.entries(e);return n.length===0?null:n.map(([s,a])=>{const r=typeof a=="string"?a:(()=>{try{return JSON.stringify(a)}catch{return String(a)}})();return`${s}=${Xc(r,50)}`}).join(", ")}function YB(e){if(e===void 0)return null;if(typeof e=="string")return Xc(e,200);try{return Xc(JSON.stringify(e),200)}catch{return Xc(String(e),200)}}function oj(e,n=!1){if(!e||e.length===0)return null;const s=(f,p)=>{const b=f.status==="running",v=f.status==="completed"&&f.isError,x=JB(f.args),y=YB(f.result),g=b?x:y?`result: ${y}`:x?`args: ${x}`:null,j=n?null:g,N=b?"running":v?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${b?" chat-tool-call--running":""}${v?" chat-tool-call--error":""}`,open:b,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",title:f.toolName,children:f.toolName}),j&&t.jsx("span",{className:"chat-tool-call-preview",title:j,children:j}),t.jsx("span",{className:"chat-tool-call-status-text",children:N})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[x&&t.jsxs("div",{className:"chat-tool-call-row",children:[t.jsx("span",{className:"chat-tool-call-label",children:"args"}),t.jsx("span",{className:"chat-tool-call-value",children:x})]}),y&&t.jsxs("div",{className:`chat-tool-call-row${v?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:"result"}),t.jsx("span",{className:"chat-tool-call-value",children:y})]})]})]},`${f.toolName}-${p}`)},a=`chat-tool-calls${n?" chat-tool-calls--compact":""}`;if(e.length===1)return t.jsxs("div",{className:a,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(Bf,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),s(e[0],0)]});const r=e.filter(f=>f.status==="running").length,o=e.filter(f=>f.status==="completed"&&f.isError).length,l=r>0,c=Array.from(new Set(e.map(f=>f.toolName))),d=c.slice(0,5),u=Math.max(0,c.length-d.length),h=u>0?`${d.join(", ")}, +${u} more`:d.join(", "),m=l?`(${r} running)`:o>0?`(${o} ${o===1?"error":"errors"})`:null;return t.jsx("div",{className:a,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:`chat-tool-calls-group${n?" chat-tool-calls-group--compact":""}`,"data-testid":"chat-tool-calls-group",open:l,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(Bf,{size:12,"aria-hidden":"true"}),t.jsxs("span",{className:"chat-tool-calls-count",children:[e.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:h,children:h}),m&&t.jsx("span",{className:"chat-tool-calls-group-status",children:m})]}),e.map((f,p)=>s(f,p))]})})}const lj={p:({children:e,...n})=>t.jsx("p",{...n,children:ai(e)}),li:({children:e,...n})=>t.jsx("li",{...n,children:ai(e)}),pre:({children:e,...n})=>t.jsx("pre",{...n,className:"quick-chat-markdown-pre",children:e}),table:({children:e,...n})=>t.jsx("table",{...n,className:"quick-chat-markdown-table",children:e})};function dv(e){const n=/(^|[\s])\/([^\s]*)$/.exec(e);if(!n)return null;const s=n[1]??"",a=n[2]??"",r=n.index+s.length;return{filter:a,start:r,end:e.length}}function XB(e,n){const s=e.slice(0,n),a=/(^|[\s])@([\w-]*)$/.exec(s);if(!a)return null;const r=a[2]??"",o=s.length-r.length-1;return{filter:r,start:o,end:n}}const Uc={width:320,height:400},QB=new Set(["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/x-log","text/csv","application/xml","text/markdown"]),ZB=[".png",".jpg",".jpeg",".gif",".webp",".txt",".json",".yaml",".yml",".log",".csv",".xml",".md"];function e8(e){return e.type.startsWith("image/")}function t8(e){if(QB.has(e.type))return!0;const n=e.name.toLowerCase();return ZB.some(s=>n.endsWith(s))}const co={width:280,height:260},hi=768,uo=8;function n8(e,n){const s=i.useCallback(()=>{if(typeof window>"u")return 0;const N=getComputedStyle(document.documentElement).getPropertyValue("--executor-footer-height").trim();return N&&parseFloat(N)||0},[]),a=i.useCallback(()=>typeof window<"u"&&window.innerWidth<=768?{x:4,y:4+s()}:{x:24,y:24+s()},[s]),[r,o]=i.useState(()=>{if(typeof window>"u")return a();const N=`fusion-quick-chat-position-${e||"default"}`;try{const C=localStorage.getItem(N);if(C){const w=JSON.parse(C);if(typeof w.x=="number"&&typeof w.y=="number"&&!isNaN(w.x)&&!isNaN(w.y))return w}}catch{}return a()}),[l,c]=i.useState(!1),d=i.useRef(null),u=i.useRef(r),h=i.useRef(null),m=i.useRef(null),f=n??i.useRef(!1);i.useEffect(()=>{u.current=r},[r]);const p=i.useCallback(N=>{if(typeof window>"u")return N;const C=48,w=window.innerWidth<=768?4:8,S=window.innerWidth<=768?44:0,R=window.innerWidth>768?s():0,I=window.innerWidth-C-w,E=window.innerHeight-C-w-S-R;return{x:Math.max(w,Math.min(I,N.x)),y:Math.max(w,Math.min(E,N.y))}},[s]),b=i.useCallback(N=>{if(typeof window>"u")return;const C=`fusion-quick-chat-position-${e||"default"}`;try{localStorage.setItem(C,JSON.stringify(N))}catch{}},[e]),v=i.useCallback(()=>{if(!d.current)return;const N=m.current,C=h.current;N&&C!==null&&typeof N.releasePointerCapture=="function"&&N.releasePointerCapture(C),d.current=null,h.current=null,m.current=null,c(!1),document.body.style.userSelect="",f.current&&b(u.current),document.removeEventListener("pointermove",x),document.removeEventListener("pointerup",y),document.removeEventListener("pointercancel",g)},[b]),x=i.useCallback(N=>{if(!d.current||h.current!==null&&N.pointerId!==h.current)return;const C=N.clientX-d.current.pointerX,w=N.clientY-d.current.pointerY;if((Math.abs(C)>=5||Math.abs(w)>=5)&&(f.current=!0),!f.current)return;const S=d.current.x-C,R=d.current.y-w,I=p({x:S,y:R});u.current=I,o(I)},[p]),y=i.useCallback(N=>{h.current!==null&&N.pointerId!==h.current||v()},[v]),g=i.useCallback(N=>{h.current!==null&&N.pointerId!==h.current||v()},[v]),j=i.useCallback(N=>{if(N.button!==0&&N.pointerType==="mouse")return;const C=N.currentTarget;N.preventDefault(),typeof C.setPointerCapture=="function"&&C.setPointerCapture(N.pointerId);const w=u.current;d.current={x:w.x,y:w.y,pointerX:N.clientX,pointerY:N.clientY},h.current=N.pointerId,m.current=C,f.current=!1,c(!0),document.body.style.userSelect="none",document.addEventListener("pointermove",x,{passive:!0}),document.addEventListener("pointerup",y),document.addEventListener("pointercancel",g)},[g,x,y]);return i.useEffect(()=>()=>{document.removeEventListener("pointermove",x),document.removeEventListener("pointerup",y),document.removeEventListener("pointercancel",g),document.body.style.userSelect=""},[g,x,y]),{position:r,isDragging:l,handlePointerDown:j}}function s8(e,n,s){const a=`fusion:quick-chat-size-${e||"default"}`,r=i.useCallback(()=>typeof window<"u"&&window.innerWidth>hi,[]),o=i.useCallback((f,p,b)=>{if(typeof window>"u")return f;const v=Math.max(co.width,window.innerWidth-p-uo),x=Math.max(co.height,window.innerHeight-b-uo);return{width:Math.max(co.width,Math.min(v,f.width)),height:Math.max(co.height,Math.min(x,f.height))}},[]),l=i.useCallback(()=>{if(typeof window>"u"||window.innerWidth<=hi)return Uc;try{const f=localStorage.getItem(a);if(!f)return Uc;const p=JSON.parse(f);return typeof p.width!="number"||typeof p.height!="number"?Uc:{width:p.width,height:p.height}}catch{return Uc}},[a]),[c,d]=i.useState(l),[u,h]=i.useState({right:0,bottom:0});i.useEffect(()=>{if(!r())return;const f={right:n+u.right,bottom:s+u.bottom};d(p=>o(p,f.right,f.bottom))},[o,r,n,s,u]),i.useEffect(()=>{if(r())try{localStorage.setItem(a,JSON.stringify(c))}catch{}},[r,c,a]);const m=i.useCallback(f=>{if(!r())return;const p=f.currentTarget.dataset.resizeDirection;if(!p)return;f.preventDefault(),f.stopPropagation();const b=f.currentTarget;typeof b.setPointerCapture=="function"&&b.setPointerCapture(f.pointerId);const v={pointerX:f.clientX,pointerY:f.clientY,width:c.width,height:c.height,anchorRight:u.right,anchorBottom:u.bottom};document.body.style.userSelect="none";const x=g=>{const j=g.clientX-v.pointerX,N=g.clientY-v.pointerY;let C=v.width,w=v.height,S=v.anchorRight,R=v.anchorBottom;if(p.includes("w")&&(C=v.width-j),p.includes("e")){const P=j;C=v.width+P,S=v.anchorRight-P}if(p.includes("n")&&(w=v.height-N),p.includes("s")){const P=N;w=v.height+P,R=v.anchorBottom-P}const I=n+S,E=s+R,M=o({width:C,height:w},I,E),G=Math.max(uo-n,Math.min(window.innerWidth-n-co.width-uo,S)),U=Math.max(uo-s,Math.min(window.innerHeight-s-co.height-uo,R));d(M),h({right:G,bottom:U})},y=g=>{typeof b.releasePointerCapture=="function"&&b.releasePointerCapture(g.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",x),document.removeEventListener("pointerup",y);try{localStorage.setItem(a,JSON.stringify({width:c.width,height:c.height}))}catch{}};document.addEventListener("pointermove",x),document.addEventListener("pointerup",y)},[u.bottom,u.right,o,s,n,r,c.height,c.width,a]);return{panelSize:c,anchorOffset:u,handleResizeStart:m}}const gm=i.memo(function({message:n,forcePlain:s,mentionAgentsByName:a,roomContext:r,projectId:o,onToggleRender:l}){const c=n.role==="user",d=i.useMemo(()=>{if(!c)return null;const m=n.content,f=/@([\w-]+)/g,p=[];let b=0,v=f.exec(m);for(;v;){const[x,y=""]=v,g=v.index;g>b&&p.push(m.slice(b,g));const j=y.replace(/_/g," ").toLowerCase(),N=a.get(j);if(N){const C=!!(r&&!r.memberIds.has(N.id)),w=C?`Not a member of ${r?.roomName}`:void 0;p.push(t.jsxs("span",{className:`chat-mention-chip${C?" chat-mention-chip--non-member":""}`,title:w,"aria-label":w,children:["@",N.name.replace(/\s+/g,"_")]},`${N.id}-${g}`))}else p.push(x);b=g+x.length,v=f.exec(m)}return b<m.length&&p.push(m.slice(b)),p.length===0?m:p},[c,n.content,a,r]),u=i.useMemo(()=>c?null:s?t.jsx("div",{className:"quick-chat-message-content quick-chat-message-content--plain",children:zs(n.content)}):t.jsx("div",{className:"quick-chat-message-content quick-chat-message-content--markdown",children:t.jsx(ji,{remarkPlugins:[Ni],components:lj,children:n.content})}),[c,s,n.content]),h=i.useMemo(()=>{if(!n.attachments?.length||!n.roomId)return null;const m=XM(n.roomId,o);return t.jsx("div",{className:"chat-message-attachments",children:n.attachments.map(f=>{const p=`${m}${encodeURIComponent(f.filename)}`,b=f.mimeType.startsWith("image/");return t.jsx("a",{className:"chat-message-attachment",href:p,target:"_blank",rel:"noreferrer","data-testid":"quick-chat-message-attachment",children:b?t.jsx("img",{src:p,alt:f.originalName,className:"chat-attachment-image",loading:"lazy"}):t.jsx("span",{children:f.originalName})},f.id)})})},[n.attachments,n.roomId,o]);return t.jsxs("div",{className:`quick-chat-panel-message ${c?"quick-chat-panel-message--sent":"quick-chat-panel-message--received"}`,"data-testid":`quick-chat-message-${n.id}`,children:[c?t.jsx("p",{children:d}):t.jsxs(t.Fragment,{children:[u,t.jsx("button",{type:"button",className:`quick-chat-message-render-toggle${s?" quick-chat-message-render-toggle--plain":""}`,"data-testid":"quick-chat-message-render-toggle","aria-label":s?"Show rendered markdown":"Show plain text",onClick:()=>l(n.id),children:s?t.jsx(Nh,{size:14}):t.jsx($o,{size:14})})]}),h,oj(n.toolCalls,!0)]})});function i8({projectId:e,addToast:n,showFAB:s=!0,open:a,onOpenChange:r,favoriteProviders:o=[],favoriteModels:l=[],onToggleFavorite:c,onToggleModelFavorite:d,roomContext:u=null}){const{agents:h}=ij(e),{models:m,defaultProvider:f,defaultModelId:p,loading:b}=mf(),{skills:v,loading:x}=PB(e),[y,g]=i.useState(!1),j=a!==void 0,N=j?a:y,C=j?X=>{r?.(typeof X=="function"?X(N):X)}:g,{keyboardOpen:w}=Ia({enabled:N}),S=$i(),R=S==="mobile",[I,E]=i.useState("agent"),[M,G]=i.useState(""),[U,P]=i.useState(!1),[T,D]=i.useState(!1),[W,Y]=i.useState("model"),[L,_]=i.useState(""),[F,ae]=i.useState(""),[k,z]=i.useState(""),[J,oe]=i.useState(""),[le,we]=i.useState(""),[re,H]=i.useState(!1),[ue,Q]=i.useState(""),[be,fe]=i.useState(0),[O,se]=i.useState(""),[ve,A]=i.useState(!1),[ne,ye]=i.useState(0),[ee,ge]=i.useState(-1),[Ne,He]=i.useState(()=>new Set),[Le,de]=i.useState(!1),[Re,Pe]=i.useState([]),[rt,qe]=i.useState(!1),[Xe,At]=i.useState(!1),[,at]=i.useState(!1),[Se,pe]=i.useState({top:0,left:0}),_e=zB({projectId:e}),et=i.useCallback(X=>{if(!X||!_e.mentionActive)return;const $e=X.getBoundingClientRect();pe({top:$e.top-260,left:$e.left+8})},[_e.mentionActive]),Ae=i.useRef(!1),it=i.useRef(!1),xt=i.useRef(!1),Nt=i.useRef(""),Ut=i.useRef(!1),Be=i.useRef(!1),Z=i.useRef(M),Oe=i.useRef(k),ht=i.useRef(0),je=i.useRef(null),mt=i.useRef(null),Et=i.useRef(0),{position:Te,isDragging:xe,handlePointerDown:gt}=n8(e,Ae),_t=Te.y+60,{panelSize:Ft,anchorOffset:Dt,handleResizeStart:nt}=s8(e,Te.x,_t),Wt=typeof window<"u"&&window.innerWidth>hi,{activeSession:Mt,messages:Kt,isStreaming:xn,streamingText:Tn,streamingThinking:Sn,streamingToolCalls:is,sessions:On,sessionsLoading:un,messagesLoading:tn,sendMessage:on,stopStreaming:pn,pendingMessage:mn,clearPendingMessage:Zn,switchSession:In,selectSession:rn,startModelChat:hn,startFreshSession:Pn,refreshSessions:nn,skipNextSessionInitRef:$t}=RB(e,n),{experimentalFeatures:Jt}=aj(),Qt=Jt?.chatRooms===!0,ie=qB(e,n),{isUnread:Fe,markRead:Je}=VB(e),tt=i.useRef(null),Ye=i.useRef(null),vt=i.useRef(null),pt=i.useRef(null),Zt=i.useRef(null),ce=i.useRef(null),Ge=i.useRef([]),Me=i.useRef(!1),Ke=i.useRef(!1),Qe=i.useRef(!1),Lt=i.useRef(null),gn=i.useRef(!1),Bn=i.useRef(!1),wn=i.useRef({isOpen:!1,sessionId:null});i.useEffect(()=>{if(!N||typeof window>"u"||typeof document>"u"||window.innerWidth>hi)return;const X=window.scrollY,$e=document.documentElement,Ue=document.body,Ht={htmlOverflow:$e.style.overflow,bodyOverflow:Ue.style.overflow};return window.scrollTo(0,0),$e.style.overflow="hidden",Ue.style.overflow="hidden",()=>{$e.style.overflow=Ht.htmlOverflow,Ue.style.overflow=Ht.bodyOverflow,window.scrollTo(0,X)}},[N]),i.useLayoutEffect(()=>{if(!N||typeof window>"u"||!window.visualViewport)return;const X=tt.current;if(!X)return;const $e=window.visualViewport,Ue=()=>{gn.current||(X.style.setProperty("--vv-height",`${$e.height}px`),X.style.setProperty("--vv-offset-top",`${$e.offsetTop||0}px`))};return Ue(),$e.addEventListener("resize",Ue),$e.addEventListener("scroll",Ue),()=>{$e.removeEventListener("resize",Ue),$e.removeEventListener("scroll",Ue)}},[N]);const Yt=k||J,$n=i.useMemo(()=>cl(Yt),[Yt]),dn=i.useMemo(()=>I==="model"&&Mt?.modelProvider&&Mt?.modelId?`${Mt.modelProvider}/${Mt.modelId}`:Yt,[Mt?.modelId,Mt?.modelProvider,I,Yt]),me=i.useMemo(()=>cl(dn),[dn]),jt=i.useMemo(()=>m.find(X=>`${X.provider}/${X.id}`===dn)??null,[dn,m]),Cn=i.useMemo(()=>GB(jt,me),[jt,me]),bs=i.useMemo(()=>I==="model"?$n?`${xr}::${$n.modelProvider}/${$n.modelId}`:"":M?`${M}::`:"",[I,M,$n]),Ts=I==="agent"?!!M:!!$n,kn=Qt&&!!ie.activeRoom,ls=i.useMemo(()=>kn?ie.messages.map(X=>({id:X.id,sessionId:X.roomId,roomId:X.roomId,role:X.role,content:X.content,thinkingOutput:X.thinkingOutput,toolCalls:void 0,attachments:X.attachments,createdAt:X.createdAt})):Kt,[Kt,kn,ie.messages]),cs=kn?!1:!Ts||!Mt,ys=le.trim().length===0&&Re.length===0||!kn&&!Ts||!kn&&!Mt,xs=i.useMemo(()=>!!M&&On.some(X=>!X.modelProvider&&!X.modelId&&X.agentId===M),[M,On]);i.useEffect(()=>{Z.current=M},[M]),i.useEffect(()=>{Oe.current=k},[k]),i.useEffect(()=>{if(h.length===0){G(""),E("model");return}if(Ut.current&&xs)return;h.some($e=>$e.id===M)||G(h[0]?.id??"")},[h,xs,M]),i.useEffect(()=>{if(N&&(it.current||(it.current=!0,xt.current=!1),!(b||!it.current||xt.current))){if(!Oe.current&&m.length>0){if(f&&p){const $e=`${f}/${p}`;if(m.some(Ht=>`${Ht.provider}/${Ht.id}`===$e)){oe($e),Oe.current||z($e),Ut.current||E("model"),xt.current=!0;return}}oe("");const X=m[0];X&&!Oe.current&&z(`${X.provider}/${X.id}`)}xt.current=!0}},[p,f,N,m,b]),i.useEffect(()=>{N&&nn()},[N,nn]),i.useEffect(()=>{if(!N||un||Ut.current||On.length===0)return;const X=On.filter(Ht=>Ht.status!=="archived"),$e=Ht=>{if(!Ht)return 0;const cn=Date.parse(Ht);return Number.isFinite(cn)?cn:0},Ue=[...X].sort((Ht,cn)=>{const Un=Math.max($e(Ht.lastMessageAt),$e(Ht.updatedAt));return Math.max($e(cn.lastMessageAt),$e(cn.updatedAt))-Un})[0];Ue?(Ue.modelProvider&&Ue.modelId?(E("model"),z(`${Ue.modelProvider}/${Ue.modelId}`)):(E("agent"),G(Ue.agentId)),Be.current=!0,rn(Ue)):Be.current=!1,Ut.current=!0},[N,rn,On,un]),i.useEffect(()=>{if(!N){Nt.current="";return}if(!Ut.current&&On.length===0&&it.current&&!xt.current)return;if(!bs){Nt.current="";return}if($t.current){Nt.current=bs;return}const $e=bs===Nt.current&&!Mt&&!un;if(Be.current){Be.current=!1,Nt.current=bs;return}if(!(bs===Nt.current&&!$e)){if(Nt.current=bs,I==="model"&&$n){hn($n.modelProvider,$n.modelId);return}I==="agent"&&M&&In(M)}},[N,I,$n,M,bs,Mt,un,hn,In,$t]),i.useEffect(()=>{N||(Ut.current=!1,Be.current=!1,A(!1),se(""),ge(-1),H(!1),Q(""),fe(0),Ge.current.forEach(X=>{X.previewUrl&&URL.revokeObjectURL(X.previewUrl)}),Pe([]))},[N]),i.useEffect(()=>{Ge.current=Re},[Re]),i.useEffect(()=>{if(!N){Me.current=!1;return}typeof window>"u"||(Me.current=window.innerWidth<=hi)},[N]),i.useEffect(()=>{if(!N||cs||!Me.current)return;const X=pt.current;if(!X)return;const $e=document.activeElement,Ue=$e?tt.current?.contains($e):!1,Ht=$e===document.body,cn=$e===Lt.current;if(!Ue&&!Ht&&!cn){Me.current=!1;return}if(cn){X.focus({preventScroll:!0}),Me.current=!1;return}const Un=requestAnimationFrame(()=>{X.focus(),Me.current=!1});return()=>cancelAnimationFrame(Un)},[N,cs]),i.useEffect(()=>()=>{Ge.current.forEach(X=>{X.previewUrl&&URL.revokeObjectURL(X.previewUrl)})},[]);const he=i.useCallback(()=>{P(!0),Y("model"),_(h[0]?.id??""),ae(k||J||"")},[h,J,k]),bt=i.useMemo(()=>h.find(X=>X.id===M)??null,[h,M]),ot=i.useMemo(()=>{const X=ue.trim().toLowerCase();return(X?v.filter(Ue=>Ue.name.toLowerCase().includes(X)):v).slice(0,10)},[v,ue]),St=i.useMemo(()=>{const X=h.filter(Ht=>nj(Ht.name,O));if(!u)return X;const $e=X.filter(Ht=>u.memberIds.has(Ht.id));if(O.trim().length===0)return $e;const Ue=X.filter(Ht=>!u.memberIds.has(Ht.id));return[...$e,...Ue]},[h,O,u]),lt=i.useMemo(()=>{const X=new Map;for(const $e of h)X.set($e.name.toLowerCase(),$e);return X},[h]);i.useEffect(()=>{fe(0)},[ot]),i.useEffect(()=>{ye(0)},[O,ve]),i.useEffect(()=>()=>{je.current!==null&&(window.clearTimeout(je.current),je.current=null),mt.current!==null&&(window.clearTimeout(mt.current),mt.current=null)},[]),i.useEffect(()=>{if(!N)return;const X=Ue=>{const Ht=Ue.target;tt.current?.contains(Ht)||Ye.current?.contains(Ht)||Ht.closest(".model-combobox-dropdown--portal")||C(!1)},$e=Ue=>{Ue.key==="Escape"&&C(!1)};return document.addEventListener("mousedown",X),document.addEventListener("keydown",$e),()=>{document.removeEventListener("mousedown",X),document.removeEventListener("keydown",$e)}},[N,C]);const Tt=i.useCallback(()=>{const X=vt.current;if(!X)return;const Ue=X.scrollTop+X.clientHeight>=X.scrollHeight-50;At(!Ue),Bn.current=!Ue},[]),Xt=i.useCallback(X=>{if(!X.isConnected)return;let $e=0,Ue=0,Ht=-1;const cn=6,Un=()=>{if(X.isConnected){if(X.scrollTop=X.scrollHeight,X.scrollHeight===Ht?Ue+=1:(Ue=0,Ht=X.scrollHeight),$e+=1,$e>=cn||Ue>=2){At(!1),Bn.current=!1;return}window.requestAnimationFrame(Un)}};Un()},[]),zt=i.useCallback(()=>{const X=vt.current;X&&Xt(X)},[Xt]);i.useLayoutEffect(()=>{const X=kn?ie.activeRoom?.id??null:Mt?.id??null,$e=wn.current;if(wn.current={isOpen:N,sessionId:X},!N||!X)return;const Ue=!$e.isOpen&&N,Ht=$e.isOpen&&$e.sessionId!==X;if(!Ue&&!Ht)return;const cn=vt.current;cn&&Xt(cn)},[N,Mt?.id,Xt,kn,ie.activeRoom?.id]),i.useEffect(()=>{if(!R||!N||!Mt)return;const X=()=>{const Ue=vt.current;Ue&&Xt(Ue)},$e=()=>{document.visibilityState==="visible"&&X()};return document.addEventListener("visibilitychange",$e),window.addEventListener("pageshow",X),()=>{document.removeEventListener("visibilitychange",$e),window.removeEventListener("pageshow",X)}},[R,N,Mt,Xt]),i.useEffect(()=>{N&&(Bn.current||zt())},[ls,Tn,Sn,xn,N,kn,zt]),i.useEffect(()=>{Mt?.id&&Je("direct",Mt.id,Mt.lastMessageAt??Mt.updatedAt)},[Mt?.id,Mt?.lastMessageAt,Mt?.updatedAt,Je]),i.useEffect(()=>{ie.activeRoom?.id&&Je("room",ie.activeRoom.id,ie.activeRoom.updatedAt)},[Je,ie.activeRoom?.id,ie.activeRoom?.updatedAt]),i.useEffect(()=>{if(N){if(ie.activeRoom?.id){Je("room",ie.activeRoom.id,ie.activeRoom.updatedAt);return}Mt?.id&&Je("direct",Mt.id,Mt.lastMessageAt??Mt.updatedAt)}},[Mt?.id,Mt?.lastMessageAt,Mt?.updatedAt,N,Je,ie.activeRoom?.id,ie.activeRoom?.updatedAt]),i.useEffect(()=>{if(!xn){if(ie.activeRoom?.id&&ie.messages.length>0){const X=ie.messages[ie.messages.length-1];Je("room",ie.activeRoom.id,X?.createdAt??ie.activeRoom.updatedAt);return}if(Mt?.id&&Kt.length>0){const X=Kt[Kt.length-1];Je("direct",Mt.id,X?.createdAt??Mt.lastMessageAt??Mt.updatedAt)}}},[Mt?.id,Mt?.lastMessageAt,Mt?.updatedAt,xn,Je,Kt,ie.activeRoom?.id,ie.activeRoom?.updatedAt,ie.messages]);const Ee=i.useMemo(()=>{const X=new Map(h.map(Ue=>[Ue.id,Ue.name?.trim()||Ue.id])),$e=new Map(m.map(Ue=>[`${Ue.provider}/${Ue.id}`,Ue.name?.trim()||""]));return On.map((Ue,Ht)=>{const cn=Ue.title?.trim()||`Session ${Ht+1}`;let Un=null;if(Ue.agentId&&Ue.agentId!==xr)Un=X.get(Ue.agentId)||Ue.agentId;else if(Ue.modelProvider&&Ue.modelId){const as=`${Ue.modelProvider}/${Ue.modelId}`,$s=$e.get(as);Un=$s?`${$s} [${as}]`:as}return{id:Ue.id,label:Un?`${cn} — ${Un}`:cn}})},[h,m,On]),yt=i.useMemo(()=>Qt?ie.rooms:[],[Qt,ie.rooms]),Rt=Qt&&yt.length>0,yn=i.useMemo(()=>{if(Rt&&kn&&ie.activeRoom)return`#${ie.activeRoom.name}`;const X=Ee.find($e=>$e.id===Mt?.id);return X?X.label:un?"Loading sessions…":"Select a session"},[Mt?.id,kn,ie.activeRoom,Ee,un,Rt]);i.useEffect(()=>{N||D(!1)},[N]),i.useEffect(()=>{if(!T)return;const X=Ue=>{const Ht=Ue.target;Zt.current?.contains(Ht)||D(!1)},$e=Ue=>{Ue.key==="Escape"&&D(!1)};return document.addEventListener("mousedown",X),document.addEventListener("keydown",$e),()=>{document.removeEventListener("mousedown",X),document.removeEventListener("keydown",$e)}},[T]);const _n=i.useMemo(()=>kn&&ie.activeRoom?`Message #${ie.activeRoom.name}`:I==="agent"?bt?`Message ${bt.name||bt.id}`:"Select an agent to start chatting":Cn?`Message ${Cn}`:"Select a model to start chatting",[I,kn,ie.activeRoom?.name,bt,Cn]),Dn=i.useCallback(X=>{const $e=On.find(Ue=>Ue.id===X);if($e){if(kn&&ie.selectRoom(null),Je("direct",$e.id,$e.lastMessageAt??$e.updatedAt),Ut.current=!0,$e.modelProvider&&$e.modelId){const Ue=`${xr}::${$e.modelProvider}/${$e.modelId}`;Be.current=!0,Nt.current=Ue,E("model"),z(`${$e.modelProvider}/${$e.modelId}`)}else{const Ue=`${$e.agentId}::`;Be.current=!0,Nt.current=Ue,E("agent"),G($e.agentId)}rn($e),D(!1)}},[Je,kn,ie,rn,On]),an=i.useCallback(X=>{const $e=ie.rooms.find(Ue=>Ue.id===X);Je("room",X,$e?.updatedAt),ie.selectRoom(X),Ut.current=!0,D(!1)},[Je,ie]),En=i.useCallback(async()=>{if(!un){if(Ut.current=!0,W==="agent"){if(!L)return;E("agent"),G(L),await Pn(L)}else{const X=cl(F||k||J);if(!X)return;E("model"),z(`${X.modelProvider}/${X.modelId}`),await Pn(xr,X.modelProvider,X.modelId)}await nn(),P(!1),Y("model")}},[J,L,W,F,nn,k,un,Pn]),ws=mn.length>50?`${mn.slice(0,50)}…`:mn,Is=i.useCallback(X=>{if(!X||X.length===0)return;const $e=[];for(let Ue=0;Ue<X.length;Ue+=1){const Ht=X[Ue];t8(Ht)&&$e.push({file:Ht,previewUrl:e8(Ht)?URL.createObjectURL(Ht):""})}$e.length>0&&Pe(Ue=>[...Ue,...$e])},[]),ks=i.useCallback(X=>{Pe($e=>{const Ue=$e[X];return Ue?.previewUrl&&URL.revokeObjectURL(Ue.previewUrl),$e.filter((Ht,cn)=>cn!==X)})},[]),V=i.useCallback(X=>{Is(X.clipboardData?.files)},[Is]),We=i.useCallback(()=>{if(typeof window>"u"||window.innerWidth>hi)return;const X=pt.current;!X||X.disabled||X.focus({preventScroll:!0})},[]),wt=i.useCallback(()=>{typeof window>"u"||window.innerWidth>hi||(Qe.current=!0)},[]),ut=i.useCallback(async()=>{const X=le.trim(),$e=Ge.current;if(!(!X&&$e.length===0)&&!cs){if(we(""),A(!1),se(""),ge(-1),X==="/help"){de(!0),We(),Qe.current=!1;return}if(X==="/clear"||X==="/new"){$e.forEach(Ue=>{Ue.previewUrl&&URL.revokeObjectURL(Ue.previewUrl)}),Pe(Ue=>Ue.filter(Ht=>!$e.includes(Ht)));try{if(kn&&ie.activeRoom?.id)await ie.clearRoom(ie.activeRoom.id),de(!1);else if(I==="model"){Zn(),pn();const Ue=cl(Yt);if(!Ue)return;await Pn(xr,Ue.modelProvider,Ue.modelId)}else M&&(Zn(),pn(),await Pn(M))}catch{n("Failed to clear conversation","error")}finally{We(),Qe.current=!1}return}try{de(!1),Qt&&ie.activeRoom?await ie.sendRoomMessage(X,{files:$e.map(Ue=>Ue.file)}):await on(X,$e.map(Ue=>Ue.file)),$e.forEach(Ue=>{Ue.previewUrl&&URL.revokeObjectURL(Ue.previewUrl)}),Pe(Ue=>Ue.filter(Ht=>!$e.includes(Ht)))}catch(Ue){const Ht=Ue instanceof Error&&Ue.message.trim()?Ue.message:Qt&&ie.activeRoom?"Failed to send room message":"Failed to send message";n(Ht,"error")}finally{We(),Qe.current=!1}}},[n,I,Qt,Zn,We,cs,le,Yt,kn,ie,M,on,Pn,pn]),Bt=i.useCallback(X=>{X.preventDefault(),Et.current+=1,qe(!0)},[]),en=i.useCallback(X=>{X.preventDefault(),X.dataTransfer.dropEffect="copy",qe(!0)},[]),jn=i.useCallback(X=>{X.preventDefault(),Et.current=Math.max(0,Et.current-1),Et.current===0&&qe(!1)},[]),ts=i.useCallback(X=>{X.preventDefault(),Et.current=0,qe(!1),Is(X.dataTransfer?.files)},[Is]),vs=i.useCallback((X,$e)=>{const Ue=XB(X,$e);if(Ue){A(!0),se(Ue.filter),ge(Ue.start);return}A(!1),se(""),ge(-1)},[]),Ps=i.useCallback((X=pt.current)=>{X&&(X.style.height="auto",X.style.height=`${KB(X.scrollHeight)}px`)},[]),te=i.useCallback(X=>{we($e=>{const Ue=dv($e);if(!Ue)return $e;const Ht=`/skill:${X.name} `,cn=$e.slice(0,Ue.start)+Ht+$e.slice(Ue.end);return window.requestAnimationFrame(()=>{pt.current&&(Ps(pt.current),pt.current.focus())}),cn}),H(!1),Q(""),fe(0)},[Ps]),Ie=i.useCallback(X=>{const $e=pt.current;if(!$e||ee<0)return;const Ue=$e.selectionStart??ht.current,Ht=$e.selectionEnd??Ue,cn=Math.max(Ue,Ht),Un=Math.min(ee,cn),$s=`${`@${X.name.replace(/\s+/g,"_")}`} `,Fs=le.slice(0,Un)+$s+le.slice(cn),js=Un+$s.length;we(Fs),A(!1),se(""),ye(0),ge(-1),window.requestAnimationFrame(()=>{pt.current&&(Ps(pt.current),pt.current.focus(),pt.current.setSelectionRange(js,js))})},[ee,le,Ps]),ft=i.useCallback((X,$e)=>{const Ht=pt.current?.selectionStart??ht.current,cn=le.lastIndexOf("#",Ht),Un=cn>=0?cn+$e.length:X.length;we(X),_e.dismissMention(),at(!1),window.requestAnimationFrame(()=>{pt.current&&(Ps(pt.current),pt.current.focus(),pt.current.setSelectionRange(Un,Un))})},[_e,le,Ps]),Vt=i.useCallback(X=>{const $e=X.target.value,Ue=X.target.selectionStart??$e.length;Ps(X.target),ht.current=Ue,we($e),Le&&$e.trim().length>0&&de(!1),vs($e,Ue);const Ht=dv($e);Ht?(H(!0),Q(Ht.filter)):(H(!1),Q("")),_e.detectMention($e,Ue),at(_e.mentionActive),_e.mentionActive&&et(X.target)},[_e,Le,Ps,et,vs]);i.useLayoutEffect(()=>{Ps()},[le,Ps]);const qt=i.useCallback(()=>{if(Qe.current){window.requestAnimationFrame(()=>{We()});return}typeof window<"u"&&window.innerWidth<=hi&&tt.current&&(gn.current=!0,tt.current.style.removeProperty("--vv-height"),tt.current.style.removeProperty("--vv-offset-top"),window.setTimeout(()=>{gn.current=!1},450)),je.current!==null&&window.clearTimeout(je.current),je.current=window.setTimeout(()=>{A(!1),se(""),ge(-1),at(!1),_e.dismissMention(),je.current=null},120),mt.current!==null&&window.clearTimeout(mt.current),mt.current=window.setTimeout(()=>{H(!1),mt.current=null},120)},[_e,We]),ln=i.useCallback(()=>{gn.current=!1,je.current!==null&&(window.clearTimeout(je.current),je.current=null),mt.current!==null&&(window.clearTimeout(mt.current),mt.current=null)},[]),Mn=i.useCallback(X=>{const $e=X.currentTarget,Ue=$e.selectionStart??$e.value.length;ht.current=Ue,vs($e.value,Ue),_e.detectMention($e.value,Ue),at(_e.mentionActive),_e.mentionActive&&et($e)},[vs,_e,et]),Rn=i.useCallback(X=>{X.key!=="Escape"&&Mn(X)},[Mn]),Kn=i.useCallback(X=>{He($e=>{const Ue=new Set($e);return Ue.has(X)?Ue.delete(X):Ue.add(X),Ue})},[]),ds=i.useCallback((X,$e=!1)=>$e?t.jsx("div",{className:"quick-chat-message-content quick-chat-message-content--plain",children:zs(X)}):t.jsx("div",{className:"quick-chat-message-content quick-chat-message-content--markdown",children:t.jsx(ji,{remarkPlugins:[Ni],components:lj,children:X})}),[]),Jn=i.useCallback(X=>{if(ht.current=X.currentTarget.selectionStart??ht.current,_e.mentionActive&&_e.combinedItems.length>0){if(_e.handleKeyDown(X,le),X.key==="Enter"||X.key==="Tab"){const $e=_e.combinedItems[_e.selectedIndex];$e?.kind==="task"?ft(_e.selectTask($e.task,le),`#${$e.task.id}`):$e?.kind==="file"&&ft(_e.selectFile($e.file,le),`#${$e.file.path}`)}return}if(ve&&X.key==="ArrowDown"){X.preventDefault(),St.length>0&&ye($e=>($e+1)%St.length);return}if(ve&&X.key==="ArrowUp"){X.preventDefault(),St.length>0&&ye($e=>$e===0?St.length-1:$e-1);return}if(ve&&X.key==="Enter"){X.preventDefault();const $e=St[ne]??St[0];$e&&Ie($e);return}if(ve&&X.key==="Escape"){X.preventDefault(),X.stopPropagation(),A(!1),se(""),ge(-1);return}if(re&&ot.length>0&&X.key==="ArrowDown"){X.preventDefault(),fe($e=>($e+1)%ot.length);return}if(re&&ot.length>0&&X.key==="ArrowUp"){X.preventDefault(),fe($e=>$e===0?ot.length-1:$e-1);return}if(re&&(X.key==="Enter"||X.key==="Tab")){X.preventDefault();const $e=ot[be]??ot[0];$e&&te($e);return}if(re&&X.key==="Escape"){X.preventDefault(),H(!1),Q("");return}X.key!=="Enter"||X.shiftKey||(X.preventDefault(),ut())},[ve,St,ne,Ie,ut,_e,ft,le,re,ot,be,te]),Us=i.useCallback(()=>{if(Ae.current){Ae.current=!1;return}if(N){C(!1);return}typeof window<"u"&&window.innerWidth<=hi&&Lt.current?.focus({preventScroll:!0}),C(!0)},[N,C]);return t.jsxs(t.Fragment,{children:[t.jsx("input",{ref:Lt,type:"text",className:"quick-chat-stealth-input","aria-hidden":"true",tabIndex:-1}),s&&t.jsx("button",{ref:Ye,type:"button",className:"quick-chat-fab","aria-label":"Open quick chat","data-testid":"quick-chat-fab","data-dragging":xe?"true":"false",style:{right:Te.x,bottom:Te.y},onPointerDown:gt,onClick:Us,children:t.jsx(fa,{size:24})}),N&&t.jsxs("div",{className:`quick-chat-panel${R&&w?" quick-chat-panel--keyboard-open":""}`,ref:tt,"data-testid":"quick-chat-panel",style:{...Wt?{right:Te.x+Dt.right,bottom:_t+Dt.bottom,width:Ft.width,height:Ft.height}:{}},children:[Wt&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"n","data-testid":"quick-chat-resize-n",onPointerDown:nt,role:"separator","aria-orientation":"horizontal","aria-label":"Resize panel from top"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"s","data-testid":"quick-chat-resize-s",onPointerDown:nt,role:"separator","aria-orientation":"horizontal","aria-label":"Resize panel from bottom"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"e","data-testid":"quick-chat-resize-e",onPointerDown:nt,role:"separator","aria-orientation":"vertical","aria-label":"Resize panel from right"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"w","data-testid":"quick-chat-resize-w",onPointerDown:nt,role:"separator","aria-orientation":"vertical","aria-label":"Resize panel from left"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"nw","data-testid":"quick-chat-resize-nw",onPointerDown:nt,role:"separator","aria-label":"Resize panel from top-left corner"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"ne","data-testid":"quick-chat-resize-ne",onPointerDown:nt,role:"separator","aria-label":"Resize panel from top-right corner"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"sw","data-testid":"quick-chat-resize-sw",onPointerDown:nt,role:"separator","aria-label":"Resize panel from bottom-left corner"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"se","data-testid":"quick-chat-resize-se",onPointerDown:nt,role:"separator","aria-label":"Resize panel from bottom-right corner"})]}),t.jsxs("div",{className:"quick-chat-panel-header",children:[t.jsxs("div",{className:"quick-chat-panel-title-wrap",children:[t.jsx("h3",{children:"Quick Chat"}),kn&&ie.activeRoom?t.jsxs("span",{className:"quick-chat-model-tag","data-testid":"quick-chat-room-tag",title:`#${ie.activeRoom.name}`,children:["#",ie.activeRoom.name]}):I==="model"&&Cn&&(()=>{const X=jt?.provider??me?.modelProvider??"";return S==="mobile"&&Cn.length>12&&X?t.jsx("span",{className:"quick-chat-model-tag quick-chat-model-tag--icon","data-testid":"quick-chat-model-tag",title:Cn,"aria-label":Cn,children:t.jsx(rs,{provider:X,size:"sm"})}):t.jsx("span",{className:"quick-chat-model-tag","data-testid":"quick-chat-model-tag",title:Cn,children:Cn})})()]}),t.jsxs("div",{className:"quick-chat-panel-header-actions",children:[t.jsx("button",{type:"button",className:"btn-icon quick-chat-new-chat-btn","data-testid":"quick-chat-new-thread","aria-label":"Start a new chat",onClick:he,disabled:un,children:t.jsx(os,{size:16})}),t.jsx("button",{type:"button",className:"btn-icon","aria-label":"Close quick chat","data-testid":"quick-chat-close",onClick:()=>C(!1),children:t.jsx(Nn,{size:16})})]})]}),t.jsx("div",{className:"quick-chat-panel-agent-select","data-testid":"quick-chat-session-select",children:t.jsxs("div",{className:"quick-chat-session-menu",ref:Zt,children:[t.jsx("label",{htmlFor:"quick-chat-session-dropdown-trigger",className:"visually-hidden",children:"Select session"}),t.jsx("input",{type:"hidden","data-testid":"quick-chat-session-dropdown",value:Rt&&kn?"":Mt?.id??"",readOnly:!0}),t.jsxs("button",{id:"quick-chat-session-dropdown-trigger",type:"button",className:"btn quick-chat-session-trigger","aria-haspopup":"menu","aria-expanded":T,"data-testid":"quick-chat-session-dropdown-trigger",onClick:()=>D(X=>!X),children:[kn&&ie.activeRoom?t.jsx(Uv,{size:16,"aria-hidden":"true"}):Mt?.modelProvider?t.jsx(rs,{provider:Mt.modelProvider,size:"sm"}):t.jsx(fa,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:yn}),t.jsx(Ln,{size:16,"aria-hidden":"true"})]}),T&&t.jsxs("div",{className:"quick-chat-session-dropdown",role:"menu","data-testid":"quick-chat-session-dropdown-menu",children:[Rt&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"quick-chat-session-dropdown-group-label",children:"Rooms"}),yt.map(X=>{const $e=ie.activeRoom?.id===X.id,Ue=!$e&&Fe("room",X.id,X.updatedAt);return t.jsxs("button",{type:"button",role:"menuitem","data-testid":`quick-chat-session-option-room-${X.slug}`,className:`quick-chat-session-option${$e?" quick-chat-session-option--active":""}`,onClick:()=>an(X.id),children:[t.jsxs("span",{children:["#",X.name]}),Ue?t.jsx("span",{className:"chat-unread-dot quick-chat-session-unread-dot","data-testid":`quick-chat-unread-dot-${X.id}`,"aria-label":"Unread messages"}):null]},X.id)}),t.jsx("div",{className:"quick-chat-session-dropdown-group-label",children:"Sessions"})]}),Ee.map(X=>{const $e=!kn&&Mt?.id===X.id,Ue=On.find(cn=>cn.id===X.id),Ht=!$e&&Fe("direct",X.id,Ue?.lastMessageAt??Ue?.updatedAt);return t.jsxs("button",{type:"button",role:"menuitem","data-testid":`quick-chat-session-option-${X.id}`,className:`quick-chat-session-option${$e?" quick-chat-session-option--active":""}`,onClick:()=>Dn(X.id),children:[t.jsx("span",{children:X.label}),Ht?t.jsx("span",{className:"chat-unread-dot quick-chat-session-unread-dot","data-testid":`quick-chat-unread-dot-${X.id}`,"aria-label":"Unread messages"}):null]},X.id)})]})]})}),U&&t.jsxs("div",{className:"quick-chat-new-session-chooser","data-testid":"quick-chat-new-session-chooser",children:[t.jsxs("div",{className:"quick-chat-inline-mode-toggle","data-testid":"quick-chat-inline-mode-toggle",children:[t.jsx("button",{type:"button",className:`quick-chat-mode-btn${W==="model"?" quick-chat-mode-btn--active":""}`,"data-testid":"quick-chat-inline-mode-model",onClick:()=>Y("model"),children:"Model"}),t.jsx("button",{type:"button",className:`quick-chat-mode-btn${W==="agent"?" quick-chat-mode-btn--active":""}`,"data-testid":"quick-chat-inline-mode-agent",onClick:()=>Y("agent"),children:"Agent"})]}),W==="agent"?t.jsxs("div",{className:"quick-chat-panel-agent-select",children:[t.jsx("label",{htmlFor:"quick-chat-new-agent-select",className:"visually-hidden",children:"Select agent for new chat"}),t.jsx("select",{id:"quick-chat-new-agent-select",value:L,onChange:X=>_(X.target.value),"data-testid":"quick-chat-new-agent-select",children:h.map(X=>t.jsx("option",{value:X.id,children:WB(X)},X.id))})]}):t.jsx("div",{className:"quick-chat-panel-agent-select","data-testid":"quick-chat-new-model-select",children:t.jsx(ri,{id:"quick-chat-new-model-select",models:m,value:F,onChange:ae,label:"Select model override",placeholder:b?"Loading models…":"Select a model",disabled:b||m.length===0,favoriteProviders:o,favoriteModels:l,onToggleFavorite:c,onToggleModelFavorite:d})}),t.jsxs("div",{className:"quick-chat-new-session-actions",children:[t.jsx("button",{type:"button",className:"btn","data-testid":"quick-chat-new-session-cancel",onClick:()=>{P(!1),Y("model")},children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary","data-testid":"quick-chat-new-session-submit",onClick:()=>void En(),disabled:un||(W==="agent"?!L:!cl(F||k||J)),children:"Create"})]})]}),t.jsx("div",{className:"quick-chat-panel-messages",ref:vt,"data-testid":"quick-chat-messages",onScroll:Tt,children:un?t.jsx("div",{className:"quick-chat-panel-empty",children:"Loading conversation…"}):!kn&&xn?t.jsxs(t.Fragment,{children:[ls.map(X=>t.jsx(gm,{message:X,forcePlain:X.role!=="user"&&Ne.has(X.id),mentionAgentsByName:lt,roomContext:u,projectId:e,onToggleRender:Kn},X.id)),Le&&t.jsx("div",{className:"quick-chat-panel-message quick-chat-panel-message--received","data-testid":"quick-chat-help-message",children:ds("Available commands:\n- `/new` or `/clear` — Clear conversation and start fresh\n- `/skill:{name}` — Use a specific skill\n- `/help` — Show this help")}),t.jsxs("div",{className:"quick-chat-panel-message quick-chat-panel-message--received quick-chat-panel-message--streaming","data-testid":"quick-chat-streaming-message",children:[Tn?t.jsxs(t.Fragment,{children:[t.jsx("div",{"data-testid":"quick-chat-streaming-text",children:ds(Tn,Ne.has("__streaming__"))}),t.jsx("button",{type:"button",className:`quick-chat-message-render-toggle${Ne.has("__streaming__")?" quick-chat-message-render-toggle--plain":""}`,"data-testid":"quick-chat-message-render-toggle","aria-label":Ne.has("__streaming__")?"Show rendered markdown":"Show plain text",onClick:()=>Kn("__streaming__"),children:Ne.has("__streaming__")?t.jsx(Nh,{size:14}):t.jsx($o,{size:14})})]}):t.jsx("p",{className:"quick-chat-panel-waiting","data-testid":"quick-chat-waiting",children:Sn?"Thinking…":"Connecting…"}),oj(is,!0),Sn&&t.jsxs("details",{className:"chat-message-thinking","data-testid":"quick-chat-streaming-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:zs(Sn)})]})]})]}):kn?ie.messagesLoading?t.jsx("div",{className:"quick-chat-panel-empty",children:"Loading conversation…"}):ls.length===0&&!Le?t.jsx("div",{className:"quick-chat-panel-empty",children:"No messages yet. Start the conversation!"}):t.jsxs(t.Fragment,{children:[ls.map(X=>t.jsx(gm,{message:X,forcePlain:X.role!=="user"&&Ne.has(X.id),mentionAgentsByName:lt,roomContext:u,projectId:e,onToggleRender:Kn},X.id)),Le&&t.jsx("div",{className:"quick-chat-panel-message quick-chat-panel-message--received","data-testid":"quick-chat-help-message",children:ds("Available commands:\n- `/new` or `/clear` — Clear conversation and start fresh\n- `/skill:{name}` — Use a specific skill\n- `/help` — Show this help")})]}):tn?t.jsx("div",{className:"quick-chat-panel-empty",children:"Loading conversation…"}):ls.length===0&&!Tn&&!Sn&&!xn&&!Le?t.jsx("div",{className:"quick-chat-panel-empty",children:"No messages yet. Start the conversation!"}):t.jsxs(t.Fragment,{children:[ls.map(X=>t.jsx(gm,{message:X,forcePlain:X.role!=="user"&&Ne.has(X.id),mentionAgentsByName:lt,roomContext:u,projectId:e,onToggleRender:Kn},X.id)),Le&&t.jsx("div",{className:"quick-chat-panel-message quick-chat-panel-message--received","data-testid":"quick-chat-help-message",children:ds("Available commands:\n- `/new` or `/clear` — Clear conversation and start fresh\n- `/skill:{name}` — Use a specific skill\n- `/help` — Show this help")})]})}),Xe&&t.jsxs("button",{type:"button",className:"btn btn-sm quick-chat-jump-to-latest","data-testid":"quick-chat-jump-to-latest",onClick:zt,children:[t.jsx(Ln,{size:14}),"Latest"]}),Re.length>0&&t.jsx("div",{className:"quick-chat-attachment-previews","data-testid":"quick-chat-attachment-previews",children:Re.map((X,$e)=>t.jsxs("div",{className:"quick-chat-attachment-preview","data-testid":`quick-chat-attachment-preview-${$e}`,children:[X.previewUrl?t.jsx("img",{src:X.previewUrl,alt:X.file.name}):t.jsx("span",{className:"quick-chat-attachment-preview-name",children:X.file.name}),t.jsx("button",{type:"button",className:"quick-chat-attachment-remove","data-testid":`quick-chat-attachment-remove-${$e}`,"aria-label":`Remove ${X.file.name}`,onClick:()=>ks($e),children:"×"})]},`${X.file.name}-${$e}`))}),t.jsx("div",{className:"quick-chat-panel-input",children:t.jsxs("div",{className:`quick-chat-input-wrapper${rt?" quick-chat-input-wrapper--dragover":""}`,onDragEnter:Bt,onDragOver:en,onDragLeave:jn,onDrop:ts,children:[t.jsx("input",{ref:ce,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,tabIndex:-1,"aria-hidden":"true",className:"quick-chat-attachment-input",onChange:X=>{Is(X.target.files),X.target.value=""}}),t.jsxs("div",{className:"quick-chat-input-row","data-testid":"quick-chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon quick-chat-attach-btn","data-testid":"quick-chat-attach-btn","aria-label":"Attach files",onClick:()=>ce.current?.click(),children:t.jsx(qv,{size:16})}),t.jsx("textarea",{ref:pt,rows:1,className:"quick-chat-textarea",value:le,onChange:Vt,onKeyDown:Jn,onKeyUp:Rn,onClick:Mn,onBlur:qt,onFocus:ln,onPaste:V,onTouchStart:X=>{typeof window>"u"||window.innerWidth>hi||Hh()&&document.activeElement!==X.currentTarget&&(X.preventDefault(),X.currentTarget.focus({preventScroll:!0}))},placeholder:_n,disabled:cs,"data-testid":"quick-chat-input"}),xn?t.jsx("button",{type:"button",className:"chat-input-stop quick-chat-send-btn",onPointerDown:X=>{typeof window>"u"||window.innerWidth>hi||(X.preventDefault(),X.pointerType&&X.pointerType!=="mouse"&&(Ke.current=!0,pn()))},onTouchStart:X=>{typeof window>"u"||window.innerWidth>hi||(X.preventDefault(),Ke.current=!0,pn())},onMouseDown:X=>{typeof window>"u"||window.innerWidth>hi||X.preventDefault()},onClick:()=>{if(Ke.current){Ke.current=!1;return}pn()},"aria-label":"Stop generation","data-testid":"quick-chat-stop",children:t.jsx(ca,{size:14})}):t.jsx("button",{type:"button",className:"quick-chat-send-btn",onPointerDown:X=>{typeof window>"u"||window.innerWidth>hi||(X.preventDefault(),X.pointerType&&X.pointerType!=="mouse"&&(Ke.current=!0,wt(),We(),ut()))},onTouchStart:X=>{typeof window>"u"||window.innerWidth>hi||(X.preventDefault(),Ke.current=!0,wt(),We(),ut())},onMouseDown:X=>{typeof window>"u"||window.innerWidth>hi||X.preventDefault()},onClick:()=>{if(Ke.current){Ke.current=!1;return}ut()},disabled:ys,"data-testid":"quick-chat-send",children:t.jsx(vr,{size:16})})]}),t.jsx(NB,{agents:h,filter:O,highlightedIndex:ne,visible:ve,onSelect:Ie,position:"above",roomMemberIds:u?.memberIds,roomName:u?.roomName}),t.jsx(DB,{visible:_e.mentionActive&&!ve,position:Se,tasks:_e.tasks,files:_e.files,selectedIndex:_e.selectedIndex,onSelectTask:X=>{ft(_e.selectTask(X,le),`#${X.id}`)},onSelectFile:X=>{ft(_e.selectFile(X,le),`#${X.path}`)},loading:_e.loading}),re&&t.jsx("div",{className:"chat-skill-menu","data-testid":"quick-chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:x?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):ot.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:ue?"No skills found":"No skills available"}):ot.map((X,$e)=>t.jsxs("button",{type:"button",role:"option","aria-selected":$e===be,className:`chat-skill-menu-item${$e===be?" chat-skill-menu-item--highlighted":""}`,onMouseDown:Ue=>Ue.preventDefault(),onMouseEnter:()=>fe($e),onClick:()=>te(X),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:X.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:X.relativePath,children:X.relativePath})]},X.id))}),!kn&&mn&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${ws}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:Zn,children:"×"})]})]})})]})]})}function dl(e){if(!e)return 0;const n=Date.parse(e);return Number.isFinite(n)?n:0}function uv(e){return e.status==="generating"||e.status==="awaiting_input"}function ul(e){return e==="complete"||e==="error"}function a8(e){const[n,s]=i.useState([]),a=i.useRef(new Map),r=i.useRef(new Map),{sessions:o,broadcastUpdate:l,broadcastCompleted:c,requestSync:d}=Bo(),u=i.useCallback(()=>{Ph(e).then(p=>{const b=p.filter(x=>{const y=dl(x.updatedAt),g=r.current.get(x.id);return g===void 0?!0:y<=g?!1:(r.current.delete(x.id),!0)}),v=new Map;for(const x of b)v.set(x.id,dl(x.updatedAt));a.current=v,s(b)}).catch(p=>{console.warn("[useBackgroundSessions] Failed to fetch AI sessions:",p)})},[e]);i.useEffect(()=>{d(),u()},[u,d]),i.useEffect(()=>{s(p=>{if(o.size===0)return p;let b=!1;const v=new Map(p.map(x=>[x.id,x]));for(const x of o.values()){if(e&&x.projectId&&x.projectId!==e)continue;const y=x.lastEventTimestamp,g=a.current.get(x.sessionId)??0;if(y<g)continue;const j=r.current.get(x.sessionId);if(j!==void 0&&y<=j)continue;if(j!==void 0&&y>j&&!ul(x.status)&&r.current.delete(x.sessionId),ul(x.status)){v.delete(x.sessionId)&&(b=!0),a.current.set(x.sessionId,y);continue}const N=v.get(x.sessionId),C=x.type??N?.type,w=x.title??N?.title;if(!N&&(!C||!w))continue;const S={id:x.sessionId,type:C??"planning",status:x.status,title:w??"AI Session",projectId:x.projectId??N?.projectId??e??null,lockedByTab:x.owningTabId??N?.lockedByTab??null,updatedAt:x.updatedAt??N?.updatedAt??new Date(y).toISOString()},R=v.get(x.sessionId);(!R||R.status!==S.status||R.title!==S.title||R.type!==S.type||R.projectId!==S.projectId||R.lockedByTab!==S.lockedByTab||R.updatedAt!==S.updatedAt)&&(v.set(x.sessionId,S),a.current.set(x.sessionId,y),b=!0)}return b?[...v.values()].sort((x,y)=>dl(y.updatedAt)-dl(x.updatedAt)):p})},[e,o]),i.useEffect(()=>{const p=e?`?projectId=${encodeURIComponent(e)}`:"",b=g=>{try{const j=JSON.parse(g.data),N=dl(j.updatedAt)||Date.now();s(C=>{const w=a.current.get(j.id)??0;if(N<w)return C;const S=r.current.get(j.id);if(S!==void 0&&N<=S)return C;if(S!==void 0&&N>S&&!ul(j.status)&&r.current.delete(j.id),a.current.set(j.id,N),ul(j.status))return C.filter(I=>I.id!==j.id);const R=C.findIndex(I=>I.id===j.id);if(R>=0){const I=[...C];return I[R]=j,I}return uv(j)?[j,...C]:C}),l({sessionId:j.id,status:j.status,needsInput:j.status==="awaiting_input",type:j.type,title:j.title,projectId:j.projectId,owningTabId:j.lockedByTab,updatedAt:j.updatedAt,timestamp:N}),ul(j.status)&&c({sessionId:j.id,status:j.status,timestamp:N})}catch{}},v=g=>{try{const j=JSON.parse(g.data),N=Date.now();r.current.set(j,N),a.current.set(j,Math.max(a.current.get(j)??0,N)),c({sessionId:j,status:"complete",timestamp:N}),s(C=>C.filter(w=>w.id!==j))}catch{}},x=`/api/events${p}`,y=Si(x,{events:{"ai_session:updated":b,"ai_session:deleted":v},onReconnect:()=>{qs({view:"useBackgroundSessions",trigger:"sse-reconnect",projectId:e,replayAttempted:!1,sseChannel:x}),u()}});return qs({view:"useBackgroundSessions",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:x}),y},[c,l,e,u]);const h=i.useCallback(async p=>{const v=n.find(j=>j.id===p)?.type,x=Pr();let y=!1;if(v==="planning")try{await ly(p,e,x)}catch(j){y=!0,j instanceof Error&&j.message.includes("locked")&&console.warn(`[useBackgroundSessions] Forcing dismiss of planning session ${p} despite lock by another tab`)}else if(v==="subtask")try{await uy(p,e,x)}catch(j){y=!0,j instanceof Error&&j.message.includes("locked")&&console.warn(`[useBackgroundSessions] Forcing dismiss of subtask session ${p} despite lock by another tab`)}else if(v==="mission_interview")try{await gy(p,e,x)}catch(j){y=!0,j instanceof Error&&j.message.includes("locked")&&console.warn(`[useBackgroundSessions] Forcing dismiss of mission interview session ${p} despite lock by another tab`)}y&&console.warn(`[useBackgroundSessions] Cancellation failed for session ${p}, attempting delete anyway`);const g=Date.now();r.current.set(p,g),a.current.set(p,Math.max(a.current.get(p)??0,g)),c({sessionId:p,status:"complete",timestamp:g});try{await by(p)}catch{}s(j=>j.filter(N=>N.id!==p))},[c,e,n]),m=i.useMemo(()=>n.filter(p=>uv(p)),[n]),f=i.useMemo(()=>m.filter(p=>p.type==="planning"),[m]);return{sessions:m,generating:m.filter(p=>p.status==="generating").length,needsInput:m.filter(p=>p.status==="awaiting_input").length,planningSessions:f,dismissSession:h,refresh:u}}const vd="fusion:hide-session-banners",yh="fusion:session-banner-pref-changed";function r8(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(vd)==="1"}catch{return!1}}function o8(e){if(typeof window>"u")return()=>{};const n=a=>{a.key===vd&&e()},s=()=>e();return window.addEventListener("storage",n),window.addEventListener(yh,s),()=>{window.removeEventListener("storage",n),window.removeEventListener(yh,s)}}function rq(e){if(!(typeof window>"u"))try{e?window.localStorage.setItem(vd,"1"):window.localStorage.removeItem(vd),window.dispatchEvent(new Event(yh))}catch{}}function l8(){return i.useSyncExternalStore(o8,r8,()=>!1)}const Hc=new Set;function Ws(e){return{...e,column:Xv(e.column),dependencies:Array.isArray(e.dependencies)?e.dependencies:[],steps:Array.isArray(e.steps)?e.steps:[],log:Array.isArray(e.log)?e.log:[]}}function yl(e){return!!e.deletedAt}function qc(e){return e.filter(n=>!yl(n))}function mv(e,n){return!e&&!n?0:e?n?e.localeCompare(n):1:-1}function c8(e,n){return{...n,columnMovedAt:e.columnMovedAt??n.columnMovedAt,executionStartedAt:e.executionStartedAt??n.executionStartedAt,executionCompletedAt:e.executionCompletedAt??n.executionCompletedAt,firstExecutionAt:e.firstExecutionAt??n.firstExecutionAt,cumulativeActiveMs:n.cumulativeActiveMs??e.cumulativeActiveMs,worktree:n.worktree??e.worktree,modifiedFiles:n.modifiedFiles??e.modifiedFiles,timedExecutionMs:n.timedExecutionMs??e.timedExecutionMs,workflowStepResults:n.workflowStepResults??e.workflowStepResults,tokenUsage:n.tokenUsage??e.tokenUsage,mergeDetails:n.mergeDetails??e.mergeDetails}}function bm(e,n){if(mv(n.updatedAt,e.updatedAt)<0)return e;if(e.column===n.column)return c8(e,n);const a=mv(e.columnMovedAt,n.columnMovedAt);return e.columnMovedAt&&!n.columnMovedAt?{...n,column:e.column,columnMovedAt:e.columnMovedAt}:a>=0?{...n,column:e.column,columnMovedAt:e.columnMovedAt}:n}function d8(e){const n=e?.projectId,s=e?.searchQuery,a=e?.sseEnabled??!0,[r,o]=i.useState(()=>{if(!n)return[];const J=ui(`${bn.TASKS_PREFIX}${n}`,{maxAgeMs:eh});return Array.isArray(J)&&J.length>0&&!Hc.has(n)&&(Hc.add(n),console.info("[swr-cache] hit tasks=",J.length,"projectId=",n)),Array.isArray(J)?qc(J.map(Ws)):[]}),[l,c]=i.useState(!0),[d,u]=i.useState(null),[h,m]=i.useState(!1),f=i.useRef(h);f.current=h;const p=i.useRef(r),b=i.useRef(0),v=i.useRef(0),x=i.useRef(0),y=i.useRef(v.current),g=i.useRef(0),j=i.useRef(s),N=i.useRef(null),C=i.useRef(void 0),w=i.useRef(n);p.current=r,j.current=s,w.current!==n&&(w.current=n,v.current++);const S=1e3,R=i.useCallback(async J=>{const oe=++b.current,le=n,we=J?.searchQueryOverride??j.current,re=J?.includeArchivedOverride??f.current;try{const H=await ty(void 0,void 0,le,we,re);if(b.current!==oe||n!==le)return;const ue=qc(H.map(Ws));if(o(ue),le){const Q=H.length>500?H.slice(0,500):H;Wn(`${bn.TASKS_PREFIX}${le}`,Q,{maxBytes:5e5})}c(!1),u(null),C.current=Date.now()}catch{if(b.current!==oe||n!==le)return;if(u(Date.now()),le&&hs(`${bn.TASKS_PREFIX}${le}`),J?.clearOnError){o([]);return}}},[n]);N.current=R;const I=i.useCallback(async()=>{f.current||(m(!0),f.current=!0,await N.current({includeArchivedOverride:!0}))},[]),E=i.useRef(s);i.useEffect(()=>{if(s===void 0&&E.current===void 0)return;E.current=s;const J=setTimeout(()=>{R({searchQueryOverride:s})},300);return()=>clearTimeout(J)},[s]),i.useEffect(()=>{if(!n)return;const J=ui(`${bn.TASKS_PREFIX}${n}`,{maxAgeMs:eh});Array.isArray(J)&&(J.length>0&&!Hc.has(n)&&(Hc.add(n),console.info("[swr-cache] hit tasks=",J.length,"projectId=",n)),o(qc(J.map(Ws)))),c(!0)},[n]),i.useEffect(()=>{c(!0),R({clearOnError:!0});const J=()=>{if(document.visibilityState!=="visible"){y.current=v.current;return}const oe=y.current,le=oe!==v.current;if(y.current=v.current,le){x.current=Date.now(),si("useTasks","visibility-context-version-changed",{projectId:n,previousContextVersion:oe,currentContextVersion:v.current}),qs({view:"useTasks",trigger:"visibility",projectId:n,replayAttempted:!1,reason:"context-version-changed"}),R();return}const we=Date.now();we-x.current<S||(x.current=we,qs({view:"useTasks",trigger:"visibility",projectId:n,replayAttempted:!1,reason:"debounced-refresh"}),R())};return document.addEventListener("visibilitychange",J),()=>{document.removeEventListener("visibilitychange",J)}},[R]),i.useEffect(()=>{if(a===!1)return;let J=v.current;const oe=n?`?projectId=${encodeURIComponent(n)}`:"",le=()=>v.current!==J,we=()=>{g.current+=1,si("useTasks","dropped-stale-event",{count:g.current,contextVersionAtStart:J,currentContextVersion:v.current,projectId:n})};let re=!0;const H=se=>{if(le()){we();return}const ve=Ws(JSON.parse(se.data));if(j.current){N.current({searchQueryOverride:j.current});return}if(yl(ve)){o(A=>A.filter(ne=>ne.id!==ve.id)),si("useTasks","soft-deleted-task-suppressed",{event:"task:created",id:ve.id});return}o(A=>{const ne=A.findIndex(Ne=>Ne.id===ve.id);if(ne===-1)return[...A,ve];const ye=A[ne],ee=bm(ye,ve);if(ee===ye)return A;const ge=[...A];return ge[ne]=ee,ge}),C.current=Date.now()},ue=se=>{if(le()){we();return}if(j.current){N.current({searchQueryOverride:j.current});return}const{task:ve,to:A}=JSON.parse(se.data),ne=Ws(ve);if(yl(ne)){o(ee=>ee.filter(ge=>ge.id!==ne.id)),si("useTasks","soft-deleted-task-suppressed",{event:"task:moved",id:ne.id});return}const ye={...ne,column:Xv(A,ne.column)};o(ee=>{const ge=ee.findIndex(He=>He.id===ye.id);if(ge===-1)return[...ee,ye];const Ne=[...ee];return Ne[ge]=ye,Ne}),C.current=Date.now()},Q=se=>{if(le()){we();return}if(j.current){N.current({searchQueryOverride:j.current});return}const ve=Ws(JSON.parse(se.data));if(yl(ve)){o(A=>A.filter(ne=>ne.id!==ve.id)),si("useTasks","soft-deleted-task-suppressed",{event:"task:updated",id:ve.id});return}o(A=>{const ne=A.findIndex(Ne=>Ne.id===ve.id);if(ne===-1)return[...A,ve];const ye=A[ne],ee=bm(ye,ve);if(ee===ye)return A;const ge=[...A];return ge[ne]=ee,ge}),C.current=Date.now()},be=se=>{if(le()){we();return}if(j.current){N.current({searchQueryOverride:j.current});return}const ve=Ws(JSON.parse(se.data));o(A=>A.filter(ne=>ne.id!==ve.id))},fe=se=>{if(le()){we();return}if(j.current){N.current({searchQueryOverride:j.current});return}const{task:ve}=JSON.parse(se.data),A=Ws(ve);if(yl(A)){o(ye=>ye.filter(ee=>ee.id!==A.id)),si("useTasks","soft-deleted-task-suppressed",{event:"task:merged",id:A.id});return}const ne={...A,column:"done"};o(ye=>{const ee=ye.findIndex(Ne=>Ne.id===ne.id);if(ee===-1)return[...ye,ne];const ge=[...ye];return ge[ee]=ne,ge})},O=Si(`/api/events${oe}`,{events:{"task:created":H,"task:moved":ue,"task:updated":Q,"task:deleted":be,"task:merged":fe},onReconnect:()=>{if(J=v.current,!!re){if(le()){we();return}qs({view:"useTasks",trigger:"sse-reconnect",projectId:n,replayAttempted:!1}),N.current()}}});return()=>{re=!1,O()}},[n,a]);const M=i.useCallback(async J=>{const oe=Ws(await ny(J,n));return o(le=>le.some(we=>we.id===oe.id)?le:[...le,oe]),oe},[n]),G=i.useCallback(async(J,oe,le)=>Ws(await LC(J,oe,n,le)),[n]),U=i.useCallback(async J=>Ws(await sy(J,n)),[n]),P=i.useCallback(async J=>Ws(await iy(J,n)),[n]),T=i.useCallback(async(J,oe)=>Ws(await OC(J,n,oe)),[n]),D=i.useCallback(async J=>FC(J,n),[n]),W=i.useCallback(async J=>Ws(await zC(J,n)),[n]),Y=i.useCallback(async J=>Ws(await UC(J,n)),[n]),L=i.useCallback(async J=>{const oe=Ws(await HC(J,n));return o(le=>le.some(we=>we.id===oe.id)?le:[...le,oe]),oe},[n]),_=i.useCallback(async(J,oe)=>{const le=p.current.find(re=>re.id===J),we=le?{...le,...oe,updatedAt:new Date().toISOString()}:void 0;we&&o(re=>re.map(H=>H.id===J?we:H));try{const re=Ws(await ni(J,oe,n));return o(H=>H.map(ue=>ue.id===J?re:ue)),re}catch(re){throw le&&o(H=>H.map(ue=>ue.id===J?le:ue)),re}},[n]),F=i.useCallback(async(J,oe)=>{const le=Ws(await qC(J,n,oe));return o(we=>we.map(re=>re.id===J?le:re)),le},[n]),ae=i.useCallback(async J=>{const oe=Ws(await VC(J,n));return o(le=>le.map(we=>we.id===J?oe:we)),oe},[n]),k=i.useCallback(async()=>{const oe=(await WC(n)).map(Ws);return o(le=>le.map(we=>oe.find(H=>H.id===we.id)||we)),oe},[n]),z=i.useCallback(J=>{if(J.length===0)return;if(j.current){N.current({searchQueryOverride:j.current});return}const oe=qc(J.map(Ws));o(le=>{let we=le;for(const re of oe){const H=we.findIndex(be=>be.id===re.id);if(H===-1){we===le&&(we=[...le]),we.push(re);continue}const ue=we[H],Q=bm(ue,re);Q!==ue&&(we===le&&(we=[...le]),we[H]=Q)}return we}),C.current=Date.now()},[]);return{tasks:r,isStale:l,lastRefreshErrorAt:d,createTask:M,moveTask:G,pauseTask:U,unpauseTask:P,deleteTask:T,mergeTask:D,retryTask:W,resetTask:Y,duplicateTask:L,updateTask:_,archiveTask:F,unarchiveTask:ae,archiveAllDone:k,loadArchivedTasks:I,includeArchived:h,refreshTasks:R,ingestCreatedTasks:z,lastFetchTimeMs:C.current}}const u8=5e3,m8=1e3;function h8(e){const s=(d_(e)?e.nodeMappings??e.projectNodeMappings??e.pathMappings??[]:[]).filter(a=>!!a?.nodeId&&!!a?.path).map(a=>({nodeId:a.nodeId,nodeName:a.nodeName,path:a.path,available:a.available!==!1}));return s.length>0?s:e.nodeId&&e.path?[{nodeId:e.nodeId,nodeName:e._sourceNodeName,path:e.path,available:!0}]:[]}function xm(e){return e.map(n=>({...n,nodeMappings:h8(n)}))}function f8(){const[e,n]=i.useState(()=>{const f=ui(bn.PROJECTS,{maxAgeMs:_r});return Array.isArray(f)?(f.length>0&&console.info("[swr-cache] hit projects=",f.length),xm(f)):[]}),[s,a]=i.useState(()=>e.length===0),[r,o]=i.useState(null),l=i.useRef(null),c=i.useRef(0),d=i.useCallback(async()=>{try{o(null);const f=await bp(),p=xm(f);n(p),Wn(bn.PROJECTS,p)}catch(f){o(f instanceof Error?f.message:"Failed to fetch projects")}},[]);i.useEffect(()=>{let f=!1;async function p(){e.length>0||a(!0);const x=performance.now();try{const y=await bp(),g=xm(y),j=Math.round(performance.now()-x);console.log(`[useProjects] initial fetchProjectsAcrossNodes took ${j}ms (${g.length} projects)`),f||(n(g),o(null),Wn(bn.PROJECTS,g))}catch(y){const g=Math.round(performance.now()-x);console.warn(`[useProjects] initial fetch failed after ${g}ms: ${y instanceof Error?y.message:String(y)}`),f||o(y instanceof Error?y.message:"Failed to fetch projects")}finally{f||a(!1)}}p();const b=()=>{if(document.visibilityState!=="visible")return;const v=Date.now(),x=v-c.current;if(x<m8){qs({view:"useProjects",trigger:"visibility",projectId:void 0,replayAttempted:!1,reason:"debounce-skipped",detail:{timeSinceLastRefreshMs:x}});return}c.current=v,qs({view:"useProjects",trigger:"visibility",projectId:void 0,replayAttempted:!1,reason:"debounced-refresh"}),d()};return document.addEventListener("visibilitychange",b),()=>{f=!0,document.removeEventListener("visibilitychange",b)}},[e.length,d]),i.useEffect(()=>{if(!s)return l.current=setInterval(()=>{d()},u8),()=>{l.current&&(clearInterval(l.current),l.current=null)}},[s,d]);const u=i.useCallback(async f=>{const p=await x_(f);return n(b=>[...b,p]),p},[]),h=i.useCallback(async(f,p)=>{const b=await S_(f,p);return n(v=>v.map(x=>x.id===f?b:x)),b},[]),m=i.useCallback(async f=>{await hy(f),n(p=>{const b=p.filter(v=>v.id!==f);return Wn(bn.PROJECTS,b),b}),hs(`${bn.TASKS_PREFIX}${f}`)},[]);return{projects:e,loading:s,error:r,refresh:d,register:u,update:h,unregister:m}}const p8="kb-dashboard-current-project",hv=3;function g8(e){return e??"local"}function b8(e,n={}){const{nodeId:s=null}=n,a=ui(bn.CURRENT_PROJECT_ID,{maxAgeMs:th}),r=typeof a=="string"&&a.length>0?e.find(C=>C.id===a)??null:null,[o,l]=i.useState(r),[c,d]=i.useState(()=>r===null),u=i.useRef(!1),h=i.useRef(null),m=i.useRef(!1),f=i.useRef(null),p=i.useRef(0),b=i.useRef(0),v=g8(s),x=i.useCallback(C=>{Wn(bn.CURRENT_PROJECT_ID,C??"")},[]),y=i.useCallback(C=>C.find(w=>w.status==="active")||C[0]||null,[]),g=i.useCallback(C=>{p.current=0,b.current=0,l(C),x(C?.id??null)},[x]);i.useEffect(()=>{let C=!1;if(h.current!==v&&(h.current=null,u.current=!1),u.current&&h.current===v)return d(!1),()=>{C=!0};typeof a=="string"&&a.length>0&&e.some(R=>R.id===a)||d(!0);async function S(){try{const R=await Ra();if(C)return;f.current=R.dashboardCurrentProjectIdByNode??{};const I=f.current[v];if(I){const E=e.find(M=>M.id===I);E&&(b.current=0,l(E),x(E.id))}if(!I)try{const E=localStorage.getItem(p8);if(E){const M=JSON.parse(E);M?.id&&e.some(U=>U.id===M.id)&&(b.current=0,l(M),x(M.id),f.current={...f.current,[v]:M.id},await Cs({dashboardCurrentProjectIdByNode:f.current}).catch(()=>{}))}}catch{}}catch{}finally{C||(u.current=!0,h.current=v,d(!1))}}return S(),()=>{C=!0}},[e,a,v,x]),i.useEffect(()=>{p.current=0,b.current=0},[o?.id]),i.useEffect(()=>{if(!c)if(o){if(b.current=0,e.some(S=>S.id===o.id))p.current=0;else if(e.length===0)p.current=0;else{if(p.current+=1,p.current>=hv){const S=y(e);g(S),S||x(null)}return}const w={...f.current,[v]:o.id};f.current=w,Cs({dashboardCurrentProjectIdByNode:w}).catch(()=>{}),x(o.id)}else{if(p.current=0,e.length===0){b.current=0;return}if(!m.current){const C=f.current?.[v];if(C){const w=e.find(S=>S.id===C)??null;if(w){b.current=0,g(w);return}}b.current+=1,b.current>=hv&&(b.current=0,g(y(e)))}}},[e,o,c,v,x,y,g]);const j=i.useCallback(C=>{if(m.current=!1,p.current=0,b.current=0,l(C),x(C?.id??null),C){const w={...f.current,[v]:C.id};f.current=w,Cs({dashboardCurrentProjectIdByNode:w}).catch(()=>{})}},[v,x]),N=i.useCallback(()=>{m.current=!0,p.current=0,b.current=0,l(null),x(null);const C={...f.current};delete C[v],f.current=C,Cs({dashboardCurrentProjectIdByNode:C}).catch(()=>{})},[v,x]);return{currentProject:o,setCurrentProject:j,clearCurrentProject:N,loading:c}}const cj=i.createContext(null);function x8({children:e}){const[n,s]=i.useState([]),a=i.useRef(0),r=i.useRef(new Map),o=i.useCallback(c=>{const d=r.current.get(c);d!==void 0&&(clearTimeout(d),r.current.delete(c)),s(u=>u.filter(h=>h.id!==c))},[]),l=i.useCallback((c,d="info")=>{if(d==="error"&&/^\s*Failed to fetch\.?\s*$/i.test(c))return;const u=a.current++;s(m=>[...m,{id:u,message:c,type:d}]);const h=setTimeout(()=>o(u),4e3);r.current.set(u,h)},[o]);return i.useEffect(()=>()=>{r.current.forEach(c=>clearTimeout(c)),r.current.clear()},[]),Ja.createElement(cj.Provider,{value:{toasts:n,addToast:l,removeToast:o}},e)}function v8(){const e=i.useContext(cj);if(!e)throw new Error("useToast must be used within ToastProvider");return e}const dj="kb-dashboard-theme-mode",uj="kb-dashboard-color-theme",mj="kb-dashboard-font-scale-pct",wh=100,y8=85,w8=125,hj=[...gC],fv="theme-data",ml="theme-data.css";function k8(){const e=document.baseURI||(typeof document.location<"u"?document.location.href:"");return e?e.startsWith("http://")||e.startsWith("https://")?new URL(`/${ml}`,e).toString():e.startsWith("file://")?e.endsWith("/")?e.slice(0,-1)+`/${ml}`:e.replace(/\/[^/]+$/,`/${ml}`):`/${ml}`:`/${ml}`}const Ai=typeof window<"u",j8=Ai?i.useLayoutEffect:i.useEffect;function fj(e){return e==="dark"||e==="light"||e==="system"}function pv(){if(!Ai)return"dark";try{const e=localStorage.getItem(dj);if(fj(e))return e}catch{}return"dark"}function gv(){if(!Ai)return"default";try{const e=localStorage.getItem(uj);if(e&&hj.includes(e))return e}catch{}return"default"}function bv(e){if(Ai)try{localStorage.setItem(dj,e)}catch{}}function xv(e){if(Ai)try{localStorage.setItem(uj,e)}catch{}}function $l(e){return typeof e!="number"||!Number.isFinite(e)?wh:Math.min(w8,Math.max(y8,Math.round(e)))}function vv(){if(!Ai)return wh;try{const e=Number(localStorage.getItem(mj));return $l(e)}catch{return wh}}function yv(e){if(Ai)try{localStorage.setItem(mj,String($l(e)))}catch{}}function N8(e,n){return e==="system"?n?"dark":"light":e}function S8(e,n,s,a){if(!Ai)return;const r=N8(e,a);document.documentElement.setAttribute("data-theme",r),document.documentElement.setAttribute("data-color-theme",n),document.documentElement.style.fontSize=`${$l(s)}%`}function wv(){if(!Ai)return;const e=k8(),n=document.getElementById(fv);if(n){n.href!==e&&(n.href=e);return}const s=document.createElement("link");s.rel="stylesheet",s.href=e,s.id=fv,document.head.appendChild(s)}function C8(){const[e,n]=i.useState(()=>pv()),[s,a]=i.useState(()=>gv()),[r,o]=i.useState(()=>vv()),[l,c]=i.useState(!0),[d,u]=i.useState(()=>Ai?window.matchMedia("(prefers-color-scheme: dark)").matches:!0),h=i.useRef(e),m=i.useRef(s),f=i.useRef(r),p=i.useRef(!1),b=i.useRef(!1),v=i.useRef(!1);i.useEffect(()=>{h.current=e},[e]),i.useEffect(()=>{m.current=s},[s]),i.useEffect(()=>{f.current=r},[r]),i.useEffect(()=>{if(!Ai||!l)return;let j=!1;return Ra().then(N=>{if(!j&&(fj(N.themeMode)&&!p.current&&(h.current!==N.themeMode&&(h.current=N.themeMode,n(N.themeMode)),pv()!==N.themeMode&&bv(N.themeMode)),N.colorTheme&&hj.includes(N.colorTheme)&&!b.current&&(m.current!==N.colorTheme&&(m.current=N.colorTheme,a(N.colorTheme)),gv()!==N.colorTheme&&xv(N.colorTheme)),!v.current)){const C=$l(N.dashboardFontScalePct);f.current!==C&&(f.current=C,o(C)),vv()!==C&&yv(C)}}).catch(N=>{console.warn("[useTheme] Failed to hydrate theme from global settings",N)}).finally(()=>{j||c(!1)}),()=>{j=!0}},[l]),i.useEffect(()=>{if(!Ai)return;const j=window.matchMedia("(prefers-color-scheme: dark)"),N=C=>{u(C.matches)};return j.addEventListener("change",N),()=>j.removeEventListener("change",N)},[]),j8(()=>{S8(e,s,r,d)},[e,s,r,d]),i.useEffect(()=>{!Ai||l||s!=="default"&&wv()},[s,l]);const x=i.useCallback(j=>{p.current=!0,h.current=j,n(j),bv(j),Cs({themeMode:j}).catch(N=>{console.warn("[useTheme] Failed to persist themeMode to global settings",N)})},[]),y=i.useCallback(j=>{b.current=!0,m.current=j,a(j),xv(j),j!=="default"&&wv(),Cs({colorTheme:j}).catch(N=>{console.warn("[useTheme] Failed to persist colorTheme to global settings",N)})},[]),g=i.useCallback(j=>{const N=$l(j);v.current=!0,f.current=N,o(N),yv(N),Cs({dashboardFontScalePct:N}).catch(C=>{console.warn("[useTheme] Failed to persist dashboardFontScalePct to global settings",C)})},[]);return{themeMode:e,colorTheme:s,dashboardFontScalePct:r,setThemeMode:x,setColorTheme:y,setDashboardFontScalePct:g,isSystemDark:d}}function E8(e){const{planningSessions:n}=e,[s,a]=i.useState(!1),[r,o]=i.useState(!1),[l,c]=i.useState(null),[d,u]=i.useState(void 0),[h,m]=i.useState(!1),[f,p]=i.useState(null),[b,v]=i.useState(void 0),[x,y]=i.useState(null),[g,j]=i.useState("definition"),[N,C]=i.useState(null),[w,S]=i.useState(!1),[R,I]=i.useState(void 0),[E,M]=i.useState(!1),[G,U]=i.useState(!1),[P,T]=i.useState(!1),[D,W]=i.useState(null),[Y,L]=i.useState(!1),[_,F]=i.useState(!1),[ae,k]=i.useState(void 0),[z,J]=i.useState(!1),[oe,le]=i.useState(!1),[we,re]=i.useState("project"),[H,ue]=i.useState(null),[Q,be]=i.useState(!1),[fe,O]=i.useState(!1),[se,ve]=i.useState(!1),[A,ne]=i.useState(!1),[ye,ee]=i.useState(!1),[ge,Ne]=i.useState(!1),[He,Le]=i.useState(!1),de=!!(x||w||s||r||h||_||z||oe||Q||fe||se||ye||A||P||Y||E||G||ge||He),Re=i.useCallback(()=>a(!0),[]),Pe=i.useCallback(()=>a(!1),[]),rt=i.useCallback(()=>o(!0),[]),qe=i.useCallback($t=>{c($t),o(!0)},[]),Xe=i.useCallback(()=>{const $t=n[0];$t&&(u($t.id),o(!0))},[n]),At=i.useCallback($t=>{u($t),o(!0)},[]),at=i.useCallback(()=>{o(!1),c(null),u(void 0)},[]),Se=i.useCallback($t=>{p($t),m(!0)},[]),pe=i.useCallback($t=>{v($t),m(!0)},[]),_e=i.useCallback(()=>{m(!1),p(null),v(void 0)},[]),et=i.useCallback(($t,Jt="definition",Qt)=>{y($t),j(Jt),C(Qt?.origin??null)},[]),Ae=i.useCallback($t=>{y($t),j("changes"),C(null)},[]),it=i.useCallback($t=>{y(Jt=>!Jt||$t.id!==void 0&&$t.id!==Jt.id?Jt:{...Jt,...$t})},[]),xt=i.useCallback(()=>{y(null),C(null)},[]),Nt=i.useCallback($t=>{I($t),S(!0)},[]),Ut=i.useCallback(()=>{S(!1),I(void 0)},[]),Be=i.useCallback(()=>M(!0),[]),Z=i.useCallback(()=>M(!1),[]),Oe=i.useCallback(()=>U(!0),[]),ht=i.useCallback(()=>U(!1),[]),je=i.useCallback($t=>{W($t??null),T(!0)},[]),mt=i.useCallback(()=>{T(!1),W(null)},[]),Et=i.useCallback(()=>L(!0),[]),Te=i.useCallback(()=>L(!1),[]),xe=i.useCallback(()=>{F($t=>!$t)},[]),gt=i.useCallback(()=>{F(!1),k(void 0)},[]),_t=i.useCallback(($t,Jt)=>{typeof $t=="string"&&$t&&re($t),ue(typeof Jt=="string"||Jt===null?Jt:null),J(!0)},[]),Ft=i.useCallback(()=>{J(!1),ue(null)},[]),Dt=i.useCallback(()=>le(!0),[]),nt=i.useCallback(()=>le(!1),[]),Wt=i.useCallback($t=>{typeof $t=="string"&&$t&&re($t)},[]),Mt=i.useCallback(()=>be(!0),[]),Kt=i.useCallback(()=>be(!1),[]),xn=i.useCallback(()=>O(!0),[]),Tn=i.useCallback(()=>O(!1),[]),Sn=i.useCallback(()=>ve(!0),[]),is=i.useCallback(()=>ve(!1),[]),On=i.useCallback(()=>ne(!0),[]),un=i.useCallback(()=>ne(!1),[]),tn=i.useCallback(()=>ee(!0),[]),on=i.useCallback(()=>ee(!1),[]),pn=i.useCallback(async($t,Jt)=>{ee(!1),k(Jt),F(!0)},[]),mn=i.useCallback(()=>Ne(!0),[]),Zn=i.useCallback(()=>Ne(!1),[]),In=i.useCallback(()=>Le(!0),[]),rn=i.useCallback(()=>Le(!1),[]),hn=i.useCallback(($t,Jt)=>{Jt(`Created ${$t.id} from planning mode`,"success"),o(!1),c(null)},[]),Pn=i.useCallback(($t,Jt)=>{const Qt=$t.map(ie=>ie.id).join(", ");Jt(`Created ${Qt} from planning mode`,"success"),o(!1),c(null)},[]),nn=i.useCallback(($t,Jt)=>{const Qt=$t.map(ie=>ie.id).join(", ");Jt(`Created ${Qt} from subtask breakdown`,"success"),m(!1),p(null)},[]);return{newTaskModalOpen:s,isPlanningOpen:r,planningInitialPlan:l,planningResumeSessionId:d,isSubtaskOpen:h,subtaskInitialDescription:f,subtaskResumeSessionId:b,detailTask:x,detailTaskInitialTab:g,detailTaskOrigin:N,settingsOpen:w,settingsInitialSection:R,schedulesOpen:E,githubImportOpen:G,usageOpen:P,usageAnchorRect:D,systemStatsOpen:Y,terminalOpen:_,terminalInitialCommand:ae,filesOpen:z,todosOpen:oe,fileBrowserWorkspace:we,fileBrowserInitialFile:H,activityLogOpen:Q,gitManagerOpen:fe,workflowStepsOpen:se,agentsOpen:A,scriptsOpen:ye,setupWizardOpen:ge,modelOnboardingOpen:He,anyModalOpen:de,openNewTask:Re,closeNewTask:Pe,openPlanning:rt,openPlanningWithInitialPlan:qe,resumePlanning:Xe,openPlanningWithSession:At,closePlanning:at,openSubtaskBreakdown:Se,openSubtaskWithSession:pe,closeSubtask:_e,openDetailTask:et,openDetailWithChangesTab:Ae,updateDetailTask:it,closeDetailTask:xt,openSettings:Nt,closeSettings:Ut,openSchedules:Be,closeSchedules:Z,openGitHubImport:Oe,closeGitHubImport:ht,openUsage:je,closeUsage:mt,openSystemStats:Et,closeSystemStats:Te,toggleTerminal:xe,closeTerminal:gt,openFiles:_t,closeFiles:Ft,openTodos:Dt,closeTodos:nt,setFileWorkspace:Wt,openActivityLog:Mt,closeActivityLog:Kt,openGitManager:xn,closeGitManager:Tn,openWorkflowSteps:Sn,closeWorkflowSteps:is,openAgents:On,closeAgents:un,openScripts:tn,closeScripts:on,runScript:pn,openSetupWizard:mn,closeSetupWizard:Zn,openModelOnboarding:In,closeModelOnboarding:rn,onPlanningTaskCreated:hn,onPlanningTasksCreated:Pn,onSubtaskTasksCreated:nn}}function _8(e){const{projectId:n,projects:s,projectsLoading:a,currentProject:r,setCurrentProject:o,addToast:l,openTaskDetail:c,closeTaskDetail:d}=e,u=i.useRef(!1),h=i.useRef(!1),m=i.useRef(null),f=i.useRef(null),p=i.useRef(null);return i.useEffect(()=>{if(!h.current){const j=window.location.pathname.match(/^\/tasks\/([A-Z]+-\d+)\/?$/);if(j){const N=j[1];if(/^[A-Z]+-\d+$/.test(N)){const C=new URLSearchParams(window.location.search);C.set("task",N);const w=C.toString(),S=window.history.state??{};window.history.replaceState(S,"",w?`/?${w}`:"/"),h.current=!0}}}const v=new URLSearchParams(window.location.search),x=v.get("project"),y=v.get("task");if(a)return;let g=n;if(x){const j=s.find(N=>N.id===x);if(!j){f.current!==x&&(l(`Project '${x}' not found`,"error"),f.current=x);return}f.current=null,g=j.id,r?.id!==j.id&&p.current!==j.id&&(o(j),p.current=j.id)}else f.current=null,p.current=null;y&&(u.current||(u.current=!0,Sr(y,g).then(j=>{c(j),m.current=y}).catch(()=>{l(`Task ${y} not found`,"error")})))},[n,s,a,r,o,l,c]),{handleDetailClose:i.useCallback(()=>{if(m.current){const v=new URLSearchParams(window.location.search);v.delete("task");const x=v.toString(),y=window.history.state??{};window.history.replaceState(y,"",x?`${window.location.pathname}?${x}`:window.location.pathname),m.current=null}d()},[d])}}function M8({projectId:e,setupWizardOpen:n,openModelOnboarding:s,openSettings:a}){const r=i.useRef(!1),o=i.useRef(n);o.current=n,i.useEffect(()=>{if(n||!e||r.current)return;r.current=!0;let l=!1,c=!1;No().then(({providers:d})=>{const u=d.some(m=>m.authenticated);if(d.length>0&&!u||d.length>0&&u)return Ra().then(m=>{const f=!!(m.defaultProvider&&m.defaultModelId);(m.modelOnboardingComplete===!1||m.modelOnboardingComplete===void 0)&&(!u||!f)&&!Io()?l=!0:!u&&!Io()&&(c=!0)})}).then(()=>{if(o.current){r.current=!1;return}l?(Bi("onboarding:auto-triggered",{trigger:"first-run"}),s()):c&&(Bi("onboarding:auto-triggered",{trigger:"missing-provider"}),a("authentication"))}).catch(()=>{})},[e,n,s,a])}function R8({isMobile:e,keyboardOpen:n,anyModalOpen:s,isIOS:a}){const r=e&&n&&!s&&a,o=e&&n;return{footerHidden:r,navKeyboardOpen:o,footerKeyboardOpen:o&&a}}const kv="kb-update-banner-dismissed";function A8(){const[e,n]=i.useState(!0),[s,a]=i.useState(!1),[r,o]=i.useState(null),[l,c]=i.useState(null),[d,u]=i.useState(!1);i.useEffect(()=>{const m=sessionStorage.getItem(kv)==="true";u(m);let f=!1;return JC().then(p=>{f||p.disabled||(a(p.updateAvailable===!0),o(typeof p.latestVersion=="string"?p.latestVersion:null),c(typeof p.currentVersion=="string"?p.currentVersion:null))}).catch(()=>{}).finally(()=>{f||n(!1)}),()=>{f=!0}},[]);const h=i.useCallback(()=>{u(!0),sessionStorage.setItem(kv,"true")},[]);return{updateAvailable:s,latestVersion:r,currentVersion:l,loading:e,dismissed:d,dismiss:h}}const T8=["board","list","graph","agents","missions","chat","documents","research","evals","goalsView","skills","mailbox","insights","memory","reliability","secrets","devserver","dev-server","stash-recovery"];function I8(e){return e!==null&&T8.includes(e)}function vm(e){return e!==null&&(I8(e)||go(e))}const P8=Vl("fusion-plugin-roadmap","roadmaps");function jv(e){return e==="devserver"?"dev-server":e}function Nv(e){return e!=="roadmaps"?"board":Cy("fusion-plugin-roadmap","roadmaps")?P8:"board"}function $8(e){const{projectsLoading:n,projectsError:s,currentProjectLoading:a,currentProject:r,projectsLength:o,setupWizardOpen:l,openSetupWizard:c,themeMode:d,setThemeMode:u}=e,[h,m]=i.useState(()=>{if(typeof window<"u"){const y=window.localStorage.getItem("kb-dashboard-view-mode");if(y==="overview"||y==="project")return y}return"overview"}),[f,p]=i.useState(()=>{const y=ns("kb-dashboard-task-view");return y==="roadmaps"?Nv(y):vm(y)?y:"board"}),b=i.useRef(!1);i.useEffect(()=>{window.localStorage.setItem("kb-dashboard-view-mode",h)},[h]),i.useEffect(()=>{const y=ns("kb-dashboard-task-view",r?.id);if(y==="roadmaps")p(Nv(y));else if(vm(y)){const g=!b.current&&y==="devserver";p(g?"devserver":jv(y))}else p("board");r?.id&&(b.current=!0)},[r?.id]),i.useEffect(()=>{Ns("kb-dashboard-task-view",f,r?.id)},[r?.id,f]),i.useEffect(()=>{if(typeof window>"u")return;const y=new URLSearchParams(window.location.search).get("view");y&&vm(y)&&p(jv(y))},[]),i.useEffect(()=>{n||a||r&&h==="overview"&&m("project")},[n,a,r,h]),i.useEffect(()=>{if(n||a||l||s||o>0||r)return;const y=window.setTimeout(()=>{c()},500);return()=>window.clearTimeout(y)},[n,s,o,a,r,l,c]);const v=i.useCallback(y=>{p(y)},[]),x=i.useCallback(()=>{const y=["dark","light","system"],g=y.indexOf(d),j=y[(g+1)%y.length];u(j)},[d,u]);return{viewMode:h,setViewMode:m,taskView:f,setTaskView:p,handleChangeTaskView:v,handleToggleTheme:x}}const ym=new Map,D8=6e4;function L8(e){const[n,s]=i.useState([]),[a,r]=i.useState(!0),[o,l]=i.useState(null),[c,d]=i.useState(0),u=i.useRef(!1),h=i.useCallback(()=>{const m=e??"default";ym.delete(m),d(f=>f+1)},[e]);return i.useEffect(()=>{const m=e??"default";let f=!1;async function p(){const b=ym.get(m);if(b&&Date.now()<b.expiresAt){if(f)return;s(b.views),r(!1);return}u.current||r(!0),l(null);try{const v=await UM(e);if(f)return;ym.set(m,{views:v,expiresAt:Date.now()+D8}),s(v)}catch(v){if(f)return;l(v instanceof Error?v.message:"Failed to fetch plugin dashboard views")}finally{f||(r(!1),u.current=!0)}}return p(),()=>{f=!0}},[e,c]),i.useMemo(()=>({views:n,loading:a,error:o,refetch:h}),[n,a,o,h])}function O8({taskView:e,context:n}){return t.jsx($R,{viewId:e,context:n})}let Sv=!1;function Po(e,n){return function(){return i.createElement("span",null,`Bundled plugin view unavailable: ${e}#${n}`)}}async function F8(){const e="@fusion-plugin-examples/dependency-graph/dashboard-view",n="DependencyGraphDashboardView",a=(await qn(()=>import("./dashboard-view-H8SnaCPP.js"),__vite__mapDeps([28,1,29,6,7,8,30])))[n];return a?{default:a}:(console.warn(`[plugin-views] Missing export ${n} from ${e}`),{default:Po(e,n)})}async function z8(){const e="@fusion-plugin-examples/roadmap/dashboard-view",n="RoadmapDashboardView",a=(await qn(()=>import("./dashboard-view-BWGH_fAq.js"),__vite__mapDeps([31,1,29,32])))[n];return a?{default:a}:(console.warn(`[plugin-views] Missing export ${n} from ${e}`),{default:Po(e,n)})}async function B8(){const e="@fusion-plugin-examples/cli-printing-press/dashboard-view",n="CliPrintingPressWizardView";try{const a=(await import(e))[n];return a?{default:a}:(console.warn(`[plugin-views] Missing export ${n} from ${e}`),{default:Po(e,n)})}catch{return{default:Po(e,n)}}}async function U8(){const e="@fusion-plugin-examples/cli-printing-press/manage-view",n="CliPrintingPressManageView";try{const a=(await import(e))[n];return a?{default:a}:(console.warn(`[plugin-views] Missing export ${n} from ${e}`),{default:Po(e,n)})}catch{return{default:Po(e,n)}}}function pj(){Sv||(Sv=!0,oc("fusion-plugin-dependency-graph","graph",i.lazy(F8)),oc("fusion-plugin-roadmap","roadmaps",i.lazy(z8)),oc("fusion-plugin-cli-printing-press","wizard",i.lazy(B8)),oc("fusion-plugin-cli-printing-press","manage",i.lazy(U8)))}function H8(e){const{setCurrentProject:n,clearCurrentProject:s,setViewMode:a,currentProject:r,refreshProjects:o,toggleFavoriteProvider:l,toggleFavoriteModel:c,addToast:d,openSettings:u,openSetupWizard:h,closeSetupWizard:m,closeModelOnboarding:f}=e,p=i.useCallback(R=>{n(R),a("project")},[n,a]),b=i.useCallback(()=>{s(),a("overview")},[s,a]),v=i.useCallback(()=>{u()},[u]),x=i.useCallback(()=>{h()},[h]),y=i.useCallback(R=>{m(),n(R),a("project"),d(`Project ${R.name} registered successfully`,"success"),o()},[m,n,a,d,o]),g=i.useCallback(()=>{f()},[f]),j=i.useCallback(async R=>{try{await j_(R.id),d(`Project ${R.name} paused`,"success"),await o()}catch{d(`Failed to pause project ${R.name}`,"error")}},[d,o]),N=i.useCallback(async R=>{try{await N_(R.id),d(`Project ${R.name} resumed`,"success"),await o()}catch{d(`Failed to resume project ${R.name}`,"error")}},[d,o]),C=i.useCallback(async R=>{try{await hy(R.id),d(`Project ${R.name} removed`,"success"),r?.id===R.id&&(s(),a("overview")),await o()}catch{d(`Failed to remove project ${R.name}`,"error")}},[r,s,a,d,o]),w=i.useCallback(async R=>{try{await l(R)}catch{d("Failed to update favorites","error")}},[l,d]),S=i.useCallback(async R=>{try{await c(R)}catch{d("Failed to update model favorites","error")}},[c,d]);return{handleSelectProject:p,handleViewAllProjects:b,handleOpenSettings:v,handleAddProject:x,handleSetupComplete:y,handleModelOnboardingComplete:g,handlePauseProject:j,handleResumeProject:N,handleRemoveProject:C,handleToggleFavorite:w,handleToggleModelFavorite:S}}function q8(e){const{createTask:n,ingestCreatedTasks:s,onPlanningTaskCreated:a,onPlanningTasksCreated:r,onSubtaskTasksCreated:o,addToast:l}=e,c=i.useCallback(async p=>n({...p,column:"triage",source:{sourceType:"dashboard_ui"}}),[n]),d=i.useCallback(async p=>await n({...p,column:"triage",source:{sourceType:"dashboard_ui"}}),[n]),u=i.useCallback(p=>{s([p]),a(p,l)},[l,s,a]),h=i.useCallback(p=>{s(p),r(p,l)},[l,s,r]),m=i.useCallback(p=>{s(p),o(p,l)},[l,s,o]),f=i.useCallback(p=>{l(`Imported ${p.id} from GitHub`,"success")},[l]);return{handleBoardQuickCreate:c,handleModalCreate:d,handlePlanningTaskCreated:u,handlePlanningTasksCreated:h,handleSubtaskTasksCreated:m,handleGitHubImport:f}}function V8(e,n){const{projectId:s,searchQuery:a}=n??{},[r,o]=i.useState([]),[l,c]=i.useState([]),[d,u]=i.useState(null),[h,m]=i.useState(!1),[f,p]=i.useState(null),b=i.useRef(null),v=i.useCallback(async()=>{if(!e){o([]),c([]),u(null),m(!1),p(null);return}b.current?.abort();const y=new AbortController;b.current=y,m(!0),p(null);try{const g=[iR(e),aR(e)];s&&(g.push(rR(e,s,a)),g.push(oR(e,s)));const j=await Promise.allSettled(g);if(y.signal.aborted)return;const N=j[0],C=j[1];if(N.status==="rejected"){p(`Failed to fetch node health: ${N.reason}`),m(!1);return}if(u(N.value),C.status==="rejected"){p(`Failed to fetch projects: ${C.reason}`),m(!1);return}if(o(C.value),s&&j[2]){const w=j[2];if(w.status==="rejected"){p(`Failed to fetch tasks: ${w.reason}`),m(!1);return}w.status==="fulfilled"&&c(w.value)}m(!1)}catch(g){y.signal.aborted||(p(g instanceof Error?g.message:"Unknown error"),m(!1))}},[e,s,a]);i.useEffect(()=>(v(),()=>{b.current?.abort()}),[v]);const x=i.useCallback(()=>{v()},[v]);return{projects:r,tasks:l,health:d,loading:h,error:f,refresh:x}}function W8(e){const[n,s]=i.useState(!1),[a,r]=i.useState(null);return i.useEffect(()=>{if(!e){s(!1),r(null);return}const o=`/api/proxy/${encodeURIComponent(e)}/events`;return Si(o,{events:{"task:created":l=>{r({type:"task:created",data:l.data})},"task:moved":l=>{r({type:"task:moved",data:l.data})},"task:updated":l=>{r({type:"task:updated",data:l.data})},"task:deleted":l=>{r({type:"task:deleted",data:l.data})},"task:merged":l=>{r({type:"task:merged",data:l.data})}},onOpen:()=>s(!0),onError:()=>s(!1)})},[e]),{isConnected:n,lastEvent:a}}const G8="fusion-dashboard-current-node",gj=i.createContext(null);function K8({children:e}){const[n,s]=i.useState(null),[a,r]=i.useState(!0),o=i.useRef(!1),l=i.useRef(void 0);i.useEffect(()=>{let h=!1;async function m(){try{const f=await Ra();if(h)return;l.current=f.dashboardCurrentNodeId;const p=f.dashboardCurrentNodeId;if(p&&(o.current=!0),!p)try{const b=localStorage.getItem(G8);if(b){const v=JSON.parse(b);v?.id&&v?.type==="remote"&&(l.current=v.id,await Cs({dashboardCurrentNodeId:v.id}).catch(()=>{}))}}catch{}}catch{}finally{h||r(!1)}}return m(),()=>{h=!0}},[]),i.useEffect(()=>{if(!a)if(n&&n.type==="remote"&&n.id){const h=n.id;l.current!==h&&(l.current=h,Cs({dashboardCurrentNodeId:h}).catch(()=>{}))}else n===null&&l.current!==void 0&&(l.current=void 0,Cs({dashboardCurrentNodeId:void 0}).catch(()=>{}))},[n,a]);const c=i.useCallback(h=>{s(h)},[]),d=i.useCallback(()=>{s(null),l.current=void 0,Cs({dashboardCurrentNodeId:void 0}).catch(()=>{})},[]),u={currentNode:n,currentNodeId:n?.id??null,isRemote:n!==null&&n.type==="remote",setCurrentNode:c,clearCurrentNode:d};return t.jsx(gj.Provider,{value:u,children:e})}function J8(){const e=i.useContext(gj);if(e===null)throw new Error("useNodeContext must be used within a NodeProvider");return e}const Y8=["shellKind","shellMode","profileId","serverBaseUrl","serverLabel","shellCanOpenConnectionManager","hostKind","mode","connectionId","serverUrl","canOpenConnectionManager"],X8=["__FUSION_SHELL_HOST_CONTEXT__","__fusionShellHostContext","__FUSION_SHELL_CONTEXT__"];let yd=null,Cv=!1;function Q8(e){if(typeof e=="boolean")return e;if(typeof e=="string"){if(e==="1"||e==="true")return!0;if(e==="0"||e==="false")return!1}}function Z8(e){if(!(typeof e!="string"||e.trim().length===0))try{const n=new URL(e);return n.protocol!=="http:"&&n.protocol!=="https:"?void 0:n.toString().replace(/\/$/,"")}catch{return}}function bj(e){if(e==="browser"||e==="desktop-shell"||e==="mobile-shell")return e;if(e==="desktop")return"desktop-shell";if(e==="mobile")return"mobile-shell"}function eU(e){return e==="local"||e==="remote"?e:void 0}function xj(e){const n=eU(e.mode),s=typeof e.connectionId=="string"&&e.connectionId.trim()?e.connectionId:void 0,a=Z8(e.serverUrl),r=Q8(e.canOpenConnectionManager);return{kind:e.kind,...n?{mode:n}:{},...s?{connectionId:s}:{},...a?{serverUrl:a}:{},...r!==void 0?{canOpenConnectionManager:r}:{}}}function tU(e){for(const n of X8){const s=e[n];if(!s||typeof s!="object")continue;const a=s,r=bj(a.kind??a.shellKind??a.hostKind);if(r)return r==="browser"?{kind:r}:xj({kind:r,mode:a.mode??a.shellMode,connectionId:a.connectionId??a.profileId,serverUrl:a.serverUrl??a.serverBaseUrl,canOpenConnectionManager:a.canOpenConnectionManager??a.shellCanOpenConnectionManager})}return null}function nU(e){let n;try{n=new URL(e.location.href)}catch{return null}const s=n.searchParams,a=bj(s.get("hostKind")??s.get("kind")??s.get("shellKind"));return a?a==="browser"?{kind:a}:xj({kind:a,mode:s.get("mode")??s.get("shellMode"),connectionId:s.get("connectionId")??s.get("profileId"),serverUrl:s.get("serverUrl")??s.get("serverBaseUrl"),canOpenConnectionManager:s.get("canOpenConnectionManager")??s.get("shellCanOpenConnectionManager")}):null}function sU(e){try{const n=new URL(e.location.href);let s=!1;for(const r of Y8)n.searchParams.has(r)&&(n.searchParams.delete(r),s=!0);if(!s)return;const a=n.pathname+(n.search?n.search:"")+n.hash;e.history.replaceState(e.history.state,"",a)}catch{}}function iU(e=window){const n=tU(e);if(n)return n;const s=nU(e);return s||(typeof e.fusionAPI<"u"?{kind:"desktop-shell"}:{kind:"browser"})}function vj(e=window){return!Cv&&typeof window<"u"&&(yd=iU(e),sU(e),Cv=!0),yd??{kind:"browser"}}function aU(){return yd||(typeof window>"u"?{kind:"browser"}:vj(window))}const rU={kind:"browser"},yj=i.createContext({host:rU,isNativeShell:!1,kind:"browser"});function oU(e){const n=e.kind!=="browser";return{host:e,isNativeShell:n,kind:e.kind,...n?{mode:e.mode,connectionId:e.connectionId,serverUrl:e.serverUrl,canOpenConnectionManager:e.canOpenConnectionManager}:{}}}function lU({children:e}){const n=i.useMemo(()=>oU(aU()),[]);return t.jsx(yj.Provider,{value:n,children:e})}function cU(){return i.useContext(yj)}function dU(e,n){const s=new URL(e);return n&&s.searchParams.set("rt",n),s.toString()}function uU({open:e,shellApi:n,shellState:s,onComplete:a}){const[r,o]=i.useState(s.desktopMode??"remote"),[l,c]=i.useState("Remote Server"),[d,u]=i.useState(""),[h,m]=i.useState(""),[f,p]=i.useState(null),[b,v]=i.useState(!1),[x,y]=i.useState(!1),g=s.host==="desktop-shell";i.useEffect(()=>{g&&o(s.desktopMode??"remote")},[g,s.desktopMode]);const j=i.useMemo(()=>g&&r==="local"?!0:d.trim().length>0,[g,r,d]);return e?t.jsx("div",{className:"modal-overlay open",children:t.jsxs("div",{className:"modal native-shell-onboarding-modal",children:[t.jsx("div",{className:"modal-header",children:t.jsx("h2",{children:"Welcome to Fusion"})}),t.jsxs("div",{className:"native-shell-onboarding-body",children:[t.jsx("p",{children:"Fusion helps you plan, run, and review AI-assisted engineering work."}),g&&t.jsxs("div",{className:"native-shell-onboarding-mode-row",children:[t.jsx("button",{type:"button",className:`btn ${r==="local"?"btn-primary":""}`,onClick:()=>o("local"),children:"Local Fusion"}),t.jsx("button",{type:"button",className:`btn ${r==="remote"?"btn-primary":""}`,onClick:()=>o("remote"),children:"Remote Server"})]}),(!g||r==="remote")&&t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"btn",onClick:async()=>{p(null),v(!0);try{const N=await n.startQrScan();u(N.serverUrl),m(N.authToken??"")}catch(N){p(N.message)}finally{v(!1)}},disabled:b,children:b?"Scanning…":"Scan QR"}),t.jsx("label",{className:"native-shell-onboarding-label",htmlFor:"native-shell-onboarding-profile-name",children:"Profile name"}),t.jsx("input",{id:"native-shell-onboarding-profile-name",className:"input",value:l,onChange:N=>c(N.target.value)}),t.jsx("label",{className:"native-shell-onboarding-label",htmlFor:"native-shell-onboarding-server-url",children:"Server URL"}),t.jsx("input",{id:"native-shell-onboarding-server-url",className:"input",value:d,onChange:N=>u(N.target.value),placeholder:"https://your-fusion-host"}),t.jsx("label",{className:"native-shell-onboarding-label",htmlFor:"native-shell-onboarding-auth-token",children:"Auth token (optional)"}),t.jsx("input",{id:"native-shell-onboarding-auth-token",className:"input",type:"password",value:h,onChange:N=>m(N.target.value)})]}),f&&t.jsx("p",{className:"form-error",role:"alert",children:f})]}),t.jsx("div",{className:"modal-actions",children:t.jsx("button",{type:"button",className:"btn btn-primary",disabled:!j||x,onClick:async()=>{p(null),y(!0);try{if(g&&r==="local"){await n.setDesktopMode("local"),a();return}const N=await n.saveProfile({name:l.trim()||"Remote Server",serverUrl:d,authToken:h||null});if(g&&await n.setDesktopMode("remote"),await n.setActiveProfile(N.id),typeof window<"u"&&s.host!=="web"){window.location.href=dU(N.serverUrl,N.authToken??null);return}a()}catch(N){p(N.message)}finally{y(!1)}},children:x?"Saving…":"Continue"})})]})}):null}function mU({open:e,shellApi:n,shellState:s,onClose:a}){const r=i.useMemo(()=>s.profiles.find(w=>w.id===s.activeProfileId)??null,[s.activeProfileId,s.profiles]),[o,l]=i.useState(null),[c,d]=i.useState({}),[u,h]=i.useState(null),[m,f]=i.useState(null);if(!e)return null;const p=o==="__new__",b=p?null:s.profiles.find(w=>w.id===o)??r,v=c.name??b?.name??"",x=c.serverUrl??b?.serverUrl??"",y=c.authToken??b?.authToken??"",g=()=>{l(null),d({}),f(null)},j=async()=>{f(null);try{const w=new URL(x.trim());if(!/^https?:$/.test(w.protocol))throw new Error("Server URL must use http or https");const S=await n.saveProfile({id:p?void 0:o??b?.id,name:v||"Remote Server",serverUrl:x,authToken:y||null});await n.setActiveProfile(S.id),l(S.id),d({})}catch(w){f(w.message)}},N=async()=>{f(null);try{const w=await n.startQrScan();l("__new__"),d({name:"",serverUrl:w.serverUrl,authToken:w.authToken??""})}catch(w){f(w.message)}},C=async()=>{u&&(await n.deleteProfile(u.id),h(null),g())};return t.jsx("div",{className:"modal-overlay open",children:t.jsxs("div",{className:"modal native-shell-connection-manager",role:"dialog","aria-label":"Connection Manager",children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h2",{children:"Connection Manager"}),t.jsx("button",{type:"button",className:"modal-close",onClick:a,"aria-label":"Close",children:"×"})]}),s.host==="desktop-shell"&&t.jsxs("div",{className:"native-shell-connection-manager__mode-row",children:[t.jsx("button",{type:"button",className:`btn ${s.desktopMode==="local"?"btn-primary":""}`,onClick:()=>void n.setDesktopMode("local"),children:"Local"}),t.jsx("button",{type:"button",className:`btn ${s.desktopMode!=="local"?"btn-primary":""}`,onClick:()=>void n.setDesktopMode("remote"),children:"Remote"})]}),t.jsx("div",{className:"native-shell-connection-manager__profiles",children:s.profiles.length===0?t.jsxs("div",{className:"card native-shell-connection-manager__empty-state",children:[t.jsx("p",{className:"settings-muted",children:"No remote servers saved yet."}),t.jsxs("div",{className:"native-shell-connection-manager__profile-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>{l("__new__"),d({name:"",serverUrl:"",authToken:""}),f(null)},children:"Add server"}),s.host==="mobile-shell"&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void N(),children:"Scan QR"})]})]}):s.profiles.map(w=>t.jsxs("div",{className:"card native-shell-connection-manager__profile",children:[t.jsxs("div",{children:[t.jsx("strong",{children:w.name}),t.jsx("div",{className:"settings-muted",children:w.serverUrl}),w.id===s.activeProfileId&&t.jsx("span",{className:"native-shell-connection-manager__active-pill",children:"Active"})]}),t.jsxs("div",{className:"native-shell-connection-manager__profile-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm","aria-label":`Edit ${w.name}`,onClick:()=>{l(w.id),d(w)},children:"Edit"}),t.jsx("button",{type:"button",className:"btn btn-sm","aria-label":`Use ${w.name}`,onClick:()=>void n.setActiveProfile(w.id),children:"Use"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-danger","aria-label":`Delete ${w.name}`,onClick:()=>h(w),children:"Delete"})]})]},w.id))}),t.jsxs("div",{className:"native-shell-connection-manager__mode-row",children:[t.jsx("button",{type:"button",className:"btn",onClick:()=>{l("__new__"),d({name:"",serverUrl:"",authToken:""}),f(null)},children:"Add connection"}),s.host==="mobile-shell"&&t.jsx("button",{type:"button",className:"btn",onClick:()=>void N(),children:"Scan QR"})]}),t.jsxs("div",{className:"form-group native-shell-connection-manager__editor",children:[t.jsx("label",{htmlFor:"native-shell-connection-manager-name",children:"Name"}),t.jsx("input",{id:"native-shell-connection-manager-name",className:"input",value:v,onChange:w=>d(S=>({...S,name:w.target.value}))}),t.jsx("label",{htmlFor:"native-shell-connection-manager-url",children:"Server URL"}),t.jsx("input",{id:"native-shell-connection-manager-url",className:"input",value:x,onChange:w=>d(S=>({...S,serverUrl:w.target.value}))}),t.jsx("label",{htmlFor:"native-shell-connection-manager-token",children:"Auth token (optional)"}),t.jsx("input",{id:"native-shell-connection-manager-token",className:"input",type:"password",value:y??"",onChange:w=>d(S=>({...S,authToken:w.target.value}))}),m&&t.jsx("p",{className:"form-error",role:"alert",children:m})]}),u&&t.jsxs("div",{className:"native-shell-connection-manager__delete-confirm",role:"alertdialog","aria-label":"Delete server confirmation",children:[t.jsxs("p",{children:["Delete ",t.jsx("strong",{children:u.name}),"? This removes the saved profile."]}),t.jsxs("div",{className:"native-shell-connection-manager__profile-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>h(null),children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-danger",onClick:()=>void C(),children:"Delete"})]})]}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:a,children:"Close"}),t.jsx("button",{type:"button",className:"btn",onClick:g,children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void j(),disabled:!x.trim(),children:"Save"})]})]})})}function hU(e){if(e.hostKind==="desktop-shell"&&e.mode==="local")return{title:"Desktop local mode",actionLabel:"Switch server",dotClassName:"status-dot status-dot--online"};const n=e.profileLabel??e.profileId,s=e.serverOrigin,a=n&&s?`${n} · ${s}`:n??s;return e.mode==="remote"?{title:a??"Connection info unavailable",actionLabel:e.hostKind==="desktop-shell"?"Switch server":"Manage connections",dotClassName:a?"status-dot status-dot--online":"status-dot status-dot--pending"}:{title:a??"Connection info unavailable",actionLabel:"Manage connections",dotClassName:a?"status-dot status-dot--online":"status-dot status-dot--pending"}}function Ev({status:e,onError:n}){if(e.hostKind==="browser"||!e.available)return null;const s=hU(e),a=i.useCallback(async()=>{const r=await e.openConnectionManager();!r.ok&&r.reason==="failed"&&n?.(r.error??"Failed to open connection manager")},[n,e]);return t.jsxs("button",{type:"button",className:"btn shell-connection-status",onClick:()=>void a(),"data-testid":"shell-connection-status-button",children:[t.jsx("span",{className:s.dotClassName,"aria-hidden":"true"}),t.jsx("span",{className:"shell-connection-status__kind",children:e.hostKind==="desktop-shell"?"Desktop":"Mobile"}),t.jsx("span",{className:"shell-connection-status__summary",title:s.title,children:s.title}),t.jsx("span",{className:"shell-connection-status__action",children:s.actionLabel})]})}function fU(e){if(e)try{return new URL(e).origin}catch{return}}function pU(e,n){const s=e.profiles.find(a=>a.id===e.activeProfileId)??null;return s||(n.kind==="browser"||!n.connectionId?null:e.profiles.find(a=>a.id===n.connectionId)??null)}async function gU(e){if(!e?.getState)return null;try{return await e.getState()}catch{return null}}async function bU(e,n=window){const s=n.fusionAPI,a=n.fusionShell,r=await gU(a),o=r?pU(r,e):null,l=e.kind==="browser"?void 0:e.mode??r?.desktopMode,c=o?.id??(e.kind==="browser"?void 0:e.connectionId),d=o?.name,u=fU(o?.serverUrl??(e.kind==="browser"?void 0:e.serverUrl)),h=e.kind==="desktop-shell"&&typeof s?.openConnectionManager=="function",m=e.kind==="mobile-shell"&&typeof a?.openConnectionManager=="function",f=h||m;return{hostKind:e.kind,available:f,...l?{mode:l}:{},...c?{profileId:c}:{},...d?{profileLabel:d}:{},...u?{serverOrigin:u}:{},openConnectionManager:async()=>{try{return h?(await s.openConnectionManager?.(),{ok:!0}):m?(await a.openConnectionManager(),{ok:!0}):{ok:!1,reason:"unsupported"}}catch(p){return{ok:!1,reason:"failed",error:p instanceof Error?p.message:String(p)}}}}}function xU({open:e}){const[n,s]=i.useState(""),a=i.useRef(null);i.useEffect(()=>{e&&a.current?.focus()},[e]);const r=i.useCallback(()=>{const l=n.trim();l&&(kC(l),window.location.reload())},[n]),o=i.useCallback(()=>{jC(),window.location.reload()},[]);return e?t.jsx("div",{className:"modal-overlay open auth-token-recovery-overlay",role:"presentation",onKeyDownCapture:l=>{l.key==="Escape"&&(l.preventDefault(),l.stopPropagation())},children:t.jsxs("div",{className:"modal modal-md",role:"dialog","aria-modal":"true","aria-labelledby":"auth-token-recovery-title","aria-describedby":"auth-token-recovery-description",children:[t.jsx("div",{className:"modal-header auth-token-recovery-header",children:t.jsx("h3",{id:"auth-token-recovery-title",children:"Authentication token required"})}),t.jsxs("div",{className:"auth-token-recovery-content",children:[t.jsx("p",{id:"auth-token-recovery-description",children:"This dashboard session can't authenticate with the daemon. Set a replacement token or clear the current token and retry."}),t.jsxs("div",{className:"auth-token-recovery-field",children:[t.jsx("label",{htmlFor:"auth-token-recovery-input",children:"Replacement token"}),t.jsx("input",{ref:a,id:"auth-token-recovery-input",className:"input",type:"password",value:n,onChange:l=>s(l.target.value),placeholder:"Paste token",autoComplete:"off",spellCheck:!1})]})]}),t.jsxs("div",{className:"modal-actions auth-token-recovery-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:o,children:"Clear token and retry"}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:r,disabled:n.trim().length===0,children:"Set token and reload"})]})]})}):null}const vU=i.lazy(()=>qn(()=>import("./AgentsView-BZVOpQ05.js"),__vite__mapDeps([33,1,4,5,34,17,6,7,8,35])).then(e=>({default:e.AgentsView}))),yU=i.lazy(()=>qn(()=>import("./DocumentsView-DIRlgdeB.js"),__vite__mapDeps([36,1,6,7,8,37])).then(e=>({default:e.DocumentsView}))),wU=i.lazy(()=>qn(()=>import("./InsightsView-Hm7vX2lr.js"),__vite__mapDeps([38,1,24,6,7,8,39])).then(e=>({default:e.InsightsView}))),kU=i.lazy(()=>qn(()=>import("./ResearchView-CpsR1Q56.js"),__vite__mapDeps([40,1,6,7,8,41])).then(e=>({default:e.ResearchView}))),jU=i.lazy(()=>qn(()=>import("./EvalsView-By5mtr80.js"),__vite__mapDeps([42,1,6,7,8,43])).then(e=>({default:e.EvalsView}))),NU=i.lazy(()=>qn(()=>import("./NodesView-bXC6WoE2.js"),__vite__mapDeps([44,1,19,34,6,7,8,45])).then(e=>({default:e.NodesView}))),SU=i.lazy(()=>qn(()=>import("./ChatView-CErtz86Y.js"),__vite__mapDeps([46,1,6,7,8,47])).then(e=>({default:e.ChatView}))),CU=i.lazy(()=>qn(()=>import("./SkillsView-CZMLY7F_.js"),__vite__mapDeps([48,1,6,7,8,49])).then(e=>({default:e.SkillsView}))),EU=i.lazy(()=>qn(()=>import("./MemoryView-BLozyYur.js"),__vite__mapDeps([50,1,22,23,6,7,8,51])).then(e=>({default:e.MemoryView}))),_U=i.lazy(()=>qn(()=>import("./SecretsView-Bwme1zZI.js"),__vite__mapDeps([25,1,6,7,8,26])).then(e=>({default:e.SecretsView}))),MU=i.lazy(()=>qn(()=>import("./ReliabilityView-C1C1j1SD.js"),__vite__mapDeps([52,1,53])).then(e=>({default:e.ReliabilityView}))),RU=i.lazy(()=>qn(()=>import("./DevServerView-BRA00XoT.js"),__vite__mapDeps([54,1,6,7,8,55])).then(e=>({default:e.DevServerView})));i.lazy(()=>qn(()=>import("./TodoView-DXdnOymj.js"),__vite__mapDeps([13,1,6,7,8,14])).then(e=>({default:e.TodoView})));const AU=i.lazy(()=>qn(()=>import("./GoalsView-COI14CWJ.js"),__vite__mapDeps([56,1,6,7,8,57])).then(e=>({default:e.GoalsView}))),TU=i.lazy(()=>qn(()=>import("./StashRecoveryView-jgZeWbZo.js"),__vite__mapDeps([58,1,6,7,8,59])).then(e=>({default:e.StashRecoveryView})));function IU(){(typeof window<"u"&&window.requestIdleCallback||(n=>setTimeout(n,200)))(()=>{qn(()=>import("./AgentsView-BZVOpQ05.js"),__vite__mapDeps([33,1,4,5,34,17,6,7,8,35])),qn(()=>import("./DocumentsView-DIRlgdeB.js"),__vite__mapDeps([36,1,6,7,8,37])),qn(()=>import("./InsightsView-Hm7vX2lr.js"),__vite__mapDeps([38,1,24,6,7,8,39])),qn(()=>import("./ResearchView-CpsR1Q56.js"),__vite__mapDeps([40,1,6,7,8,41])),qn(()=>import("./EvalsView-By5mtr80.js"),__vite__mapDeps([42,1,6,7,8,43])),qn(()=>import("./NodesView-bXC6WoE2.js"),__vite__mapDeps([44,1,19,34,6,7,8,45])),qn(()=>import("./ChatView-CErtz86Y.js"),__vite__mapDeps([46,1,6,7,8,47])),qn(()=>import("./SkillsView-CZMLY7F_.js"),__vite__mapDeps([48,1,6,7,8,49])),qn(()=>import("./MemoryView-BLozyYur.js"),__vite__mapDeps([50,1,22,23,6,7,8,51])),qn(()=>import("./SecretsView-Bwme1zZI.js"),__vite__mapDeps([25,1,6,7,8,26])),qn(()=>import("./ReliabilityView-C1C1j1SD.js"),__vite__mapDeps([52,1,53])),qn(()=>import("./DevServerView-BRA00XoT.js"),__vite__mapDeps([54,1,6,7,8,55])),qn(()=>import("./TodoView-DXdnOymj.js"),__vite__mapDeps([13,1,6,7,8,14])),qn(()=>import("./GoalsView-COI14CWJ.js"),__vite__mapDeps([56,1,6,7,8,57])),qn(()=>import("./StashRecoveryView-jgZeWbZo.js"),__vite__mapDeps([58,1,6,7,8,59]))})}pj();const wm="kb-setup-warning-dismissed",_v="kb-dashboard-working-branch-filter",Mv="kb-dashboard-base-branch-filter",Rv="__fusion:no-branch__",wj="fusion:approval-banner-dismissed",Vc="kb-capacity-risk-banner-dismissed",PU=.8;function $U(e,n){return e==="awaiting-approval"&&n!=="awaiting-approval"}function Av(e){if(!e)return 0;const n=Date.parse(e);return Number.isFinite(n)?n:0}function DU(){if(typeof window>"u")return new Map;try{const e=window.localStorage.getItem(wj);if(!e)return new Map;const n=JSON.parse(e),s=new Map;for(const[a,r]of Object.entries(n))typeof r=="number"&&Number.isFinite(r)&&s.set(a,r);return s}catch{return new Map}}function Tv(e){if(!(typeof window>"u"))try{const n={};for(const[s,a]of e)n[s]=a;window.localStorage.setItem(wj,JSON.stringify(n))}catch{}}function LU(e,n){const s=new URL(e);return n&&s.searchParams.set("rt",n),s.toString()}function OU(e,n,s){return!n||s||e.host==="web"?!1:e.host==="mobile-shell"?!e.activeProfileId:e.desktopMode==="local"?!1:!e.activeProfileId}function FU(e,n){return e&&n===0}function zU(){const{toasts:e,addToast:n,removeToast:s}=v8(),{shellApi:a,state:r,ready:o,openConnectionManagerSignal:l}=Vk(),c=cU();i.useEffect(()=>{IU()},[]);const{projects:d,loading:u,error:h,refresh:m}=f8(),{nodes:f}=Td(),{currentNode:p,currentNodeId:b,isRemote:v,setCurrentNode:x,clearCurrentNode:y}=J8(),{currentProject:g,setCurrentProject:j,clearCurrentProject:N,loading:C}=b8(d,{nodeId:b}),{hasAiProvider:w,hasGithub:S,loading:R,hasWarnings:I}=Bk(g?.id),{updateAvailable:E,latestVersion:M,currentVersion:G,dismissed:U,dismiss:P}=A8();i.useEffect(()=>{if(b&&!p&&f.length>0){const ze=f.find(Ot=>Ot.id===b);if(ze){x(ze);return}}b&&f.length>0&&(f.some(Ot=>Ot.id===b)||y())},[b,p,f,x,y]);const[T,D]=i.useState(""),[W,Y]=i.useState(""),[L,_]=i.useState("");i.useEffect(()=>{Y(ns(_v,g?.id)??""),_(ns(Mv,g?.id)??"")},[g?.id]);const F=i.useCallback(ze=>{Y(ze),Ns(_v,ze,g?.id)},[g?.id]),ae=i.useCallback(ze=>{_(ze),Ns(Mv,ze,g?.id)},[g?.id]),k=V8(b,{projectId:g?.id,searchQuery:T||void 0});W8(b);const z=v&&k.projects.length>0?k.projects:d,{themeMode:J,colorTheme:oe,dashboardFontScalePct:le,setThemeMode:we,setColorTheme:re,setDashboardFontScalePct:H}=C8(),{sessions:ue,generating:Q,needsInput:be,planningSessions:fe,dismissSession:O}=a8(g?.id),se=ue.filter(ze=>ze.status==="awaiting_input"||ze.status==="error"),ve=l8(),A=E8({projectId:g?.id,planningSessions:fe}),ye=$i()==="mobile",{pushNav:ee,replaceCurrent:ge}=QO({enabled:!0}),{viewMode:Ne,setViewMode:He,taskView:Le,handleChangeTaskView:de}=$8({projectsLoading:u,projectsError:h,currentProjectLoading:C,currentProject:g,projectsLength:d.length,setupWizardOpen:A.setupWizardOpen,openSetupWizard:A.openSetupWizard,themeMode:J,setThemeMode:we}),{views:Re}=L8(g?.id),Pe=i.useMemo(()=>{const ze=Re.find(Ot=>Ot.pluginId==="fusion-plugin-dependency-graph"&&Ot.view.viewId==="graph");return ze?`plugin:${ze.pluginId}:${ze.view.viewId}`:Cy("fusion-plugin-dependency-graph","graph")?"plugin:fusion-plugin-dependency-graph:graph":null},[Re]),rt=i.useCallback(ze=>{ze==="missions"&&(Me(void 0),Qe(void 0),gn(void 0));const Ot=Le;de(ze),Ot!==ze&&ee({type:"view",revert:()=>de(Ot)})},[de,Le,ee]),qe=Le==="board"||Le==="list",{tasks:Xe,isStale:At,createTask:at,moveTask:Se,pauseTask:pe,unpauseTask:_e,deleteTask:et,mergeTask:Ae,retryTask:it,resetTask:xt,updateTask:Nt,duplicateTask:Ut,archiveTask:Be,unarchiveTask:Z,archiveAllDone:Oe,loadArchivedTasks:ht,refreshTasks:je,ingestCreatedTasks:mt,lastFetchTimeMs:Et}=d8({...g?{projectId:g.id}:{},searchQuery:T||void 0,sseEnabled:qe}),Te=i.useRef(Le);i.useEffect(()=>{const ze=Te.current;!(ze==="board"||ze==="list")&&(Le==="board"||Le==="list")&&je(),Te.current=Le},[Le,je]);const xe=v&&k.tasks.length>0?k.tasks:Xe,[gt,_t]=i.useState(0),Ft=i.useRef(performance.now()),Dt=i.useRef(!1),nt=i.useRef(!1),Wt=i.useRef(!1),Mt=i.useMemo(()=>u?"projects":C?"project":"tasks",[u,C]);i.useEffect(()=>{if(!u&&!Dt.current){Dt.current=!0;const ze=`projects loaded at ${Math.round(performance.now()-Ft.current)}ms from mount`;console.log(`[App] ${ze}`)}if(!C&&!nt.current){nt.current=!0;const ze=`current-project resolved at ${Math.round(performance.now()-Ft.current)}ms from mount`;console.log(`[App] ${ze}`)}},[u,C]);const Kt=!u&&!C,xn=FU(u,d.length);i.useEffect(()=>{if(!Kt||Wt.current)return;Wt.current=!0;const ze=`dashboard ready at ${Math.round(performance.now()-Ft.current)}ms from mount`;console.log(`[App] ${ze}`)},[Kt]);const{keyboardOpen:Tn}=Ia({enabled:ye}),{footerHidden:Sn,navKeyboardOpen:is,footerKeyboardOpen:On}=R8({isMobile:ye,keyboardOpen:Tn,anyModalOpen:A.anyModalOpen,isIOS:Hh()}),un=Sn,tn=is;ta(un);const[on,pn]=i.useState(0),[mn,Zn]=i.useState(0),[In,rn]=i.useState(!1),[hn,Pn]=i.useState(0),[nn,$t]=i.useState(null),Jt=i.useRef(new Map),Qt=i.useRef(new Set),ie=i.useRef(DU()),Fe=i.useCallback(()=>{xy(g?.id).then(ze=>{pn(ze.unreadCount),Zn(ze.pendingApprovalCount??0)}).catch(ze=>{console.warn("[App] Failed to fetch mailbox unread count:",ze)})},[g?.id]);i.useEffect(()=>{const ze=new Map,Ot=new Set;for(const vn of Xe)ze.set(vn.id,vn.status),vn.status==="awaiting-approval"&&Ot.add(`task:${vn.id}`);Jt.current=ze,Qt.current=Ot},[Xe]),i.useEffect(()=>{Fe();const ze=new URLSearchParams;g?.id&&ze.set("projectId",g.id);const Ot=ze.size>0?`?${ze.toString()}`:"",vn=Ms=>{const Ds=ie.current.get(Ms.dedupeKey);Ds!==void 0&&Ms.updatedAtMs<=Ds||$t(Ms)};return Si(`/api/events${Ot}`,{onReconnect:Fe,events:{"message:sent":Fe,"message:received":Fe,"message:read":Fe,"message:deleted":Fe,"approval:requested":Ms=>{Fe();try{const Ds=JSON.parse(Ms.data),wi=Ds.id?`approval:${Ds.id}`:Ds.taskId?`task:${Ds.taskId}`:void 0;if(!wi||Qt.current.has(wi))return;Qt.current.add(wi),vn({dedupeKey:wi,updatedAtMs:Av(Ds.updatedAt??Ds.createdAt)})}catch{}},"approval:updated":Fe,"approval:decided":Fe,"task:updated":Ms=>{try{const Ds=JSON.parse(Ms.data);if(!Ds?.id)return;const wi=`task:${Ds.id}`,zd=Jt.current.get(Ds.id);if(Jt.current.set(Ds.id,Ds.status),Ds.status!=="awaiting-approval"){Qt.current.delete(wi),ie.current.delete(wi),Tv(ie.current);return}if(Qt.current.has(wi))return;$U(Ds.status,zd)&&(Qt.current.add(wi),vn({dedupeKey:wi,updatedAtMs:Av(Ds.updatedAt)}),Fe())}catch{}}}})},[g?.id,Fe]),i.useEffect(()=>{Le==="chat"&&rn(!1)},[Le]),i.useEffect(()=>{let ze=!1;const Ot=async()=>{try{const Ms=await $("/stash-recovery/orphans");ze||Pn(Ms.count??0)}catch{ze||Pn(0)}};Ot();const vn=window.setInterval(()=>void Ot(),3e4);return()=>{ze=!0,window.clearInterval(vn)}},[g?.id]),i.useEffect(()=>{const ze=new URLSearchParams;g?.id&&ze.set("projectId",g.id);const Ot=ze.size>0?`?${ze.toString()}`:"";return Si(`/api/events${Ot}`,{events:{"chat:message:added":vn=>{try{const Ms=JSON.parse(vn.data);if(Ms.role!=="assistant"||Le==="chat"||Ms.projectId&&g?.id&&Ms.projectId!==g.id)return;rn(!0)}catch{}},"chat:room:message:added":vn=>{try{const Ms=JSON.parse(vn.data);if(Ms.role==="user"||Le==="chat"||Ms.projectId&&g?.id&&Ms.projectId!==g.id)return;rn(!0)}catch{}}}})},[g?.id,Le]);const Je=i.useMemo(()=>Array.from(new Set(xe.map(ze=>ze.branch?.trim()).filter(ze=>!!(ze&&ze.length>0)))).sort((ze,Ot)=>ze.localeCompare(Ot)),[xe]),tt=i.useMemo(()=>Array.from(new Set(xe.map(ze=>ze.baseBranch?.trim()).filter(ze=>!!(ze&&ze.length>0)))).sort((ze,Ot)=>ze.localeCompare(Ot)),[xe]),Ye=i.useMemo(()=>xe.filter(ze=>{const Ot=ze.branch?.trim()??"",vn=ze.baseBranch?.trim()??"";if(W===Rv){if(Ot.length>0)return!1}else if(W.length>0&&Ot!==W)return!1;if(L===Rv){if(vn.length>0)return!1}else if(L.length>0&&vn!==L)return!1;return!0}),[xe,W,L]),[vt,pt]=i.useState(!1),[Zt,ce]=i.useState(!1),[Ge,Me]=i.useState(void 0),[Ke,Qe]=i.useState(void 0),[Lt,gn]=i.useState(void 0),[Bn,wn]=i.useState(!1),[Yt,$n]=i.useState(!1),[dn,me]=i.useState(null),[jt,Cn]=i.useState(!1),[bs,Ts]=i.useState(null),[kn,ls]=i.useState(()=>ns(wm,g?.id)==="true"),[cs,ys]=i.useState(()=>ns(Vc,g?.id)==="true");i.useEffect(()=>{ls(ns(wm,g?.id)==="true")},[g?.id]),i.useEffect(()=>{ys(ns(Vc,g?.id)==="true")},[g?.id]);const xs=i.useCallback(async()=>{Cn(!0),Ts(null);try{const ze=await ey();me(ze)}catch(ze){Ts(ze instanceof Error?ze.message:"Failed to refresh database health.")}finally{Cn(!1)}},[]);i.useEffect(()=>{let ze=!1;return IC().then(Ot=>{ze||me(Ot)}).catch(()=>{ze||me(null)}),()=>{ze=!0}},[]),i.useEffect(()=>{const ze=()=>{$n(!0)};return window.addEventListener(Tm,ze),()=>{window.removeEventListener(Tm,ze)}},[]);const he=i.useCallback(()=>{Ns(wm,"true",g?.id),ls(!0)},[g?.id]),bt=i.useCallback(()=>{Ns(Vc,"true",g?.id),ys(!0)},[g?.id]),{maxConcurrent:ot,autoMerge:St,globalPaused:lt,enginePaused:Tt,isTestMode:Xt,taskStuckTimeoutMs:zt,staleHighFanoutBlockerAgeThresholdMs:Ee,capacityRiskBannerEnabled:yt,capacityRiskTodoThreshold:Rt,showQuickChatFAB:yn,maxTotalRetriesBeforeFail:_n,prAuthAvailable:Dn,settingsLoaded:an,experimentalFeatures:En,insightsEnabled:ws,memoryEnabled:Is,devServerEnabled:ks,todosEnabled:V,goalsEnabled:We,toggleAutoMerge:wt,toggleGlobalPause:ut,toggleEnginePause:Bt,refresh:en}=aj(g?.id),{stats:jn}=ij(g?.id),ts=i.useMemo(()=>xe.filter(ze=>ze.column==="in-progress").length,[xe]),vs=i.useMemo(()=>xe.filter(ze=>ze.column==="in-review").length,[xe]),Ps=i.useMemo(()=>aC({todoCount:jn?.todoTaskCount??0,inProgressCount:ts,inReviewCount:vs,idleNonEphemeralAgentCount:jn?.idleNonEphemeralCount??0,threshold:Rt??iC}),[jn?.todoTaskCount,jn?.idleNonEphemeralCount,ts,vs,Rt]),te=i.useRef(yt),Ie=i.useRef(Rt),ft=i.useRef(g?.id),Vt=i.useRef(!1);i.useEffect(()=>{if(!an)return;if(!Vt.current||ft.current!==g?.id){Vt.current=!0,ft.current=g?.id,te.current=yt,Ie.current=Rt;return}const ze=te.current,Ot=Ie.current;(!ze&&yt||Ot!==Rt)&&(qi(Vc,g?.id),ys(!1)),ft.current=g?.id,te.current=yt,Ie.current=Rt},[an,yt,Rt,g?.id]);const qt=En.skillsView===!0,ln=En.nodesView===!0,Mn=En.researchView===!0,Rn=En.evalsView===!0,Kn=En.agentOnboarding===!0,ds=!0,Jn=i.useCallback(()=>{A.closeSettings(),_t(ze=>ze+1),en()},[A,en]);i.useEffect(()=>{if(an&&!go(Le)){if(Le==="graph"&&!Pe){de("board");return}Le==="skills"&&!qt&&de("board"),Le==="insights"&&!ws&&de("board"),Le==="memory"&&!Is&&de("board"),(Le==="devserver"||Le==="dev-server")&&!ks&&de("board"),Le==="research"&&!Mn&&de("board"),Le==="evals"&&!Rn&&de("board"),Le==="goalsView"&&!We&&de("board")}},[Le,an,qt,ws,de,ds,Is,ks,Mn,Rn,We,Pe]),i.useEffect(()=>{vt&&!ln&&pt(!1)},[vt,ln]);const{availableModels:Us,favoriteProviders:X,favoriteModels:$e,toggleFavoriteProvider:Ue,toggleFavoriteModel:Ht}=fk();M8({projectId:g?.id,setupWizardOpen:A.setupWizardOpen,openModelOnboarding:A.openModelOnboarding,openSettings:A.openSettings});const{handleSelectProject:cn,handleViewAllProjects:Un,handleAddProject:as,handleSetupComplete:$s,handleModelOnboardingComplete:Fs,handlePauseProject:js,handleResumeProject:Zs,handleRemoveProject:ei,handleToggleFavorite:ti,handleToggleModelFavorite:Ei}=H8({setCurrentProject:j,clearCurrentProject:N,setViewMode:He,currentProject:g,refreshProjects:m,toggleFavoriteProvider:Ue,toggleFavoriteModel:Ht,addToast:n,openSettings:A.openSettings,openSetupWizard:A.openSetupWizard,closeSetupWizard:A.closeSetupWizard,closeModelOnboarding:A.closeModelOnboarding}),{handleDetailClose:_i}=_8({projectId:g?.id,projects:d,projectsLoading:u,currentProject:g,setCurrentProject:j,addToast:n,openTaskDetail:A.openDetailTask,closeTaskDetail:A.closeDetailTask}),$r=i.useCallback(async({insightId:ze,title:Ot,description:vn})=>{await at({title:Ot,description:vn,column:"triage",source:{sourceType:"dashboard_ui",sourceMetadata:{origin:"insights",insightId:ze}}})},[at]),{handleBoardQuickCreate:Pa,handleModalCreate:Uo,handlePlanningTaskCreated:Dr,handlePlanningTasksCreated:Lr,handleSubtaskTasksCreated:$a,handleGitHubImport:Da}=q8({createTask:at,ingestCreatedTasks:mt,onPlanningTaskCreated:A.onPlanningTaskCreated,onPlanningTasksCreated:A.onPlanningTasksCreated,onSubtaskTasksCreated:A.onSubtaskTasksCreated,addToast:n}),La=i.useCallback((ze,Ot)=>{Ot==="changes"?A.openDetailWithChangesTab(ze):A.openDetailTask(ze,Ot),ee({type:"modal",close:A.closeDetailTask})},[A,ee]),_s=i.useCallback(async ze=>{try{const Ot=await Sr(ze,g?.id);A.openDetailTask(Ot,"logs"),ee({type:"modal",close:A.closeDetailTask})}catch(Ot){n(`Failed to open task logs: ${Ot.message}`,"error")}},[A,g?.id,n,ee]),[na,Li]=i.useState([]);i.useEffect(()=>{let ze=!1;return Bl(g?.id).then(Ot=>{ze||Li(Ot)}).catch(()=>{ze||Li([])}),()=>{ze=!0}},[g?.id]);const Or=i.useMemo(()=>new Map(na.map(ze=>[ze.id,ze.name])),[na]);i.useCallback(()=>{ln&&pt(ze=>!ze)},[ln]);const sa=i.useCallback(()=>{ln&&(vt?pt(!1):(pt(!0),ee({type:"view",revert:()=>pt(!1)})))},[ln,vt,ee]),Oi=i.useCallback((ze,Ot,vn)=>{A.openDetailTask(ze,Ot,vn),ee({type:"modal",close:A.closeDetailTask})},[A,ee]),ya=i.useCallback(ze=>{A.openSettings(ze),ee({type:"modal",close:Jn})},[A,ee,Jn]),Fr=i.useCallback(()=>{A.openNewTask(),ee({type:"modal",close:A.closeNewTask})},[A,ee]),zr=i.useCallback(()=>{A.openPlanning(),ee({type:"modal",close:A.closePlanning})},[A,ee]),Br=i.useCallback(ze=>{A.openPlanningWithInitialPlan(ze),ee({type:"modal",close:A.closePlanning})},[A,ee]),Vn=i.useCallback(()=>{A.resumePlanning(),ee({type:"modal",close:A.closePlanning})},[A,ee]),ir=i.useCallback(ze=>{A.openSubtaskBreakdown(ze),ee({type:"modal",close:A.closeSubtask})},[A,ee]),Oa=i.useCallback(()=>{A.openGitHubImport(),ee({type:"modal",close:A.closeGitHubImport})},[A,ee]),Fa=i.useCallback(()=>{A.terminalOpen?A.toggleTerminal():(A.toggleTerminal(),ee({type:"modal",close:A.closeTerminal}))},[A,ee]),Ur=i.useCallback((ze,Ot)=>{A.openFiles(ze,Ot),ee({type:"modal",close:A.closeFiles})},[A,ee]),Hr=i.useCallback((ze,Ot)=>{A.openFiles(Ot?.workspace,ze),ee({type:"modal",close:A.closeFiles})},[A,ee]),wa=i.useCallback(()=>{A.openTodos(),ee({type:"modal",close:A.closeTodos})},[A,ee]),ka=i.useCallback(()=>{A.openActivityLog(),ee({type:"modal",close:A.closeActivityLog})},[A,ee]),qr=i.useCallback(()=>{A.openGitManager(),ee({type:"modal",close:A.closeGitManager})},[A,ee]),Vr=i.useCallback(()=>{A.openSystemStats(),ee({type:"modal",close:A.closeSystemStats})},[A,ee]),ar=i.useCallback(()=>{A.openSchedules(),ee({type:"modal",close:A.closeSchedules})},[A,ee]),rr=i.useCallback(()=>{A.openScripts(),ee({type:"modal",close:A.closeScripts})},[A,ee]),or=i.useCallback(()=>{A.openWorkflowSteps(),ee({type:"modal",close:A.closeWorkflowSteps})},[A,ee]),lr=i.useCallback(ze=>{A.openUsage(ze),ee({type:"modal",close:A.closeUsage})},[A,ee]),cr=i.useCallback(async(ze,Ot)=>{await A.runScript(ze,Ot),ge({type:"modal",close:A.closeTerminal})},[A,ge]),Mi=i.useCallback(()=>{A.closeSettings(),A.openModelOnboarding(),ge({type:"modal",close:A.closeModelOnboarding})},[A,ge]),ia=i.useCallback(()=>{A.setFileWorkspace("project"),A.openFiles()},[A]),B=i.useCallback(async()=>{ce(!0);try{await m()}finally{ce(!1)}},[m]),De=i.useCallback(ze=>{Qe(ze),Me(void 0),de("missions")},[de]),Ve=i.useCallback(ze=>{ze.type==="planning"?A.openPlanningWithSession(ze.id):ze.type==="subtask"?A.openSubtaskWithSession(ze.id):ze.type==="mission_interview"?(Qe(void 0),Me(ze.id),gn(void 0),de("missions")):(ze.type==="milestone_interview"||ze.type==="slice_interview")&&(Me(void 0),Qe(void 0),gn(ze.id),de("missions"))},[de,A]),kt=i.useCallback(()=>{},[]),zn=i.useCallback(()=>{},[]),[Gt,Yn]=i.useState(!1),[us,Ze]=i.useState(!1),[dt,sn]=i.useState(null),Gn=OU(r,o,Gt);i.useEffect(()=>{!a||l===0||Ze(!0)},[a,l]),i.useEffect(()=>{let ze=!1;return bU(c.host).then(Ot=>{ze||sn(Ot)}),()=>{ze=!0}},[c.host,r.activeProfileId,r.desktopMode,r.host,r.profiles]),i.useEffect(()=>{r.host==="desktop-shell"&&r.desktopMode==="local"&&(r.localServer?.status!=="ready"||!r.localServer.port||window.location.port!==String(r.localServer.port)&&(window.location.href=`http://localhost:${r.localServer.port}`))},[r]),i.useEffect(()=>{if(r.host!=="desktop-shell"||r.desktopMode!=="remote")return;const ze=r.profiles.find(vn=>vn.id===r.activeProfileId);if(!ze||typeof window>"u")return;const Ot=LU(ze.serverUrl,ze.authToken??null);window.location.href!==Ot&&(window.location.href=Ot)},[r]);const fs=!u&&!C&&d.length===0&&!g&&!!h,Xn=()=>{if(fs)return t.jsx(D5,{errorMessage:h??"Failed to fetch projects",isRetrying:Zt,onRetry:B,onManageConnection:a?()=>{a.openConnectionManager()}:void 0});if(vt)return t.jsx("div",{className:"nodes-management-overlay",children:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(NU,{addToast:n,onClose:()=>pt(!1)})})})});if(Ne==="overview")return t.jsx(Gs,{children:t.jsx(YO,{projects:d,loading:u,onSelectProject:cn,onAddProject:as,onPauseProject:js,onResumeProject:Zs,onRemoveProject:ei,nodes:f})});const ze=Le==="graph"?Pe:go(Le)?Le:null;return ze?t.jsx(Gs,{children:t.jsx(O8,{taskView:ze,context:{projectId:g?.id,tasks:v&&k.tasks.length>0?k.tasks:Xe,workflowSteps:na,openTaskDetail:(Ot,vn)=>Oi(Ot,vn),renderTaskCard:Ot=>t.jsx(Al,{task:Ot,projectId:g?.id,onOpenDetail:vn=>Oi(vn),addToast:n,workflowStepNameLookup:Or,disableDrag:!0,prAuthAvailable:Dn,autoMergeEnabled:St}),addToast:n}})}):Le==="skills"?!an||!qt?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(CU,{addToast:n,projectId:g?.id,onClose:()=>de("board")})})}):Le==="chat"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(SU,{addToast:n,projectId:g?.id,experimentalFeatures:En})})}):Le==="mailbox"?t.jsx(Gs,{children:t.jsx(ZF,{projectId:g?.id,addToast:n,onUnreadCountChange:pn})}):Le==="missions"?t.jsx(Gs,{children:t.jsx(qF,{isInline:!0,isOpen:!0,onClose:()=>{Qe(void 0),Me(void 0),gn(void 0),de("board")},addToast:n,projectId:g?.id,onSelectTask:Ot=>{const vn=Xe.find(Ms=>Ms.id===Ot);vn&&Oi(vn)},availableTasks:Xe.map(Ot=>({id:Ot.id,title:Ot.title})),resumeSessionId:Ge,targetMissionId:Ke,milestoneSliceResumeSessionId:Lt,onMilestoneSliceResumeFetchError:()=>gn(void 0)})}):Le==="agents"&&ds?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(vU,{addToast:n,projectId:g?.id,onOpenTaskLogs:_s,agentOnboardingEnabled:Kn})})}):Le==="documents"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(yU,{projectId:g?.id,addToast:n,onOpenDetail:Oi})})}):Le==="stash-recovery"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(TU,{})})}):Le==="insights"?!an||!ws?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(wU,{projectId:g?.id,addToast:n,onClose:()=>de("board"),onCreateTask:$r})})}):Le==="research"?!an||!Mn?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(kU,{projectId:g?.id,addToast:n,onOpenSettings:Ot=>A.openSettings(Ot),readinessVersion:gt})})}):Le==="evals"?!an||!Rn?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(jU,{projectId:g?.id,onOpenSettings:Ot=>A.openSettings(Ot),onOpenTaskDetail:Ot=>{Sr(Ot,g?.id).then(vn=>Oi(vn)).catch(vn=>n(vn instanceof Error?vn.message:"Failed to open task detail","error"))}})})}):Le==="memory"?!an||!Is?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(EU,{addToast:n,projectId:g?.id})})}):Le==="secrets"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(_U,{addToast:n})})}):Le==="goalsView"?!an||!We?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(AU,{})})}):Le==="reliability"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(MU,{})})}):Le==="devserver"||Le==="dev-server"?!an||!ks?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(RU,{addToast:n,projectId:g?.id})})}):Le==="board"?t.jsxs(Gs,{children:[yt&&!cs?t.jsx(iB,{signal:Ps,onDismiss:bt}):null,t.jsx(h2,{tasks:Ye,projectId:g?.id,maxConcurrent:ot,onMoveTask:Se,onPauseTask:pe,onOpenDetail:Oi,addToast:n,onQuickCreate:Pa,onNewTask:Fr,onPlanningMode:Br,onSubtaskBreakdown:ir,autoMerge:St,onToggleAutoMerge:wt,globalPaused:lt,onUpdateTask:Nt,onRetryTask:it,onArchiveTask:Be,onUnarchiveTask:Z,onDeleteTask:et,onArchiveAllDone:Oe,onLoadArchivedTasks:ht,searchQuery:T,availableModels:Us,onOpenDetailWithTab:La,favoriteProviders:X,favoriteModels:$e,onToggleFavorite:ti,onToggleModelFavorite:Ei,taskStuckTimeoutMs:zt,staleHighFanoutBlockerAgeThresholdMs:Ee,onOpenMission:De,lastFetchTimeMs:Et,prAuthAvailable:Dn})]}):t.jsx(Gs,{children:t.jsx(OO,{tasks:v&&k.tasks.length>0?k.tasks:Xe,projectId:g?.id,onMoveTask:Se,onRetryTask:it,onDeleteTask:et,onPauseTask:pe,onUnpauseTask:_e,onArchiveTask:Be,onMergeTask:Ae,onResetTask:xt,onDuplicateTask:Ut,onOpenDetail:(Ot,vn)=>Oi(Ot,void 0,vn),addToast:n,globalPaused:lt,onNewTask:Fr,onQuickCreate:Pa,onPlanningMode:Br,onSubtaskBreakdown:ir,availableModels:Us,favoriteProviders:X,favoriteModels:$e,onToggleFavorite:ti,onToggleModelFavorite:Ei,taskStuckTimeoutMs:zt,searchQuery:T,lastFetchTimeMs:Et,prAuthAvailable:Dn})})},ms=!A.modelOnboardingOpen&&s5(),Fn=!A.modelOnboardingOpen&&!ms&&Io()&&!Wk(),Vs=u||C||At;return t.jsx(XO,{value:{pushNav:ee,replaceCurrent:ge},children:t.jsx(KL,{openFile:Hr,children:t.jsx(yA,{value:_n*PU,children:xn?t.jsxs(t.Fragment,{children:[t.jsx(O5,{stage:Mt}),t.jsx(Yk,{toasts:e,onRemove:s})]}):t.jsxs(t.Fragment,{children:[t.jsx(F5,{visible:Vs}),t.jsx(FR,{shellHost:c.host,onOpenSettings:ya,onOpenGitHubImport:Oa,onOpenPlanning:zr,onResumePlanning:Vn,activePlanningSessionCount:fe.length,onOpenUsage:lr,onOpenActivityLog:ka,onOpenSystemStats:Vr,onOpenMailbox:()=>rt("mailbox"),mailboxUnreadCount:on,mailboxPendingApprovalCount:mn,chatHasUnreadResponse:In,stashOrphanCount:hn,onOpenSchedules:ar,onOpenGitManager:qr,onOpenNodes:sa,showNodesButton:ln,onOpenWorkflowSteps:or,onOpenScripts:rr,onRunScript:cr,onToggleTerminal:Fa,onOpenFiles:Ur,filesOpen:A.filesOpen,onOpenTodos:wa,todosOpen:A.todosOpen,todosEnabled:V,globalPaused:lt,enginePaused:Tt,onToggleGlobalPause:ut,onToggleEnginePause:Bt,view:Le,onChangeView:Ne==="project"&&g?rt:void 0,showSkillsTab:qt,showAgentsTab:ds,searchQuery:T,onSearchChange:D,branchFilter:W,baseBranchFilter:L,branchOptions:Je,baseBranchOptions:tt,onBranchFilterChange:F,onBaseBranchFilterChange:ae,projects:z,currentProject:g,onSelectProject:cn,onViewAllProjects:Un,projectId:g?.id,mobileNavEnabled:ye,availableNodes:f,currentNode:p,onSelectNode:ze=>{ze===null?y():x(ze)},isRemote:v,experimentalFeatures:{insights:ws,memoryView:Is,devServer:ks,devServerView:ks,researchView:Mn,evalsView:Rn,goalsView:We},pluginDashboardViews:Re,shellConnectionControl:!ye&&dt?t.jsx(Ev,{status:dt,onError:ze=>n(ze,"error")}):void 0}),Ne==="project"&&g&&t.jsxs(t.Fragment,{children:[t.jsx(aB,{isActive:Xt}),t.jsx(oB,{onReLogin:ze=>A.openSettings("authentication")})]}),Ne==="project"&&g&&!vt&&Le!=="missions"&&!A.isPlanningOpen&&!ve&&t.jsx(eB,{sessions:se,onResumeSession:Ve,onDismissSession:kt,onDismissAll:zn}),Ne==="project"&&g&&t.jsx(sB,{onOpenSettings:()=>A.openSettings("general")}),Ne==="project"&&g&&ms&&t.jsx(yB,{onResume:A.openModelOnboarding}),Ne==="project"&&g&&Fn&&t.jsx(wB,{onOpenModelOnboarding:A.openModelOnboarding,onOpenSettings:ze=>A.openSettings(ze)}),Ne==="project"&&g&&E&&M&&G&&!U&&t.jsx(mB,{latestVersion:M,currentVersion:G,onDismiss:P}),Ne==="project"&&g&&t.jsx(xB,{projectId:g.id}),Ne==="project"&&g&&dn?.taskIdIntegrity?.status==="anomaly"&&dn.taskIdIntegrity.recommendedAction&&t.jsx(dB,{report:dn.taskIdIntegrity,recommendedAction:dn.taskIdIntegrity.recommendedAction,onRefresh:(ze,Ot)=>{me(vn=>vn?{...vn,status:ze.status==="anomaly"||!vn.database.healthy||vn.database.corruptionDetected?"degraded":"ok",taskIdIntegrity:{...ze,recommendedAction:Ot}}:null)}}),Ne==="project"&&g&&dn?.database?.corruptionDetected===!0&&t.jsx(uB,{errors:dn.database.corruptionErrors,lastCheckedAt:dn.database.lastCheckedAt,onRefresh:xs,refreshing:jt,refreshError:bs}),Ne==="project"&&g&&!R&&I&&!kn&&t.jsx(Uk,{hasAiProvider:w,hasGithub:S,onDismiss:he}),Ne==="project"&&g&&nn&&t.jsx(vB,{pendingCount:Math.max(mn,1),onOpenMailbox:()=>rt("mailbox"),onDismiss:()=>{ie.current.set(nn.dedupeKey,Math.max(Date.now(),nn.updatedAtMs)),Tv(ie.current),$t(null)}}),t.jsx("div",{className:`project-content${Ne==="project"&&g&&(!ye||!un)?" project-content--with-footer":""}${ye&&!un?" project-content--with-mobile-nav":""}`,children:Xn()}),Ne==="project"&&g&&!vt&&t.jsx(J5,{tasks:v&&k.tasks.length>0?k.tasks:Xe,projectId:g.id,taskStuckTimeoutMs:zt,staleHighFanoutBlockerAgeThresholdMs:Ee,backgroundSessions:ue,backgroundGenerating:Q,backgroundNeedsInput:be,onOpenBackgroundSession:Ve,onDismissBackgroundSession:O,lastFetchTimeMs:Et,currentProjectPath:g.path,onOpenProjectDirectory:ia,keyboardOpen:On,hideWhenKeyboardOpen:un}),t.jsx(jB,{view:Le,onChangeView:Ne==="project"&&g?rt:()=>{},footerVisible:Ne==="project"&&!!g,modalOpen:A.anyModalOpen,keyboardOpen:tn,onOpenSettings:ya,onOpenActivityLog:ka,onOpenSystemStats:Vr,onOpenMailbox:()=>rt("mailbox"),onOpenNodes:sa,mailboxUnreadCount:on,mailboxPendingApprovalCount:mn,chatHasUnreadResponse:In,stashOrphanCount:hn,onOpenGitManager:qr,onOpenWorkflowSteps:or,onOpenSchedules:ar,onOpenScripts:rr,onToggleTerminal:Fa,onOpenFiles:Ur,onOpenTodos:wa,todosOpen:A.todosOpen,onOpenGitHubImport:Oa,onOpenPlanning:zr,onResumePlanning:Vn,activePlanningSessionCount:fe.length,onOpenUsage:()=>lr(null),onViewAllProjects:Un,onRunScript:cr,projectId:g?.id,showSkillsTab:qt,experimentalFeatures:{insights:ws,memoryView:Is,devServer:ks,devServerView:ks,todoView:V,researchView:Mn,evalsView:Rn,goalsView:We,nodesView:ln},pluginDashboardViews:Re,shellConnectionControl:ye&&dt?t.jsx(Ev,{status:dt,onError:ze=>n(ze,"error")}):void 0}),Ne==="project"&&g&&Le!=="chat"&&Le!=="mailbox"&&Le!=="insights"&&Le!=="evals"&&Le!=="devserver"&&Le!=="dev-server"&&Le!=="graph"&&!go(Le)&&t.jsx(i8,{projectId:g.id,addToast:n,showFAB:yn,open:Bn,onOpenChange:wn,favoriteProviders:X,favoriteModels:$e,onToggleFavorite:ti,onToggleModelFavorite:Ei}),t.jsx(I5,{projectId:g?.id,tasks:Xe,projects:d,currentProject:g,addToast:n,toasts:e,removeToast:s,modalManager:A,projectActions:{handleAddProject:as,handleSetupComplete:$s,handleModelOnboardingComplete:Fs},taskHandlers:{handleModalCreate:Uo,handlePlanningTaskCreated:Dr,handlePlanningTasksCreated:Lr,handleSubtaskTasksCreated:$a,handleGitHubImport:Da},taskOperations:{moveTask:Se,deleteTask:et,mergeTask:Ae,archiveTask:Be,retryTask:it,resetTask:xt,duplicateTask:Ut},deepLink:{handleDetailClose:_i},settings:{prAuthAvailable:Dn,themeMode:J,colorTheme:oe,dashboardFontScalePct:le,setThemeMode:we,setColorTheme:re,setDashboardFontScalePct:H},onSettingsClose:Jn,onReopenOnboarding:Mi,onOpenApprovals:ze=>rt("mailbox")}),t.jsx(xU,{open:Yt}),a&&t.jsxs(t.Fragment,{children:[t.jsx(uU,{open:Gn,shellApi:a,shellState:r,onComplete:()=>Yn(!0)}),t.jsx(mU,{open:us,shellApi:a,shellState:r,onClose:()=>Ze(!1)})]})]})})})})}function BU(){return t.jsx(x8,{children:t.jsx(lU,{children:t.jsx(V3,{children:t.jsx(K8,{children:t.jsx(UR,{children:t.jsx(zU,{})})})})})})}function kj(e){e.postMessage({type:"SKIP_WAITING"})}function Iv(e){e.addEventListener("statechange",()=>{e.state==="installed"&&navigator.serviceWorker.controller&&kj(e)})}function UU(){if(!("serviceWorker"in navigator))return;const e=!!navigator.serviceWorker.controller;let n=!1;navigator.serviceWorker.addEventListener("controllerchange",()=>{n||!e||(n=!0,Mh("service worker activated new version"))}),navigator.serviceWorker.register("/sw.js").then(s=>{console.log("SW registered:",s.scope),s.waiting&&navigator.serviceWorker.controller&&kj(s.waiting),s.installing&&Iv(s.installing),s.addEventListener("updatefound",()=>{const a=s.installing;a&&Iv(a)})}).catch(s=>{console.log("SW registration failed:",s)})}RC();Y0();vj();pj();Ij.createRoot(document.getElementById("root")).render(t.jsx(i.StrictMode,{children:t.jsx(X0,{children:t.jsx(eC,{children:t.jsx(BU,{})})})}));UU();export{a_ as $,fi as A,As as B,gs as C,xC as D,T7 as E,Ya as F,jd as G,XS as H,Em as I,os as J,Qc as K,Ct as L,Ll as M,ZS as N,Vi as O,rs as P,Os as Q,Ss as R,da as S,Ma as T,aq as U,T3 as V,dm as W,Nn as X,wS as Y,Bs as Z,es as _,Ln as a,ca as a$,qn as a0,_3 as a1,i_ as a2,y3 as a3,w3 as a4,M7 as a5,r_ as a6,ui as a7,_r as a8,bn as a9,ba as aA,jh as aB,pa as aC,Jj as aD,qH as aE,WH as aF,qs as aG,XH as aH,YH as aI,JH as aJ,KH as aK,GH as aL,VH as aM,ty as aN,No as aO,BH as aP,HH as aQ,UH as aR,eq as aS,QH as aT,ZH as aU,tq as aV,K7 as aW,iq as aX,Ml as aY,km as aZ,k0 as a_,B9 as aa,U9 as ab,Wn as ac,dE as ad,Nh as ae,$o as af,Tr as ag,ji as ah,Ni as ai,Pi as aj,th as ak,IH as al,OH as am,LH as an,Nr as ao,FH as ap,PH as aq,zH as ar,$H as as,DH as at,Cs as au,Ls as av,Ar as aw,wl as ax,oi as ay,I0 as az,ps as b,E9 as b$,Ff as b0,TN as b1,zs as b2,WO as b3,xi as b4,Wv as b5,m0 as b6,q7 as b7,V7 as b8,W7 as b9,nj as bA,UB as bB,Js as bC,ga as bD,wd as bE,Hh as bF,NB as bG,vr as bH,qv as bI,DB as bJ,ai as bK,Bv as bL,Bf as bM,fa as bN,HM as bO,MH as bP,_H as bQ,RH as bR,w9 as bS,y9 as bT,v9 as bU,k9 as bV,A9 as bW,T9 as bX,_9 as bY,S9 as bZ,C9 as b_,G7 as ba,Td as bb,f8 as bc,eh as bd,K6 as be,Np as bf,hs as bg,Wo as bh,nv as bi,sR as bj,rc as bk,qi as bl,VM as bm,AH as bn,TH as bo,eR as bp,EB as bq,nR as br,CB as bs,qB as bt,VB as bu,mf as bv,PB as bw,ff as bx,zB as by,Ia as bz,ct as c,a9 as c$,N9 as c0,j9 as c1,x9 as c2,M9 as c3,s6 as c4,l7 as c5,o7 as c6,f7 as c7,r7 as c8,c7 as c9,Al as cA,jo as cB,x_ as cC,kC as cD,jC as cE,l1 as cF,c1 as cG,yH as cH,q9 as cI,H9 as cJ,wH as cK,V9 as cL,Z9 as cM,Y9 as cN,W9 as cO,X9 as cP,G9 as cQ,Q9 as cR,K9 as cS,J9 as cT,sN as cU,b1 as cV,y1 as cW,e7 as cX,x1 as cY,t7 as cZ,Ui as c_,d7 as ca,u7 as cb,m7 as cc,PE as cd,h7 as ce,Ih as cf,AE as cg,TE as ch,IE as ci,RE as cj,a7 as ck,Cd as cl,y0 as cm,ko as cn,Z7 as co,eH as cp,tH as cq,nH as cr,sH as cs,iH as ct,aH as cu,Q7 as cv,ny as cw,RS as cx,$ as cy,ad as cz,O7 as d,R9 as d$,ea as d0,l8 as d1,Uz as d2,I9 as d3,t9 as d4,e9 as d5,Y7 as d6,IC as d7,r9 as d8,Ux as d9,X7 as dA,d9 as dB,jm as dC,Qs as dD,e6 as dE,P3 as dF,D3 as dG,L3 as dH,Ka as dI,um as dJ,F3 as dK,m9 as dL,l9 as dM,h9 as dN,u9 as dO,f9 as dP,p9 as dQ,Cr as dR,rq as dS,fC as dT,Ed as dU,QU as dV,vb as dW,ZU as dX,XU as dY,n9 as dZ,sq as d_,F7 as da,o9 as db,c9 as dc,b9 as dd,g9 as de,T1 as df,Vo as dg,A1 as dh,H7 as di,Bx as dj,w1 as dk,Qi as dl,Im as dm,k1 as dn,N1 as dp,j1 as dq,S1 as dr,C1 as ds,D9 as dt,z7 as du,B7 as dv,U7 as dw,Aa as dx,JU as dy,YU as dz,D7 as e,$9 as e$,rH as e0,lH as e1,uH as e2,cH as e3,oH as e4,dH as e5,mH as e6,Dm as e7,Zf as e8,S7 as e9,w7 as eA,N7 as eB,fH as eC,PM as eD,x7 as eE,p7 as eF,Wi as eG,i7 as eH,n7 as eI,s7 as eJ,s9 as eK,i9 as eL,pH as eM,kH as eN,_m as eO,SH as eP,CH as eQ,NH as eR,xH as eS,bH as eT,vH as eU,gH as eV,jH as eW,J7 as eX,nq as eY,L9 as eZ,P9 as e_,E7 as ea,OM as eb,PN as ec,jr as ed,ii as ee,bS as ef,hH as eg,A7 as eh,Za as ei,o4 as ej,Va as ek,_7 as el,C7 as em,P7 as en,I7 as eo,zv as ep,j7 as eq,k7 as er,g7 as es,b7 as et,v3 as eu,mr as ev,R7 as ew,y7 as ex,v7 as ey,uE as ez,Sr as f,o0 as f0,F9 as f1,z9 as f2,O9 as f3,L7 as g,fk as h,Ki as i,Qa as j,gd as k,EH as l,ri as m,s_ as n,$7 as o,$i as p,ij as q,k3 as r,Si as s,ns as t,ta as u,Di as v,Ns as w,Md as x,tc as y,Ce as z};
742
+ `)[0]?.trim()||_n?.title||"",an=new Set(mm),En=ot.filter(V=>an.has(V.id)).sort((V,We)=>{const wt=mm.indexOf(V.id),ut=mm.indexOf(We.id);return wt!==ut?wt-ut:Kx(V,We)}),ws=ot.filter(V=>V.authenticated&&!an.has(V.id)),Is=ot.filter(V=>!V.authenticated&&!an.has(V.id)),ks=V=>{const We=mt[V.id]==="timeout"||mt[V.id]==="failed"||mt[V.id]==="cancelled",wt=V.loginInProgress&&!We;if(V.id==="llama-cpp"&&V.type==="cli")return t.jsx(L3,{authenticated:V.authenticated,onToggled:()=>{tn()}},V.id);if(V.id==="claude-cli"&&V.type==="cli")return t.jsx(P3,{authenticated:V.authenticated,onToggled:()=>{tn()}},V.id);if(V.id==="cursor-cli"&&V.type==="cli")return t.jsx(D3,{authenticated:V.authenticated,onToggled:()=>{tn()}},V.id);if(V.type==="api_key"){const ut=ph(V.id),Bt=S5(V);return t.jsxs("div",{"data-testid":`onboarding-provider-card-${V.id}`,className:`onboarding-provider-card${V.authenticated?" onboarding-provider-card--connected":""}`,children:[t.jsx("div",{className:"onboarding-provider-card__icon","data-testid":`onboarding-provider-icon-${V.id}`,"aria-hidden":"true",children:t.jsx(rs,{provider:V.id,size:"md"})}),t.jsxs("div",{className:"onboarding-provider-card__body",children:[t.jsxs("strong",{className:"onboarding-provider-card__name",children:[t.jsx(Hv,{size:14,className:"onboarding-provider-key-icon"}),V.name]}),t.jsx("span",{className:"onboarding-provider-card__description",children:ut.description}),t.jsx(Qt,{status:Jt(V)}),V.authenticated&&V.keyHint&&t.jsxs("span",{className:"auth-key-hint",children:["Key: ",V.keyHint]})]}),t.jsx("div",{className:"onboarding-provider-card__actions onboarding-provider-card__actions--api-key",children:t.jsx(E5,{provider:V,apiKeyInfo:Bt,inputValue:ye[V.id]??"",isSaving:ae===V.id,error:ge[V.id],success:He[V.id],isConnected:V.authenticated,onInputChange:gn,onSave:wn,onClear:Yt})})]},V.id)}return t.jsxs("div",{"data-testid":`onboarding-provider-card-${V.id}`,className:`onboarding-provider-card${V.authenticated?" onboarding-provider-card--connected":""}`,children:[t.jsx("div",{className:"onboarding-provider-card__icon","data-testid":`onboarding-provider-icon-${V.id}`,"aria-hidden":"true",children:t.jsx(rs,{provider:V.id,size:"md"})}),t.jsxs("div",{className:"onboarding-provider-card__body",children:[t.jsx("strong",{className:"onboarding-provider-card__name",children:V.name}),t.jsx("span",{className:"onboarding-provider-card__description",children:ph(V.id).description}),t.jsx(Qt,{status:Jt(V)})]}),t.jsx("div",{className:"onboarding-provider-card__actions",children:ae===V.id?V.authenticated?t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Logging out…"}):t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Waiting for login…"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>void Lt(V.id),children:"Cancel"})]}):wt?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Waiting for login…"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>void Lt(V.id),children:"Cancel"})]}):V.authenticated?t.jsx("button",{className:"btn btn-sm",onClick:()=>$n(V.id),children:"Logout"}):t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>Ke(V.id),children:"Login"})}),(ae===V.id||wt)&&V.id==="github-copilot"&&we[V.id]&&t.jsxs("div",{className:"auth-device-code-panel","data-testid":`onboarding-device-code-${V.id}`,children:[t.jsx("strong",{children:"Enter this code on GitHub"}),t.jsx("div",{className:"auth-device-code-pill",children:we[V.id].userCode}),t.jsxs("div",{className:"auth-provider-actions-row",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>{(async()=>{if(await Bx(we[V.id].userCode)){n("Copied code to clipboard","success");return}n("Failed to copy code — copy it manually from the box above","error")})()},children:"Copy code"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>window.open(Qi(we[V.id].verificationUri),"_blank"),children:"Open GitHub"})]})]}),(ae===V.id||wt)&&z[V.id]&&t.jsx(um,{instructions:z[V.id],"data-testid":`onboarding-login-instructions-${V.id}`}),(ae===V.id||wt)&&oe[V.id]&&t.jsx(F3,{value:H[V.id]??"",onChange:ut=>ue(Bt=>({...Bt,[V.id]:ut})),onSubmit:()=>void Qe(V.id),prompt:oe[V.id].prompt,placeholder:oe[V.id].placeholder,helpText:oe[V.id].helpText,disabled:Q===V.id,submitLabel:Q===V.id?"Submitting…":"Submit code","data-testid":`onboarding-manual-code-${V.id}`}),mt[V.id]==="timeout"&&ae!==V.id&&t.jsx("p",{className:"onboarding-helper-text onboarding-inline-feedback",children:"Login timed out. Please try again."}),mt[V.id]==="failed"&&ae!==V.id&&t.jsx("p",{className:"field-error onboarding-inline-feedback",children:"Login failed. Please try again."})]},V.id)};return t.jsx("div",{className:"modal-overlay open",role:"dialog","aria-modal":"true","aria-labelledby":"onboarding-title",children:t.jsxs("div",{className:"modal model-onboarding-modal",ref:ht,children:[t.jsxs("div",{className:"model-onboarding-header",children:[t.jsxs("h2",{id:"onboarding-title",className:"model-onboarding-title",children:[x==="ai-setup"&&t.jsxs(t.Fragment,{children:[t.jsx(Bs,{size:24})," Set Up AI ",t.jsx("span",{className:"onboarding-optional-badge",children:"Optional"})]}),x==="github"&&t.jsxs(t.Fragment,{children:[t.jsx(yi,{size:24})," Connect GitHub ",t.jsx("span",{className:"onboarding-optional-badge",children:"Optional"})]}),x==="project-setup"&&t.jsxs(t.Fragment,{children:[t.jsx(Of,{size:24})," Set Up Your Project"]}),x==="first-task"&&t.jsxs(t.Fragment,{children:[t.jsx(Of,{size:24})," Create Your First Task"]}),x==="complete"&&t.jsxs(t.Fragment,{children:[t.jsx(gs,{size:24})," All Set!"]})]}),x!=="complete"&&t.jsx("button",{className:"modal-close",onClick:kn,"aria-label":"Skip onboarding",title:"Skip for now",children:t.jsx(Nn,{size:20})})]}),t.jsx("div",{className:"model-onboarding-steps",children:Sn.map((V,We)=>{const wt=On>We,ut=g.includes(V.key)&&wt,Bt=N.includes(V.key)&&!g.includes(V.key)&&wt,en=ut||Bt;return t.jsxs("div",{className:"onboarding-step-wrapper",children:[We>0&&t.jsx("div",{className:`model-onboarding-step-connector ${We<=On?"done":""}`}),en?t.jsxs("button",{className:`model-onboarding-step-indicator ${x===V.key?"active":""} ${ut?"done":""} ${Bt?"skipped":""}`,onClick:()=>y(V.key),"aria-label":`Go back to ${V.label}`,title:`Review ${V.label}`,children:[t.jsx("span",{className:"step-number",children:ut?t.jsx(gs,{size:14}):Bt?t.jsx("span",{className:"onboarding-step-skip-mark",children:"–"}):We+1}),t.jsx("span",{className:"step-label",children:V.label})]}):t.jsxs("div",{className:`model-onboarding-step-indicator ${x===V.key?"active":""} ${ut?"done":""} ${Bt?"skipped":""}`,children:[t.jsx("span",{className:"step-number",children:ut?t.jsx(gs,{size:14}):Bt?t.jsx("span",{className:"onboarding-step-skip-mark",children:"–"}):We+1}),t.jsx("span",{className:"step-label",children:V.label})]})]},V.key)})}),t.jsxs("div",{className:"model-onboarding-content",ref:Oe,children:[x==="ai-setup"&&t.jsxs("div",{className:"model-onboarding-ai-setup",children:[t.jsx("p",{className:"model-onboarding-description",children:"Fusion uses AI models to plan, write, and review code for you. Connect an AI provider below to get started — you can use a hosted service or enter an API key."}),t.jsx("p",{className:"onboarding-helper-text model-onboarding-primary-helper",children:"You only need one provider to get started."}),t.jsx("p",{className:"onboarding-helper-text",children:"Research runs require provider credentials and an enabled Research View. After onboarding, verify these in Settings → Authentication and Settings → Experimental Features."}),bt&&t.jsxs("div",{className:"card",children:[t.jsx("h3",{className:"onboarding-section-title",children:"Connect remote Fusion server"}),t.jsx("p",{className:"onboarding-helper-text",children:"Your native shell needs an active remote profile before dashboard handoff can complete."}),t.jsx("label",{htmlFor:"onboarding-shell-profile-name",className:"onboarding-apikey-field-label",children:"Profile name"}),t.jsx("input",{id:"onboarding-shell-profile-name",className:"input",value:Se,onChange:V=>pe(V.target.value)}),t.jsx("label",{htmlFor:"onboarding-shell-server-url",className:"onboarding-apikey-field-label",children:"Server URL"}),t.jsx("input",{id:"onboarding-shell-server-url",className:"input",placeholder:"https://your-fusion-host",value:_e,onChange:V=>et(V.target.value)}),t.jsx("label",{htmlFor:"onboarding-shell-token",className:"onboarding-apikey-field-label",children:"Auth token (optional)"}),t.jsx("input",{id:"onboarding-shell-token",className:"input",type:"password",value:Ae,onChange:V=>it(V.target.value)}),Ut&&t.jsx("small",{className:"field-error",children:Ut}),t.jsxs("div",{className:"onboarding-apikey-input-row",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void Dt?.openConnectionManager(),children:"Open manager"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:()=>void yt(),disabled:!_e.trim()||xt,children:xt?"Saving…":"Save remote server"})]})]}),!_&&D.length>0&&(()=>{const V=D.filter(en=>en.id!=="github"&&en.authenticated).length,We=D.filter(en=>en.id!=="github").length,wt=Object.keys(xn).filter(en=>!D.find(jn=>jn.id===en)?.authenticated).length;if(We===0)return null;let ut="onboarding-provider-summary",Bt="";return V>0?(ut+=" onboarding-provider-summary--connected",Bt=`✓ ${V} of ${We} provider${We!==1?"s":""} connected`):wt>0?(ut+=" onboarding-provider-summary--skipped",Bt=`${wt} provider${wt!==1?"s":""} skipped`):(ut+=" onboarding-provider-summary--none",Bt="No providers connected yet"),t.jsx("div",{className:ut,"data-testid":"provider-summary",children:Bt})})(),t.jsx(Ka,{slotId:"onboarding-recommendation-card",projectId:s}),t.jsx(Ui,{summary:"What are AI providers?",children:t.jsx("p",{className:"onboarding-helper-text",children:"AI providers like OpenAI and Anthropic power the AI capabilities in Fusion. Connecting a provider lets Fusion's agents use AI models to help with your tasks."})}),D.length>0&&!D.some(V=>V.authenticated)&&t.jsx("p",{className:"onboarding-helper-text",children:"Skip this step if you'd like — you can always add providers later from Settings."}),_?t.jsxs("div",{className:"model-onboarding-loading",children:[t.jsx(Ct,{size:24,className:"animate-spin"}),t.jsx("span",{children:"Loading providers…"})]}):D.length===0?t.jsx("div",{className:"model-onboarding-empty",children:"No AI providers are configured. Please check your Fusion configuration."}):t.jsxs(t.Fragment,{children:[t.jsx(Ka,{slotId:"onboarding-provider-card",projectId:s,renderPlaceholder:!1,actions:{refreshAuthProviders:()=>{tn()}}}),t.jsxs("section",{className:"onboarding-provider-section","data-testid":"onboarding-quick-start-providers",children:[t.jsx("h3",{className:"onboarding-section-title",children:"Quick start providers"}),En.length>0?t.jsx("div",{className:"model-onboarding-providers",children:En.map(V=>ks(V))}):t.jsx("p",{className:"onboarding-helper-text",children:"No quick-start providers are available in this environment."})]}),ws.length>0&&t.jsxs("section",{className:"onboarding-provider-section","data-testid":"onboarding-connected-providers",children:[t.jsx("h3",{className:"onboarding-section-title",children:"Connected providers"}),t.jsx("div",{className:"model-onboarding-providers",children:ws.map(V=>ks(V))})]}),t.jsxs("div",{className:"onboarding-model-section",children:[t.jsx("h3",{className:"onboarding-section-title",children:"Default Model (Optional)"}),t.jsx("p",{className:"model-onboarding-description",children:"Pick a default model for AI tasks, or leave this blank to choose later. Models vary in speed, capability, and cost."}),t.jsx(Ui,{summary:"How do I choose a model?",children:t.jsx("p",{className:"onboarding-helper-text",children:"Models vary in speed, capability, and cost. A good default is usually the latest model from your connected provider. You can always change this later in Settings."})}),fe.length===0?t.jsx("div",{className:"model-onboarding-empty",children:"No models available yet. Connect a provider above to see model options."}):t.jsx("div",{className:"onboarding-model-selector",children:t.jsx(ri,{models:fe,value:se,onChange:dn,placeholder:"Select a default model…",label:"Default model"})}),se&&t.jsx("div",{className:"onboarding-model-preview",children:t.jsxs("small",{className:"settings-muted",children:["Selected:"," ",fe.find(V=>V.id===se)?.name??se]})})]}),t.jsx(Ui,{summary:"Advanced provider settings",className:"onboarding-provider-advanced",children:t.jsxs("div",{"data-testid":"onboarding-advanced-provider-settings",children:[Is.length>0?t.jsx("div",{className:"model-onboarding-providers",children:Is.map(V=>ks(V))}):t.jsx("p",{className:"onboarding-helper-text",children:"All currently available providers are already shown above."}),de.length>0?t.jsx("div",{className:"onboarding-custom-provider-list",children:de.map(V=>t.jsxs("div",{className:"onboarding-custom-provider-item",children:[t.jsx(rs,{provider:V.id,size:"sm"}),t.jsx("span",{children:V.name||V.id})]},V.id))}):null,Pe?t.jsx(U3,{onSave:pn,onCancel:()=>{rt(!1),at(void 0)},saving:qe,error:At}):t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>rt(!0),children:"Add custom provider"})]})}),St&&t.jsx(Ui,{summary:"How does login work?",children:t.jsx("p",{className:"onboarding-helper-text",children:"Clicking Login opens the provider's website in a new tab where you sign in. Once you authorize Fusion, this page will automatically detect the connection. Your credentials are never stored in Fusion."})}),lt&&t.jsx(Ui,{summary:"What is an API key?",children:t.jsx("p",{className:"onboarding-helper-text",children:"An API key is a secret token that authenticates Fusion with the provider. You can find your key in the provider's dashboard under API settings. Keys are stored securely on your machine."})}),t.jsx(Ka,{slotId:"onboarding-setup-help",projectId:s})]})]}),x==="github"&&t.jsxs("div",{className:"model-onboarding-github",children:[nn?t.jsx("p",{className:"model-onboarding-description",children:$t?"GitHub CLI is already authenticated — issue imports and pull request tracking work right now. You're all set; no further action needed.":"GitHub is connected — issue imports and pull request tracking are available. You're all set; no further action needed."}):t.jsx("p",{className:"model-onboarding-description",children:"Connecting GitHub unlocks issue imports and pull request tracking. You can skip this — task creation works without it."}),!nn&&t.jsx("div",{className:"onboarding-feature-list",children:t.jsxs("ul",{children:[t.jsx("li",{className:"onboarding-feature-list-heading",children:t.jsx("strong",{children:"Without GitHub (available now):"})}),t.jsx("li",{className:"onboarding-helper-text",children:"Create tasks manually"}),t.jsx("li",{className:"onboarding-helper-text",children:"Describe work for AI agents"}),t.jsx("li",{className:"onboarding-helper-text",children:"Track progress on the board"}),t.jsx("li",{className:"onboarding-feature-list-heading",children:t.jsx("strong",{children:"With GitHub (after connecting):"})}),t.jsx("li",{className:"onboarding-helper-text onboarding-feature-list-item--with-github",children:"Import issues as tasks"}),t.jsx("li",{className:"onboarding-helper-text onboarding-feature-list-item--with-github",children:"Sync pull request status"}),t.jsx("li",{className:"onboarding-helper-text onboarding-feature-list-item--with-github",children:"Link code changes to tasks"})]})}),Ee&&t.jsxs("div",{className:"onboarding-skip-banner",role:"status",children:[t.jsx("strong",{children:"No AI provider connected"}),t.jsx("p",{children:"AI features like task planning and code generation won't be available until you connect one. You can set this up later in Settings."})]}),t.jsx(Ui,{summary:"What does GitHub integration do?",children:t.jsx("p",{className:"onboarding-helper-text",children:"Without GitHub, you can still create and manage tasks manually. GitHub integration adds the ability to import issues as tasks, track pull request status alongside your work, and automatically link commits to tasks. Connect anytime from Settings → Authentication."})}),In?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"onboarding-provider-row",children:[t.jsxs("div",{className:"onboarding-provider-info",children:[t.jsxs("strong",{children:[t.jsx(yi,{size:16,className:"onboarding-provider-title-icon"}),"GitHub"]}),t.jsx("span",{"data-testid":"onboarding-auth-status-github",children:t.jsx(Fe,{status:xs})})]}),rn&&(ae==="github"?t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Logging out…"}):t.jsx("button",{className:"btn btn-sm",onClick:()=>$n("github"),children:"Disconnect"}))]}),(xs==="not-connected"||xs==="pending")&&t.jsxs("div",{className:"onboarding-github-connect-cta","data-testid":"onboarding-github-connect-cta",children:[ae==="github"||hn?t.jsxs("div",{className:"onboarding-github-connect-actions",children:[t.jsx("button",{className:"btn btn-sm",disabled:!0,children:"Waiting for login…"}),t.jsx("button",{className:"btn btn-sm",onClick:()=>void Lt("github"),children:"Cancel"})]}):t.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>Ke("github"),children:[t.jsx(yi,{size:16}),"Connect"]}),(ae==="github"||hn)&&z.github&&t.jsx(um,{instructions:z.github,"data-testid":"onboarding-login-instructions-github"})]}),xs==="connected"&&t.jsx("div",{className:"onboarding-github-feedback onboarding-github-feedback--success",children:$t?"GitHub CLI is authenticated. Imports and pull request tracking are available. Connect OAuth in Settings → Authentication if you want dashboard-managed sign-in controls.":"GitHub OAuth is connected. You can import issues and track pull requests."}),xs==="failed"&&t.jsxs("div",{className:"onboarding-github-feedback onboarding-github-feedback--error",children:[t.jsx("p",{children:"Connection failed or timed out."}),t.jsxs("div",{className:"onboarding-github-feedback-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Ke("github"),children:"Retry"}),t.jsx("button",{className:"onboarding-skip-step-link",onClick:Me,children:"Skip for now"})]})]}),xs==="pending"&&t.jsx("div",{className:"onboarding-github-feedback onboarding-github-feedback--info",children:"Waiting for GitHub authorization…"}),xs==="skipped"&&t.jsxs("div",{className:"onboarding-github-feedback onboarding-github-feedback--info",children:[t.jsx("p",{children:"GitHub was skipped. You can connect anytime from Settings → Authentication."}),t.jsx("div",{className:"onboarding-github-feedback-actions",children:t.jsx("button",{className:"btn btn-sm",onClick:()=>Ke("github"),children:"Connect anyway"})})]}),xs==="not-connected"&&t.jsx("p",{className:"onboarding-helper-text",children:"No worries if you're not ready — connect GitHub anytime from Settings → Authentication."})]}):t.jsxs("div",{className:"model-onboarding-github-optional",children:[t.jsx("div",{className:"optional-icon optional-icon--github","aria-hidden":"true",children:t.jsx(rs,{provider:"github",size:"lg"})}),$t?t.jsx("p",{children:"GitHub CLI is already authenticated, so imports and PR tracking work now. OAuth from the dashboard is optional and only controls dashboard-managed connect/disconnect."}):t.jsx("p",{children:"GitHub OAuth isn't connected yet. You can set it up in Settings → Authentication, or continue now and connect later."}),t.jsxs("div",{className:"model-onboarding-github-optional__actions",children:[t.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>y("project-setup"),children:$t?"Continue with gh CLI auth →":"Continue without GitHub →"}),$t&&(ae==="github"||hn?t.jsxs("button",{className:"btn btn-sm",disabled:!0,children:[t.jsx(Ct,{size:14,className:"onboarding-spinner"}),"Waiting for OAuth login…"]}):t.jsxs("button",{className:"btn btn-sm",onClick:()=>Ke("github"),children:[t.jsx(rs,{provider:"github",size:"sm"}),"Connect OAuth (optional)"]}))]}),$t&&(ae==="github"||hn)&&z.github&&t.jsx(um,{instructions:z.github,"data-testid":"onboarding-login-instructions-github"})]})]}),x==="project-setup"&&t.jsxs("div",{className:"model-onboarding-project-setup",children:[t.jsx("p",{className:"model-onboarding-description",children:"Choose your first project before creating or importing tasks. You can register an existing local directory or clone a GitHub repository URL through the setup wizard."}),zt?t.jsx("div",{className:"onboarding-project-ready","data-testid":"onboarding-project-ready",role:"status",children:t.jsx("p",{children:"Project selected — task creation and imports are available."})}):t.jsxs("div",{className:"onboarding-project-prerequisite","data-testid":"onboarding-project-prerequisite",children:[t.jsx("p",{className:"onboarding-helper-text",children:"A project is required before first-task actions are available."}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:a,"data-testid":"onboarding-open-setup-wizard",children:"Set Up Project"}),t.jsx("p",{className:"onboarding-helper-text",children:"In the setup wizard, pick an existing directory or paste a GitHub clone URL."})]}),t.jsx(Ui,{summary:"What does project setup do?",children:t.jsx("p",{className:"onboarding-helper-text",children:"Project setup registers a workspace so Fusion knows where to read files, run commands, and track task changes."})})]}),x==="first-task"&&t.jsxs("div",{className:"model-onboarding-first-task",children:[t.jsx("p",{className:"model-onboarding-description",children:"Create your first task to start the board and launch AI execution."}),w&&_n?t.jsxs("div",{className:"onboarding-task-created",children:[t.jsx(gs,{size:56,className:"success-icon"}),t.jsx("h3",{className:"onboarding-task-created__title",children:"Your first task is ready!"}),t.jsx("div",{className:"onboarding-task-created__task-id",children:_n.id}),Dn&&t.jsx("p",{className:"onboarding-task-created__description",children:Dn}),t.jsx("p",{className:"onboarding-task-created__hint",children:"Your task has been created and will appear on the board."}),t.jsxs("div",{className:"onboarding-task-created__actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:cs,children:"View Task"}),t.jsx("button",{type:"button",className:"btn",onClick:ys,children:"Go to Dashboard"})]})]}):t.jsxs(t.Fragment,{children:[zt?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"onboarding-first-task-form",children:[t.jsx("label",{className:"onboarding-first-task-form__label",htmlFor:"onboarding-first-task-input",children:"Describe your first task"}),t.jsx("textarea",{id:"onboarding-first-task-input",className:"input onboarding-first-task-form__input","data-testid":"onboarding-first-task-input",value:R,onChange:V=>{I(V.target.value),U(null)},placeholder:"Example: Build a login page with email and password",rows:4}),t.jsx("div",{className:"onboarding-first-task-form__actions",children:t.jsx("button",{type:"button",className:"btn btn-primary",onClick:Cn,disabled:E,"data-testid":"onboarding-first-task-submit",children:E?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:16,className:"animate-spin"}),t.jsx("span",{children:"Creating task…"})]}):"Create First Task"})})]}),G&&t.jsxs("div",{className:"onboarding-task-error",role:"alert","data-testid":"onboarding-task-error",children:[t.jsx("p",{className:"field-error",children:G}),t.jsx("p",{className:"onboarding-helper-text",children:"Your text has been preserved — fix the issue and try again."})]})]}):t.jsxs("div",{className:"onboarding-project-prerequisite","data-testid":"onboarding-project-prerequisite",children:[t.jsx("p",{className:"onboarding-helper-text",children:"A project must be selected before you can create tasks or import from GitHub."}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:a,"data-testid":"onboarding-open-setup-wizard",children:"Set Up Project"})]}),t.jsx(C5,{items:yn}),zt&&t.jsxs(t.Fragment,{children:[t.jsx(Ui,{summary:"What happens when I create a task?",children:t.jsx("p",{className:"onboarding-helper-text",children:"A task describes something you want done. Fusion's AI agents will read your description and work on implementing it. You can track progress on the board and review the results."})}),t.jsxs("div",{className:"onboarding-cta-options",children:[t.jsxs("button",{className:"onboarding-cta-card primary",onClick:bs,disabled:A,children:[t.jsx("div",{className:"cta-icon",children:t.jsx(os,{size:24})}),t.jsxs("div",{className:"cta-content",children:[t.jsx("strong",{children:"Create a New Task"}),t.jsx("span",{children:"Describe what you need built and AI will work on it"})]})]}),t.jsxs("button",{className:`onboarding-cta-card${nn?"":" onboarding-cta-card--disabled"}`,"data-testid":"cta-github-import",onClick:Ts,disabled:A||!nn,children:[t.jsx("div",{className:"cta-icon",children:t.jsx(yi,{size:24})}),t.jsxs("div",{className:"cta-content",children:[t.jsx("strong",{children:"Import from GitHub"}),t.jsx("span",{children:"Turn GitHub issues into tasks you can track here"}),!nn&&t.jsx("small",{className:"onboarding-cta-note",children:"Requires GitHub connection"})]})]})]}),t.jsxs("p",{className:"onboarding-skip-note",children:["You can create tasks anytime from the board, or use"," ",t.jsx("code",{children:"fn task create"})," in the terminal."]})]})]})]}),x==="complete"&&t.jsxs("div",{className:"model-onboarding-complete",children:[t.jsx(gs,{size:48,className:"success-icon"}),t.jsx("p",{children:"Setup complete! Head to the board to create your first task, or explore the dashboard to see what's available."})]})]}),t.jsxs("div",{className:"model-onboarding-footer",children:[x==="ai-setup"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:kn,disabled:A,children:"Skip for now"}),t.jsx("button",{className:"onboarding-skip-step-link",onClick:ce,children:"Skip setup →"}),t.jsx("button",{className:"btn btn-primary",onClick:Zt,children:"Next →"})]}),x==="github"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:Ge,children:"← Back"}),t.jsx("button",{className:"onboarding-skip-step-link",onClick:ce,children:"Skip GitHub →"}),t.jsx("button",{className:"btn btn-primary",onClick:Zt,children:"Next →"})]}),x==="project-setup"&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:Ge,children:"← Back"}),t.jsx("button",{className:"btn btn-primary",onClick:Zt,disabled:!zt,children:"Next →"})]}),x==="first-task"&&!w&&t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn btn-sm",onClick:Ge,children:"← Back"}),t.jsx("button",{className:"btn btn-primary",onClick:jt,disabled:A,children:A?t.jsxs(t.Fragment,{children:[t.jsx(Ct,{size:16,className:"animate-spin"}),t.jsx("span",{children:"Saving…"})]}):"Finish Setup"})]}),x==="complete"&&t.jsxs("button",{className:"btn btn-primary",onClick:ls,children:[t.jsx(gs,{size:16}),t.jsx("span",{children:"Get Started"})]})]})]})})}function Yk({toasts:e}){return t.jsx("div",{className:"toast-container",id:"toasts",children:e.map(n=>t.jsx("div",{className:`toast toast-${n.type}`,children:n.message},n.id))})}const R5=i.lazy(()=>qn(()=>import("./SetupWizardModal-LqloAL4J.js"),__vite__mapDeps([15,1,16,17,18,19,6,7,8,20])).then(e=>({default:e.SetupWizardModal}))),A5=i.lazy(()=>qn(()=>import("./SettingsModal-CLEkhLK_.js"),__vite__mapDeps([21,1,22,23,24,2,3,25,6,7,8,26,27])).then(e=>({default:e.SettingsModal})));function T5(){(typeof window<"u"&&window.requestIdleCallback||(n=>globalThis.setTimeout(n,200)))(()=>{qn(()=>import("./SettingsModal-CLEkhLK_.js"),__vite__mapDeps([21,1,22,23,24,2,3,25,6,7,8,26,27]))},{timeout:1500})}function I5({projectId:e,tasks:n,projects:s,currentProject:a,addToast:r,toasts:o,removeToast:l,modalManager:c,projectActions:d,taskHandlers:u,taskOperations:h,deepLink:m,settings:f,onSettingsClose:p,onReopenOnboarding:b,onOpenApprovals:v}){const{pushNav:x}=ff(),[y,g]=i.useState(null),j=c.detailTask?(()=>{const E=n.find(M=>M.id===c.detailTask?.id);return E?"prompt"in c.detailTask?{...c.detailTask,...E,prompt:c.detailTask.prompt,log:c.detailTask.log}:E:c.detailTask})():null,N=p??c.closeSettings,C=i.useCallback(()=>{c.openNewTask()},[c]),w=i.useCallback(()=>{c.openGitHubImport()},[c]),S=i.useCallback((E,M)=>{c.openDetailTask(E,M),x({type:"modal",close:c.closeDetailTask})},[c,x]),R=i.useCallback(E=>{g(null),c.closeModelOnboarding(),S(E)},[c,S]),I=i.useCallback(async E=>{const M=await u.handleModalCreate(E);return c.modelOnboardingOpen&&g(M),M},[u.handleModalCreate,c.modelOnboardingOpen]);return i.useEffect(()=>{!c.modelOnboardingOpen&&y&&g(null)},[c.modelOnboardingOpen,y]),i.useEffect(()=>{T5()},[]),t.jsxs(t.Fragment,{children:[j&&t.jsx(hr,{children:t.jsx(IO,{task:j,projectId:e,tasks:n,onClose:m.handleDetailClose,onOpenDetail:S,mobileHeaderMode:c.detailTaskOrigin==="list-mobile"?"back":"close",onMoveTask:h.moveTask,onDeleteTask:h.deleteTask,onMergeTask:h.mergeTask,onArchiveTask:h.archiveTask,onRetryTask:h.retryTask,onResetTask:h.resetTask,onDuplicateTask:h.duplicateTask,onTaskUpdated:c.updateDetailTask,addToast:r,prAuthAvailable:f.prAuthAvailable,initialTab:c.detailTaskInitialTab})}),c.settingsOpen&&t.jsx(hr,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(A5,{onClose:N,addToast:r,initialSection:c.settingsInitialSection,projectId:e,themeMode:f.themeMode,colorTheme:f.colorTheme,onThemeModeChange:f.setThemeMode,onColorThemeChange:f.setColorTheme,dashboardFontScalePct:f.dashboardFontScalePct,onDashboardFontScaleChange:f.setDashboardFontScalePct,onReopenOnboarding:b,onOpenApprovals:v})})}),t.jsx(tz,{isOpen:c.githubImportOpen,onClose:c.closeGitHubImport,onImport:u.handleGitHubImport,tasks:n,projectId:e}),t.jsx(hr,{children:t.jsx(oz,{isOpen:c.isPlanningOpen,onClose:c.closePlanning,onTaskCreated:u.handlePlanningTaskCreated,onTasksCreated:u.handlePlanningTasksCreated,tasks:n,initialPlan:c.planningInitialPlan??void 0,projectId:e,resumeSessionId:c.planningResumeSessionId})}),t.jsx(hr,{children:t.jsx(bz,{isOpen:c.isSubtaskOpen,onClose:c.closeSubtask,initialDescription:c.subtaskInitialDescription??"",onTasksCreated:u.handleSubtaskTasksCreated,projectId:e,resumeSessionId:c.subtaskResumeSessionId})}),t.jsx(Fz,{isOpen:c.terminalOpen,onClose:c.closeTerminal,initialCommand:c.terminalInitialCommand,projectId:e}),t.jsx(Bz,{isOpen:c.scriptsOpen,onClose:c.closeScripts,addToast:r,onRunScript:c.runScript,projectId:e}),c.filesOpen&&t.jsx(u6,{initialWorkspace:c.fileBrowserWorkspace,initialFile:c.fileBrowserInitialFile,isOpen:!0,onClose:c.closeFiles,onWorkspaceChange:c.setFileWorkspace,projectId:e}),c.todosOpen&&t.jsx(h6,{isOpen:!0,onClose:c.closeTodos,addToast:r,projectId:e,onPlanningMode:c.openPlanningWithInitialPlan}),t.jsx(k6,{isOpen:c.usageOpen,onClose:c.closeUsage,projectId:e,anchorRect:c.usageAnchorRect}),t.jsx(t3,{isOpen:c.systemStatsOpen,onClose:c.closeSystemStats,projectId:e}),c.schedulesOpen&&t.jsx(U6,{onClose:c.closeSchedules,addToast:r,projectId:e}),t.jsx(hr,{children:t.jsx(J6,{isOpen:c.newTaskModalOpen,onClose:c.closeNewTask,tasks:n,onCreateTask:I,addToast:r,projectId:e})}),t.jsx(r3,{isOpen:c.activityLogOpen,onClose:c.closeActivityLog,tasks:n,projectId:e,projects:s,currentProject:a,onOpenTaskDetail:E=>{const M=n.find(G=>G.id===E);M&&S(M)}}),t.jsx(hr,{children:t.jsx(l3,{isOpen:c.gitManagerOpen,onClose:c.closeGitManager,tasks:n,addToast:r,projectId:e})}),t.jsx(hr,{children:t.jsx(x3,{isOpen:c.workflowStepsOpen,onClose:c.closeWorkflowSteps,addToast:r,projectId:e})}),t.jsx(I3,{isOpen:c.agentsOpen,onClose:c.closeAgents,addToast:r,projectId:e}),c.setupWizardOpen&&t.jsx(i.Suspense,{fallback:null,children:t.jsx(R5,{onProjectRegistered:d.handleSetupComplete,onClose:c.closeSetupWizard})}),c.modelOnboardingOpen&&t.jsx(M5,{onComplete:d.handleModelOnboardingComplete,addToast:r,projectId:e??"",onOpenSetupWizard:d.handleAddProject,onOpenNewTask:C,onOpenGitHubImport:w,firstCreatedTask:y,onViewTask:R}),t.jsx(Yk,{toasts:o,onRemove:l})]})}function P5(){return typeof window>"u"?!1:typeof window.fusionShell?.resetDesktopMode=="function"}async function $5(){const e=typeof window<"u"?window.fusionShell:void 0;try{await e?.resetDesktopMode?.()}catch{}const n=new URL(window.location.href);n.searchParams.delete("serverBaseUrl"),n.searchParams.delete("shellMode"),window.location.replace(n.toString())}function D5({errorMessage:e,isRetrying:n,onRetry:s,onManageConnection:a}){const r=P5();return t.jsxs("div",{className:"project-overview-empty",role:"alert","aria-live":"polite",children:[t.jsx("h2",{children:"Can't reach the Fusion backend"}),t.jsx("p",{className:"settings-muted",children:"Fusion couldn't load your projects right now. Please make sure the backend is running and try again."}),t.jsxs("p",{className:"settings-muted",children:["Error: ",e]}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:s,disabled:n,children:n?"Retrying…":"Retry Connection"}),r&&t.jsx("button",{type:"button",className:"btn",onClick:()=>void $5(),children:"Change Launch Mode…"}),a&&t.jsx("button",{type:"button",className:"btn",onClick:a,children:"Manage Connection"})]})]})}const gh=[{id:"projects",label:"Loading projects"},{id:"project",label:"Selecting project"},{id:"tasks",label:"Fetching tasks"}];function L5(e,n){if(n==="ready")return"done";const s=gh.findIndex(r=>r.id===n),a=gh.findIndex(r=>r.id===e);return a<s?"done":a===s?"active":"pending"}function O5({stage:e}){const[n]=i.useState(()=>{const s=q0();return s&&(hs(bn.TASKS_PREFIX),hs(bn.PROJECTS),hs(bn.CURRENT_PROJECT_ID),hs(bn.AGENTS),hs(bn.AGENT_STATS),hs(bn.DOCUMENTS_PREFIX),hs(bn.TODO_LISTS_PREFIX),hs(bn.CHAT_ROOMS),hs(bn.ACTIVE_CHAT_ROOM_ID),hs(bn.CHAT_SESSIONS_PREFIX),hs(bn.CHAT_MESSAGES_PREFIX),hs(bn.CHAT_AGENTS_MAP_PREFIX),hs(bn.MODELS),hs(bn.DISCOVERED_SKILLS_PREFIX),hs(bn.INSIGHTS_PREFIX),hs(bn.INSIGHT_LATEST_RUN_PREFIX),hs(bn.RESEARCH_RUNS_PREFIX),hs(bn.RESEARCH_SELECTED_ID_PREFIX),hs(bn.EVALS_RUNS_PREFIX),hs(bn.EVALS_RESULTS_PREFIX),hs(bn.MISSIONS_PREFIX),hs(bn.MISSIONS_SELECTED_ID_PREFIX),hs(bn.MAILBOX_INBOX_PREFIX),hs(bn.MAILBOX_OUTBOX_PREFIX),hs(bn.MAILBOX_UNREAD_COUNT_PREFIX)),s});return t.jsx("div",{className:"dashboard-loader",role:"status","aria-live":"polite","aria-label":n?"Updating Fusion dashboard":"Loading Fusion dashboard","data-stage":e,"data-version-update":n?"true":void 0,children:t.jsxs("div",{className:"dashboard-loader__content",children:[t.jsx("h1",{className:"dashboard-loader__logo",children:"Fusion"}),n?t.jsx("p",{className:"dashboard-loader__message dashboard-loader__message--update",children:"Updating to a new frontend version..."}):t.jsx("p",{className:"dashboard-loader__message",children:"Initializing dashboard..."}),t.jsx("ol",{className:"dashboard-loader__steps","aria-label":"Dashboard loading progress",children:gh.map(s=>{const a=L5(s.id,e);return t.jsxs("li",{className:`dashboard-loader__step dashboard-loader__step--${a}`,"data-testid":`dashboard-loader-step-${s.id}`,children:[t.jsx("span",{className:"dashboard-loader__step-icon","aria-hidden":"true",children:a==="done"?"✓":a==="active"?t.jsx(Ct,{className:"dashboard-loader__spinner animate-spin",size:14}):"•"}),t.jsx("span",{className:"dashboard-loader__step-label",children:s.label})]},s.id)})})]})})}function F5({visible:e}){return t.jsx("div",{className:"top-progress-bar","data-visible":e?"true":"false",role:"progressbar","aria-busy":e,"aria-label":"Loading",children:t.jsx("div",{className:"top-progress-bar__indicator"})})}const z5=5e3;function B5(e,n,s){return e||n&&s===0?"idle":n&&s>0?"paused":s>0?"running":"idle"}function U5(e,n,s){let a=0,r=0,o=0,l=0,c=0;for(const d of e){switch(d.column){case"in-progress":a++,ad(d,n,s)&&o++;break;case"todo":l++;break;case"in-review":c++;break}d.blockedBy&&d.blockedBy.length>0&&r++}return{runningTaskCount:a,blockedTaskCount:r,stuckTaskCount:o,queuedTaskCount:l,inReviewCount:c}}function H5(e,n,s,a){const[r,o]=i.useState({globalPause:!1,enginePaused:!1,maxConcurrent:2}),[l,c]=i.useState(!0),[d,u]=i.useState(null),h=i.useRef(null),m=i.useRef(null),f=i.useCallback(async()=>{m.current&&m.current.abort(),m.current=new AbortController;try{c(!0),u(null);const x=await y_(n);o(x)}catch(x){if(x instanceof Error&&x.name==="AbortError")return;u(x instanceof Error?x.message:"Failed to fetch executor stats")}finally{c(!1)}},[n]);i.useEffect(()=>(f(),()=>{m.current&&m.current.abort()}),[f]),i.useEffect(()=>(h.current&&clearInterval(h.current),h.current=setInterval(()=>{f()},z5),()=>{h.current&&(clearInterval(h.current),h.current=null)}),[f]);const p=U5(e,s,a),b=B5(r.globalPause,r.enginePaused,p.runningTaskCount);return{stats:{...p,executorState:b,maxConcurrent:r.maxConcurrent,lastActivityAt:r.lastActivityAt},loading:l,error:d,refresh:f}}const q5={planning:ba,subtask:kr,mission_interview:Ys,milestone_interview:Ys,slice_interview:Ys},V5={planning:"Planning",subtask:"Subtask Breakdown",mission_interview:"Mission Interview",milestone_interview:"Milestone Interview",slice_interview:"Slice Interview"};function W5({sessions:e,generating:n,needsInput:s,onOpenSession:a,onDismissSession:r}){const{confirm:o}=Di(),[l,c]=i.useState(!1),[d,u]=i.useState(new Set),h=i.useRef(null),m=i.useRef(new Map),f=i.useRef(null),{activeTabMap:p}=Bo(),b=i.useMemo(()=>Pr(),[]);if(i.useEffect(()=>{if(!l)return;const y=g=>{h.current&&!h.current.contains(g.target)&&c(!1)};return document.addEventListener("mousedown",y),()=>document.removeEventListener("mousedown",y)},[l]),i.useEffect(()=>{const y=new Set,g=new Map;for(const j of e){const N=p.get(j.id),C=[j.status,j.updatedAt,N?.tabId??j.lockedByTab??"",N?.stale?"stale":"fresh"].join("|"),w=m.current.get(j.id);w&&w!==C&&y.add(j.id),g.set(j.id,C)}if(m.current=g,y.size!==0)return u(y),f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{u(new Set),f.current=null},500),()=>{f.current&&(clearTimeout(f.current),f.current=null)}},[p,e]),e.length===0)return null;const v=e.length,x=s>0;return t.jsxs("div",{ref:h,className:"background-tasks-indicator",children:[t.jsxs("button",{className:`background-tasks-indicator__pill${x?" background-tasks-indicator__pill--attention":""}`,onClick:()=>c(y=>!y),title:`${v} background AI task${v!==1?"s":""}${s>0?` (${s} need${s!==1?"":"s"} input)`:""}`,children:[n>0&&t.jsx(Ct,{size:12,style:{animation:"spin 1s linear infinite"}}),s>0&&n===0&&t.jsx(jm,{size:12}),t.jsxs("span",{children:["AI ",v]})]}),l&&t.jsxs("div",{className:"background-tasks-indicator__popover",children:[t.jsx("div",{className:"background-tasks-indicator__popover-header",children:"Background Tasks"}),t.jsx("div",{className:"background-tasks-indicator__popover-list",children:e.map(y=>{const g=q5[y.type],j=y.status==="generating",N=y.status==="awaiting_input",C=y.status==="error",w=p.get(y.id),S=w?.tabId??y.lockedByTab??null,R=!!(S&&S!==b&&!w?.stale),I=d.has(y.id);return t.jsxs("div",{className:`background-tasks-indicator__item${I?" background-tasks-indicator__item--updated":""}`,style:{transition:"background-color 220ms ease, transform 220ms ease",backgroundColor:I?"var(--color-accent-soft, rgba(59, 130, 246, 0.14))":void 0,transform:I?"translateY(-1px)":void 0},onClick:async()=>{R&&!await o({title:"Open Active Session",message:"This session is active in another tab. Open anyway?"})||(a(y),c(!1))},children:[C?t.jsx(oi,{size:14,className:"background-tasks-indicator__session-icon",style:{color:"var(--color-error)"}}):t.jsx(g,{size:14,className:"background-tasks-indicator__session-icon"}),t.jsxs("div",{className:"background-tasks-indicator__session-content",children:[t.jsx("div",{className:"background-tasks-indicator__session-title",children:y.title}),t.jsxs("div",{className:"background-tasks-indicator__session-meta",children:[C?"Failed":V5[y.type],j&&" — generating...",N&&!R&&" — needs input",N&&R&&" — active in another tab"]})]}),j&&t.jsx(Ct,{size:14,className:"background-tasks-indicator__session-icon",style:{animation:"spin 1s linear infinite",color:"var(--color-success)"}}),N&&!R&&t.jsx(jm,{size:14,className:"background-tasks-indicator__session-icon",style:{color:"var(--triage)"}}),N&&R&&t.jsx(Do,{size:14,className:"background-tasks-indicator__session-icon",style:{color:"var(--text-muted)"}}),t.jsx("button",{className:"background-tasks-indicator__item-dismiss",onClick:E=>{E.stopPropagation(),r(y.id)},title:"Dismiss",children:t.jsx(Nn,{size:12})})]},y.id)})})]})]})}function G5(e){if(!e)return"no activity";const n=Date.now(),s=new Date(e).getTime(),a=n-s,r=Math.floor(a/1e3),o=Math.floor(r/60),l=Math.floor(o/60),c=Math.floor(l/24);return c>0?`${c}d ago`:l>0?`${l}h ago`:o>0?`${o}m ago`:r>10?`${r}s ago`:"just now"}function K5(e){switch(e){case"running":return{label:"Running",color:"var(--color-success)",icon:Os};case"paused":return{label:"Paused",color:"var(--triage)",icon:Vi};case"idle":default:return{label:"Idle",color:"var(--text-muted)",icon:Bs}}}function J5({tasks:e,projectId:n,taskStuckTimeoutMs:s,staleHighFanoutBlockerAgeThresholdMs:a,backgroundSessions:r,backgroundGenerating:o,backgroundNeedsInput:l,onOpenBackgroundSession:c,onDismissBackgroundSession:d,lastFetchTimeMs:u,currentProjectPath:h,onOpenProjectDirectory:m,keyboardOpen:f,hideWhenKeyboardOpen:p}){if(p)return null;const{stats:b,loading:v,error:x}=H5(e,n,s,u),[y,g]=i.useState(!1),j=i.useMemo(()=>K5(b.executorState),[b.executorState]),N=i.useMemo(()=>G5(b.lastActivityAt),[b.lastActivityAt]),C=i.useMemo(()=>{const S=zh(e,{staleHighFanoutAgeThresholdMs:a??Qv});return Array.from(S.entries()).map(([I,E])=>({blockerId:I,entry:E})).filter(({entry:I})=>I.isHighFanout).sort((I,E)=>{if(E.entry.overlapBlockedTodoCount!==I.entry.overlapBlockedTodoCount)return E.entry.overlapBlockedTodoCount-I.entry.overlapBlockedTodoCount;const M=I.entry.escalation?.blockingAgeMs??0,G=E.entry.escalation?.blockingAgeMs??0;return G!==M?G-M:I.blockerId.localeCompare(E.blockerId,"en",{numeric:!0,sensitivity:"base"})})[0]??null},[e,a]),w=j.icon;return x?t.jsx("div",{className:"executor-status-bar executor-status-bar--error",role:"status","aria-label":"Executor status",children:t.jsxs("span",{className:"executor-status-bar__error",children:[t.jsx(Ma,{size:14}),x]})}):v&&b.runningTaskCount===0?t.jsx("div",{className:"executor-status-bar executor-status-bar--loading",role:"status","aria-label":"Executor status",children:t.jsx("span",{className:"executor-status-bar__loading-text",children:"Loading..."})}):t.jsxs("div",{className:`executor-status-bar ${b.executorState==="running"?"executor-status-bar--running":""}${f?" executor-status-bar--keyboard-open":""}`,role:"status","aria-label":"Executor status",children:[r&&r.length>0&&c&&d&&t.jsxs(t.Fragment,{children:[t.jsx(W5,{sessions:r,generating:o??0,needsInput:l??0,onOpenSession:c,onDismissSession:d}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"})]}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx("span",{className:"executor-status-bar__indicator executor-status-bar__indicator--queued","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Queued"}),t.jsx("span",{className:"executor-status-bar__count",children:b.queuedTaskCount})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx("span",{className:`executor-status-bar__indicator executor-status-bar__indicator--running ${b.runningTaskCount>0?"executor-status-bar__indicator--active":""}`,"aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Running"}),t.jsx("span",{className:"executor-status-bar__count",children:b.runningTaskCount}),t.jsx("span",{className:"executor-status-bar__separator","aria-hidden":"true",children:"/"}),t.jsx("span",{className:"executor-status-bar__max",children:b.maxConcurrent})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),b.stuckTaskCount>0&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"executor-status-bar__segment executor-status-bar__segment--stuck",children:[t.jsx("span",{className:"executor-status-bar__indicator executor-status-bar__indicator--stuck executor-status-bar__indicator--active","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Stuck"}),t.jsx("span",{className:"executor-status-bar__count executor-status-bar__count--error",children:b.stuckTaskCount})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"})]}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx("span",{className:`executor-status-bar__indicator executor-status-bar__indicator--blocked ${b.blockedTaskCount>0?"executor-status-bar__indicator--active":""}`,"aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Blocked"}),t.jsx("span",{className:`executor-status-bar__count ${b.blockedTaskCount>0?"executor-status-bar__count--warning":""}`,children:b.blockedTaskCount})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx("span",{className:"executor-status-bar__indicator executor-status-bar__indicator--review","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"In Review"}),t.jsx("span",{className:"executor-status-bar__count",children:b.inReviewCount})]}),C&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment executor-status-bar__segment--fanout",children:[t.jsx("span",{className:"executor-status-bar__indicator executor-status-bar__indicator--fanout executor-status-bar__indicator--active","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__label",children:"Overlap queue"}),t.jsxs("span",{className:"executor-status-bar__fanout-summary",title:`${C.entry.escalation?"Escalated":"Temporary"} overlap bottleneck ${C.blockerId}: ${C.entry.overlapBlockedTodoCount} todo blocked via blockedBy (threshold ${Ah})`,children:[C.blockerId," · ",C.entry.overlapBlockedTodoCount," todo",C.entry.escalation?" (escalated)":""]})]})]}),h&&m&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment executor-status-bar__segment--project-directory",children:[t.jsx("button",{className:`executor-status-bar__folder-toggle${y?" executor-status-bar__folder-toggle--active":""}`,onClick:()=>g(S=>!S),"aria-label":y?"Hide project directory":"Show project directory","aria-expanded":y,"data-testid":"executor-project-path-toggle",title:y?"Hide project directory":"Show project directory",children:t.jsx(Qs,{size:12,"aria-hidden":"true"})}),y&&t.jsx("button",{className:"executor-status-bar__project-path",onClick:m,title:h,"data-testid":"executor-project-path-link",children:h})]})]}),t.jsx("div",{className:"executor-status-bar__spacer"}),t.jsxs("div",{className:"executor-status-bar__segment executor-status-bar__segment--time",children:[t.jsx(pa,{size:12,className:"executor-status-bar__icon","aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__time",children:N})]}),t.jsx("span",{className:"executor-status-bar__divider","aria-hidden":"true"}),t.jsxs("div",{className:"executor-status-bar__segment",children:[t.jsx(w,{size:12,style:{color:j.color},"aria-hidden":"true"}),t.jsx("span",{className:"executor-status-bar__state",style:{color:j.color},children:j.label})]})]})}const Y5={planning:ba,subtask:kr,mission_interview:Ys,milestone_interview:Ys,slice_interview:Ys},X5={planning:"Planning",subtask:"Subtask Breakdown",mission_interview:"Mission Interview",milestone_interview:"Milestone Interview",slice_interview:"Slice Interview"},Xk="fusion:session-banner-dismissed";function vl(e){if(!e)return 0;const n=Date.parse(e);return Number.isFinite(n)?n:0}function Q5(){if(typeof window>"u")return new Map;try{const e=window.localStorage.getItem(Xk);if(!e)return new Map;const n=JSON.parse(e),s=new Map;for(const[a,r]of Object.entries(n)){const o=typeof r=="number"?r:vl(r);s.set(a,o)}return s}catch{return new Map}}function Z5(e){if(!(typeof window>"u"))try{const n={};for(const[s,a]of e)n[s]=a;window.localStorage.setItem(Xk,JSON.stringify(n))}catch{}}const Ca=Q5();function eB({sessions:e,onResumeSession:n,onDismissSession:s,onDismissAll:a}){const[r,o]=i.useState(0),l=()=>{Z5(Ca),o(b=>b+1)};i.useEffect(()=>{if(Ca.size===0)return;const b=new Map(e.map(x=>[x.id,x]));let v=!1;for(const[x,y]of Ca){const g=b.get(x);if(!g)continue;if(!(g.status==="awaiting_input"||g.status==="error")){Ca.delete(x),v=!0;continue}vl(g.updatedAt)>y&&(Ca.delete(x),v=!0)}v&&l()},[e]);const c=i.useMemo(()=>e.filter(b=>{if(b.status!=="awaiting_input"&&b.status!=="error")return!1;const v=Ca.get(b.id);return v===void 0?!0:vl(b.updatedAt)>v}),[e,r]);if(c.length===0)return null;const d=c.filter(b=>b.status==="awaiting_input").length,u=c.filter(b=>b.status==="error").length;let h="";d>0&&u>0?h=`${d} AI session${d===1?"":"s"} need${d===1?"s":""} your input, ${u} failed`:d>0?h=`${d} AI session${d===1?"":"s"} need${d===1?"s":""} your input`:u>0&&(h=`${u} AI session${u===1?"":"s"} failed`);const m=b=>{Ca.set(b.id,Math.max(vl(b.updatedAt),Date.now())),l()},f=b=>{Ca.delete(b.id),l(),n(b)},p=()=>{const b=Date.now();for(const v of c)Ca.set(v.id,Math.max(vl(v.updatedAt),b));l(),a()};return t.jsxs("section",{className:"session-notification-banner",role:"region","aria-live":"polite","aria-label":"AI sessions needing input or failed",children:[t.jsxs("div",{className:"session-notification-banner__header",children:[t.jsxs("div",{className:"session-notification-banner__headline",children:[t.jsx(oi,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:h})]}),t.jsxs("button",{className:"session-notification-banner__dismiss-all",onClick:p,children:[t.jsx(Nn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:"Dismiss all"})]})]}),t.jsx("div",{className:"session-notification-banner__list",children:c.map(b=>{const v=Y5[b.type],x=b.status==="error";return t.jsxs("article",{className:`session-notification-banner__item${x?" session-notification-banner__item--error":""}`,"data-session-type":b.type,"data-session-status":b.status,children:[t.jsxs("div",{className:"session-notification-banner__item-main",children:[x?t.jsx(oi,{size:16,className:"session-notification-banner__type-icon session-notification-banner__type-icon--error","aria-hidden":"true"}):t.jsx(v,{size:16,className:"session-notification-banner__type-icon","aria-hidden":"true"}),t.jsxs("div",{className:"session-notification-banner__text",children:[t.jsx("p",{className:"session-notification-banner__title",title:b.title,children:b.title}),t.jsx("p",{className:"session-notification-banner__meta",children:x?"Failed":X5[b.type]})]})]}),t.jsxs("div",{className:"session-notification-banner__actions",children:[t.jsx("button",{className:"session-notification-banner__resume",onClick:()=>f(b),children:x?"Retry":"Resume"}),t.jsx("button",{className:"session-notification-banner__dismiss",onClick:()=>{m(b),s(b.id)},"aria-label":`Dismiss ${b.title}`,children:t.jsx(Nn,{size:14,"aria-hidden":"true"})})]})]},b.id)})})]})}const Qk="fusion:cli-binary-banner-dismissed";function tB(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(Qk)==="1"}catch{return!1}}function nB(){if(!(typeof window>"u"))try{window.localStorage.setItem(Qk,"1")}catch{}}function sB({onOpenSettings:e}){const[n,s]=i.useState(null),[a,r]=i.useState(()=>tB()),[o,l]=i.useState(!1),[c,d]=i.useState(null);i.useEffect(()=>{if(a)return;let g=!1;return l1().then(j=>{g||s(j)}).catch(()=>{}),()=>{g=!0}},[a]);const u=i.useCallback(async()=>{l(!0),d(null);try{const g=await c1();s({binary:g.binary,expectedVersion:g.expectedVersion,state:g.state,install:g.install}),g.installResult.success||d(g.installResult.permissionsHint||g.installResult.stderr||`Install failed (exit ${g.installResult.exitCode??"n/a"})`)}catch(g){d(g instanceof Error?g.message:String(g))}finally{l(!1)}},[]),h=i.useCallback(()=>{nB(),r(!0)},[]);if(a||!n||n.state==="installed"||n.state==="skipped")return null;const m=n.state==="version-mismatch",f=n.binary.version,p=n.expectedVersion,b=m?"Update the Fusion CLI":"Install the Fusion CLI",v=m?t.jsxs(t.Fragment,{children:["Your installed ",t.jsx("code",{children:"fn"}),"/",t.jsx("code",{children:"fusion"})," CLI is"," ",t.jsxs("strong",{children:["v",f??"unknown"]})," but this dashboard expects"," ",t.jsxs("strong",{children:["v",p]}),". Update to stay in sync."]}):t.jsxs(t.Fragment,{children:["Get the ",t.jsx("code",{children:"fn"})," and ",t.jsx("code",{children:"fusion"})," commands on your terminal so you can drive Fusion from anywhere. One click below or copy the command into your shell."]}),x=m?"Update with npm":"Install with npm",y=m?"Updating…":"Installing…";return t.jsxs("div",{className:"cli-binary-banner",role:"status",children:[t.jsxs("div",{className:"cli-binary-banner__body",children:[t.jsx("div",{className:"cli-binary-banner__title",children:b}),t.jsx("div",{className:"cli-binary-banner__text",children:v}),t.jsxs("div",{className:"cli-binary-banner__actions",children:[t.jsx("button",{type:"button",className:"cli-binary-banner__primary",onClick:()=>void u(),disabled:o,children:o?y:x}),t.jsx("button",{type:"button",className:"cli-binary-banner__secondary",onClick:e,children:"Open Settings"})]}),c&&t.jsx("div",{className:"cli-binary-banner__error",children:c})]}),t.jsx("button",{type:"button",className:"cli-binary-banner__dismiss","aria-label":"Dismiss",onClick:h,children:t.jsx(Nn,{size:16})})]})}function iB({signal:e,onDismiss:n}){return!e||!e.atRisk?null:t.jsxs("div",{className:`capacity-risk-banner${n?" capacity-risk-banner--dismissible":""}`,role:"status","aria-live":"polite",children:[t.jsxs("div",{className:"capacity-risk-banner__content",children:[t.jsx("strong",{children:"Capacity risk:"})," Todo ",e.todoCount," (threshold ",e.threshold,") · In Progress ",e.inProgressCount," · In Review ",e.inReviewCount," · Idle agents ",e.idleNonEphemeralAgentCount]}),n?t.jsx("button",{type:"button",className:"capacity-risk-banner__dismiss touch-target","aria-label":"Dismiss capacity warning",onClick:n,children:t.jsx(Nn,{"aria-hidden":"true"})}):null]})}function aB({isActive:e}){return e?t.jsxs("div",{className:"test-mode-banner",role:"status","aria-live":"polite",children:[t.jsx(tS,{"aria-hidden":"true"}),t.jsx("span",{children:"Test mode — no real AI calls"})]}):null}const Zk="fusion:oauth-relogin-dismissed";function rB(){if(typeof window>"u")return new Set;try{const e=JSON.parse(window.localStorage.getItem(Zk)??"[]");return Array.isArray(e)?new Set(e.filter(n=>typeof n=="string")):new Set}catch{return new Set}}function Jx(e){typeof window>"u"||window.localStorage.setItem(Zk,JSON.stringify(Array.from(e)))}function oB({onReLogin:e,pollIntervalMs:n}){const[s,a]=i.useState([]),[r,o]=i.useState(()=>rB()),l=i.useCallback(async()=>{try{const{providers:m}=await No(),f=m.filter(p=>p.type==="oauth"&&p.expired===!0).map(p=>({id:p.id,name:p.name}));a(f),o(p=>{const b=new Set(f.map(x=>x.id)),v=new Set(Array.from(p).filter(x=>b.has(x)));return v.size===p.size?p:(Jx(v),v)})}catch{}},[]);i.useEffect(()=>{l();const m=window.setInterval(l,n??3600*1e3);return()=>{window.clearInterval(m)}},[n,l]),i.useEffect(()=>{const m=f=>{const{detail:p}=f;p?.providerId&&a(b=>b.filter(v=>v.id!==p.providerId)),l()};return window.addEventListener(Im,m),()=>{window.removeEventListener(Im,m)}},[l]);const c=i.useMemo(()=>s.filter(m=>!r.has(m.id)),[r,s]);if(c.length===0)return null;const d=c.length===1,u=c.map(m=>m.name).join(", "),h=()=>{const m=new Set(r);for(const f of c)m.add(f.id);o(m),Jx(m)};return t.jsxs("section",{className:"oauth-relogin-banner",role:"status","aria-live":"polite",children:[t.jsxs("div",{className:"oauth-relogin-banner__content",children:[t.jsx(Ma,{"aria-hidden":"true"}),t.jsx("p",{className:"oauth-relogin-banner__message",children:d?`Re-login required: ${u}. Your ${u} session expired — sign in again to keep agents running.`:`Re-login required: ${u}`})]}),t.jsxs("div",{className:"oauth-relogin-banner__actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>e(d?c[0]?.id:void 0),children:"Re-login"}),t.jsx("button",{type:"button",className:"btn-icon oauth-relogin-banner__dismiss","aria-label":"Dismiss OAuth re-login banner",onClick:h,children:t.jsx(Nn,{"aria-hidden":"true"})})]})]})}const lB={duplicate_active_id:"Duplicate active task ID",id_in_active_and_archived:"Task ID present in active and archived storage",next_sequence_at_or_below_used:"Allocator next sequence overlaps an existing task ID",task_row_outside_known_prefix:"Task row uses a prefix outside allocator state"};function cB(e){return e.length<=5?e.join(", "):`${e.slice(0,5).join(", ")} +${e.length-5} more`}function dB({report:e,recommendedAction:n,onRefresh:s}){const[a,r]=i.useState(!1),[o,l]=i.useState(null);if(e.status!=="anomaly")return null;const c=async()=>{r(!0),l(null);try{const d=await ey();s?.(d.taskIdIntegrity,d.taskIdIntegrity.recommendedAction)}catch(d){l(d instanceof Error?d.message:"Failed to refresh integrity status.")}finally{r(!1)}};return t.jsxs("section",{className:"task-id-integrity-banner",role:"alert","aria-live":"assertive",children:[t.jsxs("div",{className:"task-id-integrity-banner__header",children:[t.jsxs("div",{className:"task-id-integrity-banner__headline-wrap",children:[t.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),t.jsx(Ma,{"aria-hidden":"true"}),t.jsx("h2",{className:"task-id-integrity-banner__headline",children:"Task ID integrity anomaly detected"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm task-id-integrity-banner__refresh",onClick:()=>{c()},disabled:a,children:[t.jsx(Ss,{className:a?"task-id-integrity-banner__refresh-icon task-id-integrity-banner__refresh-icon--spinning":"task-id-integrity-banner__refresh-icon","aria-hidden":"true"}),a?"Re-checking…":"Re-check"]})]}),t.jsx("p",{className:"task-id-integrity-banner__body",children:"Fusion found allocator state that can cause task IDs to be reused or overwrite live task records."}),t.jsx("ul",{className:"task-id-integrity-banner__list",children:e.anomalies.map(d=>t.jsxs("li",{className:"task-id-integrity-banner__item",children:[t.jsx("strong",{className:"task-id-integrity-banner__item-title",children:lB[d.kind]}),t.jsx("span",{className:"task-id-integrity-banner__item-detail",children:d.details}),t.jsx("code",{className:"task-id-integrity-banner__ids",children:cB(d.affectedIds)})]},`${d.kind}:${d.prefix}:${d.affectedIds.join(",")}`))}),t.jsx("p",{className:"task-id-integrity-banner__footer",children:n}),o?t.jsx("p",{className:"task-id-integrity-banner__error",children:o}):null]})}function uB({errors:e,lastCheckedAt:n,onRefresh:s,refreshing:a,refreshError:r}){if(e.length===0)return null;const o=e.slice(0,5),l=n?new Date(n).toLocaleString():null;return t.jsxs("section",{className:"db-corruption-banner",role:"alert","aria-live":"assertive",children:[t.jsxs("div",{className:"db-corruption-banner__header",children:[t.jsxs("div",{className:"db-corruption-banner__headline-wrap",children:[t.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),t.jsx(Ma,{"aria-hidden":"true"}),t.jsxs("div",{className:"db-corruption-banner__headline-copy",children:[t.jsx("h2",{className:"db-corruption-banner__headline",children:"Database corruption detected"}),l?t.jsxs("p",{className:"db-corruption-banner__meta",children:["Last checked: ",l]}):null]})]}),t.jsxs("button",{type:"button",className:"btn btn-sm db-corruption-banner__refresh",onClick:()=>{s()},disabled:a,children:[t.jsx(Ss,{className:a?"db-corruption-banner__refresh-icon db-corruption-banner__refresh-icon--spinning":"db-corruption-banner__refresh-icon","aria-hidden":"true"}),a?"Refreshing…":"Refresh health"]})]}),t.jsx("p",{className:"db-corruption-banner__body",children:"Fusion's background SQLite integrity check reported corruption. Review the failing objects below before continuing critical operations."}),t.jsx("ul",{className:"db-corruption-banner__list",children:o.map((c,d)=>t.jsx("li",{className:"db-corruption-banner__item",children:t.jsx("code",{className:"db-corruption-banner__error-code",children:c})},`${d}:${c}`))}),t.jsxs("p",{className:"db-corruption-banner__footer",children:[t.jsx("strong",{className:"db-corruption-banner__footer-label",children:"What to do:"})," ","Back up the project, try ",t.jsx("code",{className:"db-corruption-banner__inline-code",children:"fn db --vacuum"})," if the database still opens cleanly, and restore from a known-good backup if corruption persists. See"," ",t.jsx("a",{href:"docs/storage.md",target:"_blank",rel:"noreferrer",className:"db-corruption-banner__link",children:"docs/storage.md"})," ","for the storage layout and recovery guidance."]}),r?t.jsx("p",{className:"db-corruption-banner__error",children:r}):null]})}function mB({latestVersion:e,currentVersion:n,onDismiss:s}){return t.jsxs("div",{className:"update-available-banner",role:"status","aria-live":"polite",children:[t.jsxs("p",{className:"update-available-banner__text",children:["Update available: v",e," (current: v",n,"). Run ",t.jsx("code",{children:"fn update"})," for an installed CLI, or pull this source checkout."," ",t.jsx("a",{className:"update-available-banner__link",href:"https://github.com/Runfusion/Fusion/blob/main/CHANGELOG.md",target:"_blank",rel:"noreferrer",children:"Release notes"})," ","·"," ",t.jsx("a",{className:"update-available-banner__link",href:"https://runfusion.ai",target:"_blank",rel:"noreferrer",children:"Learn more"})]}),t.jsx("button",{type:"button",className:"update-available-banner__dismiss touch-target","aria-label":"Dismiss update notice",onClick:s,children:t.jsx(Nn,{size:16,"aria-hidden":"true"})})]})}function hB(e){return e.length>7?e.slice(0,7):e}function hm(e){return e instanceof Nr?e.message||"Request failed":e instanceof Error&&e.message?e.message:"Request failed"}function Yx(e){const n=["button","[href]","input","select","textarea",'[tabindex]:not([tabindex="-1"])'].join(",");return Array.from(e.querySelectorAll(n)).filter(s=>!(s.hasAttribute("disabled")||s.getAttribute("aria-hidden")==="true"))}function fB({open:e,onClose:n,worktreePath:s,integrationBranch:a,stashSha:r,stashLabel:o,conflictedFiles:l,autostashOutcome:c,taskId:d}){const u=lk(),h=i.useRef(null),m=i.useRef(null),[f,p]=i.useState(c==="failed"?[]:l),[b,v]=i.useState(!1),[x,y]=i.useState(null),[g,j]=i.useState("idle");i.useEffect(()=>{e&&(p(c==="failed"?[]:l),y(null),j("idle"))},[c,l,e]),i.useEffect(()=>{if(!e)return;m.current=document.activeElement instanceof HTMLElement?document.activeElement:null;const I=h.current;if(I){const M=Yx(I),G=M.find(U=>U.getAttribute("aria-label")==="Copy stash reference")??M[0];G?G.focus():I.focus()}const E=M=>{if(M.key==="Escape"){M.preventDefault(),n(!1);return}if(M.key!=="Tab")return;const G=h.current;if(!G)return;const U=Yx(G);if(U.length===0){M.preventDefault(),G.focus();return}const P=U[0],T=U[U.length-1],D=document.activeElement;M.shiftKey&&D===P?(M.preventDefault(),T.focus()):!M.shiftKey&&D===T&&(M.preventDefault(),P.focus())};return document.addEventListener("keydown",E),()=>{document.removeEventListener("keydown",E);const M=m.current;M&&M.isConnected&&M.focus(),m.current=null}},[e,n]);const N=i.useMemo(()=>`Stash ref: ${hB(r)} (${o})`,[o,r]);if(!e)return null;const C=async(I,E)=>{v(!0),y(null);try{const M=await $("/git/stash-resolve",{method:"POST",body:JSON.stringify({worktreePath:s,stashSha:r,file:I,choice:E,taskId:d})});p(Array.isArray(M.remainingConflicts)?M.remainingConflicts:[])}catch(M){y(hm(M))}finally{v(!1)}},w=async()=>{v(!0),y(null);try{(await $("/git/stash-drop",{method:"POST",body:JSON.stringify({worktreePath:s,stashSha:r,taskId:d})})).dropped&&n(!0)}catch(I){y(hm(I))}finally{v(!1)}},S=async()=>{v(!0),y(null);try{const I=await $("/git/stash-apply",{method:"POST",body:JSON.stringify({worktreePath:s,stashSha:r,taskId:d})});I.conflict&&p(Array.isArray(I.conflictedFiles)?I.conflictedFiles:[])}catch(I){y(hm(I))}finally{v(!1)}},R=async()=>{try{await navigator.clipboard.writeText(r),j("copied")}catch{j("failed")}};return t.jsx("div",{className:"modal-overlay open",role:"dialog","aria-modal":"true","aria-labelledby":"stash-conflict-modal-title",children:t.jsxs("div",{className:"modal stash-conflict-modal",ref:h,tabIndex:-1,children:[t.jsx("div",{className:"modal-header",children:t.jsx("h3",{id:"stash-conflict-modal-title",children:"Resolve auto-stash conflicts"})}),t.jsxs("p",{className:"stash-conflict-modal__summary",children:["Pulled ",t.jsx("strong",{children:a}),", but restoring local edits from stash produced conflicts."]}),c==="failed"?t.jsxs("p",{className:"stash-conflict-modal__warning",children:["Automatic restore failed. Your changes are preserved in the stash above; use ",t.jsx("code",{children:"git stash apply <ref>"})," to recover manually, or use Retry below."]}):null,t.jsxs("div",{className:"stash-conflict-modal__stash-row",children:[t.jsx("span",{children:N}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:R,"aria-label":"Copy stash reference",children:t.jsx(ga,{"aria-hidden":"true"})})]}),g==="copied"?t.jsx("p",{className:"stash-conflict-modal__hint",role:"status",children:"Stash SHA copied."}):null,g==="failed"?t.jsx("p",{className:"stash-conflict-modal__error",role:"alert",children:"Could not copy stash SHA."}):null,f.length>0?t.jsx("div",{className:"stash-conflict-modal__list",role:"list",children:f.map(I=>t.jsxs("div",{className:"stash-conflict-row",role:"listitem",children:[t.jsx("code",{className:"stash-conflict-row__path",children:I}),t.jsxs("div",{className:"stash-conflict-row__actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",disabled:b,onClick:()=>void C(I,"ours"),children:"Keep mine"}),t.jsx("button",{type:"button",className:"btn btn-sm",disabled:b,onClick:()=>void C(I,"theirs"),children:"Keep incoming"}),t.jsx("button",{type:"button",className:"btn btn-sm",disabled:b,onClick:()=>u?.openFile(I,{workspace:s}),children:"Open in editor"})]})]},I))}):null,x?t.jsx("p",{className:"stash-conflict-modal__error",role:"alert",children:x}):null,t.jsxs("div",{className:"modal-actions",children:[t.jsx("div",{className:"modal-actions-left",children:t.jsx("button",{type:"button",className:"btn",disabled:b,onClick:()=>void S(),children:"Retry restore"})}),t.jsxs("div",{className:"modal-actions-right",children:[t.jsx("button",{type:"button",className:"btn",disabled:b,onClick:()=>n(!1),children:"Close"}),t.jsx("button",{type:"button",className:"btn btn-warning",disabled:b||f.length>0,onClick:()=>void w(),children:"Drop stash"})]})]})]})})}function ej(e){return`kb:merge-advance-notice-dismissed:${e??"default"}`}function tj(e){return`kb:${e??"default"}:merge-advance-force-with-lease`}function Xx(e){try{const n=window.localStorage.getItem(ej(e));if(!n)return[];const s=JSON.parse(n);return Array.isArray(s)?s.filter(a=>typeof a=="string"):[]}catch{return[]}}function pB(e,n){try{window.localStorage.setItem(ej(e),JSON.stringify(n.slice(-50)))}catch{}}function Qx(e){try{return window.sessionStorage.getItem(tj(e))==="1"}catch{return!1}}function gB(e,n){try{window.sessionStorage.setItem(tj(e),n?"1":"0")}catch{}}function bB({projectId:e,apiBase:n="/api"}){const[s,a]=i.useState([]),[r,o]=i.useState(()=>Xx(e)),[l,c]=i.useState("idle"),[d,u]=i.useState(null),[h,m]=i.useState(null),[f,p]=i.useState("idle"),[b,v]=i.useState(()=>Qx(e)),x=i.useRef(null);i.useEffect(()=>{o(Xx(e)),v(Qx(e))},[e]),i.useEffect(()=>()=>{x.current!==null&&window.clearTimeout(x.current)},[]);const y=i.useCallback(async()=>{try{const I=new URLSearchParams({limit:"5"});e&&I.set("projectId",e);const E=await $(`/tasks/merge-advance-events?${I.toString()}`);a(Array.isArray(E.events)?E.events:[])}catch{a([])}},[e]),g=i.useCallback(async()=>{if(!e){m(null);return}try{const I=await $(`/projects/${encodeURIComponent(e)}/merge-advance/push-status`);m(I)}catch{m(null)}},[e]);i.useEffect(()=>{y(),g();const I=e?`?projectId=${encodeURIComponent(e)}`:"",E=Si(`${n}/events${I}`,{events:{"task:merged":()=>{y(),g()}}});return()=>E()},[n,y,g,e]);const j=i.useMemo(()=>{const I=new Set(r);return s.find(E=>{if(E.succeeded!==!0||E.userCheckout===null||E.userCheckout.worktreePath.trim().length===0||I.has(E.toSha))return!1;const M=E.userCheckout.worktreePath,G=new Set(["clean-sync","synced-with-edits-restored"]);return!(E.autoSync??[]).some(P=>P.worktreePath===M&&G.has(P.outcome))})},[r,s]),N=i.useCallback(()=>{if(!j)return;const I=[...r.filter(E=>E!==j.toSha),j.toSha].slice(-50);o(I),pB(e,I)},[r,j,e]),C=i.useCallback(async()=>{if(j?.userCheckout){c(j.userCheckout.dirty||j.userCheckout.untrackedCount>0?"stashing":"pending");try{const I=e?`?projectId=${encodeURIComponent(e)}`:"",E=await $(`/git/pull${I}`,{method:"POST",body:JSON.stringify({worktreePath:j.userCheckout.worktreePath,integrationBranch:j.integrationBranch,taskId:j.taskId})});E.kind==="stash-conflict"?u({stashSha:E.stashSha,stashLabel:E.stashLabel,conflictedFiles:E.conflictedFiles,autostashOutcome:E.autostashOutcome}):N(),c("idle"),await g()}catch(I){I instanceof Nr?c({error:I.message||"Pull failed"}):I instanceof Error&&I.message?c({error:I.message}):c({error:"Pull failed"})}}},[N,g,j,e]),w=i.useCallback(I=>{v(I),gB(e,I)},[e]),S=i.useCallback(()=>{p("idle")},[]),R=i.useCallback(async()=>{if(e){p("pending");try{const I=await $(`/projects/${encodeURIComponent(e)}/merge-advance/push-origin`,{method:"POST",body:JSON.stringify({forceWithLease:b,expectedLocalSha:h?.localSha})});if(I.ok){p("ok"),await g(),x.current!==null&&window.clearTimeout(x.current),x.current=window.setTimeout(()=>p("idle"),2e3);return}p({error:I.message??I.outcome,outcome:I.outcome==="ok"?"failed":I.outcome,stderr:I.stderrPreview})}catch(I){const E=I instanceof Error?I.message:"Push failed";p({error:E,outcome:"failed"})}}},[g,b,e,h?.localSha]);return{notice:j,dismiss:N,pull:C,pullState:l,conflictState:d,setConflictState:u,pushStatus:h,pushState:f,push:R,clearPushError:S,forceWithLease:b,setForceWithLease:w}}function Zx(e){return e?e.length>7?e.slice(0,7):e:""}const ev={"no-remote":"No `origin` remote configured.","no-upstream":"Branch has no upstream on origin.","merge-locked":"Push paused — a Fusion merge is in progress."};function xB({projectId:e,apiBase:n="/api"}){const s=i.useRef(null),{notice:a,dismiss:r,pull:o,pullState:l,conflictState:c,setConflictState:d,pushStatus:u,pushState:h,push:m,clearPushError:f,forceWithLease:p,setForceWithLease:b}=bB({projectId:e,apiBase:n});if(!a||!a.userCheckout)return null;const v=a.userCheckout,x=v.dirty||v.untrackedCount>0,y=l==="pending"||l==="stashing",g=typeof l=="object"?l.error:null,j=()=>{const C=document.activeElement,w=C instanceof HTMLElement&&s.current?.contains(C);r(),w&&document.body.focus()},N=()=>{if(!u||u.aheadCount<=0)return null;const C=h==="pending"||u.canPush===!1||y,w=p?"Push (force-with-lease)":"Push to origin";return t.jsxs("section",{className:"merge-advance-notice__push",children:[t.jsxs("p",{className:"merge-advance-notice__push-heading",children:["Push ",u.integrationBranch," to origin — ahead by ",u.aheadCount," commit",u.aheadCount===1?"":"s","."]}),t.jsxs("div",{className:"merge-advance-notice__push-actions",children:[h==="ok"?t.jsxs("span",{children:["Pushed to origin/",u.integrationBranch," @ ",Zx(u.remoteSha),"."]}):t.jsx("button",{type:"button",className:`btn btn-sm ${p?"btn-warning":""}`.trim(),disabled:C,onClick:()=>{m()},children:h==="pending"?"Pushing…":w}),!u.canPush&&u.disabledReason&&u.disabledReason in ev?t.jsx("span",{className:"merge-advance-notice__push-error",children:ev[u.disabledReason]}):null]}),typeof h=="object"&&(h.outcome==="rejected-non-ff"||h.outcome==="sha-mismatch")?t.jsxs("div",{className:"merge-advance-notice__push-error",role:"alert",children:[t.jsx("span",{children:h.error})," ",t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>{o()},children:"Smart Pull"})]}):null,typeof h=="object"&&(h.outcome==="rejected-other"||h.outcome==="failed")?t.jsxs("div",{className:"merge-advance-notice__push-error",role:"alert",children:[t.jsx("span",{children:h.error}),h.stderr?t.jsx("pre",{children:h.stderr}):null,t.jsx("button",{type:"button",className:"btn btn-sm",onClick:f,children:"Dismiss"})]}):null,t.jsxs("details",{className:"merge-advance-notice__push-advanced",children:[t.jsx("summary",{children:"Advanced"}),t.jsxs("label",{children:[t.jsx("input",{type:"checkbox",checked:p,onChange:S=>b(S.target.checked)})," ","Allow force-with-lease (use only when you know origin diverged intentionally)"]})]})]})};return t.jsxs(t.Fragment,{children:[t.jsxs("div",{ref:s,className:"merge-advance-notice",role:"status","aria-live":"polite",children:[t.jsxs("div",{className:"merge-advance-notice__content",children:[t.jsxs("strong",{children:[a.integrationBranch," advanced to ",Zx(a.toSha),"."]})," ","Your checked-out copy at ",v.worktreePath," is behind.",x?" (local changes will be auto-stashed and restored)":"",g?t.jsxs("span",{className:"merge-advance-notice__error",role:"alert",children:[" ",g]}):null,y?t.jsx("span",{className:"merge-advance-notice__hint",children:" Pulling…"}):null,N()]}),t.jsxs("div",{className:"merge-advance-notice__actions",children:[c?null:t.jsx("button",{type:"button",className:"btn btn-sm",disabled:y,onClick:()=>{o()},children:"Pull"}),t.jsx("button",{type:"button",className:"merge-advance-notice__dismiss touch-target","aria-label":"Dismiss merge advance notice",onClick:j,children:t.jsx(Nn,{"aria-hidden":"true"})})]})]}),t.jsx(fB,{open:c!==null,onClose:C=>{d(null),C&&j()},worktreePath:v.worktreePath,integrationBranch:a.integrationBranch,stashSha:c?.stashSha??"",stashLabel:c?.stashLabel??"",conflictedFiles:c?.conflictedFiles??[],autostashOutcome:c?.autostashOutcome??"conflict-needs-manual",taskId:a.taskId})]})}function vB({pendingCount:e,onOpenMailbox:n,onDismiss:s}){const a=e===1?"request":"requests";return t.jsx("section",{className:"approval-notification-banner",role:"region","aria-live":"polite","aria-label":"Approval requests",children:t.jsxs("div",{className:"approval-notification-banner__content",children:[t.jsxs("div",{className:"approval-notification-banner__headline",children:[t.jsx("span",{className:"status-dot","aria-hidden":"true"}),t.jsx(Ma,{"aria-hidden":"true"}),t.jsxs("span",{children:[e," approval ",a," need your attention"]})]}),t.jsxs("div",{className:"approval-notification-banner__actions",children:[t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:n,children:[t.jsx(Va,{"aria-hidden":"true"}),t.jsx("span",{children:"Open Mailbox"})]}),t.jsx("button",{type:"button",className:"btn-icon approval-notification-banner__dismiss",onClick:s,"aria-label":"Dismiss approval notification banner",children:t.jsx(Nn,{"aria-hidden":"true"})})]})]})})}function yB({onResume:e}){const n=i5();if(!n)return null;const s=n.completedSteps.length,a=qa.length,r=s>0?`${s} of ${a} step${s!==1?"s":""} complete — You're on the `:"You're on the ";return t.jsxs("section",{className:"onboarding-resume-card",role:"region","aria-label":"Resume onboarding",children:[t.jsxs("div",{className:"onboarding-resume-card__main",children:[t.jsx("div",{className:"onboarding-resume-card__icon","aria-hidden":"true",children:t.jsx(Ls,{size:20})}),t.jsxs("div",{className:"onboarding-resume-card__content",children:[t.jsx("h2",{className:"onboarding-resume-card__title",children:"Continue Setup"}),t.jsxs("p",{className:"onboarding-resume-card__description",children:[r,t.jsx("strong",{children:n.label})," step. Continue where you left off to complete your dashboard setup."]})]})]}),t.jsx("div",{className:"onboarding-resume-card__actions",children:t.jsxs("button",{className:"onboarding-resume-card__resume-btn btn btn-primary btn-sm",onClick:()=>{Bi("onboarding:resumed",{source:"resume-card",resumedFromStep:n.currentStep}),e()},children:[t.jsx(Os,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:"Continue onboarding"})]})})]})}function wB({onOpenSettings:e,onOpenModelOnboarding:n}){const s=Io(),a=Wk(),[r,o]=i.useState(!0),[l,c]=i.useState(!1),[d,u]=i.useState(!1),[h,m]=i.useState({needsAiProvider:!1,needsDefaultModel:!1,needsGitHub:!1});i.useEffect(()=>{if(!s||a){o(!1);return}let y=!1;return(async()=>{try{o(!0),c(!1);const[j,N]=await Promise.all([No(),Ra()]);if(y)return;const C=j.providers??[],w=C.find(M=>M.id==="github"),R=!C.some(M=>M.id!=="github"&&M.authenticated),I=!N.defaultProvider&&!N.defaultModelId,E=w?!w.authenticated:!1;m({needsAiProvider:R,needsDefaultModel:I,needsGitHub:E})}catch{y||c(!0)}finally{y||o(!1)}})(),()=>{y=!0}},[s,a]);const f=i.useCallback(()=>{n5(),u(!0)},[]),p=i.useCallback(()=>{n()},[n]),b=i.useCallback(()=>{e("global-models")},[e]),v=i.useCallback(()=>{e("authentication")},[e]),x=i.useMemo(()=>{const y=[];return h.needsAiProvider&&y.push({id:"ai-provider",title:"Connect AI Provider",description:"Connect an AI provider to enable AI agents for task planning and code generation",actionLabel:"Set Up AI",onAction:p,icon:Bs}),h.needsDefaultModel&&y.push({id:"default-model",title:"Select Default Model",description:"Choose a default AI model for task execution",actionLabel:"Choose Model",onAction:b,icon:Hv}),h.needsGitHub&&y.push({id:"github",title:"Connect GitHub",description:"Connect GitHub to import issues and track pull requests",actionLabel:"Connect GitHub",onAction:v,icon:yi}),y},[h.needsAiProvider,h.needsDefaultModel,h.needsGitHub,v,b,p]);return!s||a||d||r||l||x.length===0?null:t.jsxs("section",{className:"post-onboarding-recommendations",role:"region","aria-label":"Setup recommendations",children:[t.jsxs("div",{className:"post-onboarding-recommendations__main",children:[t.jsx("div",{className:"post-onboarding-recommendations__icon","aria-hidden":"true",children:t.jsx(ba,{size:18,"aria-hidden":!0})}),t.jsxs("div",{className:"post-onboarding-recommendations__content",children:[t.jsx("h2",{className:"post-onboarding-recommendations__title",children:"Recommended Next Steps"}),t.jsx("p",{className:"post-onboarding-recommendations__description",children:"Complete these setup items to get the most out of Fusion."}),t.jsx("ul",{className:"post-onboarding-recommendations__list",children:x.map(y=>{const g=y.icon;return t.jsxs("li",{className:"post-onboarding-recommendations__item",children:[t.jsx("span",{className:"post-onboarding-recommendations__item-icon","aria-hidden":"true",children:t.jsx(g,{size:14,"aria-hidden":!0})}),t.jsxs("span",{className:"post-onboarding-recommendations__item-text",children:[t.jsx("strong",{children:y.title}),t.jsx("span",{children:y.description})]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-primary",onClick:y.onAction,children:y.actionLabel})]},y.id)})}),t.jsx(Ka,{slotId:"post-onboarding-recommendation",renderPlaceholder:!1,actions:{openSettingsSection:e,openModelOnboarding:n}})]})]}),t.jsx("button",{type:"button",className:"post-onboarding-recommendations__dismiss",onClick:f,"aria-label":"Dismiss recommendations",children:t.jsx(Nn,{size:16,"aria-hidden":!0})})]})}function kB({size:e=20}){return t.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",children:t.jsx("path",{d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.203 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.942.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"})})}function ol(e){return e>99?"99+":String(e)}function jB({view:e,onChangeView:n,footerVisible:s,modalOpen:a=!1,keyboardOpen:r=!1,onOpenSettings:o,onOpenActivityLog:l,onOpenSystemStats:c,onOpenMailbox:d,mailboxUnreadCount:u=0,mailboxPendingApprovalCount:h=0,chatHasUnreadResponse:m=!1,stashOrphanCount:f=0,onOpenGitManager:p,onOpenWorkflowSteps:b,onOpenSchedules:v,onOpenScripts:x,onToggleTerminal:y,onOpenFiles:g,onOpenTodos:j,todosOpen:N=!1,onOpenGitHubImport:C,onOpenPlanning:w,onResumePlanning:S,activePlanningSessionCount:R=0,onOpenUsage:I,onRunScript:E,projectId:M,onViewAllProjects:G,showSkillsTab:U,experimentalFeatures:P,onOpenNodes:T,pluginDashboardViews:D=[],shellConnectionControl:W}){const Y=$i(),[L,_]=i.useState(!1),[F,ae]=i.useState(!1),[k,z]=i.useState({}),[J,oe]=i.useState(!1),le=i.useRef(null),we=i.useMemo(()=>Object.entries(k).sort(([ge],[Ne])=>ge.localeCompare(Ne)),[k]);i.useEffect(()=>{if(!F)return;let ge=!1;return oe(!0),Rl(M).then(Ne=>{ge||z(Ne)}).catch(()=>{ge||z({})}).finally(()=>{ge||oe(!1)}),()=>{ge=!0}},[F,M]);const re=i.useCallback(()=>_(!1),[]),H=i.useCallback(ge=>{re(),ge?.()},[re]);if(i.useEffect(()=>{if(!L)return;const ge=Ne=>{Ne.key==="Escape"&&_(!1)};return document.addEventListener("keydown",ge),()=>document.removeEventListener("keydown",ge)},[L]),i.useLayoutEffect(()=>{const ge=le.current;if(!ge||typeof document>"u")return;const Ne=()=>{const Le=window.getComputedStyle(ge),de=Number.parseFloat(Le.paddingBottom)||0,Re=ge.offsetHeight-de,Pe=Math.max(44,Math.ceil(Re));document.documentElement.style.setProperty("--mobile-nav-height",`${Pe}px`)};Ne();let He=null;return typeof ResizeObserver<"u"&&(He=new ResizeObserver(()=>{Ne()}),He.observe(ge)),()=>{He?.disconnect(),document.documentElement.style.removeProperty("--mobile-nav-height")}},[]),Y!=="mobile"||a)return null;const ue=R>0&&S?S:w,Q=!!U,be=!!P?.todoView,fe=Q,O=Q&&!fe,A=D.filter(ge=>ge.view.placement==="primary").sort((ge,Ne)=>(ge.view.order??Number.MAX_SAFE_INTEGER)-(Ne.view.order??Number.MAX_SAFE_INTEGER)).slice(0,1),ne=new Set(A.map(ge=>`${ge.pluginId}:${ge.view.viewId}`)),ye=D.filter(ge=>!ne.has(`${ge.pluginId}:${ge.view.viewId}`)).sort((ge,Ne)=>(ge.view.order??Number.MAX_SAFE_INTEGER)-(Ne.view.order??Number.MAX_SAFE_INTEGER)),ee=e==="documents"||e==="reliability"||!!P?.evalsView&&e==="evals"||!!P?.goalsView&&e==="goalsView"||e==="research"||e==="insights"||e==="memory"||e==="secrets"||e==="devserver"||e==="dev-server"||N&&be||e==="skills"&&!fe||e==="graph"||e==="stash-recovery"||go(e)&&!A.some(ge=>kl(ge.pluginId,ge.view.viewId)===e);return t.jsxs(t.Fragment,{children:[t.jsxs("nav",{ref:le,className:`mobile-nav-bar${s?" mobile-nav-bar--with-footer":""}${r?" mobile-nav-bar--keyboard-open":""}`,role:"tablist","aria-label":"Primary navigation",children:[t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="board"||e==="list"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-tasks",role:"tab","aria-selected":e==="board"||e==="list",onClick:()=>{n(e==="board"||e==="list"?e:"board")},children:[t.jsx(Xa,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Tasks"})]}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="agents"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-agents",role:"tab","aria-selected":e==="agents",onClick:()=>n("agents"),children:[t.jsx(As,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Agents"})]}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="missions"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-missions",role:"tab","aria-selected":e==="missions",onClick:()=>n("missions"),children:[t.jsx(Ys,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Missions"})]}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="chat"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-chat",role:"tab","aria-selected":e==="chat",onClick:()=>n("chat"),children:[t.jsxs("span",{className:"mobile-nav-tab-icon-wrapper",children:[t.jsx(fa,{}),m&&e!=="chat"&&t.jsx("span",{className:"status-dot status-dot--pending mobile-nav-chat-unread-dot","aria-label":"Unread chat response"})]}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Chat"})]}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="mailbox"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-mailbox",role:"tab","aria-selected":e==="mailbox",onClick:()=>n("mailbox"),children:[t.jsxs("span",{className:"mobile-nav-tab-icon-wrapper",children:[t.jsx(jr,{}),h>0&&e!=="mailbox"&&t.jsx("span",{className:"status-dot status-dot--pending mobile-nav-chat-unread-dot","aria-label":"Pending approvals"})]}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Mailbox"}),u>0&&t.jsx("span",{className:"mobile-nav-tab-badge",children:ol(u)})]}),fe&&t.jsxs("button",{type:"button",className:`mobile-nav-tab${e==="skills"?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-skills",role:"tab","aria-selected":e==="skills",onClick:()=>n("skills"),children:[t.jsx(Bs,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"Skills"})]}),A.map(ge=>{const Ne=kl(ge.pluginId,ge.view.viewId),He=id(ge.view.icon);return t.jsxs("button",{type:"button",className:`mobile-nav-tab${e===Ne||e==="graph"&&ge.pluginId==="fusion-plugin-dependency-graph"&&ge.view.viewId==="graph"?" mobile-nav-tab--active":""}`,"data-testid":`mobile-nav-tab-plugin-${ge.pluginId}-${ge.view.viewId}`,role:"tab","aria-selected":e===Ne||e==="graph"&&ge.pluginId==="fusion-plugin-dependency-graph"&&ge.view.viewId==="graph",onClick:()=>n(ge.pluginId==="fusion-plugin-dependency-graph"&&ge.view.viewId==="graph"?"graph":Ne),children:[t.jsx(He,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:ge.view.label})]},`${ge.pluginId}:${ge.view.viewId}`)}),t.jsxs("button",{type:"button",className:`mobile-nav-tab${ee?" mobile-nav-tab--active":""}`,"data-testid":"mobile-nav-tab-more",role:"tab","aria-selected":!1,onClick:()=>_(ge=>!ge),children:[t.jsx(Nm,{}),t.jsx("span",{className:"mobile-nav-tab-label",children:"More"})]})]}),L&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"mobile-more-sheet-backdrop",onClick:re}),t.jsxs("div",{className:"mobile-more-sheet",children:[t.jsx("div",{className:"mobile-more-sheet-handle"}),t.jsx("div",{className:"mobile-more-sheet-title",children:"Navigate"}),W?t.jsx("div",{className:"mobile-more-shell-connection","data-testid":"mobile-more-shell-connection",children:W}):null,t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-mailbox",onClick:()=>H(d),children:[t.jsx(jr,{}),t.jsx("span",{children:"Mailbox"}),u>0&&t.jsx("span",{className:"mobile-more-item-badge mobile-more-item-badge--unread",children:ol(u)}),h>0&&t.jsx("span",{className:"mobile-more-item-badge",children:ol(h)})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-activity",onClick:()=>H(l),children:[t.jsx(fi,{}),t.jsx("span",{children:"Activity Log"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-system-stats",onClick:()=>H(c),children:[t.jsx(ko,{}),t.jsx("span",{children:"System Stats"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-git",onClick:()=>H(p),children:[t.jsx(ii,{}),t.jsx("span",{children:"Git Manager"})]}),t.jsxs("div",{className:"mobile-more-split-row",children:[t.jsxs("button",{type:"button",className:"mobile-more-item mobile-more-split-primary","data-testid":"mobile-more-item-terminal",onClick:()=>H(y),children:[t.jsx(_a,{}),t.jsx("span",{children:"Terminal"})]}),t.jsx("button",{type:"button",className:"mobile-more-split-toggle","data-testid":"mobile-more-terminal-split-toggle",onClick:()=>ae(ge=>!ge),"aria-expanded":F,"aria-haspopup":"menu","aria-label":"Show scripts",children:t.jsx(ps,{size:14,className:`mobile-more-chevron${F?" mobile-more-chevron--open":""}`})})]}),F&&t.jsx("div",{className:"mobile-more-submenu",role:"menu","aria-label":"Scripts submenu",children:J?t.jsxs("div",{className:"mobile-more-submenu-loading","data-testid":"mobile-more-scripts-loading",children:[t.jsx(Ct,{className:"animate-spin"}),t.jsx("span",{children:"Loading scripts…"})]}):we.length>0?t.jsxs(t.Fragment,{children:[we.map(([ge,Ne])=>t.jsxs("button",{type:"button",className:"mobile-more-item mobile-more-subitem","data-testid":`mobile-more-script-item-${ge}`,onClick:()=>{E&&E(ge,Ne),re(),ae(!1)},children:[t.jsx(Os,{}),t.jsx("span",{children:ge})]},ge)),x&&t.jsxs("button",{type:"button",className:"mobile-more-item mobile-more-subitem mobile-more-subitem--manage","data-testid":"mobile-more-scripts-manage",onClick:()=>{re(),ae(!1),x()},children:[t.jsx(Yi,{}),t.jsx("span",{children:"Manage Scripts…"})]})]}):x&&t.jsxs("button",{type:"button",className:"mobile-more-item mobile-more-subitem","data-testid":"mobile-more-scripts-manage",onClick:()=>{re(),ae(!1),x()},children:[t.jsx(Yi,{}),t.jsx("span",{children:"No scripts — add one…"})]})}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-files",onClick:()=>H(g),children:[t.jsx(Qs,{}),t.jsx("span",{children:"Files"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-planning",onClick:()=>H(ue),children:[t.jsx(ba,{}),t.jsx("span",{children:"Planning"}),R>0&&t.jsx("span",{className:"mobile-more-item-badge",children:ol(R)})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-workflow",onClick:()=>H(b),children:[t.jsx(Zc,{}),t.jsx("span",{children:"Workflow Steps"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-schedules",onClick:()=>H(v),children:[t.jsx(pa,{}),t.jsx("span",{children:"Automation"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-github",onClick:()=>H(C),children:[t.jsx(kB,{}),t.jsx("span",{children:"Import from GitHub"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-usage",onClick:()=>H(I),children:[t.jsx(fi,{}),t.jsx("span",{children:"Usage"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-projects",onClick:()=>H(G),children:[t.jsx(_l,{}),t.jsx("span",{children:"Projects"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-documents",onClick:()=>H(()=>n("documents")),children:[t.jsx(Ya,{}),t.jsx("span",{children:"Documents"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-reliability",onClick:()=>H(()=>n("reliability")),children:[t.jsx(fi,{}),t.jsx("span",{children:"Reliability"})]}),P?.evalsView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-evals",onClick:()=>H(()=>n("evals")),children:[t.jsx(Ys,{}),t.jsx("span",{children:"Evals"})]}),P?.goalsView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-goals",onClick:()=>H(()=>n("goalsView")),children:[t.jsx(Ys,{}),t.jsx("span",{children:"Goals"})]}),O&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-skills",onClick:()=>H(()=>n("skills")),children:[t.jsx(Bs,{}),t.jsx("span",{children:"Skills"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-stash-recovery",onClick:()=>H(()=>n("stash-recovery")),children:[t.jsx(wr,{}),t.jsx("span",{children:"Stash Recovery"}),f>0?t.jsx("span",{className:"mobile-more-item-badge",children:ol(f)}):null]}),P?.researchView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-research",onClick:()=>H(()=>n("research")),children:[t.jsx(da,{}),t.jsx("span",{children:"Research"})]}),P?.insights&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-insights",onClick:()=>H(()=>n("insights")),children:[t.jsx(Ls,{}),t.jsx("span",{children:"Insights"})]}),P?.memoryView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-memory",onClick:()=>H(()=>n("memory")),children:[t.jsx(El,{}),t.jsx("span",{children:"Memory"})]}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-secrets",onClick:()=>H(()=>n("secrets")),children:[t.jsx(Do,{}),t.jsx("span",{children:"Secrets"})]}),P?.devServerView&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-dev-server",onClick:()=>{H(()=>n("dev-server"))},children:[t.jsx(ko,{}),t.jsx("span",{children:"Dev Server"})]}),P?.nodesView&&T&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-nodes",onClick:()=>H(T),children:[t.jsx(ZS,{}),t.jsx("span",{children:"Nodes"})]}),be&&t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-todos",onClick:()=>H(()=>j?.()),children:[t.jsx(Ch,{}),t.jsx("span",{children:"Todos"})]}),ye.map(ge=>{const Ne=kl(ge.pluginId,ge.view.viewId),He=id(ge.view.icon);return t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":`mobile-more-item-plugin-${ge.pluginId}-${ge.view.viewId}`,onClick:()=>H(()=>n(ge.pluginId==="fusion-plugin-dependency-graph"&&ge.view.viewId==="graph"?"graph":Ne)),children:[t.jsx(He,{}),t.jsx("span",{children:ge.view.label})]},`${ge.pluginId}:${ge.view.viewId}`)}),t.jsx("div",{className:"mobile-more-separator"}),t.jsxs("button",{type:"button",className:"mobile-more-item","data-testid":"mobile-more-item-settings",onClick:()=>H(o),children:[t.jsx(wl,{}),t.jsx("span",{children:"Settings"})]})]})]})]})}function tv(e){return e.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function nj(e,n){const s=n.trim();if(!s)return!0;const a=tv(s);return tv(e).includes(a)||e.toLowerCase().includes(s.toLowerCase())}function NB({agents:e,filter:n,highlightedIndex:s,visible:a,onSelect:r,position:o="below",roomMemberIds:l,roomName:c}){const d=i.useMemo(()=>e.filter(b=>nj(b.name,n)),[e,n]),u=!!l,h=u&&n.trim().length>0,m=i.useMemo(()=>u?d.filter(b=>l?.has(b.id)):d,[d,l,u]),f=i.useMemo(()=>u?d.filter(b=>!l?.has(b.id)):[],[d,l,u]),p=h?[...m,...f]:m;return a?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${o}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":"Agent mention suggestions",children:p.length===0?t.jsx("div",{className:"agent-mention-empty",children:"No agents found"}):t.jsxs(t.Fragment,{children:[u&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:c?`Members of #${c}`:"Room members"}),m.map((b,v)=>t.jsxs("button",{type:"button",className:`agent-mention-item${v===s?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${b.id}`,onMouseDown:x=>x.preventDefault(),onClick:()=>r(b),role:"option","aria-selected":v===s,children:[t.jsx(gd,{agent:b,size:20}),u&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":"Room member"}),t.jsx("span",{className:"agent-mention-name",children:b.name}),t.jsx("span",{className:"agent-mention-role",children:b.role})]},b.id)),u&&!h&&f.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:"Type to search other agents"}),u&&h&&f.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:"Other agents"}),f.map((b,v)=>{const x=m.length+v;return t.jsxs("button",{type:"button",className:`agent-mention-item${x===s?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${b.id}`,onMouseDown:y=>y.preventDefault(),onClick:()=>r(b),role:"option","aria-selected":x===s,children:[t.jsx(gd,{agent:b,size:20}),t.jsx("span",{className:"agent-mention-name",children:b.name}),t.jsx("span",{className:"agent-mention-role",children:b.role})]},b.id)})]})]})}):null}function nv(e){const{sessionId:n,tempUserMessageId:s,setStreamingText:a,setStreamingThinking:r,setStreamingToolCalls:o,cancelStreamingFlushesRef:l,addToast:c,onDone:d,onError:u,onFallbackSession:h}=e;let m="",f="",p=[],b,v=null,x=null;const y=()=>{v=null,a(m)},g=()=>{x=null,r(f)},j=()=>{v!==null&&(cancelAnimationFrame(v),v=null),x!==null&&(cancelAnimationFrame(x),x=null)};return l.current=j,{handlers:{onThinking:C=>{f+=C,x===null&&(x=requestAnimationFrame(g))},onText:C=>{m+=C,v===null&&(v=requestAnimationFrame(y))},onToolStart:C=>{p=[...p,{toolName:C.toolName,args:C.args,isError:!1,status:"running"}],o(p)},onToolEnd:C=>{const w=[...p];for(let S=w.length-1;S>=0;S--){const R=w[S];if(R?.toolName===C.toolName&&R.status==="running"){w[S]={...R,status:"completed",isError:C.isError,result:C.result},p=w,o(w);return}}p=[...w,{toolName:C.toolName,isError:C.isError,result:C.result,status:"completed"}],o(p)},onFallback:C=>{b=C,h?.(C,n),c?.(`Primary model unavailable. Switched to fallback ${C.fallbackModel}.`,"warning")},onDone:C=>{j(),d({messageId:C.messageId,message:C.message,accumulated:{text:m,thinking:f,toolCalls:p,fallbackInfo:b}})},onError:C=>{j(),u(C,s)}},cancelFlushes:j}}let sv=null,iv=null;const SB=["load failed","failed to fetch","networkerror when attempting to fetch resource.","connection aborted","connection closed unexpectedly","network error"];function CB(e){const n=e.trim().toLowerCase();return n?SB.some(s=>n.includes(s)):!1}function EB(){const e=i.useRef(sv),n=i.useRef(iv),s=i.useRef(new Set);i.useEffect(()=>{if(typeof document>"u")return;let l=document.visibilityState;const c=()=>{const d=Date.now(),u=document.visibilityState;if(u==="hidden"&&(e.current=d,sv=d),u==="visible"&&(n.current=d,iv=d,l==="hidden"))for(const h of s.current)h();l=u};return c(),document.addEventListener("visibilitychange",c),()=>document.removeEventListener("visibilitychange",c)},[]);const a=i.useCallback(()=>typeof document<"u"&&document.visibilityState==="hidden",[]),r=i.useCallback((l=5e3)=>{const c=e.current;if(c===null)return!1;const d=Date.now();if(a())return d-c<=l;const u=n.current;return u===null||u<c?!1:d-u<=l},[a]),o=i.useCallback(l=>(s.current.add(l),()=>{s.current.delete(l)}),[]);return i.useMemo(()=>({isHiddenNow:a,wasRecentlyHidden:r,onBecameVisible:o}),[a,o,r])}const xr="__fn_agent__";function sj(e,n){const s=typeof e=="string"?e.trim():"",a=typeof n=="string"?n.trim():"";return!s||!a?{}:{modelProvider:s,modelId:a}}function Oc(e,n,s){const a=typeof e=="string"?e.trim():"",r=sj(n,s),o=a||(r.modelProvider&&r.modelId?xr:"");return o?{agentId:o,...r}:null}function Fc(e,n,s){const a=sj(n,s),r=a.modelProvider??"",o=a.modelId??"";return`${e}::${r}/${o}`}function av(e){const n=typeof e=="string"?e.trim():"",s=n.indexOf("/");return!n||s<=0||s>=n.length-1?{}:{modelProvider:n.slice(0,s),modelId:n.slice(s+1)}}function _B(e){const n=e?.toolCalls;if(!Array.isArray(n))return;const s=n.map(a=>{if(!a||typeof a!="object")return null;const r=a,o=typeof r.toolName=="string"?r.toolName:"";if(!o)return null;const l=r.args;return{toolName:o,...l&&typeof l=="object"?{args:l}:{},isError:!!r.isError,result:r.result,status:"completed"}}).filter(a=>a!==null);return s.length>0?s:void 0}function MB(e){const n=e?.fallback;if(!n||typeof n!="object")return;const s=n,a=typeof s.primaryModel=="string"?s.primaryModel:"",r=typeof s.fallbackModel=="string"?s.fallbackModel:"",o=s.triggerPoint;if(!(!a||!r||o!=="session-creation"&&o!=="prompt-time"))return{primaryModel:a,fallbackModel:r,triggerPoint:o}}function ro(e){return{id:e.id,sessionId:e.sessionId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput,toolCalls:_B(e.metadata),fallbackInfo:MB(e.metadata),createdAt:e.createdAt}}function RB(e,n){const[s,a]=i.useState(null),[r,o]=i.useState([]),[l,c]=i.useState(!1),[d,u]=i.useState([]),[h,m]=i.useState(!1),[f,p]=i.useState(!1),[b,v]=i.useState(""),[x,y]=i.useState(""),[g,j]=i.useState([]),[N,C]=i.useState(""),w=i.useRef(null),S=i.useRef(null),R=i.useRef(!1),I=i.useRef(null),E=i.useRef(""),M=i.useRef(f);M.current=f;const G=i.useRef(null),U=i.useRef(null),P=i.useRef(""),T=i.useRef(null),D=i.useRef(s);D.current=s;const W=i.useRef(0),Y=3,L=i.useRef(!1);i.useEffect(()=>{E.current=N},[N]),i.useEffect(()=>{S.current=null},[e]);const _=i.useCallback(async()=>{c(!0);try{const A=await Np(e);o(A.sessions)}catch(A){console.error("[useQuickChat] Failed to refresh sessions:",A)}finally{c(!1)}},[e]),F=i.useCallback(async A=>{const ne={agentId:A.agentId};return A.modelProvider&&A.modelId&&(ne.modelProvider=A.modelProvider,ne.modelId=A.modelId),(await VM(ne,e)).session},[e]),ae=i.useCallback(()=>{E.current="",C("")},[]),k=i.useCallback(()=>{const A=E.current.trim();if(!A)return;E.current="",C("");const ne=U.current;U.current=null;const ye=fe.current(A);ne&&ye.then(ne.resolve).catch(ne.reject)},[]),z=i.useCallback((A,ne,ye)=>{if(w.current||!A)return!0;R.current=!1,ne&&(v(ne.streamingText),y(ne.streamingThinking),j(ne.toolCalls)),p(!0);const{handlers:ee}=nv({sessionId:A,tempUserMessageId:"",setStreamingText:v,setStreamingThinking:y,setStreamingToolCalls:j,cancelStreamingFlushesRef:I,addToast:ye?.silent?void 0:n,onFallbackSession:(ge,Ne)=>{const He=av(ge.fallbackModel);o(Le=>Le.map(de=>de.id===Ne?{...de,...He}:de)),a(Le=>Le&&Le.id===Ne?{...Le,...He}:Le)},onDone:()=>{v(""),y(""),j([]),p(!1),M.current=!1,w.current=null,S.current=null,Wo(A,{limit:50,order:"desc"},e).then(ge=>{D.current?.id===A&&u(ge.messages.slice().reverse().map(ro))}).catch(()=>{}),k()},onError:ge=>{v(""),y(""),j([]),p(!1),M.current=!1,w.current=null,S.current=null;const Ne=typeof ge=="string"&&ge.trim()?ge:"Failed to get response";ye?.silent||n?.(Ne,"error"),Wo(A,{limit:50,order:"desc"},e).then(He=>{D.current?.id===A&&u(He.messages.slice().reverse().map(ro))}).catch(()=>{}),k()}});return w.current=sR(A,ee,e,{...typeof ne?.replayFromEventId=="number"?{lastEventId:ne.replayFromEventId}:{}}),S.current={sessionId:A,replayFromEventId:typeof ne?.replayFromEventId=="number"?ne.replayFromEventId:null},!0},[n,e,k]),J=i.useCallback(async(A,ne,ye)=>{const ee=Oc(A,ne,ye);if(!ee)return;const ge=Fc(ee.agentId,ee.modelProvider,ee.modelId);c(!0);try{const{session:Ne}=await qM({agentId:ee.agentId,modelProvider:ee.modelProvider,modelId:ee.modelId},e);if(Ne)a(Ne),P.current=ge,Ne.isGenerating&&z(Ne.id,Ne.inFlightGeneration);else{const He=await F(ee);a(He),P.current=ge}W.current=0}catch(Ne){console.error("[useQuickChat] Failed to initialize session:",Ne),W.current+=1,W.current<=Y&&n?.("Failed to initialize chat","error")}finally{c(!1)}},[z,e,n,F]),oe=i.useCallback(async()=>{if(s){m(!0);try{const A=s.id,ne=await Wo(A,{limit:50,order:"desc"},e);D.current?.id===A&&u(ne.messages.slice().reverse().map(ro))}catch(A){console.error("[useQuickChat] Failed to load messages:",A)}finally{m(!1)}}},[s,e]);i.useEffect(()=>{s?oe():u([])},[s,oe]),i.useEffect(()=>{if(!s?.isGenerating||(w.current||z(s.id,s.inFlightGeneration),!M.current||w.current||!s))return;const A=setInterval(async()=>{if(!M.current||w.current||!s){clearInterval(A);return}try{if(!(await rc(s.id,e)).session.isGenerating){clearInterval(A);const ye=s.id,ee=await Wo(ye,{limit:50,order:"desc"},e);D.current?.id===ye&&u(ee.messages.slice().reverse().map(ro)),v(""),y(""),j([]),p(!1),M.current=!1,k()}}catch{}},3e3);return()=>clearInterval(A)},[s,z,e,k]);const le=i.useCallback(async()=>{if(s){m(!0);try{const A=s.id,ne=await Wo(A,{limit:50,order:"desc"},e);D.current?.id===A&&u(ne.messages.slice().reverse().map(ro))}catch(A){console.error("[useQuickChat] Failed to reload messages:",A)}finally{m(!1)}}},[s,e]),we=i.useCallback(()=>{I.current?.(),I.current=null,E.current="",C(""),U.current?.resolve(),U.current=null,v(""),y(""),j([]),p(!1)},[]),re=i.useCallback(async(A,ne,ye)=>{const ee=Oc(A,ne,ye);if(!ee)return;const ge=Fc(ee.agentId,ee.modelProvider,ee.modelId);T.current=ee;const Ne=ge===P.current&&D.current;if(Ne||(w.current&&(w.current.close(),w.current=null),S.current=null,we()),Ne){await le();return}a(null),u([]),P.current=ge,await J(ee.agentId,ee.modelProvider,ee.modelId)},[J,le,we]),H=i.useCallback(async A=>{const ne=Oc(A.agentId,A.modelProvider??void 0,A.modelId??void 0);ne&&(T.current=ne,P.current=Fc(ne.agentId,ne.modelProvider,ne.modelId),w.current&&(w.current.close(),w.current=null),S.current=null,we(),a(A),Promise.resolve(rc(A.id,e)).then(({session:ye})=>{!ye.isGenerating||!ye.inFlightGeneration||a(ee=>!ee||ee.id!==A.id?ee:{...ee,...ye})}).catch(()=>{}),A.isGenerating&&z(A.id,A.inFlightGeneration))},[z,e,we]),ue=i.useCallback(async(A,ne)=>{await re(xr,A,ne)},[re]),Q=i.useCallback(async(A,ne,ye)=>{const ge=Oc(A??"",ne,ye)??T.current;if(!ge)return;T.current=ge;const Ne=Fc(ge.agentId,ge.modelProvider,ge.modelId);L.current=!0,W.current=0,w.current&&(w.current.close(),w.current=null),S.current=null,we(),u([]),a(null),c(!0);try{const He=await F(ge);a(He),P.current=Ne;const Le=await Np(e);o(Le.sessions)}catch(He){console.error("[useQuickChat] Failed to start a fresh session:",He),n?.("Failed to start a new chat","error")}finally{L.current=!1,c(!1)}},[n,F,e,we]),be=i.useCallback(()=>{s&&(R.current=!0,I.current?.(),I.current=null,w.current?.close(),w.current=null,S.current=null,eR(s.id,e).catch(()=>{}),p(!1),M.current=!1,v(""),y(""),j([]),k())},[s,e,k]),fe=i.useRef(()=>Promise.resolve()),O=EB(),se=i.useCallback(async A=>{try{await _();const ye=(await rc(A,e)).session;D.current?.id===A&&a(ee=>!ee||ee.id!==A?ee:{...ee,...ye}),ye.isGenerating?(v(""),y(""),j([]),p(!0),M.current=!0,z(A,ye.inFlightGeneration,{silent:!0})):(v(""),y(""),j([]),p(!1),M.current=!1,await le())}catch{}},[z,e,_,le]),ve=i.useCallback((A,ne)=>{if(!A.trim()&&(!ne||ne.length===0))return Promise.resolve();if(!s)return ne&&ne.length>0?Promise.reject(new Error("Cannot send attachments before chat session is ready")):new Promise((ee,ge)=>{U.current?.resolve(),U.current={resolve:ee,reject:ge},E.current=A,C(A),D.current&&!M.current&&!w.current&&queueMicrotask(()=>{!M.current&&!w.current&&k()})});if(M.current)return ne&&ne.length>0?Promise.reject(new Error("Cannot send attachments while a response is streaming")):(E.current=A,C(A),Promise.resolve());const ye=new Promise((ee,ge)=>{G.current={resolve:ee,reject:ge},R.current=!1,w.current&&(w.current.close(),w.current=null),S.current=null;const Ne=`temp-${Date.now()}`,He={id:Ne,sessionId:s.id,role:"user",content:A,createdAt:new Date().toISOString()};u(de=>[...de,He]),v(""),y(""),j([]),p(!0);const{handlers:Le}=nv({sessionId:s.id,tempUserMessageId:Ne,setStreamingText:v,setStreamingThinking:y,setStreamingToolCalls:j,cancelStreamingFlushesRef:I,addToast:n,onFallbackSession:(de,Re)=>{const Pe=av(de.fallbackModel);o(rt=>rt.map(qe=>qe.id===Re?{...qe,...Pe}:qe)),a(rt=>rt&&rt.id===Re?{...rt,...Pe}:rt)},onDone:({messageId:de,message:Re,accumulated:Pe})=>{const rt=Re?{...ro(Re),...Pe.text.length>0?{content:Pe.text}:{}}:{id:de||`msg-${Date.now()}`,sessionId:s.id,role:"assistant",content:Pe.text,thinkingOutput:Pe.thinking||void 0,toolCalls:Pe.toolCalls.length>0?Pe.toolCalls:void 0,fallbackInfo:Pe.fallbackInfo,createdAt:new Date().toISOString()};u(qe=>[...qe,rt]),v(""),y(""),j([]),p(!1),M.current=!1,w.current=null,S.current=null,G.current?.resolve(),G.current=null,k()},onError:de=>{v(""),y(""),j([]),p(!1),M.current=!1,w.current=null,S.current=null,console.error("[useQuickChat] Stream error:",de);const Re=typeof de=="string"&&de.trim()?de:"Failed to get response",Pe=CB(Re);Pe?(console.info("[useQuickChat] Suppressed tab-suspension stream error:",de),s?.id&&(v(""),y(""),j([]),p(!0),M.current=!0,se(s.id)),G.current?.resolve()):(n?.(Re,"error"),G.current?.reject(new Error(Re))),G.current=null,R.current||k(),Pe||le()}});w.current=nR(s.id,A,Le,ne,e)});return ye.catch(()=>{}),ye},[s,e,n,le,se,k]);return fe.current=ve,i.useEffect(()=>{if(!s?.id||s.isGenerating!==!0||w.current)return;const A=typeof s.inFlightGeneration?.replayFromEventId=="number"?s.inFlightGeneration.replayFromEventId:null,ne=S.current;ne?.sessionId===s.id&&ne.replayFromEventId===A||z(s.id,s.inFlightGeneration,{silent:!0})},[s?.id,s?.isGenerating,s?.inFlightGeneration,z]),i.useEffect(()=>O.onBecameVisible(()=>{if(L.current)return;const ne=D.current;!ne||w.current||Promise.resolve(rc(ne.id,e)).then(ye=>{if(!(w.current||D.current?.id!==ne.id)){if(ye.session.isGenerating){v(""),y(""),j([]),p(!0),M.current=!0,z(ne.id,ye.session.inFlightGeneration,{silent:!0});return}M.current&&(v(""),y(""),j([]),p(!1),M.current=!1,k(),le())}}).catch(()=>{})}),[z,e,le,O,k]),i.useEffect(()=>{!s||M.current||w.current||E.current.trim().length!==0&&k()},[s,k]),i.useEffect(()=>()=>{w.current&&(w.current.close(),w.current=null),S.current=null},[]),i.useMemo(()=>({activeSession:s,sessions:r,sessionsLoading:l,messages:d,messagesLoading:h,isStreaming:f,streamingText:b,streamingThinking:x,streamingToolCalls:g,pendingMessage:N,sendMessage:ve,stopStreaming:be,clearPendingMessage:ae,switchSession:re,selectSession:H,startModelChat:ue,startFreshSession:Q,refreshSessions:_,loadMessages:oe,reloadMessages:le,skipNextSessionInitRef:L}),[s,r,l,d,h,f,b,x,g,N,ve,be,ae,re,H,ue,Q,_,oe,le])}const AB=250;function ij(e,n){const[s,a]=i.useState(()=>{const x=ui(bn.AGENTS,{maxAgeMs:_r});return Array.isArray(x)?x:[]}),[r,o]=i.useState(()=>ui(bn.AGENT_STATS,{maxAgeMs:_r})??null),[l,c]=i.useState(!1),d=i.useRef(s.length>0||r!==null),u=i.useRef(0),h=i.useRef(0),m=i.useCallback(async(x,y)=>{const g=++u.current;d.current||c(!0);try{const j=n?.filterState,N=j&&j!=="all"?{state:j}:void 0,C=n?.showSystemAgents??!1,w={...N,...x,includeEphemeral:x?.includeEphemeral??C},S=y?.forceFresh?await Qa(w,e,{forceFresh:!0}):await Qa(w,e);if(g!==u.current)return;const R=Array.from(new Map(S.map(I=>[I.id,I])).values());a(R),Wn(bn.AGENTS,R,{maxBytes:5e5}),d.current=d.current||R.length>0}catch(j){console.error("Failed to load agents:",j)}finally{g===u.current&&c(!1)}},[e,n?.filterState,n?.showSystemAgents]),f=i.useCallback(async x=>{const y=++h.current;try{const g=x?.forceFresh?await pp(e,{forceFresh:!0}):await pp(e);if(y!==h.current)return;o(g),Wn(bn.AGENT_STATS,g,{maxBytes:5e5}),d.current=!0}catch(g){console.error("Failed to load agent stats:",g)}},[e]);i.useEffect(()=>{m(),f()},[m,f]),i.useEffect(()=>{const x=e?`?projectId=${encodeURIComponent(e)}`:"";let y=null,g=!1,j=!1,N=!1;const C=async()=>{g=!0,j=!1;try{await Promise.all([m(void 0,{forceFresh:!0}),f({forceFresh:!0})])}finally{g=!1,!N&&j&&w()}},w=()=>{if(y||g){g&&(j=!0);return}y=setTimeout(()=>{y=null,C()},AB)},S=()=>{if(g){j=!0;return}w()},R=Si(`/api/events${x}`,{events:{"agent:created":S,"agent:updated":S,"agent:deleted":S,"agent:stateChanged":S,"approval:requested":S,"approval:updated":S,"approval:decided":S}});return()=>{N=!0,y&&clearTimeout(y),R()}},[e,m,f]);const p=i.useCallback(async()=>{await Promise.all([m(void 0,{forceFresh:!0}),f({forceFresh:!0})])},[m,f]),b=n?.showSystemAgents??!1,v=s.filter(x=>x.state!=="active"&&x.state!=="running"?!1:b||!xC(x));return{agents:s,activeAgents:v,stats:r,isLoading:l,loadAgents:m,loadStats:f,refreshAgents:p}}const fm=new Map,Yc=new Map;function yf(e){return e??"global"}function bh(e){return`${bn.DISCOVERED_SKILLS_PREFIX}${yf(e)}`}function oo(e){return ui(bh(e),{maxAgeMs:_r})}function TB(e,n){for(const s of Yc.get(e)??[])s(n)}async function IB(e){const n=yf(e),s=fm.get(n);if(s)return s;const a=HM(e).finally(()=>{fm.delete(n)});return fm.set(n,a),a}function PB(e){const[n,s]=i.useState(()=>oo(e)??[]),[a,r]=i.useState(()=>oo(e)===null),o=i.useRef(oo(e)!==null),l=yf(e);i.useEffect(()=>{const u=oo(e)??[];s(u),r(oo(e)===null),o.current=oo(e)!==null},[e]),i.useEffect(()=>{const u=Yc.get(l)??new Set;return u.add(s),Yc.set(l,u),()=>{u.delete(s),u.size===0&&Yc.delete(l)}},[l]);const c=i.useCallback(async()=>{try{const u=await IB(e);o.current=!0,Wn(bh(e),u,{maxBytes:5e5}),TB(l,u)}catch{o.current||hs(bh(e))}finally{r(!1)}},[e,l]);i.useEffect(()=>{c()},[c]);const d=i.useCallback(async()=>{r(!0),await c()},[c]);return{skills:n,loading:a,refresh:d}}function $B(e,n){return e+n}function DB({visible:e,position:n,tasks:s,files:a,selectedIndex:r,onSelectTask:o,onSelectFile:l,loading:c}){if(!e)return null;const d=s.length>0,u=a.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:n.top,left:n.left},"data-testid":"file-mention-popup",onMouseDown:h=>{h.preventDefault()},children:[c&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!c&&!d&&!u&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:"No tasks or files found"}),!c&&(d||u)&&t.jsxs("div",{className:"file-mention-popup-groups",children:[d&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:"Tasks"}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":"Task matches",children:s.map((h,m)=>{const f=m;return t.jsxs("li",{className:`file-mention-popup-item${f===r?" file-mention-popup-item--selected":""}`,onClick:()=>o(h),role:"option","aria-selected":f===r,"data-testid":`task-mention-item-${f}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Uv,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsxs("div",{className:"file-mention-popup-task-row",children:[t.jsx("span",{className:"file-mention-popup-task-id",children:h.id}),t.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${h.column}`,children:h.column})]}),t.jsx("span",{className:"file-mention-popup-item-path",children:h.title})]})]},h.id)})})]}),u&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:"Files"}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":"File matches",children:a.map((h,m)=>{const f=$B(s.length,m),p=AR(h.path);return t.jsxs("li",{className:`file-mention-popup-item${f===r?" file-mention-popup-item--selected":""}`,onClick:()=>l(h),role:"option","aria-selected":f===r,"data-testid":`file-mention-item-${f}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Bv,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:h.name}),p&&t.jsx("span",{className:"file-mention-popup-item-path",children:p})]})]},h.path)})})]})]})]})}const LB=200,OB=8,FB=8;function rv(){return new DOMException("The operation was aborted.","AbortError")}function ov(e,n){return n.aborted?Promise.reject(rv()):new Promise((s,a)=>{const r=()=>a(rv());n.addEventListener("abort",r,{once:!0}),e.then(o=>{n.removeEventListener("abort",r),s(o)},o=>{n.removeEventListener("abort",r),a(o)})})}function lv(e,n,s){const a=e.slice(0,n),r=e.slice(n+1),o=r.match(/[\s]|$/),l=o?o.index??r.length:r.length,c=r.slice(l);return`${a}${s}${c}`}function zB(e={}){const{projectId:n,workspace:s="project"}=e,[a,r]=i.useState(!1),[o,l]=i.useState(""),[c,d]=i.useState(-1),[u,h]=i.useState([]),[m,f]=i.useState([]),[p,b]=i.useState(!1),[v,x]=i.useState(0),y=i.useRef(null),g=i.useRef(null),j=[...u.map(E=>({kind:"task",task:E})),...m.map(E=>({kind:"file",file:E}))];i.useEffect(()=>()=>{y.current&&clearTimeout(y.current),g.current?.abort()},[]);const N=i.useCallback((E,M)=>{if(M<0||M>E.length){r(!1);return}const G=U=>/[a-zA-Z0-9/_.-]/.test(U);for(let U=M-1;U>=0;U--){if(E[U]==="#"){if(U===0){const T=E.slice(U+1,M);d(U),l(T),x(0),r(!0);return}const P=E[U-1];if(/[\s,.;:!?'"()[\]{}]/.test(P)){const T=E.slice(U+1,M);d(U),l(T),x(0),r(!0);return}r(!1);return}if(!G(E[U])){r(!1);return}}r(!1)},[]),C=i.useCallback(()=>{g.current?.abort(),r(!1),l(""),d(-1),h([]),f([]),x(0),b(!1)},[]),w=i.useCallback(async E=>{if(!E.trim()){h([]),f([]),b(!1);return}g.current?.abort();const M=new AbortController;g.current=M;try{b(!0);const[G,U]=await Promise.allSettled([ov(ty(20,0,n,E),M.signal),ov(mE(E,s,n),M.signal)]);if(M.signal.aborted)return;const P=G.status==="fulfilled"?G.value.slice(0,OB).map(D=>({id:D.id,title:D.title??"",column:D.column})):[],T=U.status==="fulfilled"?U.value.files.slice(0,FB):[];h(P),f(T),x(0)}catch(G){G.name!=="AbortError"&&(h([]),f([]))}finally{M.signal.aborted||b(!1)}},[s,n]);i.useEffect(()=>{if(a)return y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{w(o)},LB),()=>{y.current&&clearTimeout(y.current)}},[o,a,w]);const S=i.useCallback((E,M)=>!a||c<0?M:lv(M,c,`#${E.id}`),[a,c]),R=i.useCallback((E,M)=>!a||c<0?M:lv(M,c,`#${E.path}`),[a,c]),I=i.useCallback((E,M)=>{if(!a||j.length===0)return!1;switch(E.key){case"ArrowDown":return E.preventDefault(),x(G=>Math.min(G+1,j.length-1)),!0;case"ArrowUp":return E.preventDefault(),x(G=>Math.max(G-1,0)),!0;case"Enter":case"Tab":return j[v]?(E.preventDefault(),!0):!1;case"Escape":return E.preventDefault(),C(),!0;default:return!1}},[a,j,v,C]);return{mentionActive:a,tasks:u,files:m,combinedItems:j,loading:p,mentionQuery:o,selectedIndex:v,setSelectedIndex:x,detectMention:N,selectTask:S,selectFile:R,dismissMention:C,handleKeyDown:I}}function aj(e){const[n,s]=i.useState(2),[a,r]=i.useState("."),[o,l]=i.useState(!0),[c,d]=i.useState(!1),[u,h]=i.useState(!1),[m,f]=i.useState(!1),[p,b]=i.useState(!1),[v,x]=i.useState(void 0),[y,g]=i.useState(7200*1e3),[j,N]=i.useState(!1),[C,w]=i.useState(20),[S,R]=i.useState(!1),[I,E]=i.useState(25),[M,G]=i.useState(!1),[U,P]=i.useState(!1),[T,D]=i.useState({}),[W,Y]=i.useState(!1),[L,_]=i.useState(!1),[F,ae]=i.useState(!1),[k,z]=i.useState(!1),[J,oe]=i.useState(!1),[le,we]=i.useState(!0),re=i.useCallback(async()=>{const[O,se]=await Promise.allSettled([ay(e),Md(e)]);if(O.status==="fulfilled"&&(s(O.value.maxConcurrent),r(O.value.rootDir)),se.status==="fulfilled"){const ve=se.value;l(!!ve.autoMerge);const A=ve.testMode===!0,ne=A||ve.defaultProvider?.trim().toLowerCase()==="mock";d(A),h(ne),f(!!ve.globalPause),b(!!ve.enginePaused),G(!!ve.prAuthAvailable),x(ve.taskStuckTimeoutMs),g(ve.staleHighFanoutBlockerAgeThresholdMs??7200*1e3),R(ve.showQuickChatFAB===!0),E(ve.maxTotalRetriesBeforeFail??25),N(ve.capacityRiskBannerEnabled===!0),w(ve.capacityRiskTodoThreshold??20),D(ve.experimentalFeatures??{});const ye=ve.experimentalFeatures??{};Y(ye.insights===!0),_(ye.memoryView===!0),ae(ye.devServerView===!0||ye.devServer===!0),z(ye.todoView===!0),oe(ye.goalsView===!0);const ee=ve.autoReloadOnVersionChange!==!1;we(ee),Yd(ee)}P(!0)},[e]);i.useEffect(()=>{P(!1),D({}),Y(!1),_(!1),ae(!1),z(!1),oe(!1),re()},[re]);const H=i.useCallback(async()=>{const O=!o;l(O);try{await tc({autoMerge:O},e)}catch{l(!O)}},[o,e]),ue=i.useCallback(async()=>{const O=!m;f(O);try{await tc({globalPause:O,globalPauseReason:O?"manual":void 0},e)}catch{f(!O)}},[m,e]),Q=i.useCallback(async()=>{const O=!p;b(O);try{await tc({enginePaused:O},e)}catch{b(!O)}},[p,e]),be=i.useCallback(async()=>{const O=!S;R(O);try{await tc({showQuickChatFAB:O},e)}catch{R(!O)}},[S,e]),fe=i.useCallback(async()=>{const O=!le;we(O),Yd(O);try{await Cs({autoReloadOnVersionChange:O})}catch{we(!O),Yd(!O)}},[le]);return{maxConcurrent:n,rootDir:a,autoMerge:o,testMode:c,isTestMode:u,globalPaused:m,enginePaused:p,taskStuckTimeoutMs:v,staleHighFanoutBlockerAgeThresholdMs:y,capacityRiskBannerEnabled:j,capacityRiskTodoThreshold:C,showQuickChatFAB:S,maxTotalRetriesBeforeFail:I,prAuthAvailable:M,settingsLoaded:U,experimentalFeatures:T,insightsEnabled:W,memoryEnabled:L,devServerEnabled:F,todosEnabled:k,goalsEnabled:J,autoReloadOnVersionChange:le,toggleAutoMerge:H,toggleGlobalPause:ue,toggleEnginePause:Q,toggleShowQuickChatFAB:be,toggleAutoReloadOnVersionChange:fe,refresh:re}}function zc(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function BB(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function pm(e,n){const s=BB(),a=n?.warm===!0,r=zc(),o=new Map;let l=!1,c=!1;return{mark(u){l||c||!s||o.has(u)||o.set(u,zc())},complete:u=>{if(!s||l||c){l=!0;return}l=!0,o.set("complete",zc());const h=Array.from(o.entries()).sort((b,v)=>b[1]-v[1]);let m=r;const f={};for(const[b,v]of h)f[b]=Math.max(0,v-m),m=v;const p=Math.max(0,zc()-r);try{console.debug("[room-open]",{roomId:e,warm:a,totalMs:p,phases:f,...u??{}})}catch{}},cancel(){c=!0,l=!0}}}const Ha="fusion:chat-active-room";class UB extends Error{roomId;constructor(n,s){super(n),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=s}}function xh(e){return[...e].sort((n,s)=>new Date(s.updatedAt).getTime()-new Date(n.updatedAt).getTime())}function lo(e,n){const s=e.findIndex(r=>r.id===n.id);if(s===-1)return xh([n,...e]);const a=[...e];return a[s]=n,xh(a)}function Ea(e){try{return JSON.parse(e.data)}catch{return null}}function HB(e,n,s){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:e,role:"user",content:n,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...s?.length?{attachments:s}:{},createdAt:new Date().toISOString()}}function qB(e,n){const s=`${bn.CHAT_ROOMS}:${e??"global"}`,a=`${bn.ACTIVE_CHAT_ROOM_ID}:${e??"global"}`,r=i.useCallback(T=>`${bn.CHAT_ROOM_MESSAGES_PREFIX}${e??"global"}:${T}`,[e]),o=i.useCallback(T=>`${bn.CHAT_ROOM_MEMBERS_PREFIX}${e??"global"}:${T}`,[e]),[l,c]=i.useState(()=>{const T=ui(s,{maxAgeMs:_r});return Array.isArray(T)?T:[]}),[d,u]=i.useState(()=>l.length===0),[h,m]=i.useState(null),[f,p]=i.useState(()=>{const T=ui(a,{maxAgeMs:th});return T?l.find(D=>D.id===T)??null:null}),[b,v]=i.useState([]),[x,y]=i.useState([]),[g,j]=i.useState(!1),N=i.useRef(l),C=i.useRef(f),w=i.useRef(0),S=i.useRef(e);N.current=l,C.current=f,S.current!==e&&(S.current=e,w.current+=1);const R=i.useCallback(async T=>{if(!T){v([]),y([]),j(!1);return}const D=pm(T.id,{warm:!1});D.mark("select");const W=ui(r(T.id),{maxAgeMs:c4}),Y=ui(o(T.id),{maxAgeMs:_r}),L=Array.isArray(W)&&W.length>0,_=Array.isArray(Y)&&Y.length>0;L||_?(D.mark("cache-hit"),L&&(y(W),D.mark("hydrate")),_&&v(Y),j(!1)):(y([]),j(!0));try{const[F,ae]=await Promise.all([JM(T.id,e),nu(T.id,{limit:100,order:"desc"},e)]);D.mark("members-fetch"),D.mark("messages-fetch"),Wn(o(T.id),F.members,{maxBytes:5e5}),Wn(r(T.id),ae.messages,{maxBytes:5e5}),C.current?.id===T.id&&(v(F.members),y(ae.messages),D.mark("hydrate"))}catch{!L&&!_&&(v([]),y([]))}finally{j(!1),D.complete({warm:L,membersCached:_})}},[o,r,e]),I=i.useCallback(async()=>{N.current.length===0&&u(!0);try{const T=await WM({},e),D=xh(T.rooms);c(D),Wn(s,D,{maxBytes:5e5}),m(null);const W=ui(a,{maxAgeMs:th})??ns(Ha,e);if(W){const Y=D.find(L=>L.id===W)??null;Y?(p(Y),R(Y)):(qi(Ha,e),Wn(a,"",{maxBytes:5e5}))}}catch(T){const D=T instanceof Error?T.message:"Failed to load chat rooms";m(D),n?.(D,"error")}finally{u(!1)}},[a,n,R,e,s]),E=i.useCallback(T=>{if(!T){C.current=null,p(null),qi(Ha,e),Wn(a,"",{maxBytes:5e5}),R(null);return}const D=N.current.find(W=>W.id===T)??null;C.current=D,p(D),D&&(Ns(Ha,D.id,e),Wn(a,D.id,{maxBytes:5e5}),R(D))},[a,R,e]),M=i.useCallback(async T=>{const W=(await GM({name:T.name,memberAgentIds:T.memberAgentIds},e)).room;return c(Y=>lo(Y,W)),C.current=W,p(W),Ns(Ha,W.id,e),Wn(a,W.id,{maxBytes:5e5}),await R(W),W},[a,R,e]),G=i.useCallback(async T=>{await KM(T,e),c(D=>D.filter(W=>W.id!==T)),Wn(r(T),[],{maxBytes:5e5}),Wn(o(T),[],{maxBytes:5e5}),C.current?.id===T&&(C.current=null,p(null),v([]),y([]),qi(Ha,e),Wn(a,"",{maxBytes:5e5}))},[a,o,r,e]),U=i.useCallback(async(T,D)=>{const W=C.current,Y=W?.id;if(!Y)throw new Error("Select a room before sending a message");const L=pm(Y,{warm:!1}),_=D?.files?.map(k=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:k.name,originalName:k.name,mimeType:k.type||"application/octet-stream",size:k.size,createdAt:new Date().toISOString()})),F=HB(Y,T,_?.length?_:D?.attachments);C.current?.id===Y&&y(k=>{const z=[...k,F];return Wn(r(Y),z,{maxBytes:5e5}),z});let ae=!1;try{const k=[];if(D?.files?.length)for(const le of D.files)try{const we=await YM(Y,le,e);k.push(we.attachment)}catch{throw new Error(`Failed to upload attachment: ${le.name}`)}const z=[...D?.attachments??[],...k],J=await QM(Y,{content:T,...z.length?{attachments:z}:{}},e);ae=!0,J.message?.createdAt&&W&&c(le=>lo(le,{...W,updatedAt:J.message.createdAt})),C.current?.id===Y&&y(le=>{const we=le.map(re=>re.id===F.id?J.message:re);return Wn(r(Y),we,{maxBytes:5e5}),we});const oe=await nu(Y,{limit:100,order:"desc"},e);if(Wn(r(Y),oe.messages,{maxBytes:5e5}),C.current?.id!==Y)return;y(oe.messages),L.mark("hydrate")}catch(k){try{const z=await nu(Y,{limit:100,order:"desc"},e);Wn(r(Y),z.messages,{maxBytes:5e5}),C.current?.id===Y&&(y(z.messages),L.mark("hydrate"))}catch{C.current?.id===Y&&y(z=>{const J=z.filter(oe=>oe.id!==F.id);return Wn(r(Y),J,{maxBytes:5e5}),J})}if(ae){const z=k instanceof Error&&k.message.trim()?k.message:"Message delivered, but failed to refresh room replies";throw new UB(z,Y)}throw k}finally{L.complete({source:"send-room-message"})}},[r,e]),P=i.useCallback(async T=>{!T||!N.current.some(D=>D.id===T)||(await ZM(T,e),Wn(r(T),[],{maxBytes:5e5}),C.current?.id===T&&y([]))},[r,e]);return i.useEffect(()=>{I()},[I]),i.useEffect(()=>{const T=w.current,D=e?`/api/events?projectId=${encodeURIComponent(e)}`:"/api/events";return Si(D,{onReconnect:()=>{qs({view:"useChatRooms",trigger:"sse-reconnect",projectId:e,replayAttempted:!1});const W=C.current?.id;if(W){const Y=pm(W,{warm:!0});Y.mark("sse-reconnect-refresh"),I().finally(()=>Y.complete({source:"sse-reconnect"}));return}I()},events:{"chat:room:created":W=>{if(w.current!==T)return;const Y=Ea(W);Y&&c(L=>lo(L,Y))},"chat:room:updated":W=>{if(w.current!==T)return;const Y=Ea(W);Y&&(c(L=>lo(L,Y)),C.current?.id===Y.id&&p(Y))},"chat:room:deleted":W=>{if(w.current!==T)return;const Y=Ea(W);Y?.id&&(c(L=>L.filter(_=>_.id!==Y.id)),Wn(r(Y.id),[],{maxBytes:5e5}),Wn(o(Y.id),[],{maxBytes:5e5}),C.current?.id===Y.id&&(C.current=null,p(null),v([]),y([]),qi(Ha,e),Wn(a,"",{maxBytes:5e5})))},"chat:room:member:added":W=>{if(w.current!==T)return;const Y=Ea(W);!Y||C.current?.id!==Y.roomId||v(L=>{if(L.some(F=>F.agentId===Y.agentId))return L;const _=[...L,Y];return Wn(o(Y.roomId),_,{maxBytes:5e5}),_})},"chat:room:member:removed":W=>{if(w.current!==T)return;const Y=Ea(W);!Y||C.current?.id!==Y.roomId||v(L=>{const _=L.filter(F=>F.agentId!==Y.agentId);return Wn(o(Y.roomId),_,{maxBytes:5e5}),_})},"chat:room:message:added":W=>{if(w.current!==T)return;const Y=Ea(W);Y&&(c(L=>{const _=L.find(F=>F.id===Y.roomId);return _?lo(L,{..._,updatedAt:Y.createdAt}):L}),C.current?.id===Y.roomId&&y(L=>{if(L.some(F=>F.id===Y.id))return L;if(Y.role==="user"){const F=L.findIndex(ae=>ae.role==="user"&&ae.id.startsWith("temp-")&&ae.content.trim()===Y.content.trim());if(F>=0){const ae=[...L];return ae[F]=Y,Wn(r(Y.roomId),ae,{maxBytes:5e5}),ae}}const _=[...L,Y];return Wn(r(Y.roomId),_,{maxBytes:5e5}),_}))},"chat:room:message:updated":W=>{if(w.current!==T)return;const Y=Ea(W);!Y||C.current?.id!==Y.roomId||y(L=>{const _=L.map(F=>F.id===Y.id?Y:F);return Wn(r(Y.roomId),_,{maxBytes:5e5}),_})},"chat:room:message:deleted":W=>{if(w.current!==T)return;const Y=Ea(W);Y?.id&&y(L=>{const _=L.filter(ae=>ae.id!==Y.id),F=C.current?.id;return F&&Wn(r(F),_,{maxBytes:5e5}),_})},"chat:room:messages:cleared":W=>{if(w.current!==T)return;const Y=Ea(W);Y?.roomId&&(Wn(r(Y.roomId),[],{maxBytes:5e5}),C.current?.id===Y.roomId&&y([]),c(L=>{const _=L.find(F=>F.id===Y.roomId);return _?lo(L,{..._,updatedAt:new Date().toISOString()}):L}))}}})},[a,o,r,e,I]),i.useEffect(()=>{f&&(l.some(T=>T.id===f.id)||(C.current=null,p(null),v([]),y([]),qi(Ha,e),Wn(a,"",{maxBytes:5e5})))},[f,a,e,l]),{rooms:l,roomsLoading:d,roomsError:h,activeRoom:f,activeRoomMembers:b,messages:x,messagesLoading:g,selectRoom:E,createRoom:M,deleteRoom:G,sendRoomMessage:U,clearRoom:P,refreshRooms:I}}const ll={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},cv=200;function vh(e){if(!e)return null;const n=new Date(e).getTime();return Number.isFinite(n)?n:null}function rj(e){const n=Object.entries(e);if(n.length<=cv)return e;const s=n.map(([a,r])=>({id:a,timestamp:r,value:vh(r)??0})).sort((a,r)=>r.value-a.value).slice(0,cv);return Object.fromEntries(s.map(({id:a,timestamp:r})=>[a,r]))}function Bc(e){if(!e)return{};try{const n=JSON.parse(e);if(!n||typeof n!="object")return{};const s={};for(const[a,r]of Object.entries(n))typeof a=="string"&&typeof r=="string"&&(s[a]=r);return rj(s)}catch{return{}}}function VB(e){const[n,s]=i.useState(()=>{try{return Bc(ns(ll.direct,e))}catch{return{}}}),[a,r]=i.useState(()=>{try{return Bc(ns(ll.room,e))}catch{return{}}});i.useEffect(()=>{try{s(Bc(ns(ll.direct,e)))}catch{s({})}try{r(Bc(ns(ll.room,e)))}catch{r({})}},[e]);const o=i.useMemo(()=>({direct:n,room:a}),[n,a]),l=i.useCallback((m,f)=>{const p=rj(f);try{Ns(ll[m],JSON.stringify(p),e)}catch{}return p},[e]),c=i.useCallback((m,f)=>{if(m==="direct"){s(p=>l(m,f(p)));return}r(p=>l(m,f(p)))},[l]),d=i.useCallback((m,f,p)=>{const b=vh(p);if(b===null)return!1;const v=o[m][f],x=vh(v);return x===null?!0:b>x},[o]),u=i.useCallback((m,f,p)=>{if(!f)return;const b=p??new Date().toISOString();c(m,v=>({...v,[f]:b}))},[c]),h=i.useCallback((m,f)=>{f.length!==0&&c(m,p=>{const b={...p};for(const v of f)v.id&&(b[v.id]=v.lastActivityAt??new Date().toISOString());return b})},[c]);return{isUnread:d,markRead:u,markAllRead:h}}function WB(e){return`${e.name?.trim()||e.id} (${e.role})`}function cl(e){const n=e.trim(),s=n.indexOf("/");return!n||s<=0||s>=n.length-1?null:{modelProvider:n.slice(0,s),modelId:n.slice(s+1)}}function GB(e,n){return n?e?.name?.trim()?e.name.trim():n.modelId.replace(/[-_]/g," ").replace(/\s+/g," ").replace(/^\w/,s=>s.toUpperCase()).trim():null}function KB(e){return Math.max(40,Math.min(e,640))}function Xc(e,n){return e.length<=n?e:`${e.slice(0,n)}…`}function JB(e){if(!e)return null;const n=Object.entries(e);return n.length===0?null:n.map(([s,a])=>{const r=typeof a=="string"?a:(()=>{try{return JSON.stringify(a)}catch{return String(a)}})();return`${s}=${Xc(r,50)}`}).join(", ")}function YB(e){if(e===void 0)return null;if(typeof e=="string")return Xc(e,200);try{return Xc(JSON.stringify(e),200)}catch{return Xc(String(e),200)}}function oj(e,n=!1){if(!e||e.length===0)return null;const s=(f,p)=>{const b=f.status==="running",v=f.status==="completed"&&f.isError,x=JB(f.args),y=YB(f.result),g=b?x:y?`result: ${y}`:x?`args: ${x}`:null,j=n?null:g,N=b?"running":v?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${b?" chat-tool-call--running":""}${v?" chat-tool-call--error":""}`,open:b,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",title:f.toolName,children:f.toolName}),j&&t.jsx("span",{className:"chat-tool-call-preview",title:j,children:j}),t.jsx("span",{className:"chat-tool-call-status-text",children:N})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[x&&t.jsxs("div",{className:"chat-tool-call-row",children:[t.jsx("span",{className:"chat-tool-call-label",children:"args"}),t.jsx("span",{className:"chat-tool-call-value",children:x})]}),y&&t.jsxs("div",{className:`chat-tool-call-row${v?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:"result"}),t.jsx("span",{className:"chat-tool-call-value",children:y})]})]})]},`${f.toolName}-${p}`)},a=`chat-tool-calls${n?" chat-tool-calls--compact":""}`;if(e.length===1)return t.jsxs("div",{className:a,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(Bf,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),s(e[0],0)]});const r=e.filter(f=>f.status==="running").length,o=e.filter(f=>f.status==="completed"&&f.isError).length,l=r>0,c=Array.from(new Set(e.map(f=>f.toolName))),d=c.slice(0,5),u=Math.max(0,c.length-d.length),h=u>0?`${d.join(", ")}, +${u} more`:d.join(", "),m=l?`(${r} running)`:o>0?`(${o} ${o===1?"error":"errors"})`:null;return t.jsx("div",{className:a,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:`chat-tool-calls-group${n?" chat-tool-calls-group--compact":""}`,"data-testid":"chat-tool-calls-group",open:l,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(Bf,{size:12,"aria-hidden":"true"}),t.jsxs("span",{className:"chat-tool-calls-count",children:[e.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:h,children:h}),m&&t.jsx("span",{className:"chat-tool-calls-group-status",children:m})]}),e.map((f,p)=>s(f,p))]})})}const lj={p:({children:e,...n})=>t.jsx("p",{...n,children:ai(e)}),li:({children:e,...n})=>t.jsx("li",{...n,children:ai(e)}),pre:({children:e,...n})=>t.jsx("pre",{...n,className:"quick-chat-markdown-pre",children:e}),table:({children:e,...n})=>t.jsx("table",{...n,className:"quick-chat-markdown-table",children:e})};function dv(e){const n=/(^|[\s])\/([^\s]*)$/.exec(e);if(!n)return null;const s=n[1]??"",a=n[2]??"",r=n.index+s.length;return{filter:a,start:r,end:e.length}}function XB(e,n){const s=e.slice(0,n),a=/(^|[\s])@([\w-]*)$/.exec(s);if(!a)return null;const r=a[2]??"",o=s.length-r.length-1;return{filter:r,start:o,end:n}}const Uc={width:320,height:400},QB=new Set(["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/x-log","text/csv","application/xml","text/markdown"]),ZB=[".png",".jpg",".jpeg",".gif",".webp",".txt",".json",".yaml",".yml",".log",".csv",".xml",".md"];function e8(e){return e.type.startsWith("image/")}function t8(e){if(QB.has(e.type))return!0;const n=e.name.toLowerCase();return ZB.some(s=>n.endsWith(s))}const co={width:280,height:260},hi=768,uo=8;function n8(e,n){const s=i.useCallback(()=>{if(typeof window>"u")return 0;const N=getComputedStyle(document.documentElement).getPropertyValue("--executor-footer-height").trim();return N&&parseFloat(N)||0},[]),a=i.useCallback(()=>typeof window<"u"&&window.innerWidth<=768?{x:4,y:4+s()}:{x:24,y:24+s()},[s]),[r,o]=i.useState(()=>{if(typeof window>"u")return a();const N=`fusion-quick-chat-position-${e||"default"}`;try{const C=localStorage.getItem(N);if(C){const w=JSON.parse(C);if(typeof w.x=="number"&&typeof w.y=="number"&&!isNaN(w.x)&&!isNaN(w.y))return w}}catch{}return a()}),[l,c]=i.useState(!1),d=i.useRef(null),u=i.useRef(r),h=i.useRef(null),m=i.useRef(null),f=n??i.useRef(!1);i.useEffect(()=>{u.current=r},[r]);const p=i.useCallback(N=>{if(typeof window>"u")return N;const C=48,w=window.innerWidth<=768?4:8,S=window.innerWidth<=768?44:0,R=window.innerWidth>768?s():0,I=window.innerWidth-C-w,E=window.innerHeight-C-w-S-R;return{x:Math.max(w,Math.min(I,N.x)),y:Math.max(w,Math.min(E,N.y))}},[s]),b=i.useCallback(N=>{if(typeof window>"u")return;const C=`fusion-quick-chat-position-${e||"default"}`;try{localStorage.setItem(C,JSON.stringify(N))}catch{}},[e]),v=i.useCallback(()=>{if(!d.current)return;const N=m.current,C=h.current;N&&C!==null&&typeof N.releasePointerCapture=="function"&&N.releasePointerCapture(C),d.current=null,h.current=null,m.current=null,c(!1),document.body.style.userSelect="",f.current&&b(u.current),document.removeEventListener("pointermove",x),document.removeEventListener("pointerup",y),document.removeEventListener("pointercancel",g)},[b]),x=i.useCallback(N=>{if(!d.current||h.current!==null&&N.pointerId!==h.current)return;const C=N.clientX-d.current.pointerX,w=N.clientY-d.current.pointerY;if((Math.abs(C)>=5||Math.abs(w)>=5)&&(f.current=!0),!f.current)return;const S=d.current.x-C,R=d.current.y-w,I=p({x:S,y:R});u.current=I,o(I)},[p]),y=i.useCallback(N=>{h.current!==null&&N.pointerId!==h.current||v()},[v]),g=i.useCallback(N=>{h.current!==null&&N.pointerId!==h.current||v()},[v]),j=i.useCallback(N=>{if(N.button!==0&&N.pointerType==="mouse")return;const C=N.currentTarget;N.preventDefault(),typeof C.setPointerCapture=="function"&&C.setPointerCapture(N.pointerId);const w=u.current;d.current={x:w.x,y:w.y,pointerX:N.clientX,pointerY:N.clientY},h.current=N.pointerId,m.current=C,f.current=!1,c(!0),document.body.style.userSelect="none",document.addEventListener("pointermove",x,{passive:!0}),document.addEventListener("pointerup",y),document.addEventListener("pointercancel",g)},[g,x,y]);return i.useEffect(()=>()=>{document.removeEventListener("pointermove",x),document.removeEventListener("pointerup",y),document.removeEventListener("pointercancel",g),document.body.style.userSelect=""},[g,x,y]),{position:r,isDragging:l,handlePointerDown:j}}function s8(e,n,s){const a=`fusion:quick-chat-size-${e||"default"}`,r=i.useCallback(()=>typeof window<"u"&&window.innerWidth>hi,[]),o=i.useCallback((f,p,b)=>{if(typeof window>"u")return f;const v=Math.max(co.width,window.innerWidth-p-uo),x=Math.max(co.height,window.innerHeight-b-uo);return{width:Math.max(co.width,Math.min(v,f.width)),height:Math.max(co.height,Math.min(x,f.height))}},[]),l=i.useCallback(()=>{if(typeof window>"u"||window.innerWidth<=hi)return Uc;try{const f=localStorage.getItem(a);if(!f)return Uc;const p=JSON.parse(f);return typeof p.width!="number"||typeof p.height!="number"?Uc:{width:p.width,height:p.height}}catch{return Uc}},[a]),[c,d]=i.useState(l),[u,h]=i.useState({right:0,bottom:0});i.useEffect(()=>{if(!r())return;const f={right:n+u.right,bottom:s+u.bottom};d(p=>o(p,f.right,f.bottom))},[o,r,n,s,u]),i.useEffect(()=>{if(r())try{localStorage.setItem(a,JSON.stringify(c))}catch{}},[r,c,a]);const m=i.useCallback(f=>{if(!r())return;const p=f.currentTarget.dataset.resizeDirection;if(!p)return;f.preventDefault(),f.stopPropagation();const b=f.currentTarget;typeof b.setPointerCapture=="function"&&b.setPointerCapture(f.pointerId);const v={pointerX:f.clientX,pointerY:f.clientY,width:c.width,height:c.height,anchorRight:u.right,anchorBottom:u.bottom};document.body.style.userSelect="none";const x=g=>{const j=g.clientX-v.pointerX,N=g.clientY-v.pointerY;let C=v.width,w=v.height,S=v.anchorRight,R=v.anchorBottom;if(p.includes("w")&&(C=v.width-j),p.includes("e")){const P=j;C=v.width+P,S=v.anchorRight-P}if(p.includes("n")&&(w=v.height-N),p.includes("s")){const P=N;w=v.height+P,R=v.anchorBottom-P}const I=n+S,E=s+R,M=o({width:C,height:w},I,E),G=Math.max(uo-n,Math.min(window.innerWidth-n-co.width-uo,S)),U=Math.max(uo-s,Math.min(window.innerHeight-s-co.height-uo,R));d(M),h({right:G,bottom:U})},y=g=>{typeof b.releasePointerCapture=="function"&&b.releasePointerCapture(g.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",x),document.removeEventListener("pointerup",y);try{localStorage.setItem(a,JSON.stringify({width:c.width,height:c.height}))}catch{}};document.addEventListener("pointermove",x),document.addEventListener("pointerup",y)},[u.bottom,u.right,o,s,n,r,c.height,c.width,a]);return{panelSize:c,anchorOffset:u,handleResizeStart:m}}const gm=i.memo(function({message:n,forcePlain:s,mentionAgentsByName:a,roomContext:r,projectId:o,onToggleRender:l}){const c=n.role==="user",d=i.useMemo(()=>{if(!c)return null;const m=n.content,f=/@([\w-]+)/g,p=[];let b=0,v=f.exec(m);for(;v;){const[x,y=""]=v,g=v.index;g>b&&p.push(m.slice(b,g));const j=y.replace(/_/g," ").toLowerCase(),N=a.get(j);if(N){const C=!!(r&&!r.memberIds.has(N.id)),w=C?`Not a member of ${r?.roomName}`:void 0;p.push(t.jsxs("span",{className:`chat-mention-chip${C?" chat-mention-chip--non-member":""}`,title:w,"aria-label":w,children:["@",N.name.replace(/\s+/g,"_")]},`${N.id}-${g}`))}else p.push(x);b=g+x.length,v=f.exec(m)}return b<m.length&&p.push(m.slice(b)),p.length===0?m:p},[c,n.content,a,r]),u=i.useMemo(()=>c?null:s?t.jsx("div",{className:"quick-chat-message-content quick-chat-message-content--plain",children:zs(n.content)}):t.jsx("div",{className:"quick-chat-message-content quick-chat-message-content--markdown",children:t.jsx(ji,{remarkPlugins:[Ni],components:lj,children:n.content})}),[c,s,n.content]),h=i.useMemo(()=>{if(!n.attachments?.length||!n.roomId)return null;const m=XM(n.roomId,o);return t.jsx("div",{className:"chat-message-attachments",children:n.attachments.map(f=>{const p=`${m}${encodeURIComponent(f.filename)}`,b=f.mimeType.startsWith("image/");return t.jsx("a",{className:"chat-message-attachment",href:p,target:"_blank",rel:"noreferrer","data-testid":"quick-chat-message-attachment",children:b?t.jsx("img",{src:p,alt:f.originalName,className:"chat-attachment-image",loading:"lazy"}):t.jsx("span",{children:f.originalName})},f.id)})})},[n.attachments,n.roomId,o]);return t.jsxs("div",{className:`quick-chat-panel-message ${c?"quick-chat-panel-message--sent":"quick-chat-panel-message--received"}`,"data-testid":`quick-chat-message-${n.id}`,children:[c?t.jsx("p",{children:d}):t.jsxs(t.Fragment,{children:[u,t.jsx("button",{type:"button",className:`quick-chat-message-render-toggle${s?" quick-chat-message-render-toggle--plain":""}`,"data-testid":"quick-chat-message-render-toggle","aria-label":s?"Show rendered markdown":"Show plain text",onClick:()=>l(n.id),children:s?t.jsx(Nh,{size:14}):t.jsx($o,{size:14})})]}),h,oj(n.toolCalls,!0)]})});function i8({projectId:e,addToast:n,showFAB:s=!0,open:a,onOpenChange:r,favoriteProviders:o=[],favoriteModels:l=[],onToggleFavorite:c,onToggleModelFavorite:d,roomContext:u=null}){const{agents:h}=ij(e),{models:m,defaultProvider:f,defaultModelId:p,loading:b}=mf(),{skills:v,loading:x}=PB(e),[y,g]=i.useState(!1),j=a!==void 0,N=j?a:y,C=j?X=>{r?.(typeof X=="function"?X(N):X)}:g,{keyboardOpen:w}=Ia({enabled:N}),S=$i(),R=S==="mobile",[I,E]=i.useState("agent"),[M,G]=i.useState(""),[U,P]=i.useState(!1),[T,D]=i.useState(!1),[W,Y]=i.useState("model"),[L,_]=i.useState(""),[F,ae]=i.useState(""),[k,z]=i.useState(""),[J,oe]=i.useState(""),[le,we]=i.useState(""),[re,H]=i.useState(!1),[ue,Q]=i.useState(""),[be,fe]=i.useState(0),[O,se]=i.useState(""),[ve,A]=i.useState(!1),[ne,ye]=i.useState(0),[ee,ge]=i.useState(-1),[Ne,He]=i.useState(()=>new Set),[Le,de]=i.useState(!1),[Re,Pe]=i.useState([]),[rt,qe]=i.useState(!1),[Xe,At]=i.useState(!1),[,at]=i.useState(!1),[Se,pe]=i.useState({top:0,left:0}),_e=zB({projectId:e}),et=i.useCallback(X=>{if(!X||!_e.mentionActive)return;const $e=X.getBoundingClientRect();pe({top:$e.top-260,left:$e.left+8})},[_e.mentionActive]),Ae=i.useRef(!1),it=i.useRef(!1),xt=i.useRef(!1),Nt=i.useRef(""),Ut=i.useRef(!1),Be=i.useRef(!1),Z=i.useRef(M),Oe=i.useRef(k),ht=i.useRef(0),je=i.useRef(null),mt=i.useRef(null),Et=i.useRef(0),{position:Te,isDragging:xe,handlePointerDown:gt}=n8(e,Ae),_t=Te.y+60,{panelSize:Ft,anchorOffset:Dt,handleResizeStart:nt}=s8(e,Te.x,_t),Wt=typeof window<"u"&&window.innerWidth>hi,{activeSession:Mt,messages:Kt,isStreaming:xn,streamingText:Tn,streamingThinking:Sn,streamingToolCalls:is,sessions:On,sessionsLoading:un,messagesLoading:tn,sendMessage:on,stopStreaming:pn,pendingMessage:mn,clearPendingMessage:Zn,switchSession:In,selectSession:rn,startModelChat:hn,startFreshSession:Pn,refreshSessions:nn,skipNextSessionInitRef:$t}=RB(e,n),{experimentalFeatures:Jt}=aj(),Qt=Jt?.chatRooms===!0,ie=qB(e,n),{isUnread:Fe,markRead:Je}=VB(e),tt=i.useRef(null),Ye=i.useRef(null),vt=i.useRef(null),pt=i.useRef(null),Zt=i.useRef(null),ce=i.useRef(null),Ge=i.useRef([]),Me=i.useRef(!1),Ke=i.useRef(!1),Qe=i.useRef(!1),Lt=i.useRef(null),gn=i.useRef(!1),Bn=i.useRef(!1),wn=i.useRef({isOpen:!1,sessionId:null});i.useEffect(()=>{if(!N||typeof window>"u"||typeof document>"u"||window.innerWidth>hi)return;const X=window.scrollY,$e=document.documentElement,Ue=document.body,Ht={htmlOverflow:$e.style.overflow,bodyOverflow:Ue.style.overflow};return window.scrollTo(0,0),$e.style.overflow="hidden",Ue.style.overflow="hidden",()=>{$e.style.overflow=Ht.htmlOverflow,Ue.style.overflow=Ht.bodyOverflow,window.scrollTo(0,X)}},[N]),i.useLayoutEffect(()=>{if(!N||typeof window>"u"||!window.visualViewport)return;const X=tt.current;if(!X)return;const $e=window.visualViewport,Ue=()=>{gn.current||(X.style.setProperty("--vv-height",`${$e.height}px`),X.style.setProperty("--vv-offset-top",`${$e.offsetTop||0}px`))};return Ue(),$e.addEventListener("resize",Ue),$e.addEventListener("scroll",Ue),()=>{$e.removeEventListener("resize",Ue),$e.removeEventListener("scroll",Ue)}},[N]);const Yt=k||J,$n=i.useMemo(()=>cl(Yt),[Yt]),dn=i.useMemo(()=>I==="model"&&Mt?.modelProvider&&Mt?.modelId?`${Mt.modelProvider}/${Mt.modelId}`:Yt,[Mt?.modelId,Mt?.modelProvider,I,Yt]),me=i.useMemo(()=>cl(dn),[dn]),jt=i.useMemo(()=>m.find(X=>`${X.provider}/${X.id}`===dn)??null,[dn,m]),Cn=i.useMemo(()=>GB(jt,me),[jt,me]),bs=i.useMemo(()=>I==="model"?$n?`${xr}::${$n.modelProvider}/${$n.modelId}`:"":M?`${M}::`:"",[I,M,$n]),Ts=I==="agent"?!!M:!!$n,kn=Qt&&!!ie.activeRoom,ls=i.useMemo(()=>kn?ie.messages.map(X=>({id:X.id,sessionId:X.roomId,roomId:X.roomId,role:X.role,content:X.content,thinkingOutput:X.thinkingOutput,toolCalls:void 0,attachments:X.attachments,createdAt:X.createdAt})):Kt,[Kt,kn,ie.messages]),cs=kn?!1:!Ts||!Mt,ys=le.trim().length===0&&Re.length===0||!kn&&!Ts||!kn&&!Mt,xs=i.useMemo(()=>!!M&&On.some(X=>!X.modelProvider&&!X.modelId&&X.agentId===M),[M,On]);i.useEffect(()=>{Z.current=M},[M]),i.useEffect(()=>{Oe.current=k},[k]),i.useEffect(()=>{if(h.length===0){G(""),E("model");return}if(Ut.current&&xs)return;h.some($e=>$e.id===M)||G(h[0]?.id??"")},[h,xs,M]),i.useEffect(()=>{if(N&&(it.current||(it.current=!0,xt.current=!1),!(b||!it.current||xt.current))){if(!Oe.current&&m.length>0){if(f&&p){const $e=`${f}/${p}`;if(m.some(Ht=>`${Ht.provider}/${Ht.id}`===$e)){oe($e),Oe.current||z($e),Ut.current||E("model"),xt.current=!0;return}}oe("");const X=m[0];X&&!Oe.current&&z(`${X.provider}/${X.id}`)}xt.current=!0}},[p,f,N,m,b]),i.useEffect(()=>{N&&nn()},[N,nn]),i.useEffect(()=>{if(!N||un||Ut.current||On.length===0)return;const X=On.filter(Ht=>Ht.status!=="archived"),$e=Ht=>{if(!Ht)return 0;const cn=Date.parse(Ht);return Number.isFinite(cn)?cn:0},Ue=[...X].sort((Ht,cn)=>{const Un=Math.max($e(Ht.lastMessageAt),$e(Ht.updatedAt));return Math.max($e(cn.lastMessageAt),$e(cn.updatedAt))-Un})[0];Ue?(Ue.modelProvider&&Ue.modelId?(E("model"),z(`${Ue.modelProvider}/${Ue.modelId}`)):(E("agent"),G(Ue.agentId)),Be.current=!0,rn(Ue)):Be.current=!1,Ut.current=!0},[N,rn,On,un]),i.useEffect(()=>{if(!N){Nt.current="";return}if(!Ut.current&&On.length===0&&it.current&&!xt.current)return;if(!bs){Nt.current="";return}if($t.current){Nt.current=bs;return}const $e=bs===Nt.current&&!Mt&&!un;if(Be.current){Be.current=!1,Nt.current=bs;return}if(!(bs===Nt.current&&!$e)){if(Nt.current=bs,I==="model"&&$n){hn($n.modelProvider,$n.modelId);return}I==="agent"&&M&&In(M)}},[N,I,$n,M,bs,Mt,un,hn,In,$t]),i.useEffect(()=>{N||(Ut.current=!1,Be.current=!1,A(!1),se(""),ge(-1),H(!1),Q(""),fe(0),Ge.current.forEach(X=>{X.previewUrl&&URL.revokeObjectURL(X.previewUrl)}),Pe([]))},[N]),i.useEffect(()=>{Ge.current=Re},[Re]),i.useEffect(()=>{if(!N){Me.current=!1;return}typeof window>"u"||(Me.current=window.innerWidth<=hi)},[N]),i.useEffect(()=>{if(!N||cs||!Me.current)return;const X=pt.current;if(!X)return;const $e=document.activeElement,Ue=$e?tt.current?.contains($e):!1,Ht=$e===document.body,cn=$e===Lt.current;if(!Ue&&!Ht&&!cn){Me.current=!1;return}if(cn){X.focus({preventScroll:!0}),Me.current=!1;return}const Un=requestAnimationFrame(()=>{X.focus(),Me.current=!1});return()=>cancelAnimationFrame(Un)},[N,cs]),i.useEffect(()=>()=>{Ge.current.forEach(X=>{X.previewUrl&&URL.revokeObjectURL(X.previewUrl)})},[]);const he=i.useCallback(()=>{P(!0),Y("model"),_(h[0]?.id??""),ae(k||J||"")},[h,J,k]),bt=i.useMemo(()=>h.find(X=>X.id===M)??null,[h,M]),ot=i.useMemo(()=>{const X=ue.trim().toLowerCase();return(X?v.filter(Ue=>Ue.name.toLowerCase().includes(X)):v).slice(0,10)},[v,ue]),St=i.useMemo(()=>{const X=h.filter(Ht=>nj(Ht.name,O));if(!u)return X;const $e=X.filter(Ht=>u.memberIds.has(Ht.id));if(O.trim().length===0)return $e;const Ue=X.filter(Ht=>!u.memberIds.has(Ht.id));return[...$e,...Ue]},[h,O,u]),lt=i.useMemo(()=>{const X=new Map;for(const $e of h)X.set($e.name.toLowerCase(),$e);return X},[h]);i.useEffect(()=>{fe(0)},[ot]),i.useEffect(()=>{ye(0)},[O,ve]),i.useEffect(()=>()=>{je.current!==null&&(window.clearTimeout(je.current),je.current=null),mt.current!==null&&(window.clearTimeout(mt.current),mt.current=null)},[]),i.useEffect(()=>{if(!N)return;const X=Ue=>{const Ht=Ue.target;tt.current?.contains(Ht)||Ye.current?.contains(Ht)||Ht.closest(".model-combobox-dropdown--portal")||C(!1)},$e=Ue=>{Ue.key==="Escape"&&C(!1)};return document.addEventListener("mousedown",X),document.addEventListener("keydown",$e),()=>{document.removeEventListener("mousedown",X),document.removeEventListener("keydown",$e)}},[N,C]);const Tt=i.useCallback(()=>{const X=vt.current;if(!X)return;const Ue=X.scrollTop+X.clientHeight>=X.scrollHeight-50;At(!Ue),Bn.current=!Ue},[]),Xt=i.useCallback(X=>{if(!X.isConnected)return;let $e=0,Ue=0,Ht=-1;const cn=6,Un=()=>{if(X.isConnected){if(X.scrollTop=X.scrollHeight,X.scrollHeight===Ht?Ue+=1:(Ue=0,Ht=X.scrollHeight),$e+=1,$e>=cn||Ue>=2){At(!1),Bn.current=!1;return}window.requestAnimationFrame(Un)}};Un()},[]),zt=i.useCallback(()=>{const X=vt.current;X&&Xt(X)},[Xt]);i.useLayoutEffect(()=>{const X=kn?ie.activeRoom?.id??null:Mt?.id??null,$e=wn.current;if(wn.current={isOpen:N,sessionId:X},!N||!X)return;const Ue=!$e.isOpen&&N,Ht=$e.isOpen&&$e.sessionId!==X;if(!Ue&&!Ht)return;const cn=vt.current;cn&&Xt(cn)},[N,Mt?.id,Xt,kn,ie.activeRoom?.id]),i.useEffect(()=>{if(!R||!N||!Mt)return;const X=()=>{const Ue=vt.current;Ue&&Xt(Ue)},$e=()=>{document.visibilityState==="visible"&&X()};return document.addEventListener("visibilitychange",$e),window.addEventListener("pageshow",X),()=>{document.removeEventListener("visibilitychange",$e),window.removeEventListener("pageshow",X)}},[R,N,Mt,Xt]),i.useEffect(()=>{N&&(Bn.current||zt())},[ls,Tn,Sn,xn,N,kn,zt]),i.useEffect(()=>{Mt?.id&&Je("direct",Mt.id,Mt.lastMessageAt??Mt.updatedAt)},[Mt?.id,Mt?.lastMessageAt,Mt?.updatedAt,Je]),i.useEffect(()=>{ie.activeRoom?.id&&Je("room",ie.activeRoom.id,ie.activeRoom.updatedAt)},[Je,ie.activeRoom?.id,ie.activeRoom?.updatedAt]),i.useEffect(()=>{if(N){if(ie.activeRoom?.id){Je("room",ie.activeRoom.id,ie.activeRoom.updatedAt);return}Mt?.id&&Je("direct",Mt.id,Mt.lastMessageAt??Mt.updatedAt)}},[Mt?.id,Mt?.lastMessageAt,Mt?.updatedAt,N,Je,ie.activeRoom?.id,ie.activeRoom?.updatedAt]),i.useEffect(()=>{if(!xn){if(ie.activeRoom?.id&&ie.messages.length>0){const X=ie.messages[ie.messages.length-1];Je("room",ie.activeRoom.id,X?.createdAt??ie.activeRoom.updatedAt);return}if(Mt?.id&&Kt.length>0){const X=Kt[Kt.length-1];Je("direct",Mt.id,X?.createdAt??Mt.lastMessageAt??Mt.updatedAt)}}},[Mt?.id,Mt?.lastMessageAt,Mt?.updatedAt,xn,Je,Kt,ie.activeRoom?.id,ie.activeRoom?.updatedAt,ie.messages]);const Ee=i.useMemo(()=>{const X=new Map(h.map(Ue=>[Ue.id,Ue.name?.trim()||Ue.id])),$e=new Map(m.map(Ue=>[`${Ue.provider}/${Ue.id}`,Ue.name?.trim()||""]));return On.map((Ue,Ht)=>{const cn=Ue.title?.trim()||`Session ${Ht+1}`;let Un=null;if(Ue.agentId&&Ue.agentId!==xr)Un=X.get(Ue.agentId)||Ue.agentId;else if(Ue.modelProvider&&Ue.modelId){const as=`${Ue.modelProvider}/${Ue.modelId}`,$s=$e.get(as);Un=$s?`${$s} [${as}]`:as}return{id:Ue.id,label:Un?`${cn} — ${Un}`:cn}})},[h,m,On]),yt=i.useMemo(()=>Qt?ie.rooms:[],[Qt,ie.rooms]),Rt=Qt&&yt.length>0,yn=i.useMemo(()=>{if(Rt&&kn&&ie.activeRoom)return`#${ie.activeRoom.name}`;const X=Ee.find($e=>$e.id===Mt?.id);return X?X.label:un?"Loading sessions…":"Select a session"},[Mt?.id,kn,ie.activeRoom,Ee,un,Rt]);i.useEffect(()=>{N||D(!1)},[N]),i.useEffect(()=>{if(!T)return;const X=Ue=>{const Ht=Ue.target;Zt.current?.contains(Ht)||D(!1)},$e=Ue=>{Ue.key==="Escape"&&D(!1)};return document.addEventListener("mousedown",X),document.addEventListener("keydown",$e),()=>{document.removeEventListener("mousedown",X),document.removeEventListener("keydown",$e)}},[T]);const _n=i.useMemo(()=>kn&&ie.activeRoom?`Message #${ie.activeRoom.name}`:I==="agent"?bt?`Message ${bt.name||bt.id}`:"Select an agent to start chatting":Cn?`Message ${Cn}`:"Select a model to start chatting",[I,kn,ie.activeRoom?.name,bt,Cn]),Dn=i.useCallback(X=>{const $e=On.find(Ue=>Ue.id===X);if($e){if(kn&&ie.selectRoom(null),Je("direct",$e.id,$e.lastMessageAt??$e.updatedAt),Ut.current=!0,$e.modelProvider&&$e.modelId){const Ue=`${xr}::${$e.modelProvider}/${$e.modelId}`;Be.current=!0,Nt.current=Ue,E("model"),z(`${$e.modelProvider}/${$e.modelId}`)}else{const Ue=`${$e.agentId}::`;Be.current=!0,Nt.current=Ue,E("agent"),G($e.agentId)}rn($e),D(!1)}},[Je,kn,ie,rn,On]),an=i.useCallback(X=>{const $e=ie.rooms.find(Ue=>Ue.id===X);Je("room",X,$e?.updatedAt),ie.selectRoom(X),Ut.current=!0,D(!1)},[Je,ie]),En=i.useCallback(async()=>{if(!un){if(Ut.current=!0,W==="agent"){if(!L)return;E("agent"),G(L),await Pn(L)}else{const X=cl(F||k||J);if(!X)return;E("model"),z(`${X.modelProvider}/${X.modelId}`),await Pn(xr,X.modelProvider,X.modelId)}await nn(),P(!1),Y("model")}},[J,L,W,F,nn,k,un,Pn]),ws=mn.length>50?`${mn.slice(0,50)}…`:mn,Is=i.useCallback(X=>{if(!X||X.length===0)return;const $e=[];for(let Ue=0;Ue<X.length;Ue+=1){const Ht=X[Ue];t8(Ht)&&$e.push({file:Ht,previewUrl:e8(Ht)?URL.createObjectURL(Ht):""})}$e.length>0&&Pe(Ue=>[...Ue,...$e])},[]),ks=i.useCallback(X=>{Pe($e=>{const Ue=$e[X];return Ue?.previewUrl&&URL.revokeObjectURL(Ue.previewUrl),$e.filter((Ht,cn)=>cn!==X)})},[]),V=i.useCallback(X=>{Is(X.clipboardData?.files)},[Is]),We=i.useCallback(()=>{if(typeof window>"u"||window.innerWidth>hi)return;const X=pt.current;!X||X.disabled||X.focus({preventScroll:!0})},[]),wt=i.useCallback(()=>{typeof window>"u"||window.innerWidth>hi||(Qe.current=!0)},[]),ut=i.useCallback(async()=>{const X=le.trim(),$e=Ge.current;if(!(!X&&$e.length===0)&&!cs){if(we(""),A(!1),se(""),ge(-1),X==="/help"){de(!0),We(),Qe.current=!1;return}if(X==="/clear"||X==="/new"){$e.forEach(Ue=>{Ue.previewUrl&&URL.revokeObjectURL(Ue.previewUrl)}),Pe(Ue=>Ue.filter(Ht=>!$e.includes(Ht)));try{if(kn&&ie.activeRoom?.id)await ie.clearRoom(ie.activeRoom.id),de(!1);else if(I==="model"){Zn(),pn();const Ue=cl(Yt);if(!Ue)return;await Pn(xr,Ue.modelProvider,Ue.modelId)}else M&&(Zn(),pn(),await Pn(M))}catch{n("Failed to clear conversation","error")}finally{We(),Qe.current=!1}return}try{de(!1),Qt&&ie.activeRoom?await ie.sendRoomMessage(X,{files:$e.map(Ue=>Ue.file)}):await on(X,$e.map(Ue=>Ue.file)),$e.forEach(Ue=>{Ue.previewUrl&&URL.revokeObjectURL(Ue.previewUrl)}),Pe(Ue=>Ue.filter(Ht=>!$e.includes(Ht)))}catch(Ue){const Ht=Ue instanceof Error&&Ue.message.trim()?Ue.message:Qt&&ie.activeRoom?"Failed to send room message":"Failed to send message";n(Ht,"error")}finally{We(),Qe.current=!1}}},[n,I,Qt,Zn,We,cs,le,Yt,kn,ie,M,on,Pn,pn]),Bt=i.useCallback(X=>{X.preventDefault(),Et.current+=1,qe(!0)},[]),en=i.useCallback(X=>{X.preventDefault(),X.dataTransfer.dropEffect="copy",qe(!0)},[]),jn=i.useCallback(X=>{X.preventDefault(),Et.current=Math.max(0,Et.current-1),Et.current===0&&qe(!1)},[]),ts=i.useCallback(X=>{X.preventDefault(),Et.current=0,qe(!1),Is(X.dataTransfer?.files)},[Is]),vs=i.useCallback((X,$e)=>{const Ue=XB(X,$e);if(Ue){A(!0),se(Ue.filter),ge(Ue.start);return}A(!1),se(""),ge(-1)},[]),Ps=i.useCallback((X=pt.current)=>{X&&(X.style.height="auto",X.style.height=`${KB(X.scrollHeight)}px`)},[]),te=i.useCallback(X=>{we($e=>{const Ue=dv($e);if(!Ue)return $e;const Ht=`/skill:${X.name} `,cn=$e.slice(0,Ue.start)+Ht+$e.slice(Ue.end);return window.requestAnimationFrame(()=>{pt.current&&(Ps(pt.current),pt.current.focus())}),cn}),H(!1),Q(""),fe(0)},[Ps]),Ie=i.useCallback(X=>{const $e=pt.current;if(!$e||ee<0)return;const Ue=$e.selectionStart??ht.current,Ht=$e.selectionEnd??Ue,cn=Math.max(Ue,Ht),Un=Math.min(ee,cn),$s=`${`@${X.name.replace(/\s+/g,"_")}`} `,Fs=le.slice(0,Un)+$s+le.slice(cn),js=Un+$s.length;we(Fs),A(!1),se(""),ye(0),ge(-1),window.requestAnimationFrame(()=>{pt.current&&(Ps(pt.current),pt.current.focus(),pt.current.setSelectionRange(js,js))})},[ee,le,Ps]),ft=i.useCallback((X,$e)=>{const Ht=pt.current?.selectionStart??ht.current,cn=le.lastIndexOf("#",Ht),Un=cn>=0?cn+$e.length:X.length;we(X),_e.dismissMention(),at(!1),window.requestAnimationFrame(()=>{pt.current&&(Ps(pt.current),pt.current.focus(),pt.current.setSelectionRange(Un,Un))})},[_e,le,Ps]),Vt=i.useCallback(X=>{const $e=X.target.value,Ue=X.target.selectionStart??$e.length;Ps(X.target),ht.current=Ue,we($e),Le&&$e.trim().length>0&&de(!1),vs($e,Ue);const Ht=dv($e);Ht?(H(!0),Q(Ht.filter)):(H(!1),Q("")),_e.detectMention($e,Ue),at(_e.mentionActive),_e.mentionActive&&et(X.target)},[_e,Le,Ps,et,vs]);i.useLayoutEffect(()=>{Ps()},[le,Ps]);const qt=i.useCallback(()=>{if(Qe.current){window.requestAnimationFrame(()=>{We()});return}typeof window<"u"&&window.innerWidth<=hi&&tt.current&&(gn.current=!0,tt.current.style.removeProperty("--vv-height"),tt.current.style.removeProperty("--vv-offset-top"),window.setTimeout(()=>{gn.current=!1},450)),je.current!==null&&window.clearTimeout(je.current),je.current=window.setTimeout(()=>{A(!1),se(""),ge(-1),at(!1),_e.dismissMention(),je.current=null},120),mt.current!==null&&window.clearTimeout(mt.current),mt.current=window.setTimeout(()=>{H(!1),mt.current=null},120)},[_e,We]),ln=i.useCallback(()=>{gn.current=!1,je.current!==null&&(window.clearTimeout(je.current),je.current=null),mt.current!==null&&(window.clearTimeout(mt.current),mt.current=null)},[]),Mn=i.useCallback(X=>{const $e=X.currentTarget,Ue=$e.selectionStart??$e.value.length;ht.current=Ue,vs($e.value,Ue),_e.detectMention($e.value,Ue),at(_e.mentionActive),_e.mentionActive&&et($e)},[vs,_e,et]),Rn=i.useCallback(X=>{X.key!=="Escape"&&Mn(X)},[Mn]),Kn=i.useCallback(X=>{He($e=>{const Ue=new Set($e);return Ue.has(X)?Ue.delete(X):Ue.add(X),Ue})},[]),ds=i.useCallback((X,$e=!1)=>$e?t.jsx("div",{className:"quick-chat-message-content quick-chat-message-content--plain",children:zs(X)}):t.jsx("div",{className:"quick-chat-message-content quick-chat-message-content--markdown",children:t.jsx(ji,{remarkPlugins:[Ni],components:lj,children:X})}),[]),Jn=i.useCallback(X=>{if(ht.current=X.currentTarget.selectionStart??ht.current,_e.mentionActive&&_e.combinedItems.length>0){if(_e.handleKeyDown(X,le),X.key==="Enter"||X.key==="Tab"){const $e=_e.combinedItems[_e.selectedIndex];$e?.kind==="task"?ft(_e.selectTask($e.task,le),`#${$e.task.id}`):$e?.kind==="file"&&ft(_e.selectFile($e.file,le),`#${$e.file.path}`)}return}if(ve&&X.key==="ArrowDown"){X.preventDefault(),St.length>0&&ye($e=>($e+1)%St.length);return}if(ve&&X.key==="ArrowUp"){X.preventDefault(),St.length>0&&ye($e=>$e===0?St.length-1:$e-1);return}if(ve&&X.key==="Enter"){X.preventDefault();const $e=St[ne]??St[0];$e&&Ie($e);return}if(ve&&X.key==="Escape"){X.preventDefault(),X.stopPropagation(),A(!1),se(""),ge(-1);return}if(re&&ot.length>0&&X.key==="ArrowDown"){X.preventDefault(),fe($e=>($e+1)%ot.length);return}if(re&&ot.length>0&&X.key==="ArrowUp"){X.preventDefault(),fe($e=>$e===0?ot.length-1:$e-1);return}if(re&&(X.key==="Enter"||X.key==="Tab")){X.preventDefault();const $e=ot[be]??ot[0];$e&&te($e);return}if(re&&X.key==="Escape"){X.preventDefault(),H(!1),Q("");return}X.key!=="Enter"||X.shiftKey||(X.preventDefault(),ut())},[ve,St,ne,Ie,ut,_e,ft,le,re,ot,be,te]),Us=i.useCallback(()=>{if(Ae.current){Ae.current=!1;return}if(N){C(!1);return}typeof window<"u"&&window.innerWidth<=hi&&Lt.current?.focus({preventScroll:!0}),C(!0)},[N,C]);return t.jsxs(t.Fragment,{children:[t.jsx("input",{ref:Lt,type:"text",className:"quick-chat-stealth-input","aria-hidden":"true",tabIndex:-1}),s&&t.jsx("button",{ref:Ye,type:"button",className:"quick-chat-fab","aria-label":"Open quick chat","data-testid":"quick-chat-fab","data-dragging":xe?"true":"false",style:{right:Te.x,bottom:Te.y},onPointerDown:gt,onClick:Us,children:t.jsx(fa,{size:24})}),N&&t.jsxs("div",{className:`quick-chat-panel${R&&w?" quick-chat-panel--keyboard-open":""}`,ref:tt,"data-testid":"quick-chat-panel",style:{...Wt?{right:Te.x+Dt.right,bottom:_t+Dt.bottom,width:Ft.width,height:Ft.height}:{}},children:[Wt&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"n","data-testid":"quick-chat-resize-n",onPointerDown:nt,role:"separator","aria-orientation":"horizontal","aria-label":"Resize panel from top"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"s","data-testid":"quick-chat-resize-s",onPointerDown:nt,role:"separator","aria-orientation":"horizontal","aria-label":"Resize panel from bottom"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"e","data-testid":"quick-chat-resize-e",onPointerDown:nt,role:"separator","aria-orientation":"vertical","aria-label":"Resize panel from right"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"w","data-testid":"quick-chat-resize-w",onPointerDown:nt,role:"separator","aria-orientation":"vertical","aria-label":"Resize panel from left"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"nw","data-testid":"quick-chat-resize-nw",onPointerDown:nt,role:"separator","aria-label":"Resize panel from top-left corner"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"ne","data-testid":"quick-chat-resize-ne",onPointerDown:nt,role:"separator","aria-label":"Resize panel from top-right corner"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"sw","data-testid":"quick-chat-resize-sw",onPointerDown:nt,role:"separator","aria-label":"Resize panel from bottom-left corner"}),t.jsx("div",{className:"quick-chat-resize-handle","data-resize-direction":"se","data-testid":"quick-chat-resize-se",onPointerDown:nt,role:"separator","aria-label":"Resize panel from bottom-right corner"})]}),t.jsxs("div",{className:"quick-chat-panel-header",children:[t.jsxs("div",{className:"quick-chat-panel-title-wrap",children:[t.jsx("h3",{children:"Quick Chat"}),kn&&ie.activeRoom?t.jsxs("span",{className:"quick-chat-model-tag","data-testid":"quick-chat-room-tag",title:`#${ie.activeRoom.name}`,children:["#",ie.activeRoom.name]}):I==="model"&&Cn&&(()=>{const X=jt?.provider??me?.modelProvider??"";return S==="mobile"&&Cn.length>12&&X?t.jsx("span",{className:"quick-chat-model-tag quick-chat-model-tag--icon","data-testid":"quick-chat-model-tag",title:Cn,"aria-label":Cn,children:t.jsx(rs,{provider:X,size:"sm"})}):t.jsx("span",{className:"quick-chat-model-tag","data-testid":"quick-chat-model-tag",title:Cn,children:Cn})})()]}),t.jsxs("div",{className:"quick-chat-panel-header-actions",children:[t.jsx("button",{type:"button",className:"btn-icon quick-chat-new-chat-btn","data-testid":"quick-chat-new-thread","aria-label":"Start a new chat",onClick:he,disabled:un,children:t.jsx(os,{size:16})}),t.jsx("button",{type:"button",className:"btn-icon","aria-label":"Close quick chat","data-testid":"quick-chat-close",onClick:()=>C(!1),children:t.jsx(Nn,{size:16})})]})]}),t.jsx("div",{className:"quick-chat-panel-agent-select","data-testid":"quick-chat-session-select",children:t.jsxs("div",{className:"quick-chat-session-menu",ref:Zt,children:[t.jsx("label",{htmlFor:"quick-chat-session-dropdown-trigger",className:"visually-hidden",children:"Select session"}),t.jsx("input",{type:"hidden","data-testid":"quick-chat-session-dropdown",value:Rt&&kn?"":Mt?.id??"",readOnly:!0}),t.jsxs("button",{id:"quick-chat-session-dropdown-trigger",type:"button",className:"btn quick-chat-session-trigger","aria-haspopup":"menu","aria-expanded":T,"data-testid":"quick-chat-session-dropdown-trigger",onClick:()=>D(X=>!X),children:[kn&&ie.activeRoom?t.jsx(Uv,{size:16,"aria-hidden":"true"}):Mt?.modelProvider?t.jsx(rs,{provider:Mt.modelProvider,size:"sm"}):t.jsx(fa,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:yn}),t.jsx(Ln,{size:16,"aria-hidden":"true"})]}),T&&t.jsxs("div",{className:"quick-chat-session-dropdown",role:"menu","data-testid":"quick-chat-session-dropdown-menu",children:[Rt&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"quick-chat-session-dropdown-group-label",children:"Rooms"}),yt.map(X=>{const $e=ie.activeRoom?.id===X.id,Ue=!$e&&Fe("room",X.id,X.updatedAt);return t.jsxs("button",{type:"button",role:"menuitem","data-testid":`quick-chat-session-option-room-${X.slug}`,className:`quick-chat-session-option${$e?" quick-chat-session-option--active":""}`,onClick:()=>an(X.id),children:[t.jsxs("span",{children:["#",X.name]}),Ue?t.jsx("span",{className:"chat-unread-dot quick-chat-session-unread-dot","data-testid":`quick-chat-unread-dot-${X.id}`,"aria-label":"Unread messages"}):null]},X.id)}),t.jsx("div",{className:"quick-chat-session-dropdown-group-label",children:"Sessions"})]}),Ee.map(X=>{const $e=!kn&&Mt?.id===X.id,Ue=On.find(cn=>cn.id===X.id),Ht=!$e&&Fe("direct",X.id,Ue?.lastMessageAt??Ue?.updatedAt);return t.jsxs("button",{type:"button",role:"menuitem","data-testid":`quick-chat-session-option-${X.id}`,className:`quick-chat-session-option${$e?" quick-chat-session-option--active":""}`,onClick:()=>Dn(X.id),children:[t.jsx("span",{children:X.label}),Ht?t.jsx("span",{className:"chat-unread-dot quick-chat-session-unread-dot","data-testid":`quick-chat-unread-dot-${X.id}`,"aria-label":"Unread messages"}):null]},X.id)})]})]})}),U&&t.jsxs("div",{className:"quick-chat-new-session-chooser","data-testid":"quick-chat-new-session-chooser",children:[t.jsxs("div",{className:"quick-chat-inline-mode-toggle","data-testid":"quick-chat-inline-mode-toggle",children:[t.jsx("button",{type:"button",className:`quick-chat-mode-btn${W==="model"?" quick-chat-mode-btn--active":""}`,"data-testid":"quick-chat-inline-mode-model",onClick:()=>Y("model"),children:"Model"}),t.jsx("button",{type:"button",className:`quick-chat-mode-btn${W==="agent"?" quick-chat-mode-btn--active":""}`,"data-testid":"quick-chat-inline-mode-agent",onClick:()=>Y("agent"),children:"Agent"})]}),W==="agent"?t.jsxs("div",{className:"quick-chat-panel-agent-select",children:[t.jsx("label",{htmlFor:"quick-chat-new-agent-select",className:"visually-hidden",children:"Select agent for new chat"}),t.jsx("select",{id:"quick-chat-new-agent-select",value:L,onChange:X=>_(X.target.value),"data-testid":"quick-chat-new-agent-select",children:h.map(X=>t.jsx("option",{value:X.id,children:WB(X)},X.id))})]}):t.jsx("div",{className:"quick-chat-panel-agent-select","data-testid":"quick-chat-new-model-select",children:t.jsx(ri,{id:"quick-chat-new-model-select",models:m,value:F,onChange:ae,label:"Select model override",placeholder:b?"Loading models…":"Select a model",disabled:b||m.length===0,favoriteProviders:o,favoriteModels:l,onToggleFavorite:c,onToggleModelFavorite:d})}),t.jsxs("div",{className:"quick-chat-new-session-actions",children:[t.jsx("button",{type:"button",className:"btn","data-testid":"quick-chat-new-session-cancel",onClick:()=>{P(!1),Y("model")},children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary","data-testid":"quick-chat-new-session-submit",onClick:()=>void En(),disabled:un||(W==="agent"?!L:!cl(F||k||J)),children:"Create"})]})]}),t.jsx("div",{className:"quick-chat-panel-messages",ref:vt,"data-testid":"quick-chat-messages",onScroll:Tt,children:un?t.jsx("div",{className:"quick-chat-panel-empty",children:"Loading conversation…"}):!kn&&xn?t.jsxs(t.Fragment,{children:[ls.map(X=>t.jsx(gm,{message:X,forcePlain:X.role!=="user"&&Ne.has(X.id),mentionAgentsByName:lt,roomContext:u,projectId:e,onToggleRender:Kn},X.id)),Le&&t.jsx("div",{className:"quick-chat-panel-message quick-chat-panel-message--received","data-testid":"quick-chat-help-message",children:ds("Available commands:\n- `/new` or `/clear` — Clear conversation and start fresh\n- `/skill:{name}` — Use a specific skill\n- `/help` — Show this help")}),t.jsxs("div",{className:"quick-chat-panel-message quick-chat-panel-message--received quick-chat-panel-message--streaming","data-testid":"quick-chat-streaming-message",children:[Tn?t.jsxs(t.Fragment,{children:[t.jsx("div",{"data-testid":"quick-chat-streaming-text",children:ds(Tn,Ne.has("__streaming__"))}),t.jsx("button",{type:"button",className:`quick-chat-message-render-toggle${Ne.has("__streaming__")?" quick-chat-message-render-toggle--plain":""}`,"data-testid":"quick-chat-message-render-toggle","aria-label":Ne.has("__streaming__")?"Show rendered markdown":"Show plain text",onClick:()=>Kn("__streaming__"),children:Ne.has("__streaming__")?t.jsx(Nh,{size:14}):t.jsx($o,{size:14})})]}):t.jsx("p",{className:"quick-chat-panel-waiting","data-testid":"quick-chat-waiting",children:Sn?"Thinking…":"Connecting…"}),oj(is,!0),Sn&&t.jsxs("details",{className:"chat-message-thinking","data-testid":"quick-chat-streaming-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:zs(Sn)})]})]})]}):kn?ie.messagesLoading?t.jsx("div",{className:"quick-chat-panel-empty",children:"Loading conversation…"}):ls.length===0&&!Le?t.jsx("div",{className:"quick-chat-panel-empty",children:"No messages yet. Start the conversation!"}):t.jsxs(t.Fragment,{children:[ls.map(X=>t.jsx(gm,{message:X,forcePlain:X.role!=="user"&&Ne.has(X.id),mentionAgentsByName:lt,roomContext:u,projectId:e,onToggleRender:Kn},X.id)),Le&&t.jsx("div",{className:"quick-chat-panel-message quick-chat-panel-message--received","data-testid":"quick-chat-help-message",children:ds("Available commands:\n- `/new` or `/clear` — Clear conversation and start fresh\n- `/skill:{name}` — Use a specific skill\n- `/help` — Show this help")})]}):tn?t.jsx("div",{className:"quick-chat-panel-empty",children:"Loading conversation…"}):ls.length===0&&!Tn&&!Sn&&!xn&&!Le?t.jsx("div",{className:"quick-chat-panel-empty",children:"No messages yet. Start the conversation!"}):t.jsxs(t.Fragment,{children:[ls.map(X=>t.jsx(gm,{message:X,forcePlain:X.role!=="user"&&Ne.has(X.id),mentionAgentsByName:lt,roomContext:u,projectId:e,onToggleRender:Kn},X.id)),Le&&t.jsx("div",{className:"quick-chat-panel-message quick-chat-panel-message--received","data-testid":"quick-chat-help-message",children:ds("Available commands:\n- `/new` or `/clear` — Clear conversation and start fresh\n- `/skill:{name}` — Use a specific skill\n- `/help` — Show this help")})]})}),Xe&&t.jsxs("button",{type:"button",className:"btn btn-sm quick-chat-jump-to-latest","data-testid":"quick-chat-jump-to-latest",onClick:zt,children:[t.jsx(Ln,{size:14}),"Latest"]}),Re.length>0&&t.jsx("div",{className:"quick-chat-attachment-previews","data-testid":"quick-chat-attachment-previews",children:Re.map((X,$e)=>t.jsxs("div",{className:"quick-chat-attachment-preview","data-testid":`quick-chat-attachment-preview-${$e}`,children:[X.previewUrl?t.jsx("img",{src:X.previewUrl,alt:X.file.name}):t.jsx("span",{className:"quick-chat-attachment-preview-name",children:X.file.name}),t.jsx("button",{type:"button",className:"quick-chat-attachment-remove","data-testid":`quick-chat-attachment-remove-${$e}`,"aria-label":`Remove ${X.file.name}`,onClick:()=>ks($e),children:"×"})]},`${X.file.name}-${$e}`))}),t.jsx("div",{className:"quick-chat-panel-input",children:t.jsxs("div",{className:`quick-chat-input-wrapper${rt?" quick-chat-input-wrapper--dragover":""}`,onDragEnter:Bt,onDragOver:en,onDragLeave:jn,onDrop:ts,children:[t.jsx("input",{ref:ce,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,tabIndex:-1,"aria-hidden":"true",className:"quick-chat-attachment-input",onChange:X=>{Is(X.target.files),X.target.value=""}}),t.jsxs("div",{className:"quick-chat-input-row","data-testid":"quick-chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon quick-chat-attach-btn","data-testid":"quick-chat-attach-btn","aria-label":"Attach files",onClick:()=>ce.current?.click(),children:t.jsx(qv,{size:16})}),t.jsx("textarea",{ref:pt,rows:1,className:"quick-chat-textarea",value:le,onChange:Vt,onKeyDown:Jn,onKeyUp:Rn,onClick:Mn,onBlur:qt,onFocus:ln,onPaste:V,onTouchStart:X=>{typeof window>"u"||window.innerWidth>hi||Hh()&&document.activeElement!==X.currentTarget&&(X.preventDefault(),X.currentTarget.focus({preventScroll:!0}))},placeholder:_n,disabled:cs,"data-testid":"quick-chat-input"}),xn?t.jsx("button",{type:"button",className:"chat-input-stop quick-chat-send-btn",onPointerDown:X=>{typeof window>"u"||window.innerWidth>hi||(X.preventDefault(),X.pointerType&&X.pointerType!=="mouse"&&(Ke.current=!0,pn()))},onTouchStart:X=>{typeof window>"u"||window.innerWidth>hi||(X.preventDefault(),Ke.current=!0,pn())},onMouseDown:X=>{typeof window>"u"||window.innerWidth>hi||X.preventDefault()},onClick:()=>{if(Ke.current){Ke.current=!1;return}pn()},"aria-label":"Stop generation","data-testid":"quick-chat-stop",children:t.jsx(ca,{size:14})}):t.jsx("button",{type:"button",className:"quick-chat-send-btn",onPointerDown:X=>{typeof window>"u"||window.innerWidth>hi||(X.preventDefault(),X.pointerType&&X.pointerType!=="mouse"&&(Ke.current=!0,wt(),We(),ut()))},onTouchStart:X=>{typeof window>"u"||window.innerWidth>hi||(X.preventDefault(),Ke.current=!0,wt(),We(),ut())},onMouseDown:X=>{typeof window>"u"||window.innerWidth>hi||X.preventDefault()},onClick:()=>{if(Ke.current){Ke.current=!1;return}ut()},disabled:ys,"data-testid":"quick-chat-send",children:t.jsx(vr,{size:16})})]}),t.jsx(NB,{agents:h,filter:O,highlightedIndex:ne,visible:ve,onSelect:Ie,position:"above",roomMemberIds:u?.memberIds,roomName:u?.roomName}),t.jsx(DB,{visible:_e.mentionActive&&!ve,position:Se,tasks:_e.tasks,files:_e.files,selectedIndex:_e.selectedIndex,onSelectTask:X=>{ft(_e.selectTask(X,le),`#${X.id}`)},onSelectFile:X=>{ft(_e.selectFile(X,le),`#${X.path}`)},loading:_e.loading}),re&&t.jsx("div",{className:"chat-skill-menu","data-testid":"quick-chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:x?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):ot.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:ue?"No skills found":"No skills available"}):ot.map((X,$e)=>t.jsxs("button",{type:"button",role:"option","aria-selected":$e===be,className:`chat-skill-menu-item${$e===be?" chat-skill-menu-item--highlighted":""}`,onMouseDown:Ue=>Ue.preventDefault(),onMouseEnter:()=>fe($e),onClick:()=>te(X),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:X.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:X.relativePath,children:X.relativePath})]},X.id))}),!kn&&mn&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${ws}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:Zn,children:"×"})]})]})})]})]})}function dl(e){if(!e)return 0;const n=Date.parse(e);return Number.isFinite(n)?n:0}function uv(e){return e.status==="generating"||e.status==="awaiting_input"}function ul(e){return e==="complete"||e==="error"}function a8(e){const[n,s]=i.useState([]),a=i.useRef(new Map),r=i.useRef(new Map),{sessions:o,broadcastUpdate:l,broadcastCompleted:c,requestSync:d}=Bo(),u=i.useCallback(()=>{Ph(e).then(p=>{const b=p.filter(x=>{const y=dl(x.updatedAt),g=r.current.get(x.id);return g===void 0?!0:y<=g?!1:(r.current.delete(x.id),!0)}),v=new Map;for(const x of b)v.set(x.id,dl(x.updatedAt));a.current=v,s(b)}).catch(p=>{console.warn("[useBackgroundSessions] Failed to fetch AI sessions:",p)})},[e]);i.useEffect(()=>{d(),u()},[u,d]),i.useEffect(()=>{s(p=>{if(o.size===0)return p;let b=!1;const v=new Map(p.map(x=>[x.id,x]));for(const x of o.values()){if(e&&x.projectId&&x.projectId!==e)continue;const y=x.lastEventTimestamp,g=a.current.get(x.sessionId)??0;if(y<g)continue;const j=r.current.get(x.sessionId);if(j!==void 0&&y<=j)continue;if(j!==void 0&&y>j&&!ul(x.status)&&r.current.delete(x.sessionId),ul(x.status)){v.delete(x.sessionId)&&(b=!0),a.current.set(x.sessionId,y);continue}const N=v.get(x.sessionId),C=x.type??N?.type,w=x.title??N?.title;if(!N&&(!C||!w))continue;const S={id:x.sessionId,type:C??"planning",status:x.status,title:w??"AI Session",projectId:x.projectId??N?.projectId??e??null,lockedByTab:x.owningTabId??N?.lockedByTab??null,updatedAt:x.updatedAt??N?.updatedAt??new Date(y).toISOString()},R=v.get(x.sessionId);(!R||R.status!==S.status||R.title!==S.title||R.type!==S.type||R.projectId!==S.projectId||R.lockedByTab!==S.lockedByTab||R.updatedAt!==S.updatedAt)&&(v.set(x.sessionId,S),a.current.set(x.sessionId,y),b=!0)}return b?[...v.values()].sort((x,y)=>dl(y.updatedAt)-dl(x.updatedAt)):p})},[e,o]),i.useEffect(()=>{const p=e?`?projectId=${encodeURIComponent(e)}`:"",b=g=>{try{const j=JSON.parse(g.data),N=dl(j.updatedAt)||Date.now();s(C=>{const w=a.current.get(j.id)??0;if(N<w)return C;const S=r.current.get(j.id);if(S!==void 0&&N<=S)return C;if(S!==void 0&&N>S&&!ul(j.status)&&r.current.delete(j.id),a.current.set(j.id,N),ul(j.status))return C.filter(I=>I.id!==j.id);const R=C.findIndex(I=>I.id===j.id);if(R>=0){const I=[...C];return I[R]=j,I}return uv(j)?[j,...C]:C}),l({sessionId:j.id,status:j.status,needsInput:j.status==="awaiting_input",type:j.type,title:j.title,projectId:j.projectId,owningTabId:j.lockedByTab,updatedAt:j.updatedAt,timestamp:N}),ul(j.status)&&c({sessionId:j.id,status:j.status,timestamp:N})}catch{}},v=g=>{try{const j=JSON.parse(g.data),N=Date.now();r.current.set(j,N),a.current.set(j,Math.max(a.current.get(j)??0,N)),c({sessionId:j,status:"complete",timestamp:N}),s(C=>C.filter(w=>w.id!==j))}catch{}},x=`/api/events${p}`,y=Si(x,{events:{"ai_session:updated":b,"ai_session:deleted":v},onReconnect:()=>{qs({view:"useBackgroundSessions",trigger:"sse-reconnect",projectId:e,replayAttempted:!1,sseChannel:x}),u()}});return qs({view:"useBackgroundSessions",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:x}),y},[c,l,e,u]);const h=i.useCallback(async p=>{const v=n.find(j=>j.id===p)?.type,x=Pr();let y=!1;if(v==="planning")try{await ly(p,e,x)}catch(j){y=!0,j instanceof Error&&j.message.includes("locked")&&console.warn(`[useBackgroundSessions] Forcing dismiss of planning session ${p} despite lock by another tab`)}else if(v==="subtask")try{await uy(p,e,x)}catch(j){y=!0,j instanceof Error&&j.message.includes("locked")&&console.warn(`[useBackgroundSessions] Forcing dismiss of subtask session ${p} despite lock by another tab`)}else if(v==="mission_interview")try{await gy(p,e,x)}catch(j){y=!0,j instanceof Error&&j.message.includes("locked")&&console.warn(`[useBackgroundSessions] Forcing dismiss of mission interview session ${p} despite lock by another tab`)}y&&console.warn(`[useBackgroundSessions] Cancellation failed for session ${p}, attempting delete anyway`);const g=Date.now();r.current.set(p,g),a.current.set(p,Math.max(a.current.get(p)??0,g)),c({sessionId:p,status:"complete",timestamp:g});try{await by(p)}catch{}s(j=>j.filter(N=>N.id!==p))},[c,e,n]),m=i.useMemo(()=>n.filter(p=>uv(p)),[n]),f=i.useMemo(()=>m.filter(p=>p.type==="planning"),[m]);return{sessions:m,generating:m.filter(p=>p.status==="generating").length,needsInput:m.filter(p=>p.status==="awaiting_input").length,planningSessions:f,dismissSession:h,refresh:u}}const vd="fusion:hide-session-banners",yh="fusion:session-banner-pref-changed";function r8(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(vd)==="1"}catch{return!1}}function o8(e){if(typeof window>"u")return()=>{};const n=a=>{a.key===vd&&e()},s=()=>e();return window.addEventListener("storage",n),window.addEventListener(yh,s),()=>{window.removeEventListener("storage",n),window.removeEventListener(yh,s)}}function rq(e){if(!(typeof window>"u"))try{e?window.localStorage.setItem(vd,"1"):window.localStorage.removeItem(vd),window.dispatchEvent(new Event(yh))}catch{}}function l8(){return i.useSyncExternalStore(o8,r8,()=>!1)}const Hc=new Set;function Ws(e){return{...e,column:Xv(e.column),dependencies:Array.isArray(e.dependencies)?e.dependencies:[],steps:Array.isArray(e.steps)?e.steps:[],log:Array.isArray(e.log)?e.log:[]}}function yl(e){return!!e.deletedAt}function qc(e){return e.filter(n=>!yl(n))}function mv(e,n){return!e&&!n?0:e?n?e.localeCompare(n):1:-1}function c8(e,n){return{...n,columnMovedAt:e.columnMovedAt??n.columnMovedAt,executionStartedAt:e.executionStartedAt??n.executionStartedAt,executionCompletedAt:e.executionCompletedAt??n.executionCompletedAt,firstExecutionAt:e.firstExecutionAt??n.firstExecutionAt,cumulativeActiveMs:n.cumulativeActiveMs??e.cumulativeActiveMs,worktree:n.worktree??e.worktree,modifiedFiles:n.modifiedFiles??e.modifiedFiles,timedExecutionMs:n.timedExecutionMs??e.timedExecutionMs,workflowStepResults:n.workflowStepResults??e.workflowStepResults,tokenUsage:n.tokenUsage??e.tokenUsage,mergeDetails:n.mergeDetails??e.mergeDetails}}function bm(e,n){if(mv(n.updatedAt,e.updatedAt)<0)return e;if(e.column===n.column)return c8(e,n);const a=mv(e.columnMovedAt,n.columnMovedAt);return e.columnMovedAt&&!n.columnMovedAt?{...n,column:e.column,columnMovedAt:e.columnMovedAt}:a>=0?{...n,column:e.column,columnMovedAt:e.columnMovedAt}:n}function d8(e){const n=e?.projectId,s=e?.searchQuery,a=e?.sseEnabled??!0,[r,o]=i.useState(()=>{if(!n)return[];const J=ui(`${bn.TASKS_PREFIX}${n}`,{maxAgeMs:eh});return Array.isArray(J)&&J.length>0&&!Hc.has(n)&&(Hc.add(n),console.info("[swr-cache] hit tasks=",J.length,"projectId=",n)),Array.isArray(J)?qc(J.map(Ws)):[]}),[l,c]=i.useState(!0),[d,u]=i.useState(null),[h,m]=i.useState(!1),f=i.useRef(h);f.current=h;const p=i.useRef(r),b=i.useRef(0),v=i.useRef(0),x=i.useRef(0),y=i.useRef(v.current),g=i.useRef(0),j=i.useRef(s),N=i.useRef(null),C=i.useRef(void 0),w=i.useRef(n);p.current=r,j.current=s,w.current!==n&&(w.current=n,v.current++);const S=1e3,R=i.useCallback(async J=>{const oe=++b.current,le=n,we=J?.searchQueryOverride??j.current,re=J?.includeArchivedOverride??f.current;try{const H=await ty(void 0,void 0,le,we,re);if(b.current!==oe||n!==le)return;const ue=qc(H.map(Ws));if(o(ue),le){const Q=H.length>500?H.slice(0,500):H;Wn(`${bn.TASKS_PREFIX}${le}`,Q,{maxBytes:5e5})}c(!1),u(null),C.current=Date.now()}catch{if(b.current!==oe||n!==le)return;if(u(Date.now()),le&&hs(`${bn.TASKS_PREFIX}${le}`),J?.clearOnError){o([]);return}}},[n]);N.current=R;const I=i.useCallback(async()=>{f.current||(m(!0),f.current=!0,await N.current({includeArchivedOverride:!0}))},[]),E=i.useRef(s);i.useEffect(()=>{if(s===void 0&&E.current===void 0)return;E.current=s;const J=setTimeout(()=>{R({searchQueryOverride:s})},300);return()=>clearTimeout(J)},[s]),i.useEffect(()=>{if(!n)return;const J=ui(`${bn.TASKS_PREFIX}${n}`,{maxAgeMs:eh});Array.isArray(J)&&(J.length>0&&!Hc.has(n)&&(Hc.add(n),console.info("[swr-cache] hit tasks=",J.length,"projectId=",n)),o(qc(J.map(Ws)))),c(!0)},[n]),i.useEffect(()=>{c(!0),R({clearOnError:!0});const J=()=>{if(document.visibilityState!=="visible"){y.current=v.current;return}const oe=y.current,le=oe!==v.current;if(y.current=v.current,le){x.current=Date.now(),si("useTasks","visibility-context-version-changed",{projectId:n,previousContextVersion:oe,currentContextVersion:v.current}),qs({view:"useTasks",trigger:"visibility",projectId:n,replayAttempted:!1,reason:"context-version-changed"}),R();return}const we=Date.now();we-x.current<S||(x.current=we,qs({view:"useTasks",trigger:"visibility",projectId:n,replayAttempted:!1,reason:"debounced-refresh"}),R())};return document.addEventListener("visibilitychange",J),()=>{document.removeEventListener("visibilitychange",J)}},[R]),i.useEffect(()=>{if(a===!1)return;let J=v.current;const oe=n?`?projectId=${encodeURIComponent(n)}`:"",le=()=>v.current!==J,we=()=>{g.current+=1,si("useTasks","dropped-stale-event",{count:g.current,contextVersionAtStart:J,currentContextVersion:v.current,projectId:n})};let re=!0;const H=se=>{if(le()){we();return}const ve=Ws(JSON.parse(se.data));if(j.current){N.current({searchQueryOverride:j.current});return}if(yl(ve)){o(A=>A.filter(ne=>ne.id!==ve.id)),si("useTasks","soft-deleted-task-suppressed",{event:"task:created",id:ve.id});return}o(A=>{const ne=A.findIndex(Ne=>Ne.id===ve.id);if(ne===-1)return[...A,ve];const ye=A[ne],ee=bm(ye,ve);if(ee===ye)return A;const ge=[...A];return ge[ne]=ee,ge}),C.current=Date.now()},ue=se=>{if(le()){we();return}if(j.current){N.current({searchQueryOverride:j.current});return}const{task:ve,to:A}=JSON.parse(se.data),ne=Ws(ve);if(yl(ne)){o(ee=>ee.filter(ge=>ge.id!==ne.id)),si("useTasks","soft-deleted-task-suppressed",{event:"task:moved",id:ne.id});return}const ye={...ne,column:Xv(A,ne.column)};o(ee=>{const ge=ee.findIndex(He=>He.id===ye.id);if(ge===-1)return[...ee,ye];const Ne=[...ee];return Ne[ge]=ye,Ne}),C.current=Date.now()},Q=se=>{if(le()){we();return}if(j.current){N.current({searchQueryOverride:j.current});return}const ve=Ws(JSON.parse(se.data));if(yl(ve)){o(A=>A.filter(ne=>ne.id!==ve.id)),si("useTasks","soft-deleted-task-suppressed",{event:"task:updated",id:ve.id});return}o(A=>{const ne=A.findIndex(Ne=>Ne.id===ve.id);if(ne===-1)return[...A,ve];const ye=A[ne],ee=bm(ye,ve);if(ee===ye)return A;const ge=[...A];return ge[ne]=ee,ge}),C.current=Date.now()},be=se=>{if(le()){we();return}if(j.current){N.current({searchQueryOverride:j.current});return}const ve=Ws(JSON.parse(se.data));o(A=>A.filter(ne=>ne.id!==ve.id))},fe=se=>{if(le()){we();return}if(j.current){N.current({searchQueryOverride:j.current});return}const{task:ve}=JSON.parse(se.data),A=Ws(ve);if(yl(A)){o(ye=>ye.filter(ee=>ee.id!==A.id)),si("useTasks","soft-deleted-task-suppressed",{event:"task:merged",id:A.id});return}const ne={...A,column:"done"};o(ye=>{const ee=ye.findIndex(Ne=>Ne.id===ne.id);if(ee===-1)return[...ye,ne];const ge=[...ye];return ge[ee]=ne,ge})},O=Si(`/api/events${oe}`,{events:{"task:created":H,"task:moved":ue,"task:updated":Q,"task:deleted":be,"task:merged":fe},onReconnect:()=>{if(J=v.current,!!re){if(le()){we();return}qs({view:"useTasks",trigger:"sse-reconnect",projectId:n,replayAttempted:!1}),N.current()}}});return()=>{re=!1,O()}},[n,a]);const M=i.useCallback(async J=>{const oe=Ws(await ny(J,n));return o(le=>le.some(we=>we.id===oe.id)?le:[...le,oe]),oe},[n]),G=i.useCallback(async(J,oe,le)=>Ws(await LC(J,oe,n,le)),[n]),U=i.useCallback(async J=>Ws(await sy(J,n)),[n]),P=i.useCallback(async J=>Ws(await iy(J,n)),[n]),T=i.useCallback(async(J,oe)=>Ws(await OC(J,n,oe)),[n]),D=i.useCallback(async J=>FC(J,n),[n]),W=i.useCallback(async J=>Ws(await zC(J,n)),[n]),Y=i.useCallback(async J=>Ws(await UC(J,n)),[n]),L=i.useCallback(async J=>{const oe=Ws(await HC(J,n));return o(le=>le.some(we=>we.id===oe.id)?le:[...le,oe]),oe},[n]),_=i.useCallback(async(J,oe)=>{const le=p.current.find(re=>re.id===J),we=le?{...le,...oe,updatedAt:new Date().toISOString()}:void 0;we&&o(re=>re.map(H=>H.id===J?we:H));try{const re=Ws(await ni(J,oe,n));return o(H=>H.map(ue=>ue.id===J?re:ue)),re}catch(re){throw le&&o(H=>H.map(ue=>ue.id===J?le:ue)),re}},[n]),F=i.useCallback(async(J,oe)=>{const le=Ws(await qC(J,n,oe));return o(we=>we.map(re=>re.id===J?le:re)),le},[n]),ae=i.useCallback(async J=>{const oe=Ws(await VC(J,n));return o(le=>le.map(we=>we.id===J?oe:we)),oe},[n]),k=i.useCallback(async()=>{const oe=(await WC(n)).map(Ws);return o(le=>le.map(we=>oe.find(H=>H.id===we.id)||we)),oe},[n]),z=i.useCallback(J=>{if(J.length===0)return;if(j.current){N.current({searchQueryOverride:j.current});return}const oe=qc(J.map(Ws));o(le=>{let we=le;for(const re of oe){const H=we.findIndex(be=>be.id===re.id);if(H===-1){we===le&&(we=[...le]),we.push(re);continue}const ue=we[H],Q=bm(ue,re);Q!==ue&&(we===le&&(we=[...le]),we[H]=Q)}return we}),C.current=Date.now()},[]);return{tasks:r,isStale:l,lastRefreshErrorAt:d,createTask:M,moveTask:G,pauseTask:U,unpauseTask:P,deleteTask:T,mergeTask:D,retryTask:W,resetTask:Y,duplicateTask:L,updateTask:_,archiveTask:F,unarchiveTask:ae,archiveAllDone:k,loadArchivedTasks:I,includeArchived:h,refreshTasks:R,ingestCreatedTasks:z,lastFetchTimeMs:C.current}}const u8=5e3,m8=1e3;function h8(e){const s=(d_(e)?e.nodeMappings??e.projectNodeMappings??e.pathMappings??[]:[]).filter(a=>!!a?.nodeId&&!!a?.path).map(a=>({nodeId:a.nodeId,nodeName:a.nodeName,path:a.path,available:a.available!==!1}));return s.length>0?s:e.nodeId&&e.path?[{nodeId:e.nodeId,nodeName:e._sourceNodeName,path:e.path,available:!0}]:[]}function xm(e){return e.map(n=>({...n,nodeMappings:h8(n)}))}function f8(){const[e,n]=i.useState(()=>{const f=ui(bn.PROJECTS,{maxAgeMs:_r});return Array.isArray(f)?(f.length>0&&console.info("[swr-cache] hit projects=",f.length),xm(f)):[]}),[s,a]=i.useState(()=>e.length===0),[r,o]=i.useState(null),l=i.useRef(null),c=i.useRef(0),d=i.useCallback(async()=>{try{o(null);const f=await bp(),p=xm(f);n(p),Wn(bn.PROJECTS,p)}catch(f){o(f instanceof Error?f.message:"Failed to fetch projects")}},[]);i.useEffect(()=>{let f=!1;async function p(){e.length>0||a(!0);const x=performance.now();try{const y=await bp(),g=xm(y),j=Math.round(performance.now()-x);console.log(`[useProjects] initial fetchProjectsAcrossNodes took ${j}ms (${g.length} projects)`),f||(n(g),o(null),Wn(bn.PROJECTS,g))}catch(y){const g=Math.round(performance.now()-x);console.warn(`[useProjects] initial fetch failed after ${g}ms: ${y instanceof Error?y.message:String(y)}`),f||o(y instanceof Error?y.message:"Failed to fetch projects")}finally{f||a(!1)}}p();const b=()=>{if(document.visibilityState!=="visible")return;const v=Date.now(),x=v-c.current;if(x<m8){qs({view:"useProjects",trigger:"visibility",projectId:void 0,replayAttempted:!1,reason:"debounce-skipped",detail:{timeSinceLastRefreshMs:x}});return}c.current=v,qs({view:"useProjects",trigger:"visibility",projectId:void 0,replayAttempted:!1,reason:"debounced-refresh"}),d()};return document.addEventListener("visibilitychange",b),()=>{f=!0,document.removeEventListener("visibilitychange",b)}},[e.length,d]),i.useEffect(()=>{if(!s)return l.current=setInterval(()=>{d()},u8),()=>{l.current&&(clearInterval(l.current),l.current=null)}},[s,d]);const u=i.useCallback(async f=>{const p=await x_(f);return n(b=>[...b,p]),p},[]),h=i.useCallback(async(f,p)=>{const b=await S_(f,p);return n(v=>v.map(x=>x.id===f?b:x)),b},[]),m=i.useCallback(async f=>{await hy(f),n(p=>{const b=p.filter(v=>v.id!==f);return Wn(bn.PROJECTS,b),b}),hs(`${bn.TASKS_PREFIX}${f}`)},[]);return{projects:e,loading:s,error:r,refresh:d,register:u,update:h,unregister:m}}const p8="kb-dashboard-current-project",hv=3;function g8(e){return e??"local"}function b8(e,n={}){const{nodeId:s=null}=n,a=ui(bn.CURRENT_PROJECT_ID,{maxAgeMs:th}),r=typeof a=="string"&&a.length>0?e.find(C=>C.id===a)??null:null,[o,l]=i.useState(r),[c,d]=i.useState(()=>r===null),u=i.useRef(!1),h=i.useRef(null),m=i.useRef(!1),f=i.useRef(null),p=i.useRef(0),b=i.useRef(0),v=g8(s),x=i.useCallback(C=>{Wn(bn.CURRENT_PROJECT_ID,C??"")},[]),y=i.useCallback(C=>C.find(w=>w.status==="active")||C[0]||null,[]),g=i.useCallback(C=>{p.current=0,b.current=0,l(C),x(C?.id??null)},[x]);i.useEffect(()=>{let C=!1;if(h.current!==v&&(h.current=null,u.current=!1),u.current&&h.current===v)return d(!1),()=>{C=!0};typeof a=="string"&&a.length>0&&e.some(R=>R.id===a)||d(!0);async function S(){try{const R=await Ra();if(C)return;f.current=R.dashboardCurrentProjectIdByNode??{};const I=f.current[v];if(I){const E=e.find(M=>M.id===I);E&&(b.current=0,l(E),x(E.id))}if(!I)try{const E=localStorage.getItem(p8);if(E){const M=JSON.parse(E);M?.id&&e.some(U=>U.id===M.id)&&(b.current=0,l(M),x(M.id),f.current={...f.current,[v]:M.id},await Cs({dashboardCurrentProjectIdByNode:f.current}).catch(()=>{}))}}catch{}}catch{}finally{C||(u.current=!0,h.current=v,d(!1))}}return S(),()=>{C=!0}},[e,a,v,x]),i.useEffect(()=>{p.current=0,b.current=0},[o?.id]),i.useEffect(()=>{if(!c)if(o){if(b.current=0,e.some(S=>S.id===o.id))p.current=0;else if(e.length===0)p.current=0;else{if(p.current+=1,p.current>=hv){const S=y(e);g(S),S||x(null)}return}const w={...f.current,[v]:o.id};f.current=w,Cs({dashboardCurrentProjectIdByNode:w}).catch(()=>{}),x(o.id)}else{if(p.current=0,e.length===0){b.current=0;return}if(!m.current){const C=f.current?.[v];if(C){const w=e.find(S=>S.id===C)??null;if(w){b.current=0,g(w);return}}b.current+=1,b.current>=hv&&(b.current=0,g(y(e)))}}},[e,o,c,v,x,y,g]);const j=i.useCallback(C=>{if(m.current=!1,p.current=0,b.current=0,l(C),x(C?.id??null),C){const w={...f.current,[v]:C.id};f.current=w,Cs({dashboardCurrentProjectIdByNode:w}).catch(()=>{})}},[v,x]),N=i.useCallback(()=>{m.current=!0,p.current=0,b.current=0,l(null),x(null);const C={...f.current};delete C[v],f.current=C,Cs({dashboardCurrentProjectIdByNode:C}).catch(()=>{})},[v,x]);return{currentProject:o,setCurrentProject:j,clearCurrentProject:N,loading:c}}const cj=i.createContext(null);function x8({children:e}){const[n,s]=i.useState([]),a=i.useRef(0),r=i.useRef(new Map),o=i.useCallback(c=>{const d=r.current.get(c);d!==void 0&&(clearTimeout(d),r.current.delete(c)),s(u=>u.filter(h=>h.id!==c))},[]),l=i.useCallback((c,d="info")=>{if(d==="error"&&/^\s*Failed to fetch\.?\s*$/i.test(c))return;const u=a.current++;s(m=>[...m,{id:u,message:c,type:d}]);const h=setTimeout(()=>o(u),4e3);r.current.set(u,h)},[o]);return i.useEffect(()=>()=>{r.current.forEach(c=>clearTimeout(c)),r.current.clear()},[]),Ja.createElement(cj.Provider,{value:{toasts:n,addToast:l,removeToast:o}},e)}function v8(){const e=i.useContext(cj);if(!e)throw new Error("useToast must be used within ToastProvider");return e}const dj="kb-dashboard-theme-mode",uj="kb-dashboard-color-theme",mj="kb-dashboard-font-scale-pct",wh=100,y8=85,w8=125,hj=[...gC],fv="theme-data",ml="theme-data.css";function k8(){const e=document.baseURI||(typeof document.location<"u"?document.location.href:"");return e?e.startsWith("http://")||e.startsWith("https://")?new URL(`/${ml}`,e).toString():e.startsWith("file://")?e.endsWith("/")?e.slice(0,-1)+`/${ml}`:e.replace(/\/[^/]+$/,`/${ml}`):`/${ml}`:`/${ml}`}const Ai=typeof window<"u",j8=Ai?i.useLayoutEffect:i.useEffect;function fj(e){return e==="dark"||e==="light"||e==="system"}function pv(){if(!Ai)return"dark";try{const e=localStorage.getItem(dj);if(fj(e))return e}catch{}return"dark"}function gv(){if(!Ai)return"default";try{const e=localStorage.getItem(uj);if(e&&hj.includes(e))return e}catch{}return"default"}function bv(e){if(Ai)try{localStorage.setItem(dj,e)}catch{}}function xv(e){if(Ai)try{localStorage.setItem(uj,e)}catch{}}function $l(e){return typeof e!="number"||!Number.isFinite(e)?wh:Math.min(w8,Math.max(y8,Math.round(e)))}function vv(){if(!Ai)return wh;try{const e=Number(localStorage.getItem(mj));return $l(e)}catch{return wh}}function yv(e){if(Ai)try{localStorage.setItem(mj,String($l(e)))}catch{}}function N8(e,n){return e==="system"?n?"dark":"light":e}function S8(e,n,s,a){if(!Ai)return;const r=N8(e,a);document.documentElement.setAttribute("data-theme",r),document.documentElement.setAttribute("data-color-theme",n),document.documentElement.style.fontSize=`${$l(s)}%`}function wv(){if(!Ai)return;const e=k8(),n=document.getElementById(fv);if(n){n.href!==e&&(n.href=e);return}const s=document.createElement("link");s.rel="stylesheet",s.href=e,s.id=fv,document.head.appendChild(s)}function C8(){const[e,n]=i.useState(()=>pv()),[s,a]=i.useState(()=>gv()),[r,o]=i.useState(()=>vv()),[l,c]=i.useState(!0),[d,u]=i.useState(()=>Ai?window.matchMedia("(prefers-color-scheme: dark)").matches:!0),h=i.useRef(e),m=i.useRef(s),f=i.useRef(r),p=i.useRef(!1),b=i.useRef(!1),v=i.useRef(!1);i.useEffect(()=>{h.current=e},[e]),i.useEffect(()=>{m.current=s},[s]),i.useEffect(()=>{f.current=r},[r]),i.useEffect(()=>{if(!Ai||!l)return;let j=!1;return Ra().then(N=>{if(!j&&(fj(N.themeMode)&&!p.current&&(h.current!==N.themeMode&&(h.current=N.themeMode,n(N.themeMode)),pv()!==N.themeMode&&bv(N.themeMode)),N.colorTheme&&hj.includes(N.colorTheme)&&!b.current&&(m.current!==N.colorTheme&&(m.current=N.colorTheme,a(N.colorTheme)),gv()!==N.colorTheme&&xv(N.colorTheme)),!v.current)){const C=$l(N.dashboardFontScalePct);f.current!==C&&(f.current=C,o(C)),vv()!==C&&yv(C)}}).catch(N=>{console.warn("[useTheme] Failed to hydrate theme from global settings",N)}).finally(()=>{j||c(!1)}),()=>{j=!0}},[l]),i.useEffect(()=>{if(!Ai)return;const j=window.matchMedia("(prefers-color-scheme: dark)"),N=C=>{u(C.matches)};return j.addEventListener("change",N),()=>j.removeEventListener("change",N)},[]),j8(()=>{S8(e,s,r,d)},[e,s,r,d]),i.useEffect(()=>{!Ai||l||s!=="default"&&wv()},[s,l]);const x=i.useCallback(j=>{p.current=!0,h.current=j,n(j),bv(j),Cs({themeMode:j}).catch(N=>{console.warn("[useTheme] Failed to persist themeMode to global settings",N)})},[]),y=i.useCallback(j=>{b.current=!0,m.current=j,a(j),xv(j),j!=="default"&&wv(),Cs({colorTheme:j}).catch(N=>{console.warn("[useTheme] Failed to persist colorTheme to global settings",N)})},[]),g=i.useCallback(j=>{const N=$l(j);v.current=!0,f.current=N,o(N),yv(N),Cs({dashboardFontScalePct:N}).catch(C=>{console.warn("[useTheme] Failed to persist dashboardFontScalePct to global settings",C)})},[]);return{themeMode:e,colorTheme:s,dashboardFontScalePct:r,setThemeMode:x,setColorTheme:y,setDashboardFontScalePct:g,isSystemDark:d}}function E8(e){const{planningSessions:n}=e,[s,a]=i.useState(!1),[r,o]=i.useState(!1),[l,c]=i.useState(null),[d,u]=i.useState(void 0),[h,m]=i.useState(!1),[f,p]=i.useState(null),[b,v]=i.useState(void 0),[x,y]=i.useState(null),[g,j]=i.useState("definition"),[N,C]=i.useState(null),[w,S]=i.useState(!1),[R,I]=i.useState(void 0),[E,M]=i.useState(!1),[G,U]=i.useState(!1),[P,T]=i.useState(!1),[D,W]=i.useState(null),[Y,L]=i.useState(!1),[_,F]=i.useState(!1),[ae,k]=i.useState(void 0),[z,J]=i.useState(!1),[oe,le]=i.useState(!1),[we,re]=i.useState("project"),[H,ue]=i.useState(null),[Q,be]=i.useState(!1),[fe,O]=i.useState(!1),[se,ve]=i.useState(!1),[A,ne]=i.useState(!1),[ye,ee]=i.useState(!1),[ge,Ne]=i.useState(!1),[He,Le]=i.useState(!1),de=!!(x||w||s||r||h||_||z||oe||Q||fe||se||ye||A||P||Y||E||G||ge||He),Re=i.useCallback(()=>a(!0),[]),Pe=i.useCallback(()=>a(!1),[]),rt=i.useCallback(()=>o(!0),[]),qe=i.useCallback($t=>{c($t),o(!0)},[]),Xe=i.useCallback(()=>{const $t=n[0];$t&&(u($t.id),o(!0))},[n]),At=i.useCallback($t=>{u($t),o(!0)},[]),at=i.useCallback(()=>{o(!1),c(null),u(void 0)},[]),Se=i.useCallback($t=>{p($t),m(!0)},[]),pe=i.useCallback($t=>{v($t),m(!0)},[]),_e=i.useCallback(()=>{m(!1),p(null),v(void 0)},[]),et=i.useCallback(($t,Jt="definition",Qt)=>{y($t),j(Jt),C(Qt?.origin??null)},[]),Ae=i.useCallback($t=>{y($t),j("changes"),C(null)},[]),it=i.useCallback($t=>{y(Jt=>!Jt||$t.id!==void 0&&$t.id!==Jt.id?Jt:{...Jt,...$t})},[]),xt=i.useCallback(()=>{y(null),C(null)},[]),Nt=i.useCallback($t=>{I($t),S(!0)},[]),Ut=i.useCallback(()=>{S(!1),I(void 0)},[]),Be=i.useCallback(()=>M(!0),[]),Z=i.useCallback(()=>M(!1),[]),Oe=i.useCallback(()=>U(!0),[]),ht=i.useCallback(()=>U(!1),[]),je=i.useCallback($t=>{W($t??null),T(!0)},[]),mt=i.useCallback(()=>{T(!1),W(null)},[]),Et=i.useCallback(()=>L(!0),[]),Te=i.useCallback(()=>L(!1),[]),xe=i.useCallback(()=>{F($t=>!$t)},[]),gt=i.useCallback(()=>{F(!1),k(void 0)},[]),_t=i.useCallback(($t,Jt)=>{typeof $t=="string"&&$t&&re($t),ue(typeof Jt=="string"||Jt===null?Jt:null),J(!0)},[]),Ft=i.useCallback(()=>{J(!1),ue(null)},[]),Dt=i.useCallback(()=>le(!0),[]),nt=i.useCallback(()=>le(!1),[]),Wt=i.useCallback($t=>{typeof $t=="string"&&$t&&re($t)},[]),Mt=i.useCallback(()=>be(!0),[]),Kt=i.useCallback(()=>be(!1),[]),xn=i.useCallback(()=>O(!0),[]),Tn=i.useCallback(()=>O(!1),[]),Sn=i.useCallback(()=>ve(!0),[]),is=i.useCallback(()=>ve(!1),[]),On=i.useCallback(()=>ne(!0),[]),un=i.useCallback(()=>ne(!1),[]),tn=i.useCallback(()=>ee(!0),[]),on=i.useCallback(()=>ee(!1),[]),pn=i.useCallback(async($t,Jt)=>{ee(!1),k(Jt),F(!0)},[]),mn=i.useCallback(()=>Ne(!0),[]),Zn=i.useCallback(()=>Ne(!1),[]),In=i.useCallback(()=>Le(!0),[]),rn=i.useCallback(()=>Le(!1),[]),hn=i.useCallback(($t,Jt)=>{Jt(`Created ${$t.id} from planning mode`,"success"),o(!1),c(null)},[]),Pn=i.useCallback(($t,Jt)=>{const Qt=$t.map(ie=>ie.id).join(", ");Jt(`Created ${Qt} from planning mode`,"success"),o(!1),c(null)},[]),nn=i.useCallback(($t,Jt)=>{const Qt=$t.map(ie=>ie.id).join(", ");Jt(`Created ${Qt} from subtask breakdown`,"success"),m(!1),p(null)},[]);return{newTaskModalOpen:s,isPlanningOpen:r,planningInitialPlan:l,planningResumeSessionId:d,isSubtaskOpen:h,subtaskInitialDescription:f,subtaskResumeSessionId:b,detailTask:x,detailTaskInitialTab:g,detailTaskOrigin:N,settingsOpen:w,settingsInitialSection:R,schedulesOpen:E,githubImportOpen:G,usageOpen:P,usageAnchorRect:D,systemStatsOpen:Y,terminalOpen:_,terminalInitialCommand:ae,filesOpen:z,todosOpen:oe,fileBrowserWorkspace:we,fileBrowserInitialFile:H,activityLogOpen:Q,gitManagerOpen:fe,workflowStepsOpen:se,agentsOpen:A,scriptsOpen:ye,setupWizardOpen:ge,modelOnboardingOpen:He,anyModalOpen:de,openNewTask:Re,closeNewTask:Pe,openPlanning:rt,openPlanningWithInitialPlan:qe,resumePlanning:Xe,openPlanningWithSession:At,closePlanning:at,openSubtaskBreakdown:Se,openSubtaskWithSession:pe,closeSubtask:_e,openDetailTask:et,openDetailWithChangesTab:Ae,updateDetailTask:it,closeDetailTask:xt,openSettings:Nt,closeSettings:Ut,openSchedules:Be,closeSchedules:Z,openGitHubImport:Oe,closeGitHubImport:ht,openUsage:je,closeUsage:mt,openSystemStats:Et,closeSystemStats:Te,toggleTerminal:xe,closeTerminal:gt,openFiles:_t,closeFiles:Ft,openTodos:Dt,closeTodos:nt,setFileWorkspace:Wt,openActivityLog:Mt,closeActivityLog:Kt,openGitManager:xn,closeGitManager:Tn,openWorkflowSteps:Sn,closeWorkflowSteps:is,openAgents:On,closeAgents:un,openScripts:tn,closeScripts:on,runScript:pn,openSetupWizard:mn,closeSetupWizard:Zn,openModelOnboarding:In,closeModelOnboarding:rn,onPlanningTaskCreated:hn,onPlanningTasksCreated:Pn,onSubtaskTasksCreated:nn}}function _8(e){const{projectId:n,projects:s,projectsLoading:a,currentProject:r,setCurrentProject:o,addToast:l,openTaskDetail:c,closeTaskDetail:d}=e,u=i.useRef(!1),h=i.useRef(!1),m=i.useRef(null),f=i.useRef(null),p=i.useRef(null);return i.useEffect(()=>{if(!h.current){const j=window.location.pathname.match(/^\/tasks\/([A-Z]+-\d+)\/?$/);if(j){const N=j[1];if(/^[A-Z]+-\d+$/.test(N)){const C=new URLSearchParams(window.location.search);C.set("task",N);const w=C.toString(),S=window.history.state??{};window.history.replaceState(S,"",w?`/?${w}`:"/"),h.current=!0}}}const v=new URLSearchParams(window.location.search),x=v.get("project"),y=v.get("task");if(a)return;let g=n;if(x){const j=s.find(N=>N.id===x);if(!j){f.current!==x&&(l(`Project '${x}' not found`,"error"),f.current=x);return}f.current=null,g=j.id,r?.id!==j.id&&p.current!==j.id&&(o(j),p.current=j.id)}else f.current=null,p.current=null;y&&(u.current||(u.current=!0,Sr(y,g).then(j=>{c(j),m.current=y}).catch(()=>{l(`Task ${y} not found`,"error")})))},[n,s,a,r,o,l,c]),{handleDetailClose:i.useCallback(()=>{if(m.current){const v=new URLSearchParams(window.location.search);v.delete("task");const x=v.toString(),y=window.history.state??{};window.history.replaceState(y,"",x?`${window.location.pathname}?${x}`:window.location.pathname),m.current=null}d()},[d])}}function M8({projectId:e,setupWizardOpen:n,openModelOnboarding:s,openSettings:a}){const r=i.useRef(!1),o=i.useRef(n);o.current=n,i.useEffect(()=>{if(n||!e||r.current)return;r.current=!0;let l=!1,c=!1;No().then(({providers:d})=>{const u=d.some(m=>m.authenticated);if(d.length>0&&!u||d.length>0&&u)return Ra().then(m=>{const f=!!(m.defaultProvider&&m.defaultModelId);(m.modelOnboardingComplete===!1||m.modelOnboardingComplete===void 0)&&(!u||!f)&&!Io()?l=!0:!u&&!Io()&&(c=!0)})}).then(()=>{if(o.current){r.current=!1;return}l?(Bi("onboarding:auto-triggered",{trigger:"first-run"}),s()):c&&(Bi("onboarding:auto-triggered",{trigger:"missing-provider"}),a("authentication"))}).catch(()=>{})},[e,n,s,a])}function R8({isMobile:e,keyboardOpen:n,anyModalOpen:s,isIOS:a}){const r=e&&n&&!s&&a,o=e&&n;return{footerHidden:r,navKeyboardOpen:o,footerKeyboardOpen:o&&a}}const kv="kb-update-banner-dismissed";function A8(){const[e,n]=i.useState(!0),[s,a]=i.useState(!1),[r,o]=i.useState(null),[l,c]=i.useState(null),[d,u]=i.useState(!1);i.useEffect(()=>{const m=sessionStorage.getItem(kv)==="true";u(m);let f=!1;return JC().then(p=>{f||p.disabled||(a(p.updateAvailable===!0),o(typeof p.latestVersion=="string"?p.latestVersion:null),c(typeof p.currentVersion=="string"?p.currentVersion:null))}).catch(()=>{}).finally(()=>{f||n(!1)}),()=>{f=!0}},[]);const h=i.useCallback(()=>{u(!0),sessionStorage.setItem(kv,"true")},[]);return{updateAvailable:s,latestVersion:r,currentVersion:l,loading:e,dismissed:d,dismiss:h}}const T8=["board","list","graph","agents","missions","chat","documents","research","evals","goalsView","skills","mailbox","insights","memory","reliability","secrets","devserver","dev-server","stash-recovery"];function I8(e){return e!==null&&T8.includes(e)}function vm(e){return e!==null&&(I8(e)||go(e))}const P8=Vl("fusion-plugin-roadmap","roadmaps");function jv(e){return e==="devserver"?"dev-server":e}function Nv(e){return e!=="roadmaps"?"board":Cy("fusion-plugin-roadmap","roadmaps")?P8:"board"}function $8(e){const{projectsLoading:n,projectsError:s,currentProjectLoading:a,currentProject:r,projectsLength:o,setupWizardOpen:l,openSetupWizard:c,themeMode:d,setThemeMode:u}=e,[h,m]=i.useState(()=>{if(typeof window<"u"){const y=window.localStorage.getItem("kb-dashboard-view-mode");if(y==="overview"||y==="project")return y}return"overview"}),[f,p]=i.useState(()=>{const y=ns("kb-dashboard-task-view");return y==="roadmaps"?Nv(y):vm(y)?y:"board"}),b=i.useRef(!1);i.useEffect(()=>{window.localStorage.setItem("kb-dashboard-view-mode",h)},[h]),i.useEffect(()=>{const y=ns("kb-dashboard-task-view",r?.id);if(y==="roadmaps")p(Nv(y));else if(vm(y)){const g=!b.current&&y==="devserver";p(g?"devserver":jv(y))}else p("board");r?.id&&(b.current=!0)},[r?.id]),i.useEffect(()=>{Ns("kb-dashboard-task-view",f,r?.id)},[r?.id,f]),i.useEffect(()=>{if(typeof window>"u")return;const y=new URLSearchParams(window.location.search).get("view");y&&vm(y)&&p(jv(y))},[]),i.useEffect(()=>{n||a||r&&h==="overview"&&m("project")},[n,a,r,h]),i.useEffect(()=>{if(n||a||l||s||o>0||r)return;const y=window.setTimeout(()=>{c()},500);return()=>window.clearTimeout(y)},[n,s,o,a,r,l,c]);const v=i.useCallback(y=>{p(y)},[]),x=i.useCallback(()=>{const y=["dark","light","system"],g=y.indexOf(d),j=y[(g+1)%y.length];u(j)},[d,u]);return{viewMode:h,setViewMode:m,taskView:f,setTaskView:p,handleChangeTaskView:v,handleToggleTheme:x}}const ym=new Map,D8=6e4;function L8(e){const[n,s]=i.useState([]),[a,r]=i.useState(!0),[o,l]=i.useState(null),[c,d]=i.useState(0),u=i.useRef(!1),h=i.useCallback(()=>{const m=e??"default";ym.delete(m),d(f=>f+1)},[e]);return i.useEffect(()=>{const m=e??"default";let f=!1;async function p(){const b=ym.get(m);if(b&&Date.now()<b.expiresAt){if(f)return;s(b.views),r(!1);return}u.current||r(!0),l(null);try{const v=await UM(e);if(f)return;ym.set(m,{views:v,expiresAt:Date.now()+D8}),s(v)}catch(v){if(f)return;l(v instanceof Error?v.message:"Failed to fetch plugin dashboard views")}finally{f||(r(!1),u.current=!0)}}return p(),()=>{f=!0}},[e,c]),i.useMemo(()=>({views:n,loading:a,error:o,refetch:h}),[n,a,o,h])}function O8({taskView:e,context:n}){return t.jsx($R,{viewId:e,context:n})}let Sv=!1;function Po(e,n){return function(){return i.createElement("span",null,`Bundled plugin view unavailable: ${e}#${n}`)}}async function F8(){const e="@fusion-plugin-examples/dependency-graph/dashboard-view",n="DependencyGraphDashboardView",a=(await qn(()=>import("./dashboard-view-D4XVI1XP.js"),__vite__mapDeps([28,1,29,6,7,8,30])))[n];return a?{default:a}:(console.warn(`[plugin-views] Missing export ${n} from ${e}`),{default:Po(e,n)})}async function z8(){const e="@fusion-plugin-examples/roadmap/dashboard-view",n="RoadmapDashboardView",a=(await qn(()=>import("./dashboard-view-BWGH_fAq.js"),__vite__mapDeps([31,1,29,32])))[n];return a?{default:a}:(console.warn(`[plugin-views] Missing export ${n} from ${e}`),{default:Po(e,n)})}async function B8(){const e="@fusion-plugin-examples/cli-printing-press/dashboard-view",n="CliPrintingPressWizardView";try{const a=(await import(e))[n];return a?{default:a}:(console.warn(`[plugin-views] Missing export ${n} from ${e}`),{default:Po(e,n)})}catch{return{default:Po(e,n)}}}async function U8(){const e="@fusion-plugin-examples/cli-printing-press/manage-view",n="CliPrintingPressManageView";try{const a=(await import(e))[n];return a?{default:a}:(console.warn(`[plugin-views] Missing export ${n} from ${e}`),{default:Po(e,n)})}catch{return{default:Po(e,n)}}}function pj(){Sv||(Sv=!0,oc("fusion-plugin-dependency-graph","graph",i.lazy(F8)),oc("fusion-plugin-roadmap","roadmaps",i.lazy(z8)),oc("fusion-plugin-cli-printing-press","wizard",i.lazy(B8)),oc("fusion-plugin-cli-printing-press","manage",i.lazy(U8)))}function H8(e){const{setCurrentProject:n,clearCurrentProject:s,setViewMode:a,currentProject:r,refreshProjects:o,toggleFavoriteProvider:l,toggleFavoriteModel:c,addToast:d,openSettings:u,openSetupWizard:h,closeSetupWizard:m,closeModelOnboarding:f}=e,p=i.useCallback(R=>{n(R),a("project")},[n,a]),b=i.useCallback(()=>{s(),a("overview")},[s,a]),v=i.useCallback(()=>{u()},[u]),x=i.useCallback(()=>{h()},[h]),y=i.useCallback(R=>{m(),n(R),a("project"),d(`Project ${R.name} registered successfully`,"success"),o()},[m,n,a,d,o]),g=i.useCallback(()=>{f()},[f]),j=i.useCallback(async R=>{try{await j_(R.id),d(`Project ${R.name} paused`,"success"),await o()}catch{d(`Failed to pause project ${R.name}`,"error")}},[d,o]),N=i.useCallback(async R=>{try{await N_(R.id),d(`Project ${R.name} resumed`,"success"),await o()}catch{d(`Failed to resume project ${R.name}`,"error")}},[d,o]),C=i.useCallback(async R=>{try{await hy(R.id),d(`Project ${R.name} removed`,"success"),r?.id===R.id&&(s(),a("overview")),await o()}catch{d(`Failed to remove project ${R.name}`,"error")}},[r,s,a,d,o]),w=i.useCallback(async R=>{try{await l(R)}catch{d("Failed to update favorites","error")}},[l,d]),S=i.useCallback(async R=>{try{await c(R)}catch{d("Failed to update model favorites","error")}},[c,d]);return{handleSelectProject:p,handleViewAllProjects:b,handleOpenSettings:v,handleAddProject:x,handleSetupComplete:y,handleModelOnboardingComplete:g,handlePauseProject:j,handleResumeProject:N,handleRemoveProject:C,handleToggleFavorite:w,handleToggleModelFavorite:S}}function q8(e){const{createTask:n,ingestCreatedTasks:s,onPlanningTaskCreated:a,onPlanningTasksCreated:r,onSubtaskTasksCreated:o,addToast:l}=e,c=i.useCallback(async p=>n({...p,column:"triage",source:{sourceType:"dashboard_ui"}}),[n]),d=i.useCallback(async p=>await n({...p,column:"triage",source:{sourceType:"dashboard_ui"}}),[n]),u=i.useCallback(p=>{s([p]),a(p,l)},[l,s,a]),h=i.useCallback(p=>{s(p),r(p,l)},[l,s,r]),m=i.useCallback(p=>{s(p),o(p,l)},[l,s,o]),f=i.useCallback(p=>{l(`Imported ${p.id} from GitHub`,"success")},[l]);return{handleBoardQuickCreate:c,handleModalCreate:d,handlePlanningTaskCreated:u,handlePlanningTasksCreated:h,handleSubtaskTasksCreated:m,handleGitHubImport:f}}function V8(e,n){const{projectId:s,searchQuery:a}=n??{},[r,o]=i.useState([]),[l,c]=i.useState([]),[d,u]=i.useState(null),[h,m]=i.useState(!1),[f,p]=i.useState(null),b=i.useRef(null),v=i.useCallback(async()=>{if(!e){o([]),c([]),u(null),m(!1),p(null);return}b.current?.abort();const y=new AbortController;b.current=y,m(!0),p(null);try{const g=[iR(e),aR(e)];s&&(g.push(rR(e,s,a)),g.push(oR(e,s)));const j=await Promise.allSettled(g);if(y.signal.aborted)return;const N=j[0],C=j[1];if(N.status==="rejected"){p(`Failed to fetch node health: ${N.reason}`),m(!1);return}if(u(N.value),C.status==="rejected"){p(`Failed to fetch projects: ${C.reason}`),m(!1);return}if(o(C.value),s&&j[2]){const w=j[2];if(w.status==="rejected"){p(`Failed to fetch tasks: ${w.reason}`),m(!1);return}w.status==="fulfilled"&&c(w.value)}m(!1)}catch(g){y.signal.aborted||(p(g instanceof Error?g.message:"Unknown error"),m(!1))}},[e,s,a]);i.useEffect(()=>(v(),()=>{b.current?.abort()}),[v]);const x=i.useCallback(()=>{v()},[v]);return{projects:r,tasks:l,health:d,loading:h,error:f,refresh:x}}function W8(e){const[n,s]=i.useState(!1),[a,r]=i.useState(null);return i.useEffect(()=>{if(!e){s(!1),r(null);return}const o=`/api/proxy/${encodeURIComponent(e)}/events`;return Si(o,{events:{"task:created":l=>{r({type:"task:created",data:l.data})},"task:moved":l=>{r({type:"task:moved",data:l.data})},"task:updated":l=>{r({type:"task:updated",data:l.data})},"task:deleted":l=>{r({type:"task:deleted",data:l.data})},"task:merged":l=>{r({type:"task:merged",data:l.data})}},onOpen:()=>s(!0),onError:()=>s(!1)})},[e]),{isConnected:n,lastEvent:a}}const G8="fusion-dashboard-current-node",gj=i.createContext(null);function K8({children:e}){const[n,s]=i.useState(null),[a,r]=i.useState(!0),o=i.useRef(!1),l=i.useRef(void 0);i.useEffect(()=>{let h=!1;async function m(){try{const f=await Ra();if(h)return;l.current=f.dashboardCurrentNodeId;const p=f.dashboardCurrentNodeId;if(p&&(o.current=!0),!p)try{const b=localStorage.getItem(G8);if(b){const v=JSON.parse(b);v?.id&&v?.type==="remote"&&(l.current=v.id,await Cs({dashboardCurrentNodeId:v.id}).catch(()=>{}))}}catch{}}catch{}finally{h||r(!1)}}return m(),()=>{h=!0}},[]),i.useEffect(()=>{if(!a)if(n&&n.type==="remote"&&n.id){const h=n.id;l.current!==h&&(l.current=h,Cs({dashboardCurrentNodeId:h}).catch(()=>{}))}else n===null&&l.current!==void 0&&(l.current=void 0,Cs({dashboardCurrentNodeId:void 0}).catch(()=>{}))},[n,a]);const c=i.useCallback(h=>{s(h)},[]),d=i.useCallback(()=>{s(null),l.current=void 0,Cs({dashboardCurrentNodeId:void 0}).catch(()=>{})},[]),u={currentNode:n,currentNodeId:n?.id??null,isRemote:n!==null&&n.type==="remote",setCurrentNode:c,clearCurrentNode:d};return t.jsx(gj.Provider,{value:u,children:e})}function J8(){const e=i.useContext(gj);if(e===null)throw new Error("useNodeContext must be used within a NodeProvider");return e}const Y8=["shellKind","shellMode","profileId","serverBaseUrl","serverLabel","shellCanOpenConnectionManager","hostKind","mode","connectionId","serverUrl","canOpenConnectionManager"],X8=["__FUSION_SHELL_HOST_CONTEXT__","__fusionShellHostContext","__FUSION_SHELL_CONTEXT__"];let yd=null,Cv=!1;function Q8(e){if(typeof e=="boolean")return e;if(typeof e=="string"){if(e==="1"||e==="true")return!0;if(e==="0"||e==="false")return!1}}function Z8(e){if(!(typeof e!="string"||e.trim().length===0))try{const n=new URL(e);return n.protocol!=="http:"&&n.protocol!=="https:"?void 0:n.toString().replace(/\/$/,"")}catch{return}}function bj(e){if(e==="browser"||e==="desktop-shell"||e==="mobile-shell")return e;if(e==="desktop")return"desktop-shell";if(e==="mobile")return"mobile-shell"}function eU(e){return e==="local"||e==="remote"?e:void 0}function xj(e){const n=eU(e.mode),s=typeof e.connectionId=="string"&&e.connectionId.trim()?e.connectionId:void 0,a=Z8(e.serverUrl),r=Q8(e.canOpenConnectionManager);return{kind:e.kind,...n?{mode:n}:{},...s?{connectionId:s}:{},...a?{serverUrl:a}:{},...r!==void 0?{canOpenConnectionManager:r}:{}}}function tU(e){for(const n of X8){const s=e[n];if(!s||typeof s!="object")continue;const a=s,r=bj(a.kind??a.shellKind??a.hostKind);if(r)return r==="browser"?{kind:r}:xj({kind:r,mode:a.mode??a.shellMode,connectionId:a.connectionId??a.profileId,serverUrl:a.serverUrl??a.serverBaseUrl,canOpenConnectionManager:a.canOpenConnectionManager??a.shellCanOpenConnectionManager})}return null}function nU(e){let n;try{n=new URL(e.location.href)}catch{return null}const s=n.searchParams,a=bj(s.get("hostKind")??s.get("kind")??s.get("shellKind"));return a?a==="browser"?{kind:a}:xj({kind:a,mode:s.get("mode")??s.get("shellMode"),connectionId:s.get("connectionId")??s.get("profileId"),serverUrl:s.get("serverUrl")??s.get("serverBaseUrl"),canOpenConnectionManager:s.get("canOpenConnectionManager")??s.get("shellCanOpenConnectionManager")}):null}function sU(e){try{const n=new URL(e.location.href);let s=!1;for(const r of Y8)n.searchParams.has(r)&&(n.searchParams.delete(r),s=!0);if(!s)return;const a=n.pathname+(n.search?n.search:"")+n.hash;e.history.replaceState(e.history.state,"",a)}catch{}}function iU(e=window){const n=tU(e);if(n)return n;const s=nU(e);return s||(typeof e.fusionAPI<"u"?{kind:"desktop-shell"}:{kind:"browser"})}function vj(e=window){return!Cv&&typeof window<"u"&&(yd=iU(e),sU(e),Cv=!0),yd??{kind:"browser"}}function aU(){return yd||(typeof window>"u"?{kind:"browser"}:vj(window))}const rU={kind:"browser"},yj=i.createContext({host:rU,isNativeShell:!1,kind:"browser"});function oU(e){const n=e.kind!=="browser";return{host:e,isNativeShell:n,kind:e.kind,...n?{mode:e.mode,connectionId:e.connectionId,serverUrl:e.serverUrl,canOpenConnectionManager:e.canOpenConnectionManager}:{}}}function lU({children:e}){const n=i.useMemo(()=>oU(aU()),[]);return t.jsx(yj.Provider,{value:n,children:e})}function cU(){return i.useContext(yj)}function dU(e,n){const s=new URL(e);return n&&s.searchParams.set("rt",n),s.toString()}function uU({open:e,shellApi:n,shellState:s,onComplete:a}){const[r,o]=i.useState(s.desktopMode??"remote"),[l,c]=i.useState("Remote Server"),[d,u]=i.useState(""),[h,m]=i.useState(""),[f,p]=i.useState(null),[b,v]=i.useState(!1),[x,y]=i.useState(!1),g=s.host==="desktop-shell";i.useEffect(()=>{g&&o(s.desktopMode??"remote")},[g,s.desktopMode]);const j=i.useMemo(()=>g&&r==="local"?!0:d.trim().length>0,[g,r,d]);return e?t.jsx("div",{className:"modal-overlay open",children:t.jsxs("div",{className:"modal native-shell-onboarding-modal",children:[t.jsx("div",{className:"modal-header",children:t.jsx("h2",{children:"Welcome to Fusion"})}),t.jsxs("div",{className:"native-shell-onboarding-body",children:[t.jsx("p",{children:"Fusion helps you plan, run, and review AI-assisted engineering work."}),g&&t.jsxs("div",{className:"native-shell-onboarding-mode-row",children:[t.jsx("button",{type:"button",className:`btn ${r==="local"?"btn-primary":""}`,onClick:()=>o("local"),children:"Local Fusion"}),t.jsx("button",{type:"button",className:`btn ${r==="remote"?"btn-primary":""}`,onClick:()=>o("remote"),children:"Remote Server"})]}),(!g||r==="remote")&&t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"btn",onClick:async()=>{p(null),v(!0);try{const N=await n.startQrScan();u(N.serverUrl),m(N.authToken??"")}catch(N){p(N.message)}finally{v(!1)}},disabled:b,children:b?"Scanning…":"Scan QR"}),t.jsx("label",{className:"native-shell-onboarding-label",htmlFor:"native-shell-onboarding-profile-name",children:"Profile name"}),t.jsx("input",{id:"native-shell-onboarding-profile-name",className:"input",value:l,onChange:N=>c(N.target.value)}),t.jsx("label",{className:"native-shell-onboarding-label",htmlFor:"native-shell-onboarding-server-url",children:"Server URL"}),t.jsx("input",{id:"native-shell-onboarding-server-url",className:"input",value:d,onChange:N=>u(N.target.value),placeholder:"https://your-fusion-host"}),t.jsx("label",{className:"native-shell-onboarding-label",htmlFor:"native-shell-onboarding-auth-token",children:"Auth token (optional)"}),t.jsx("input",{id:"native-shell-onboarding-auth-token",className:"input",type:"password",value:h,onChange:N=>m(N.target.value)})]}),f&&t.jsx("p",{className:"form-error",role:"alert",children:f})]}),t.jsx("div",{className:"modal-actions",children:t.jsx("button",{type:"button",className:"btn btn-primary",disabled:!j||x,onClick:async()=>{p(null),y(!0);try{if(g&&r==="local"){await n.setDesktopMode("local"),a();return}const N=await n.saveProfile({name:l.trim()||"Remote Server",serverUrl:d,authToken:h||null});if(g&&await n.setDesktopMode("remote"),await n.setActiveProfile(N.id),typeof window<"u"&&s.host!=="web"){window.location.href=dU(N.serverUrl,N.authToken??null);return}a()}catch(N){p(N.message)}finally{y(!1)}},children:x?"Saving…":"Continue"})})]})}):null}function mU({open:e,shellApi:n,shellState:s,onClose:a}){const r=i.useMemo(()=>s.profiles.find(w=>w.id===s.activeProfileId)??null,[s.activeProfileId,s.profiles]),[o,l]=i.useState(null),[c,d]=i.useState({}),[u,h]=i.useState(null),[m,f]=i.useState(null);if(!e)return null;const p=o==="__new__",b=p?null:s.profiles.find(w=>w.id===o)??r,v=c.name??b?.name??"",x=c.serverUrl??b?.serverUrl??"",y=c.authToken??b?.authToken??"",g=()=>{l(null),d({}),f(null)},j=async()=>{f(null);try{const w=new URL(x.trim());if(!/^https?:$/.test(w.protocol))throw new Error("Server URL must use http or https");const S=await n.saveProfile({id:p?void 0:o??b?.id,name:v||"Remote Server",serverUrl:x,authToken:y||null});await n.setActiveProfile(S.id),l(S.id),d({})}catch(w){f(w.message)}},N=async()=>{f(null);try{const w=await n.startQrScan();l("__new__"),d({name:"",serverUrl:w.serverUrl,authToken:w.authToken??""})}catch(w){f(w.message)}},C=async()=>{u&&(await n.deleteProfile(u.id),h(null),g())};return t.jsx("div",{className:"modal-overlay open",children:t.jsxs("div",{className:"modal native-shell-connection-manager",role:"dialog","aria-label":"Connection Manager",children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h2",{children:"Connection Manager"}),t.jsx("button",{type:"button",className:"modal-close",onClick:a,"aria-label":"Close",children:"×"})]}),s.host==="desktop-shell"&&t.jsxs("div",{className:"native-shell-connection-manager__mode-row",children:[t.jsx("button",{type:"button",className:`btn ${s.desktopMode==="local"?"btn-primary":""}`,onClick:()=>void n.setDesktopMode("local"),children:"Local"}),t.jsx("button",{type:"button",className:`btn ${s.desktopMode!=="local"?"btn-primary":""}`,onClick:()=>void n.setDesktopMode("remote"),children:"Remote"})]}),t.jsx("div",{className:"native-shell-connection-manager__profiles",children:s.profiles.length===0?t.jsxs("div",{className:"card native-shell-connection-manager__empty-state",children:[t.jsx("p",{className:"settings-muted",children:"No remote servers saved yet."}),t.jsxs("div",{className:"native-shell-connection-manager__profile-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>{l("__new__"),d({name:"",serverUrl:"",authToken:""}),f(null)},children:"Add server"}),s.host==="mobile-shell"&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void N(),children:"Scan QR"})]})]}):s.profiles.map(w=>t.jsxs("div",{className:"card native-shell-connection-manager__profile",children:[t.jsxs("div",{children:[t.jsx("strong",{children:w.name}),t.jsx("div",{className:"settings-muted",children:w.serverUrl}),w.id===s.activeProfileId&&t.jsx("span",{className:"native-shell-connection-manager__active-pill",children:"Active"})]}),t.jsxs("div",{className:"native-shell-connection-manager__profile-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm","aria-label":`Edit ${w.name}`,onClick:()=>{l(w.id),d(w)},children:"Edit"}),t.jsx("button",{type:"button",className:"btn btn-sm","aria-label":`Use ${w.name}`,onClick:()=>void n.setActiveProfile(w.id),children:"Use"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-danger","aria-label":`Delete ${w.name}`,onClick:()=>h(w),children:"Delete"})]})]},w.id))}),t.jsxs("div",{className:"native-shell-connection-manager__mode-row",children:[t.jsx("button",{type:"button",className:"btn",onClick:()=>{l("__new__"),d({name:"",serverUrl:"",authToken:""}),f(null)},children:"Add connection"}),s.host==="mobile-shell"&&t.jsx("button",{type:"button",className:"btn",onClick:()=>void N(),children:"Scan QR"})]}),t.jsxs("div",{className:"form-group native-shell-connection-manager__editor",children:[t.jsx("label",{htmlFor:"native-shell-connection-manager-name",children:"Name"}),t.jsx("input",{id:"native-shell-connection-manager-name",className:"input",value:v,onChange:w=>d(S=>({...S,name:w.target.value}))}),t.jsx("label",{htmlFor:"native-shell-connection-manager-url",children:"Server URL"}),t.jsx("input",{id:"native-shell-connection-manager-url",className:"input",value:x,onChange:w=>d(S=>({...S,serverUrl:w.target.value}))}),t.jsx("label",{htmlFor:"native-shell-connection-manager-token",children:"Auth token (optional)"}),t.jsx("input",{id:"native-shell-connection-manager-token",className:"input",type:"password",value:y??"",onChange:w=>d(S=>({...S,authToken:w.target.value}))}),m&&t.jsx("p",{className:"form-error",role:"alert",children:m})]}),u&&t.jsxs("div",{className:"native-shell-connection-manager__delete-confirm",role:"alertdialog","aria-label":"Delete server confirmation",children:[t.jsxs("p",{children:["Delete ",t.jsx("strong",{children:u.name}),"? This removes the saved profile."]}),t.jsxs("div",{className:"native-shell-connection-manager__profile-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>h(null),children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-danger",onClick:()=>void C(),children:"Delete"})]})]}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:a,children:"Close"}),t.jsx("button",{type:"button",className:"btn",onClick:g,children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void j(),disabled:!x.trim(),children:"Save"})]})]})})}function hU(e){if(e.hostKind==="desktop-shell"&&e.mode==="local")return{title:"Desktop local mode",actionLabel:"Switch server",dotClassName:"status-dot status-dot--online"};const n=e.profileLabel??e.profileId,s=e.serverOrigin,a=n&&s?`${n} · ${s}`:n??s;return e.mode==="remote"?{title:a??"Connection info unavailable",actionLabel:e.hostKind==="desktop-shell"?"Switch server":"Manage connections",dotClassName:a?"status-dot status-dot--online":"status-dot status-dot--pending"}:{title:a??"Connection info unavailable",actionLabel:"Manage connections",dotClassName:a?"status-dot status-dot--online":"status-dot status-dot--pending"}}function Ev({status:e,onError:n}){if(e.hostKind==="browser"||!e.available)return null;const s=hU(e),a=i.useCallback(async()=>{const r=await e.openConnectionManager();!r.ok&&r.reason==="failed"&&n?.(r.error??"Failed to open connection manager")},[n,e]);return t.jsxs("button",{type:"button",className:"btn shell-connection-status",onClick:()=>void a(),"data-testid":"shell-connection-status-button",children:[t.jsx("span",{className:s.dotClassName,"aria-hidden":"true"}),t.jsx("span",{className:"shell-connection-status__kind",children:e.hostKind==="desktop-shell"?"Desktop":"Mobile"}),t.jsx("span",{className:"shell-connection-status__summary",title:s.title,children:s.title}),t.jsx("span",{className:"shell-connection-status__action",children:s.actionLabel})]})}function fU(e){if(e)try{return new URL(e).origin}catch{return}}function pU(e,n){const s=e.profiles.find(a=>a.id===e.activeProfileId)??null;return s||(n.kind==="browser"||!n.connectionId?null:e.profiles.find(a=>a.id===n.connectionId)??null)}async function gU(e){if(!e?.getState)return null;try{return await e.getState()}catch{return null}}async function bU(e,n=window){const s=n.fusionAPI,a=n.fusionShell,r=await gU(a),o=r?pU(r,e):null,l=e.kind==="browser"?void 0:e.mode??r?.desktopMode,c=o?.id??(e.kind==="browser"?void 0:e.connectionId),d=o?.name,u=fU(o?.serverUrl??(e.kind==="browser"?void 0:e.serverUrl)),h=e.kind==="desktop-shell"&&typeof s?.openConnectionManager=="function",m=e.kind==="mobile-shell"&&typeof a?.openConnectionManager=="function",f=h||m;return{hostKind:e.kind,available:f,...l?{mode:l}:{},...c?{profileId:c}:{},...d?{profileLabel:d}:{},...u?{serverOrigin:u}:{},openConnectionManager:async()=>{try{return h?(await s.openConnectionManager?.(),{ok:!0}):m?(await a.openConnectionManager(),{ok:!0}):{ok:!1,reason:"unsupported"}}catch(p){return{ok:!1,reason:"failed",error:p instanceof Error?p.message:String(p)}}}}}function xU({open:e}){const[n,s]=i.useState(""),a=i.useRef(null);i.useEffect(()=>{e&&a.current?.focus()},[e]);const r=i.useCallback(()=>{const l=n.trim();l&&(kC(l),window.location.reload())},[n]),o=i.useCallback(()=>{jC(),window.location.reload()},[]);return e?t.jsx("div",{className:"modal-overlay open auth-token-recovery-overlay",role:"presentation",onKeyDownCapture:l=>{l.key==="Escape"&&(l.preventDefault(),l.stopPropagation())},children:t.jsxs("div",{className:"modal modal-md",role:"dialog","aria-modal":"true","aria-labelledby":"auth-token-recovery-title","aria-describedby":"auth-token-recovery-description",children:[t.jsx("div",{className:"modal-header auth-token-recovery-header",children:t.jsx("h3",{id:"auth-token-recovery-title",children:"Authentication token required"})}),t.jsxs("div",{className:"auth-token-recovery-content",children:[t.jsx("p",{id:"auth-token-recovery-description",children:"This dashboard session can't authenticate with the daemon. Set a replacement token or clear the current token and retry."}),t.jsxs("div",{className:"auth-token-recovery-field",children:[t.jsx("label",{htmlFor:"auth-token-recovery-input",children:"Replacement token"}),t.jsx("input",{ref:a,id:"auth-token-recovery-input",className:"input",type:"password",value:n,onChange:l=>s(l.target.value),placeholder:"Paste token",autoComplete:"off",spellCheck:!1})]})]}),t.jsxs("div",{className:"modal-actions auth-token-recovery-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:o,children:"Clear token and retry"}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:r,disabled:n.trim().length===0,children:"Set token and reload"})]})]})}):null}const vU=i.lazy(()=>qn(()=>import("./AgentsView-UbCAHs_i.js"),__vite__mapDeps([33,1,4,5,34,17,6,7,8,35])).then(e=>({default:e.AgentsView}))),yU=i.lazy(()=>qn(()=>import("./DocumentsView-tqpIZ9t9.js"),__vite__mapDeps([36,1,6,7,8,37])).then(e=>({default:e.DocumentsView}))),wU=i.lazy(()=>qn(()=>import("./InsightsView-BYfsVobi.js"),__vite__mapDeps([38,1,24,6,7,8,39])).then(e=>({default:e.InsightsView}))),kU=i.lazy(()=>qn(()=>import("./ResearchView-Bv4igpnv.js"),__vite__mapDeps([40,1,6,7,8,41])).then(e=>({default:e.ResearchView}))),jU=i.lazy(()=>qn(()=>import("./EvalsView-C_Br3ry8.js"),__vite__mapDeps([42,1,6,7,8,43])).then(e=>({default:e.EvalsView}))),NU=i.lazy(()=>qn(()=>import("./NodesView-Dx6HFqjI.js"),__vite__mapDeps([44,1,19,34,6,7,8,45])).then(e=>({default:e.NodesView}))),SU=i.lazy(()=>qn(()=>import("./ChatView-DDDjYRKc.js"),__vite__mapDeps([46,1,6,7,8,47])).then(e=>({default:e.ChatView}))),CU=i.lazy(()=>qn(()=>import("./SkillsView-I1SDKaRz.js"),__vite__mapDeps([48,1,6,7,8,49])).then(e=>({default:e.SkillsView}))),EU=i.lazy(()=>qn(()=>import("./MemoryView-DT4vIhaW.js"),__vite__mapDeps([50,1,22,23,6,7,8,51])).then(e=>({default:e.MemoryView}))),_U=i.lazy(()=>qn(()=>import("./SecretsView-C4VX2ZTa.js"),__vite__mapDeps([25,1,6,7,8,26])).then(e=>({default:e.SecretsView}))),MU=i.lazy(()=>qn(()=>import("./ReliabilityView-C1C1j1SD.js"),__vite__mapDeps([52,1,53])).then(e=>({default:e.ReliabilityView}))),RU=i.lazy(()=>qn(()=>import("./DevServerView-DY5GlJcD.js"),__vite__mapDeps([54,1,6,7,8,55])).then(e=>({default:e.DevServerView})));i.lazy(()=>qn(()=>import("./TodoView-PKvJKjtV.js"),__vite__mapDeps([13,1,6,7,8,14])).then(e=>({default:e.TodoView})));const AU=i.lazy(()=>qn(()=>import("./GoalsView-CI3Bzs1b.js"),__vite__mapDeps([56,1,6,7,8,57])).then(e=>({default:e.GoalsView}))),TU=i.lazy(()=>qn(()=>import("./StashRecoveryView-DMUUR3cy.js"),__vite__mapDeps([58,1,6,7,8,59])).then(e=>({default:e.StashRecoveryView})));function IU(){(typeof window<"u"&&window.requestIdleCallback||(n=>setTimeout(n,200)))(()=>{qn(()=>import("./AgentsView-UbCAHs_i.js"),__vite__mapDeps([33,1,4,5,34,17,6,7,8,35])),qn(()=>import("./DocumentsView-tqpIZ9t9.js"),__vite__mapDeps([36,1,6,7,8,37])),qn(()=>import("./InsightsView-BYfsVobi.js"),__vite__mapDeps([38,1,24,6,7,8,39])),qn(()=>import("./ResearchView-Bv4igpnv.js"),__vite__mapDeps([40,1,6,7,8,41])),qn(()=>import("./EvalsView-C_Br3ry8.js"),__vite__mapDeps([42,1,6,7,8,43])),qn(()=>import("./NodesView-Dx6HFqjI.js"),__vite__mapDeps([44,1,19,34,6,7,8,45])),qn(()=>import("./ChatView-DDDjYRKc.js"),__vite__mapDeps([46,1,6,7,8,47])),qn(()=>import("./SkillsView-I1SDKaRz.js"),__vite__mapDeps([48,1,6,7,8,49])),qn(()=>import("./MemoryView-DT4vIhaW.js"),__vite__mapDeps([50,1,22,23,6,7,8,51])),qn(()=>import("./SecretsView-C4VX2ZTa.js"),__vite__mapDeps([25,1,6,7,8,26])),qn(()=>import("./ReliabilityView-C1C1j1SD.js"),__vite__mapDeps([52,1,53])),qn(()=>import("./DevServerView-DY5GlJcD.js"),__vite__mapDeps([54,1,6,7,8,55])),qn(()=>import("./TodoView-PKvJKjtV.js"),__vite__mapDeps([13,1,6,7,8,14])),qn(()=>import("./GoalsView-CI3Bzs1b.js"),__vite__mapDeps([56,1,6,7,8,57])),qn(()=>import("./StashRecoveryView-DMUUR3cy.js"),__vite__mapDeps([58,1,6,7,8,59]))})}pj();const wm="kb-setup-warning-dismissed",_v="kb-dashboard-working-branch-filter",Mv="kb-dashboard-base-branch-filter",Rv="__fusion:no-branch__",wj="fusion:approval-banner-dismissed",Vc="kb-capacity-risk-banner-dismissed",PU=.8;function $U(e,n){return e==="awaiting-approval"&&n!=="awaiting-approval"}function Av(e){if(!e)return 0;const n=Date.parse(e);return Number.isFinite(n)?n:0}function DU(){if(typeof window>"u")return new Map;try{const e=window.localStorage.getItem(wj);if(!e)return new Map;const n=JSON.parse(e),s=new Map;for(const[a,r]of Object.entries(n))typeof r=="number"&&Number.isFinite(r)&&s.set(a,r);return s}catch{return new Map}}function Tv(e){if(!(typeof window>"u"))try{const n={};for(const[s,a]of e)n[s]=a;window.localStorage.setItem(wj,JSON.stringify(n))}catch{}}function LU(e,n){const s=new URL(e);return n&&s.searchParams.set("rt",n),s.toString()}function OU(e,n,s){return!n||s||e.host==="web"?!1:e.host==="mobile-shell"?!e.activeProfileId:e.desktopMode==="local"?!1:!e.activeProfileId}function FU(e,n){return e&&n===0}function zU(){const{toasts:e,addToast:n,removeToast:s}=v8(),{shellApi:a,state:r,ready:o,openConnectionManagerSignal:l}=Vk(),c=cU();i.useEffect(()=>{IU()},[]);const{projects:d,loading:u,error:h,refresh:m}=f8(),{nodes:f}=Td(),{currentNode:p,currentNodeId:b,isRemote:v,setCurrentNode:x,clearCurrentNode:y}=J8(),{currentProject:g,setCurrentProject:j,clearCurrentProject:N,loading:C}=b8(d,{nodeId:b}),{hasAiProvider:w,hasGithub:S,loading:R,hasWarnings:I}=Bk(g?.id),{updateAvailable:E,latestVersion:M,currentVersion:G,dismissed:U,dismiss:P}=A8();i.useEffect(()=>{if(b&&!p&&f.length>0){const ze=f.find(Ot=>Ot.id===b);if(ze){x(ze);return}}b&&f.length>0&&(f.some(Ot=>Ot.id===b)||y())},[b,p,f,x,y]);const[T,D]=i.useState(""),[W,Y]=i.useState(""),[L,_]=i.useState("");i.useEffect(()=>{Y(ns(_v,g?.id)??""),_(ns(Mv,g?.id)??"")},[g?.id]);const F=i.useCallback(ze=>{Y(ze),Ns(_v,ze,g?.id)},[g?.id]),ae=i.useCallback(ze=>{_(ze),Ns(Mv,ze,g?.id)},[g?.id]),k=V8(b,{projectId:g?.id,searchQuery:T||void 0});W8(b);const z=v&&k.projects.length>0?k.projects:d,{themeMode:J,colorTheme:oe,dashboardFontScalePct:le,setThemeMode:we,setColorTheme:re,setDashboardFontScalePct:H}=C8(),{sessions:ue,generating:Q,needsInput:be,planningSessions:fe,dismissSession:O}=a8(g?.id),se=ue.filter(ze=>ze.status==="awaiting_input"||ze.status==="error"),ve=l8(),A=E8({projectId:g?.id,planningSessions:fe}),ye=$i()==="mobile",{pushNav:ee,replaceCurrent:ge}=QO({enabled:!0}),{viewMode:Ne,setViewMode:He,taskView:Le,handleChangeTaskView:de}=$8({projectsLoading:u,projectsError:h,currentProjectLoading:C,currentProject:g,projectsLength:d.length,setupWizardOpen:A.setupWizardOpen,openSetupWizard:A.openSetupWizard,themeMode:J,setThemeMode:we}),{views:Re}=L8(g?.id),Pe=i.useMemo(()=>{const ze=Re.find(Ot=>Ot.pluginId==="fusion-plugin-dependency-graph"&&Ot.view.viewId==="graph");return ze?`plugin:${ze.pluginId}:${ze.view.viewId}`:Cy("fusion-plugin-dependency-graph","graph")?"plugin:fusion-plugin-dependency-graph:graph":null},[Re]),rt=i.useCallback(ze=>{ze==="missions"&&(Me(void 0),Qe(void 0),gn(void 0));const Ot=Le;de(ze),Ot!==ze&&ee({type:"view",revert:()=>de(Ot)})},[de,Le,ee]),qe=Le==="board"||Le==="list",{tasks:Xe,isStale:At,createTask:at,moveTask:Se,pauseTask:pe,unpauseTask:_e,deleteTask:et,mergeTask:Ae,retryTask:it,resetTask:xt,updateTask:Nt,duplicateTask:Ut,archiveTask:Be,unarchiveTask:Z,archiveAllDone:Oe,loadArchivedTasks:ht,refreshTasks:je,ingestCreatedTasks:mt,lastFetchTimeMs:Et}=d8({...g?{projectId:g.id}:{},searchQuery:T||void 0,sseEnabled:qe}),Te=i.useRef(Le);i.useEffect(()=>{const ze=Te.current;!(ze==="board"||ze==="list")&&(Le==="board"||Le==="list")&&je(),Te.current=Le},[Le,je]);const xe=v&&k.tasks.length>0?k.tasks:Xe,[gt,_t]=i.useState(0),Ft=i.useRef(performance.now()),Dt=i.useRef(!1),nt=i.useRef(!1),Wt=i.useRef(!1),Mt=i.useMemo(()=>u?"projects":C?"project":"tasks",[u,C]);i.useEffect(()=>{if(!u&&!Dt.current){Dt.current=!0;const ze=`projects loaded at ${Math.round(performance.now()-Ft.current)}ms from mount`;console.log(`[App] ${ze}`)}if(!C&&!nt.current){nt.current=!0;const ze=`current-project resolved at ${Math.round(performance.now()-Ft.current)}ms from mount`;console.log(`[App] ${ze}`)}},[u,C]);const Kt=!u&&!C,xn=FU(u,d.length);i.useEffect(()=>{if(!Kt||Wt.current)return;Wt.current=!0;const ze=`dashboard ready at ${Math.round(performance.now()-Ft.current)}ms from mount`;console.log(`[App] ${ze}`)},[Kt]);const{keyboardOpen:Tn}=Ia({enabled:ye}),{footerHidden:Sn,navKeyboardOpen:is,footerKeyboardOpen:On}=R8({isMobile:ye,keyboardOpen:Tn,anyModalOpen:A.anyModalOpen,isIOS:Hh()}),un=Sn,tn=is;ta(un);const[on,pn]=i.useState(0),[mn,Zn]=i.useState(0),[In,rn]=i.useState(!1),[hn,Pn]=i.useState(0),[nn,$t]=i.useState(null),Jt=i.useRef(new Map),Qt=i.useRef(new Set),ie=i.useRef(DU()),Fe=i.useCallback(()=>{xy(g?.id).then(ze=>{pn(ze.unreadCount),Zn(ze.pendingApprovalCount??0)}).catch(ze=>{console.warn("[App] Failed to fetch mailbox unread count:",ze)})},[g?.id]);i.useEffect(()=>{const ze=new Map,Ot=new Set;for(const vn of Xe)ze.set(vn.id,vn.status),vn.status==="awaiting-approval"&&Ot.add(`task:${vn.id}`);Jt.current=ze,Qt.current=Ot},[Xe]),i.useEffect(()=>{Fe();const ze=new URLSearchParams;g?.id&&ze.set("projectId",g.id);const Ot=ze.size>0?`?${ze.toString()}`:"",vn=Ms=>{const Ds=ie.current.get(Ms.dedupeKey);Ds!==void 0&&Ms.updatedAtMs<=Ds||$t(Ms)};return Si(`/api/events${Ot}`,{onReconnect:Fe,events:{"message:sent":Fe,"message:received":Fe,"message:read":Fe,"message:deleted":Fe,"approval:requested":Ms=>{Fe();try{const Ds=JSON.parse(Ms.data),wi=Ds.id?`approval:${Ds.id}`:Ds.taskId?`task:${Ds.taskId}`:void 0;if(!wi||Qt.current.has(wi))return;Qt.current.add(wi),vn({dedupeKey:wi,updatedAtMs:Av(Ds.updatedAt??Ds.createdAt)})}catch{}},"approval:updated":Fe,"approval:decided":Fe,"task:updated":Ms=>{try{const Ds=JSON.parse(Ms.data);if(!Ds?.id)return;const wi=`task:${Ds.id}`,zd=Jt.current.get(Ds.id);if(Jt.current.set(Ds.id,Ds.status),Ds.status!=="awaiting-approval"){Qt.current.delete(wi),ie.current.delete(wi),Tv(ie.current);return}if(Qt.current.has(wi))return;$U(Ds.status,zd)&&(Qt.current.add(wi),vn({dedupeKey:wi,updatedAtMs:Av(Ds.updatedAt)}),Fe())}catch{}}}})},[g?.id,Fe]),i.useEffect(()=>{Le==="chat"&&rn(!1)},[Le]),i.useEffect(()=>{let ze=!1;const Ot=async()=>{try{const Ms=await $("/stash-recovery/orphans");ze||Pn(Ms.count??0)}catch{ze||Pn(0)}};Ot();const vn=window.setInterval(()=>void Ot(),3e4);return()=>{ze=!0,window.clearInterval(vn)}},[g?.id]),i.useEffect(()=>{const ze=new URLSearchParams;g?.id&&ze.set("projectId",g.id);const Ot=ze.size>0?`?${ze.toString()}`:"";return Si(`/api/events${Ot}`,{events:{"chat:message:added":vn=>{try{const Ms=JSON.parse(vn.data);if(Ms.role!=="assistant"||Le==="chat"||Ms.projectId&&g?.id&&Ms.projectId!==g.id)return;rn(!0)}catch{}},"chat:room:message:added":vn=>{try{const Ms=JSON.parse(vn.data);if(Ms.role==="user"||Le==="chat"||Ms.projectId&&g?.id&&Ms.projectId!==g.id)return;rn(!0)}catch{}}}})},[g?.id,Le]);const Je=i.useMemo(()=>Array.from(new Set(xe.map(ze=>ze.branch?.trim()).filter(ze=>!!(ze&&ze.length>0)))).sort((ze,Ot)=>ze.localeCompare(Ot)),[xe]),tt=i.useMemo(()=>Array.from(new Set(xe.map(ze=>ze.baseBranch?.trim()).filter(ze=>!!(ze&&ze.length>0)))).sort((ze,Ot)=>ze.localeCompare(Ot)),[xe]),Ye=i.useMemo(()=>xe.filter(ze=>{const Ot=ze.branch?.trim()??"",vn=ze.baseBranch?.trim()??"";if(W===Rv){if(Ot.length>0)return!1}else if(W.length>0&&Ot!==W)return!1;if(L===Rv){if(vn.length>0)return!1}else if(L.length>0&&vn!==L)return!1;return!0}),[xe,W,L]),[vt,pt]=i.useState(!1),[Zt,ce]=i.useState(!1),[Ge,Me]=i.useState(void 0),[Ke,Qe]=i.useState(void 0),[Lt,gn]=i.useState(void 0),[Bn,wn]=i.useState(!1),[Yt,$n]=i.useState(!1),[dn,me]=i.useState(null),[jt,Cn]=i.useState(!1),[bs,Ts]=i.useState(null),[kn,ls]=i.useState(()=>ns(wm,g?.id)==="true"),[cs,ys]=i.useState(()=>ns(Vc,g?.id)==="true");i.useEffect(()=>{ls(ns(wm,g?.id)==="true")},[g?.id]),i.useEffect(()=>{ys(ns(Vc,g?.id)==="true")},[g?.id]);const xs=i.useCallback(async()=>{Cn(!0),Ts(null);try{const ze=await ey();me(ze)}catch(ze){Ts(ze instanceof Error?ze.message:"Failed to refresh database health.")}finally{Cn(!1)}},[]);i.useEffect(()=>{let ze=!1;return IC().then(Ot=>{ze||me(Ot)}).catch(()=>{ze||me(null)}),()=>{ze=!0}},[]),i.useEffect(()=>{const ze=()=>{$n(!0)};return window.addEventListener(Tm,ze),()=>{window.removeEventListener(Tm,ze)}},[]);const he=i.useCallback(()=>{Ns(wm,"true",g?.id),ls(!0)},[g?.id]),bt=i.useCallback(()=>{Ns(Vc,"true",g?.id),ys(!0)},[g?.id]),{maxConcurrent:ot,autoMerge:St,globalPaused:lt,enginePaused:Tt,isTestMode:Xt,taskStuckTimeoutMs:zt,staleHighFanoutBlockerAgeThresholdMs:Ee,capacityRiskBannerEnabled:yt,capacityRiskTodoThreshold:Rt,showQuickChatFAB:yn,maxTotalRetriesBeforeFail:_n,prAuthAvailable:Dn,settingsLoaded:an,experimentalFeatures:En,insightsEnabled:ws,memoryEnabled:Is,devServerEnabled:ks,todosEnabled:V,goalsEnabled:We,toggleAutoMerge:wt,toggleGlobalPause:ut,toggleEnginePause:Bt,refresh:en}=aj(g?.id),{stats:jn}=ij(g?.id),ts=i.useMemo(()=>xe.filter(ze=>ze.column==="in-progress").length,[xe]),vs=i.useMemo(()=>xe.filter(ze=>ze.column==="in-review").length,[xe]),Ps=i.useMemo(()=>aC({todoCount:jn?.todoTaskCount??0,inProgressCount:ts,inReviewCount:vs,idleNonEphemeralAgentCount:jn?.idleNonEphemeralCount??0,threshold:Rt??iC}),[jn?.todoTaskCount,jn?.idleNonEphemeralCount,ts,vs,Rt]),te=i.useRef(yt),Ie=i.useRef(Rt),ft=i.useRef(g?.id),Vt=i.useRef(!1);i.useEffect(()=>{if(!an)return;if(!Vt.current||ft.current!==g?.id){Vt.current=!0,ft.current=g?.id,te.current=yt,Ie.current=Rt;return}const ze=te.current,Ot=Ie.current;(!ze&&yt||Ot!==Rt)&&(qi(Vc,g?.id),ys(!1)),ft.current=g?.id,te.current=yt,Ie.current=Rt},[an,yt,Rt,g?.id]);const qt=En.skillsView===!0,ln=En.nodesView===!0,Mn=En.researchView===!0,Rn=En.evalsView===!0,Kn=En.agentOnboarding===!0,ds=!0,Jn=i.useCallback(()=>{A.closeSettings(),_t(ze=>ze+1),en()},[A,en]);i.useEffect(()=>{if(an&&!go(Le)){if(Le==="graph"&&!Pe){de("board");return}Le==="skills"&&!qt&&de("board"),Le==="insights"&&!ws&&de("board"),Le==="memory"&&!Is&&de("board"),(Le==="devserver"||Le==="dev-server")&&!ks&&de("board"),Le==="research"&&!Mn&&de("board"),Le==="evals"&&!Rn&&de("board"),Le==="goalsView"&&!We&&de("board")}},[Le,an,qt,ws,de,ds,Is,ks,Mn,Rn,We,Pe]),i.useEffect(()=>{vt&&!ln&&pt(!1)},[vt,ln]);const{availableModels:Us,favoriteProviders:X,favoriteModels:$e,toggleFavoriteProvider:Ue,toggleFavoriteModel:Ht}=fk();M8({projectId:g?.id,setupWizardOpen:A.setupWizardOpen,openModelOnboarding:A.openModelOnboarding,openSettings:A.openSettings});const{handleSelectProject:cn,handleViewAllProjects:Un,handleAddProject:as,handleSetupComplete:$s,handleModelOnboardingComplete:Fs,handlePauseProject:js,handleResumeProject:Zs,handleRemoveProject:ei,handleToggleFavorite:ti,handleToggleModelFavorite:Ei}=H8({setCurrentProject:j,clearCurrentProject:N,setViewMode:He,currentProject:g,refreshProjects:m,toggleFavoriteProvider:Ue,toggleFavoriteModel:Ht,addToast:n,openSettings:A.openSettings,openSetupWizard:A.openSetupWizard,closeSetupWizard:A.closeSetupWizard,closeModelOnboarding:A.closeModelOnboarding}),{handleDetailClose:_i}=_8({projectId:g?.id,projects:d,projectsLoading:u,currentProject:g,setCurrentProject:j,addToast:n,openTaskDetail:A.openDetailTask,closeTaskDetail:A.closeDetailTask}),$r=i.useCallback(async({insightId:ze,title:Ot,description:vn})=>{await at({title:Ot,description:vn,column:"triage",source:{sourceType:"dashboard_ui",sourceMetadata:{origin:"insights",insightId:ze}}})},[at]),{handleBoardQuickCreate:Pa,handleModalCreate:Uo,handlePlanningTaskCreated:Dr,handlePlanningTasksCreated:Lr,handleSubtaskTasksCreated:$a,handleGitHubImport:Da}=q8({createTask:at,ingestCreatedTasks:mt,onPlanningTaskCreated:A.onPlanningTaskCreated,onPlanningTasksCreated:A.onPlanningTasksCreated,onSubtaskTasksCreated:A.onSubtaskTasksCreated,addToast:n}),La=i.useCallback((ze,Ot)=>{Ot==="changes"?A.openDetailWithChangesTab(ze):A.openDetailTask(ze,Ot),ee({type:"modal",close:A.closeDetailTask})},[A,ee]),_s=i.useCallback(async ze=>{try{const Ot=await Sr(ze,g?.id);A.openDetailTask(Ot,"logs"),ee({type:"modal",close:A.closeDetailTask})}catch(Ot){n(`Failed to open task logs: ${Ot.message}`,"error")}},[A,g?.id,n,ee]),[na,Li]=i.useState([]);i.useEffect(()=>{let ze=!1;return Bl(g?.id).then(Ot=>{ze||Li(Ot)}).catch(()=>{ze||Li([])}),()=>{ze=!0}},[g?.id]);const Or=i.useMemo(()=>new Map(na.map(ze=>[ze.id,ze.name])),[na]);i.useCallback(()=>{ln&&pt(ze=>!ze)},[ln]);const sa=i.useCallback(()=>{ln&&(vt?pt(!1):(pt(!0),ee({type:"view",revert:()=>pt(!1)})))},[ln,vt,ee]),Oi=i.useCallback((ze,Ot,vn)=>{A.openDetailTask(ze,Ot,vn),ee({type:"modal",close:A.closeDetailTask})},[A,ee]),ya=i.useCallback(ze=>{A.openSettings(ze),ee({type:"modal",close:Jn})},[A,ee,Jn]),Fr=i.useCallback(()=>{A.openNewTask(),ee({type:"modal",close:A.closeNewTask})},[A,ee]),zr=i.useCallback(()=>{A.openPlanning(),ee({type:"modal",close:A.closePlanning})},[A,ee]),Br=i.useCallback(ze=>{A.openPlanningWithInitialPlan(ze),ee({type:"modal",close:A.closePlanning})},[A,ee]),Vn=i.useCallback(()=>{A.resumePlanning(),ee({type:"modal",close:A.closePlanning})},[A,ee]),ir=i.useCallback(ze=>{A.openSubtaskBreakdown(ze),ee({type:"modal",close:A.closeSubtask})},[A,ee]),Oa=i.useCallback(()=>{A.openGitHubImport(),ee({type:"modal",close:A.closeGitHubImport})},[A,ee]),Fa=i.useCallback(()=>{A.terminalOpen?A.toggleTerminal():(A.toggleTerminal(),ee({type:"modal",close:A.closeTerminal}))},[A,ee]),Ur=i.useCallback((ze,Ot)=>{A.openFiles(ze,Ot),ee({type:"modal",close:A.closeFiles})},[A,ee]),Hr=i.useCallback((ze,Ot)=>{A.openFiles(Ot?.workspace,ze),ee({type:"modal",close:A.closeFiles})},[A,ee]),wa=i.useCallback(()=>{A.openTodos(),ee({type:"modal",close:A.closeTodos})},[A,ee]),ka=i.useCallback(()=>{A.openActivityLog(),ee({type:"modal",close:A.closeActivityLog})},[A,ee]),qr=i.useCallback(()=>{A.openGitManager(),ee({type:"modal",close:A.closeGitManager})},[A,ee]),Vr=i.useCallback(()=>{A.openSystemStats(),ee({type:"modal",close:A.closeSystemStats})},[A,ee]),ar=i.useCallback(()=>{A.openSchedules(),ee({type:"modal",close:A.closeSchedules})},[A,ee]),rr=i.useCallback(()=>{A.openScripts(),ee({type:"modal",close:A.closeScripts})},[A,ee]),or=i.useCallback(()=>{A.openWorkflowSteps(),ee({type:"modal",close:A.closeWorkflowSteps})},[A,ee]),lr=i.useCallback(ze=>{A.openUsage(ze),ee({type:"modal",close:A.closeUsage})},[A,ee]),cr=i.useCallback(async(ze,Ot)=>{await A.runScript(ze,Ot),ge({type:"modal",close:A.closeTerminal})},[A,ge]),Mi=i.useCallback(()=>{A.closeSettings(),A.openModelOnboarding(),ge({type:"modal",close:A.closeModelOnboarding})},[A,ge]),ia=i.useCallback(()=>{A.setFileWorkspace("project"),A.openFiles()},[A]),B=i.useCallback(async()=>{ce(!0);try{await m()}finally{ce(!1)}},[m]),De=i.useCallback(ze=>{Qe(ze),Me(void 0),de("missions")},[de]),Ve=i.useCallback(ze=>{ze.type==="planning"?A.openPlanningWithSession(ze.id):ze.type==="subtask"?A.openSubtaskWithSession(ze.id):ze.type==="mission_interview"?(Qe(void 0),Me(ze.id),gn(void 0),de("missions")):(ze.type==="milestone_interview"||ze.type==="slice_interview")&&(Me(void 0),Qe(void 0),gn(ze.id),de("missions"))},[de,A]),kt=i.useCallback(()=>{},[]),zn=i.useCallback(()=>{},[]),[Gt,Yn]=i.useState(!1),[us,Ze]=i.useState(!1),[dt,sn]=i.useState(null),Gn=OU(r,o,Gt);i.useEffect(()=>{!a||l===0||Ze(!0)},[a,l]),i.useEffect(()=>{let ze=!1;return bU(c.host).then(Ot=>{ze||sn(Ot)}),()=>{ze=!0}},[c.host,r.activeProfileId,r.desktopMode,r.host,r.profiles]),i.useEffect(()=>{r.host==="desktop-shell"&&r.desktopMode==="local"&&(r.localServer?.status!=="ready"||!r.localServer.port||window.location.port!==String(r.localServer.port)&&(window.location.href=`http://localhost:${r.localServer.port}`))},[r]),i.useEffect(()=>{if(r.host!=="desktop-shell"||r.desktopMode!=="remote")return;const ze=r.profiles.find(vn=>vn.id===r.activeProfileId);if(!ze||typeof window>"u")return;const Ot=LU(ze.serverUrl,ze.authToken??null);window.location.href!==Ot&&(window.location.href=Ot)},[r]);const fs=!u&&!C&&d.length===0&&!g&&!!h,Xn=()=>{if(fs)return t.jsx(D5,{errorMessage:h??"Failed to fetch projects",isRetrying:Zt,onRetry:B,onManageConnection:a?()=>{a.openConnectionManager()}:void 0});if(vt)return t.jsx("div",{className:"nodes-management-overlay",children:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(NU,{addToast:n,onClose:()=>pt(!1)})})})});if(Ne==="overview")return t.jsx(Gs,{children:t.jsx(YO,{projects:d,loading:u,onSelectProject:cn,onAddProject:as,onPauseProject:js,onResumeProject:Zs,onRemoveProject:ei,nodes:f})});const ze=Le==="graph"?Pe:go(Le)?Le:null;return ze?t.jsx(Gs,{children:t.jsx(O8,{taskView:ze,context:{projectId:g?.id,tasks:v&&k.tasks.length>0?k.tasks:Xe,workflowSteps:na,openTaskDetail:(Ot,vn)=>Oi(Ot,vn),renderTaskCard:Ot=>t.jsx(Al,{task:Ot,projectId:g?.id,onOpenDetail:vn=>Oi(vn),addToast:n,workflowStepNameLookup:Or,disableDrag:!0,prAuthAvailable:Dn,autoMergeEnabled:St}),addToast:n}})}):Le==="skills"?!an||!qt?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(CU,{addToast:n,projectId:g?.id,onClose:()=>de("board")})})}):Le==="chat"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(SU,{addToast:n,projectId:g?.id,experimentalFeatures:En})})}):Le==="mailbox"?t.jsx(Gs,{children:t.jsx(ZF,{projectId:g?.id,addToast:n,onUnreadCountChange:pn})}):Le==="missions"?t.jsx(Gs,{children:t.jsx(qF,{isInline:!0,isOpen:!0,onClose:()=>{Qe(void 0),Me(void 0),gn(void 0),de("board")},addToast:n,projectId:g?.id,onSelectTask:Ot=>{const vn=Xe.find(Ms=>Ms.id===Ot);vn&&Oi(vn)},availableTasks:Xe.map(Ot=>({id:Ot.id,title:Ot.title})),resumeSessionId:Ge,targetMissionId:Ke,milestoneSliceResumeSessionId:Lt,onMilestoneSliceResumeFetchError:()=>gn(void 0)})}):Le==="agents"&&ds?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(vU,{addToast:n,projectId:g?.id,onOpenTaskLogs:_s,agentOnboardingEnabled:Kn})})}):Le==="documents"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(yU,{projectId:g?.id,addToast:n,onOpenDetail:Oi})})}):Le==="stash-recovery"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(TU,{})})}):Le==="insights"?!an||!ws?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(wU,{projectId:g?.id,addToast:n,onClose:()=>de("board"),onCreateTask:$r})})}):Le==="research"?!an||!Mn?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(kU,{projectId:g?.id,addToast:n,onOpenSettings:Ot=>A.openSettings(Ot),readinessVersion:gt})})}):Le==="evals"?!an||!Rn?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(jU,{projectId:g?.id,onOpenSettings:Ot=>A.openSettings(Ot),onOpenTaskDetail:Ot=>{Sr(Ot,g?.id).then(vn=>Oi(vn)).catch(vn=>n(vn instanceof Error?vn.message:"Failed to open task detail","error"))}})})}):Le==="memory"?!an||!Is?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(EU,{addToast:n,projectId:g?.id})})}):Le==="secrets"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(_U,{addToast:n})})}):Le==="goalsView"?!an||!We?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(AU,{})})}):Le==="reliability"?t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(MU,{})})}):Le==="devserver"||Le==="dev-server"?!an||!ks?null:t.jsx(Gs,{children:t.jsx(i.Suspense,{fallback:null,children:t.jsx(RU,{addToast:n,projectId:g?.id})})}):Le==="board"?t.jsxs(Gs,{children:[yt&&!cs?t.jsx(iB,{signal:Ps,onDismiss:bt}):null,t.jsx(h2,{tasks:Ye,projectId:g?.id,maxConcurrent:ot,onMoveTask:Se,onPauseTask:pe,onOpenDetail:Oi,addToast:n,onQuickCreate:Pa,onNewTask:Fr,onPlanningMode:Br,onSubtaskBreakdown:ir,autoMerge:St,onToggleAutoMerge:wt,globalPaused:lt,onUpdateTask:Nt,onRetryTask:it,onArchiveTask:Be,onUnarchiveTask:Z,onDeleteTask:et,onArchiveAllDone:Oe,onLoadArchivedTasks:ht,searchQuery:T,availableModels:Us,onOpenDetailWithTab:La,favoriteProviders:X,favoriteModels:$e,onToggleFavorite:ti,onToggleModelFavorite:Ei,taskStuckTimeoutMs:zt,staleHighFanoutBlockerAgeThresholdMs:Ee,onOpenMission:De,lastFetchTimeMs:Et,prAuthAvailable:Dn})]}):t.jsx(Gs,{children:t.jsx(OO,{tasks:v&&k.tasks.length>0?k.tasks:Xe,projectId:g?.id,onMoveTask:Se,onRetryTask:it,onDeleteTask:et,onPauseTask:pe,onUnpauseTask:_e,onArchiveTask:Be,onMergeTask:Ae,onResetTask:xt,onDuplicateTask:Ut,onOpenDetail:(Ot,vn)=>Oi(Ot,void 0,vn),addToast:n,globalPaused:lt,onNewTask:Fr,onQuickCreate:Pa,onPlanningMode:Br,onSubtaskBreakdown:ir,availableModels:Us,favoriteProviders:X,favoriteModels:$e,onToggleFavorite:ti,onToggleModelFavorite:Ei,taskStuckTimeoutMs:zt,searchQuery:T,lastFetchTimeMs:Et,prAuthAvailable:Dn})})},ms=!A.modelOnboardingOpen&&s5(),Fn=!A.modelOnboardingOpen&&!ms&&Io()&&!Wk(),Vs=u||C||At;return t.jsx(XO,{value:{pushNav:ee,replaceCurrent:ge},children:t.jsx(KL,{openFile:Hr,children:t.jsx(yA,{value:_n*PU,children:xn?t.jsxs(t.Fragment,{children:[t.jsx(O5,{stage:Mt}),t.jsx(Yk,{toasts:e,onRemove:s})]}):t.jsxs(t.Fragment,{children:[t.jsx(F5,{visible:Vs}),t.jsx(FR,{shellHost:c.host,onOpenSettings:ya,onOpenGitHubImport:Oa,onOpenPlanning:zr,onResumePlanning:Vn,activePlanningSessionCount:fe.length,onOpenUsage:lr,onOpenActivityLog:ka,onOpenSystemStats:Vr,onOpenMailbox:()=>rt("mailbox"),mailboxUnreadCount:on,mailboxPendingApprovalCount:mn,chatHasUnreadResponse:In,stashOrphanCount:hn,onOpenSchedules:ar,onOpenGitManager:qr,onOpenNodes:sa,showNodesButton:ln,onOpenWorkflowSteps:or,onOpenScripts:rr,onRunScript:cr,onToggleTerminal:Fa,onOpenFiles:Ur,filesOpen:A.filesOpen,onOpenTodos:wa,todosOpen:A.todosOpen,todosEnabled:V,globalPaused:lt,enginePaused:Tt,onToggleGlobalPause:ut,onToggleEnginePause:Bt,view:Le,onChangeView:Ne==="project"&&g?rt:void 0,showSkillsTab:qt,showAgentsTab:ds,searchQuery:T,onSearchChange:D,branchFilter:W,baseBranchFilter:L,branchOptions:Je,baseBranchOptions:tt,onBranchFilterChange:F,onBaseBranchFilterChange:ae,projects:z,currentProject:g,onSelectProject:cn,onViewAllProjects:Un,projectId:g?.id,mobileNavEnabled:ye,availableNodes:f,currentNode:p,onSelectNode:ze=>{ze===null?y():x(ze)},isRemote:v,experimentalFeatures:{insights:ws,memoryView:Is,devServer:ks,devServerView:ks,researchView:Mn,evalsView:Rn,goalsView:We},pluginDashboardViews:Re,shellConnectionControl:!ye&&dt?t.jsx(Ev,{status:dt,onError:ze=>n(ze,"error")}):void 0}),Ne==="project"&&g&&t.jsxs(t.Fragment,{children:[t.jsx(aB,{isActive:Xt}),t.jsx(oB,{onReLogin:ze=>A.openSettings("authentication")})]}),Ne==="project"&&g&&!vt&&Le!=="missions"&&!A.isPlanningOpen&&!ve&&t.jsx(eB,{sessions:se,onResumeSession:Ve,onDismissSession:kt,onDismissAll:zn}),Ne==="project"&&g&&t.jsx(sB,{onOpenSettings:()=>A.openSettings("general")}),Ne==="project"&&g&&ms&&t.jsx(yB,{onResume:A.openModelOnboarding}),Ne==="project"&&g&&Fn&&t.jsx(wB,{onOpenModelOnboarding:A.openModelOnboarding,onOpenSettings:ze=>A.openSettings(ze)}),Ne==="project"&&g&&E&&M&&G&&!U&&t.jsx(mB,{latestVersion:M,currentVersion:G,onDismiss:P}),Ne==="project"&&g&&t.jsx(xB,{projectId:g.id}),Ne==="project"&&g&&dn?.taskIdIntegrity?.status==="anomaly"&&dn.taskIdIntegrity.recommendedAction&&t.jsx(dB,{report:dn.taskIdIntegrity,recommendedAction:dn.taskIdIntegrity.recommendedAction,onRefresh:(ze,Ot)=>{me(vn=>vn?{...vn,status:ze.status==="anomaly"||!vn.database.healthy||vn.database.corruptionDetected?"degraded":"ok",taskIdIntegrity:{...ze,recommendedAction:Ot}}:null)}}),Ne==="project"&&g&&dn?.database?.corruptionDetected===!0&&t.jsx(uB,{errors:dn.database.corruptionErrors,lastCheckedAt:dn.database.lastCheckedAt,onRefresh:xs,refreshing:jt,refreshError:bs}),Ne==="project"&&g&&!R&&I&&!kn&&t.jsx(Uk,{hasAiProvider:w,hasGithub:S,onDismiss:he}),Ne==="project"&&g&&nn&&t.jsx(vB,{pendingCount:Math.max(mn,1),onOpenMailbox:()=>rt("mailbox"),onDismiss:()=>{ie.current.set(nn.dedupeKey,Math.max(Date.now(),nn.updatedAtMs)),Tv(ie.current),$t(null)}}),t.jsx("div",{className:`project-content${Ne==="project"&&g&&(!ye||!un)?" project-content--with-footer":""}${ye&&!un?" project-content--with-mobile-nav":""}`,children:Xn()}),Ne==="project"&&g&&!vt&&t.jsx(J5,{tasks:v&&k.tasks.length>0?k.tasks:Xe,projectId:g.id,taskStuckTimeoutMs:zt,staleHighFanoutBlockerAgeThresholdMs:Ee,backgroundSessions:ue,backgroundGenerating:Q,backgroundNeedsInput:be,onOpenBackgroundSession:Ve,onDismissBackgroundSession:O,lastFetchTimeMs:Et,currentProjectPath:g.path,onOpenProjectDirectory:ia,keyboardOpen:On,hideWhenKeyboardOpen:un}),t.jsx(jB,{view:Le,onChangeView:Ne==="project"&&g?rt:()=>{},footerVisible:Ne==="project"&&!!g,modalOpen:A.anyModalOpen,keyboardOpen:tn,onOpenSettings:ya,onOpenActivityLog:ka,onOpenSystemStats:Vr,onOpenMailbox:()=>rt("mailbox"),onOpenNodes:sa,mailboxUnreadCount:on,mailboxPendingApprovalCount:mn,chatHasUnreadResponse:In,stashOrphanCount:hn,onOpenGitManager:qr,onOpenWorkflowSteps:or,onOpenSchedules:ar,onOpenScripts:rr,onToggleTerminal:Fa,onOpenFiles:Ur,onOpenTodos:wa,todosOpen:A.todosOpen,onOpenGitHubImport:Oa,onOpenPlanning:zr,onResumePlanning:Vn,activePlanningSessionCount:fe.length,onOpenUsage:()=>lr(null),onViewAllProjects:Un,onRunScript:cr,projectId:g?.id,showSkillsTab:qt,experimentalFeatures:{insights:ws,memoryView:Is,devServer:ks,devServerView:ks,todoView:V,researchView:Mn,evalsView:Rn,goalsView:We,nodesView:ln},pluginDashboardViews:Re,shellConnectionControl:ye&&dt?t.jsx(Ev,{status:dt,onError:ze=>n(ze,"error")}):void 0}),Ne==="project"&&g&&Le!=="chat"&&Le!=="mailbox"&&Le!=="insights"&&Le!=="evals"&&Le!=="devserver"&&Le!=="dev-server"&&Le!=="graph"&&!go(Le)&&t.jsx(i8,{projectId:g.id,addToast:n,showFAB:yn,open:Bn,onOpenChange:wn,favoriteProviders:X,favoriteModels:$e,onToggleFavorite:ti,onToggleModelFavorite:Ei}),t.jsx(I5,{projectId:g?.id,tasks:Xe,projects:d,currentProject:g,addToast:n,toasts:e,removeToast:s,modalManager:A,projectActions:{handleAddProject:as,handleSetupComplete:$s,handleModelOnboardingComplete:Fs},taskHandlers:{handleModalCreate:Uo,handlePlanningTaskCreated:Dr,handlePlanningTasksCreated:Lr,handleSubtaskTasksCreated:$a,handleGitHubImport:Da},taskOperations:{moveTask:Se,deleteTask:et,mergeTask:Ae,archiveTask:Be,retryTask:it,resetTask:xt,duplicateTask:Ut},deepLink:{handleDetailClose:_i},settings:{prAuthAvailable:Dn,themeMode:J,colorTheme:oe,dashboardFontScalePct:le,setThemeMode:we,setColorTheme:re,setDashboardFontScalePct:H},onSettingsClose:Jn,onReopenOnboarding:Mi,onOpenApprovals:ze=>rt("mailbox")}),t.jsx(xU,{open:Yt}),a&&t.jsxs(t.Fragment,{children:[t.jsx(uU,{open:Gn,shellApi:a,shellState:r,onComplete:()=>Yn(!0)}),t.jsx(mU,{open:us,shellApi:a,shellState:r,onClose:()=>Ze(!1)})]})]})})})})}function BU(){return t.jsx(x8,{children:t.jsx(lU,{children:t.jsx(V3,{children:t.jsx(K8,{children:t.jsx(UR,{children:t.jsx(zU,{})})})})})})}function kj(e){e.postMessage({type:"SKIP_WAITING"})}function Iv(e){e.addEventListener("statechange",()=>{e.state==="installed"&&navigator.serviceWorker.controller&&kj(e)})}function UU(){if(!("serviceWorker"in navigator))return;const e=!!navigator.serviceWorker.controller;let n=!1;navigator.serviceWorker.addEventListener("controllerchange",()=>{n||!e||(n=!0,Mh("service worker activated new version"))}),navigator.serviceWorker.register("/sw.js").then(s=>{console.log("SW registered:",s.scope),s.waiting&&navigator.serviceWorker.controller&&kj(s.waiting),s.installing&&Iv(s.installing),s.addEventListener("updatefound",()=>{const a=s.installing;a&&Iv(a)})}).catch(s=>{console.log("SW registration failed:",s)})}RC();Y0();vj();pj();Ij.createRoot(document.getElementById("root")).render(t.jsx(i.StrictMode,{children:t.jsx(X0,{children:t.jsx(eC,{children:t.jsx(BU,{})})})}));UU();export{a_ as $,fi as A,As as B,gs as C,xC as D,T7 as E,Ya as F,jd as G,XS as H,Em as I,os as J,Qc as K,Ct as L,Ll as M,ZS as N,Vi as O,rs as P,Os as Q,Ss as R,da as S,Ma as T,aq as U,T3 as V,dm as W,Nn as X,wS as Y,Bs as Z,es as _,Ln as a,ca as a$,qn as a0,_3 as a1,i_ as a2,y3 as a3,w3 as a4,M7 as a5,r_ as a6,ui as a7,_r as a8,bn as a9,ba as aA,jh as aB,pa as aC,Jj as aD,qH as aE,WH as aF,qs as aG,XH as aH,YH as aI,JH as aJ,KH as aK,GH as aL,VH as aM,ty as aN,No as aO,BH as aP,HH as aQ,UH as aR,eq as aS,QH as aT,ZH as aU,tq as aV,K7 as aW,iq as aX,Ml as aY,km as aZ,k0 as a_,B9 as aa,U9 as ab,Wn as ac,dE as ad,Nh as ae,$o as af,Tr as ag,ji as ah,Ni as ai,Pi as aj,th as ak,IH as al,OH as am,LH as an,Nr as ao,FH as ap,PH as aq,zH as ar,$H as as,DH as at,Cs as au,Ls as av,Ar as aw,wl as ax,oi as ay,I0 as az,ps as b,E9 as b$,Ff as b0,TN as b1,zs as b2,WO as b3,xi as b4,Wv as b5,m0 as b6,q7 as b7,V7 as b8,W7 as b9,nj as bA,UB as bB,Js as bC,ga as bD,wd as bE,Hh as bF,NB as bG,vr as bH,qv as bI,DB as bJ,ai as bK,Bv as bL,Bf as bM,fa as bN,HM as bO,MH as bP,_H as bQ,RH as bR,w9 as bS,y9 as bT,v9 as bU,k9 as bV,A9 as bW,T9 as bX,_9 as bY,S9 as bZ,C9 as b_,G7 as ba,Td as bb,f8 as bc,eh as bd,K6 as be,Np as bf,hs as bg,Wo as bh,nv as bi,sR as bj,rc as bk,qi as bl,VM as bm,AH as bn,TH as bo,eR as bp,EB as bq,nR as br,CB as bs,qB as bt,VB as bu,mf as bv,PB as bw,ff as bx,zB as by,Ia as bz,ct as c,a9 as c$,N9 as c0,j9 as c1,x9 as c2,M9 as c3,s6 as c4,l7 as c5,o7 as c6,f7 as c7,r7 as c8,c7 as c9,Al as cA,jo as cB,x_ as cC,kC as cD,jC as cE,l1 as cF,c1 as cG,yH as cH,q9 as cI,H9 as cJ,wH as cK,V9 as cL,Z9 as cM,Y9 as cN,W9 as cO,X9 as cP,G9 as cQ,Q9 as cR,K9 as cS,J9 as cT,sN as cU,b1 as cV,y1 as cW,e7 as cX,x1 as cY,t7 as cZ,Ui as c_,d7 as ca,u7 as cb,m7 as cc,PE as cd,h7 as ce,Ih as cf,AE as cg,TE as ch,IE as ci,RE as cj,a7 as ck,Cd as cl,y0 as cm,ko as cn,Z7 as co,eH as cp,tH as cq,nH as cr,sH as cs,iH as ct,aH as cu,Q7 as cv,ny as cw,RS as cx,$ as cy,ad as cz,O7 as d,R9 as d$,ea as d0,l8 as d1,Uz as d2,I9 as d3,t9 as d4,e9 as d5,Y7 as d6,IC as d7,r9 as d8,Ux as d9,X7 as dA,d9 as dB,jm as dC,Qs as dD,e6 as dE,P3 as dF,D3 as dG,L3 as dH,Ka as dI,um as dJ,F3 as dK,m9 as dL,l9 as dM,h9 as dN,u9 as dO,f9 as dP,p9 as dQ,Cr as dR,rq as dS,fC as dT,Ed as dU,QU as dV,vb as dW,ZU as dX,XU as dY,n9 as dZ,sq as d_,F7 as da,o9 as db,c9 as dc,b9 as dd,g9 as de,T1 as df,Vo as dg,A1 as dh,H7 as di,Bx as dj,w1 as dk,Qi as dl,Im as dm,k1 as dn,N1 as dp,j1 as dq,S1 as dr,C1 as ds,D9 as dt,z7 as du,B7 as dv,U7 as dw,Aa as dx,JU as dy,YU as dz,D7 as e,$9 as e$,rH as e0,lH as e1,uH as e2,cH as e3,oH as e4,dH as e5,mH as e6,Dm as e7,Zf as e8,S7 as e9,w7 as eA,N7 as eB,fH as eC,PM as eD,x7 as eE,p7 as eF,Wi as eG,i7 as eH,n7 as eI,s7 as eJ,s9 as eK,i9 as eL,pH as eM,kH as eN,_m as eO,SH as eP,CH as eQ,NH as eR,xH as eS,bH as eT,vH as eU,gH as eV,jH as eW,J7 as eX,nq as eY,L9 as eZ,P9 as e_,E7 as ea,OM as eb,PN as ec,jr as ed,ii as ee,bS as ef,hH as eg,A7 as eh,Za as ei,o4 as ej,Va as ek,_7 as el,C7 as em,P7 as en,I7 as eo,zv as ep,j7 as eq,k7 as er,g7 as es,b7 as et,v3 as eu,mr as ev,R7 as ew,y7 as ex,v7 as ey,uE as ez,Sr as f,o0 as f0,F9 as f1,z9 as f2,O9 as f3,L7 as g,fk as h,Ki as i,Qa as j,gd as k,EH as l,ri as m,s_ as n,$7 as o,$i as p,ij as q,k3 as r,Si as s,ns as t,ta as u,Di as v,Ns as w,Md as x,tc as y,Ce as z};