@runfusion/fusion 0.5.0 → 0.7.0

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 (64) hide show
  1. package/dist/bin.js +5092 -1417
  2. package/dist/client/assets/AgentDetailView-C1_lTTET.css +1 -0
  3. package/dist/client/assets/AgentDetailView-Du65-jDo.js +18 -0
  4. package/dist/client/assets/AgentsView-BkgNEbNs.js +522 -0
  5. package/dist/client/assets/AgentsView-D12CuIFc.css +1 -0
  6. package/dist/client/assets/ChatView-LDte0TdV.js +1 -0
  7. package/dist/client/assets/DevServerView-AXznq3jv.js +6 -0
  8. package/dist/client/assets/DevServerView-DlZpuAnj.css +1 -0
  9. package/dist/client/assets/{DirectoryPicker-B3ejJOl0.js → DirectoryPicker-CSp3G115.js} +1 -1
  10. package/dist/client/assets/DocumentsView-BrhyOdeE.css +1 -0
  11. package/dist/client/assets/DocumentsView-DOe0E1WQ.js +1 -0
  12. package/dist/client/assets/{InsightsView-CoRsf8DC.js → InsightsView-DWZbS6z-.js} +1 -1
  13. package/dist/client/assets/{MemoryView-oFUIaoM5.js → MemoryView-BxnlhBoa.js} +1 -1
  14. package/dist/client/assets/{NodesView-BXUaViVf.js → NodesView-DO9jxhM4.js} +1 -1
  15. package/dist/client/assets/{PiExtensionsManager-DJRC5zRv.js → PiExtensionsManager-CfXZaWl7.js} +3 -3
  16. package/dist/client/assets/PluginManager-jyNkJZSz.css +1 -0
  17. package/dist/client/assets/PluginManager-r6CWD9u-.js +1 -0
  18. package/dist/client/assets/RoadmapsView-CgAM3YfN.js +6 -0
  19. package/dist/client/assets/SettingsModal-DPDQyWim.css +1 -0
  20. package/dist/client/assets/SettingsModal-GZdRt8fX.js +31 -0
  21. package/dist/client/assets/{SettingsModal-CDWvhvrd.css → SettingsModal-YjpwLH2V.css} +1 -1
  22. package/dist/client/assets/{SettingsModal-CMRJwSFd.js → SettingsModal-fmRtzH8z.js} +1 -1
  23. package/dist/client/assets/{SetupWizardModal-BnPgyQho.js → SetupWizardModal-oRNpImWR.js} +1 -1
  24. package/dist/client/assets/{SkillsView-pHEyP-vg.js → SkillsView-BhwtL-0_.js} +1 -1
  25. package/dist/client/assets/TodoView-C1g65hJo.css +1 -0
  26. package/dist/client/assets/TodoView-CmhUBFNV.js +6 -0
  27. package/dist/client/assets/{folder-open-DJxjQmf1.js → folder-open-CrTagHrr.js} +1 -1
  28. package/dist/client/assets/index-BTeSa6vk.js +646 -0
  29. package/dist/client/assets/index-S9oR77v2.css +1 -0
  30. package/dist/client/assets/{list-checks-NjVTpQgK.js → list-checks-DR26h_Io.js} +1 -1
  31. package/dist/client/assets/star-CO_D42zy.js +6 -0
  32. package/dist/client/assets/{upload-BQA5FG0G.js → upload-BcrgS-iu.js} +1 -1
  33. package/dist/client/assets/{users-p7CqLoIz.js → users-4d8al5Sp.js} +1 -1
  34. package/dist/client/brands/hermes-logo.svg +1 -0
  35. package/dist/client/index.html +2 -2
  36. package/dist/client/version.json +1 -1
  37. package/dist/extension.js +2833 -625
  38. package/dist/pi-claude-cli/index.ts +12 -0
  39. package/dist/pi-claude-cli/package.json +1 -1
  40. package/dist/pi-claude-cli/src/__tests__/event-bridge.test.ts +40 -0
  41. package/dist/pi-claude-cli/src/__tests__/mcp-config.test.ts +17 -1
  42. package/dist/pi-claude-cli/src/__tests__/prompt-builder.test.ts +41 -0
  43. package/dist/pi-claude-cli/src/__tests__/tool-mapping.test.ts +1 -0
  44. package/dist/pi-claude-cli/src/prompt-builder.ts +8 -11
  45. package/dist/pi-claude-cli/src/provider.ts +17 -4
  46. package/package.json +5 -5
  47. package/dist/client/assets/AgentDetailView-C1b9PC5l.css +0 -1
  48. package/dist/client/assets/AgentDetailView-CnedHKqd.js +0 -23
  49. package/dist/client/assets/AgentsView-DETxUmHS.css +0 -1
  50. package/dist/client/assets/AgentsView-TCAMvB-N.js +0 -522
  51. package/dist/client/assets/ChatView-B7djAFGF.js +0 -1
  52. package/dist/client/assets/DevServerView-B_zgnvEn.js +0 -11
  53. package/dist/client/assets/DevServerView-ZeBGQkLI.css +0 -1
  54. package/dist/client/assets/DocumentsView-DV2DrCZb.css +0 -1
  55. package/dist/client/assets/DocumentsView-DzmbEKrl.js +0 -1
  56. package/dist/client/assets/PluginManager-DRiIqol2.css +0 -1
  57. package/dist/client/assets/PluginManager-OQhiY2zP.js +0 -1
  58. package/dist/client/assets/RoadmapsView-DwdewIMm.js +0 -6
  59. package/dist/client/assets/SettingsModal-Bmz_YrW5.js +0 -31
  60. package/dist/client/assets/SettingsModal-G0ESQXRD.css +0 -1
  61. package/dist/client/assets/TodoView-Cg-xDGeH.js +0 -1
  62. package/dist/client/assets/TodoView-DNi8blBB.css +0 -1
  63. package/dist/client/assets/index-B7TDbn3p.css +0 -1
  64. package/dist/client/assets/index-Cf4wCcWp.js +0 -631
@@ -1 +0,0 @@
1
- import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{i as _e,aw as ut,g as ht,ax as mt,a as gt,ay as ft,az as pt,aA as xt,aB as St,aC as bt,aD as vt,s as wt,aE as kt,aF as Nt,f as Ct,a5 as jt,a6 as Mt,w as Re,S as yt,I as He,ai as Tt,aG as At,B as je,a2 as Ge,a3 as Ue,aH as $t,aI as Et,aJ as Pt,aK as Dt,aL as Rt,aM as Lt,h as _t,j as zt}from"./index-Cf4wCcWp.js";import"./vendor-xterm-DzcZoU0P.js";const Le="kb-chat-active-session";function It(n){const i=n?.toolCalls;if(!Array.isArray(i))return;const c=i.map(l=>{if(!l||typeof l!="object")return null;const r=l,f=typeof r.toolName=="string"?r.toolName:"";if(!f)return null;const v=r.args;return{toolName:f,...v&&typeof v=="object"?{args:v}:{},isError:!!r.isError,result:r.result,status:"completed"}}).filter(l=>l!==null);return c.length>0?c:void 0}function qe(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:It(n.metadata),createdAt:n.createdAt}}function Ft(n){const[i,c]=s.useState([]),[l,r]=s.useState(null),[f,v]=s.useState(!0),[M,w]=s.useState([]),[X,I]=s.useState(!1),[F,R]=s.useState(!1),[ce,E]=s.useState(""),[O,T]=s.useState(""),[pe,P]=s.useState([]),[p,D]=s.useState(""),[Z,U]=s.useState(""),[A,V]=s.useState(!0),[q,ne]=s.useState(new Map),N=s.useRef(null),J=s.useRef(!1),K=s.useRef(""),xe=s.useRef(i),B=s.useRef(l),ke=s.useRef(F);xe.current=i,B.current=l,ke.current=F,s.useEffect(()=>{K.current=p},[p]);const ae=s.useRef(new Set),ee=s.useRef(0),Ne=s.useRef(n);Ne.current!==n&&(Ne.current=n,ee.current++),s.useEffect(()=>{const u=ee.current;_e(void 0,n).then(m=>{if(ee.current!==u)return;const h=new Map;for(const k of m)h.set(k.id,k);ne(h)}).catch(()=>{})},[n]);const te=s.useCallback(async()=>{v(!0);try{const m=[...(await ut(n)).sessions].sort((h,k)=>new Date(k.updatedAt).getTime()-new Date(h.updatedAt).getTime());c(m)}catch{}finally{v(!1)}},[n]);s.useEffect(()=>{te()},[te]);const Q=s.useRef(()=>{});s.useEffect(()=>{if(f)return;const u=ht(Le,n);u&&i.find(h=>h.id===u)&&Q.current(u)},[f,i,n]);const _=s.useCallback(async(u,m)=>{I(!0);try{const h=await mt(u,{limit:50,...m},n),k=h.messages.map(qe);m?.offset&&m.offset>0?w(W=>[...k,...W]):w(k),V(h.messages.length>=50)}catch{}finally{I(!1)}},[n]),oe=s.useCallback(u=>{N.current&&(N.current.close(),N.current=null);const m=i.find(h=>h.id===u);r(m||null),E(""),T(""),P([]),R(!1),V(!0),u?_(u):w([]),u?gt(Le,u,n):ft(Le,n)},[i,_,n]);Q.current=oe;const de=s.useCallback(async u=>{const m=await pt(u,n),h={id:m.session.id,title:m.session.title,agentId:m.session.agentId,status:m.session.status,modelProvider:m.session.modelProvider,modelId:m.session.modelId,createdAt:m.session.createdAt,updatedAt:m.session.updatedAt};return c(k=>[h,...k]),r(h),w([]),E(""),T(""),P([]),R(!1),V(!0),h},[n]),ue=s.useCallback(async u=>{await xt(u,{status:"archived"},n),c(m=>m.filter(h=>h.id!==u)),l?.id===u&&(r(null),w([]))},[l,n]),ie=s.useCallback(async u=>{l?.id===u&&N.current&&(N.current.close(),N.current=null),await St(u,n),c(m=>m.filter(h=>h.id!==u)),l?.id===u&&(r(null),w([]))},[l,n]),he=s.useCallback(async()=>{!l||!A||await _(l.id,{offset:M.length})},[l,A,_,M.length]),se=s.useCallback(()=>{l&&(J.current=!0,N.current?.close(),N.current=null,bt(l.id,n).catch(()=>{}),R(!1),E(""),T(""),P([]))},[l,n]),H=s.useCallback(()=>{K.current="",D("")},[]),G=s.useCallback(u=>{if(!l)return;if(F){K.current=u,D(u);return}J.current=!1,N.current&&(N.current.close(),N.current=null);const m=`temp-${Date.now()}`,h={id:m,sessionId:l.id,role:"user",content:u,createdAt:new Date().toISOString()};w(x=>[...x,h]),E(""),T(""),P([]),R(!0);let k="",W="",j=[];const be={onThinking:x=>{W+=x,T(W)},onText:x=>{k+=x,E(k)},onToolStart:x=>{j=[...j,{toolName:x.toolName,args:x.args,isError:!1,status:"running"}],P(j)},onToolEnd:x=>{const d=[...j];for(let S=d.length-1;S>=0;S--){const b=d[S];if(b?.toolName===x.toolName&&b.status==="running"){d[S]={...b,status:"completed",isError:x.isError,result:x.result},j=d,P(d);return}}j=[...d,{toolName:x.toolName,isError:x.isError,result:x.result,status:"completed"}],P(j)},onDone:x=>{const d={id:x.messageId||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:k,thinkingOutput:W,toolCalls:j.length>0?j:void 0,createdAt:new Date().toISOString()};ae.current.add(d.id),w(b=>[...b,d]),E(""),T(""),P([]),R(!1),N.current=null,setTimeout(()=>{ae.current.delete(d.id)},1e3),te();const S=K.current.trim();S&&(K.current="",D(""),G(S))},onError:x=>{if(w(d=>d.filter(S=>S.id!==m)),E(""),T(""),P([]),R(!1),N.current=null,console.error("[useChat] Stream error:",x),!J.current){const d=K.current.trim();d&&(K.current="",D(""),G(d))}}};N.current=vt(l.id,u,be,n)},[l,F,n,te]),Se=Z?i.filter(u=>u.title?.toLowerCase().includes(Z.toLowerCase())||u.agentId.toLowerCase().includes(Z.toLowerCase())):i;return s.useEffect(()=>{const u=ee.current,m=n?`?projectId=${encodeURIComponent(n)}`:"",h=()=>ee.current!==u,k=S=>{if(h())return;const b=JSON.parse(S.data);c(g=>g.some(L=>L.id===b.id)?g:[b,...g])},W=S=>{if(h())return;const b=JSON.parse(S.data);c(g=>[...g.map(C=>C.id===b.id?b:C)]),B.current?.id===b.id&&r(b)},j=S=>{if(h())return;const{id:b}=JSON.parse(S.data);c(g=>g.filter(L=>L.id!==b)),B.current?.id===b&&(r(null),w([]))},be=S=>{if(h())return;const b=JSON.parse(S.data),g=qe(b);ae.current.has(g.id)||B.current?.id===g.sessionId&&!ke.current&&w(L=>L.some(C=>C.id===g.id)?L:[...L,g])},x=S=>{if(h())return;const{id:b}=JSON.parse(S.data);w(g=>g.filter(L=>L.id!==b))};return wt(`/api/events${m}`,{events:{"chat:session:created":k,"chat:session:updated":W,"chat:session:deleted":j,"chat:message:added":be,"chat:message:deleted":x}})},[n]),s.useEffect(()=>()=>{N.current&&(N.current.close(),N.current=null)},[]),{sessions:i,activeSession:l,sessionsLoading:f,messages:M,messagesLoading:X,isStreaming:F,streamingText:ce,streamingThinking:O,streamingToolCalls:pe,pendingMessage:p,selectSession:oe,createSession:de,archiveSession:ue,deleteSession:ie,sendMessage:G,stopStreaming:se,clearPendingMessage:H,loadMoreMessages:he,hasMoreMessages:A,searchQuery:Z,setSearchQuery:U,filteredSessions:Se,refreshSessions:te,agentsMap:q}}function Je(n){const i=new Date(n),l=new Date().getTime()-i.getTime(),r=Math.floor(l/1e3),f=Math.floor(r/60),v=Math.floor(f/60),M=Math.floor(v/24);return r<60?"just now":f<60?`${f}m ago`:v<24?`${v}h ago`:M<7?`${M}d ago`:i.toLocaleDateString()}function Ke(n,i){if(!n||!i)return null;const c=i.toLowerCase();if(c.includes("claude")){let r=i.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return r=r.replace(/\s+/g," "),r.length>30?r.slice(0,30)+"…":r}if(c.includes("gpt")||c.includes("openai")){const r=i.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return r.length>30?r.slice(0,30)+"…":r}if(c.includes("gemini")){const r=i.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return r.length>30?r.slice(0,30)+"…":r}const l=i.replace(/-/g," ").replace(/^\w/,r=>r.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function Me(n,i){return n.length>i?`${n.slice(0,i)}…`:n}function Ot(n){if(!n)return null;const i=Object.entries(n);return i.length===0?null:i.map(([c,l])=>{let r="";if(typeof l=="string")r=l;else try{r=JSON.stringify(l)}catch{r=String(l)}return`${c}=${Me(r,50)}`}).join(", ")}function Vt(n){if(n===void 0)return null;if(typeof n=="string")return Me(n,200);try{return Me(JSON.stringify(n),200)}catch{return Me(String(n),200)}}function Qe(n){return!n||n.length===0?null:e.jsxs("div",{className:"chat-tool-calls","data-testid":"chat-tool-calls",children:[e.jsxs("div",{className:"chat-tool-calls-header",children:[e.jsx(Lt,{size:12,"aria-hidden":"true"}),e.jsx("span",{children:"Tool calls"})]}),n.map((i,c)=>{const l=i.status==="running",r=i.status==="completed"&&i.isError,f=Ot(i.args),v=Vt(i.result),M=l?f:v?`result: ${v}`:f?`args: ${f}`:null,w=l?"running":r?"error":"completed";return e.jsxs("details",{className:`chat-tool-call${l?" chat-tool-call--running":""}${r?" chat-tool-call--error":""}`,open:l,children:[e.jsxs("summary",{children:[e.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),e.jsx("span",{className:"chat-tool-call-name",children:i.toolName}),M&&e.jsx("span",{className:"chat-tool-call-preview",title:M,children:M}),e.jsx("span",{className:"chat-tool-call-status-text",children:w})]}),e.jsxs("div",{className:"chat-tool-call-content",children:[f&&e.jsxs("div",{className:"chat-tool-call-row",children:[e.jsx("span",{className:"chat-tool-call-label",children:"args"}),e.jsx("span",{className:"chat-tool-call-value",children:f})]}),v&&e.jsxs("div",{className:`chat-tool-call-row${r?" chat-tool-call-row--error":""}`,children:[e.jsx("span",{className:"chat-tool-call-label",children:"result"}),e.jsx("span",{className:"chat-tool-call-value",children:v})]})]})]},`${i.toolName}-${c}`)})]})}const Bt={pre:({children:n,...i})=>e.jsx("pre",{...i,className:"chat-markdown-pre",children:n}),table:({children:n,...i})=>e.jsx("table",{...i,className:"chat-markdown-table",children:n})},ye="__fn_agent__";function We(n){const i=/(^|[\s])\/([^\s]*)$/.exec(n);if(!i)return null;const c=i[1]??"",l=i[2]??"",r=i.index+c.length;return{filter:l,start:r,end:n.length}}function Ht(n,i){const c=n.slice(0,i),l=/(^|[\s\n])@([\w-]*)$/.exec(c);if(!l)return null;const r=l[2]??"",f=c.length-r.length-1;return{filter:r,start:f,end:i}}function Gt({projectId:n,onClose:i,onCreate:c}){const[l,r]=s.useState("agent"),[f,v]=s.useState([]),[M,w]=s.useState(!0),[X,I]=s.useState(""),[F,R]=s.useState([]),[ce,E]=s.useState(!0),[O,T]=s.useState("");s.useEffect(()=>{let p=!1;return w(!0),_e(void 0,n).then(D=>{p||v(D)}).catch(()=>{p||v([])}).finally(()=>{p||w(!1)}),()=>{p=!0}},[n]),s.useEffect(()=>{E(!0),_t().then(p=>{R(p.models)}).catch(()=>{R([])}).finally(()=>{E(!1)})},[]);const pe=p=>{if(p.preventDefault(),l==="agent"){if(!X)return;c({agentId:X});return}if(!O)return;const D=O.indexOf("/");if(D<=0)return;const Z=O.slice(0,D),U=O.slice(D+1);c({agentId:ye,modelProvider:Z,modelId:U})},P=l==="agent"?!X:!O;return e.jsx("div",{className:"chat-new-dialog-backdrop",onClick:i,role:"dialog","aria-modal":"true",children:e.jsxs("div",{className:"chat-new-dialog",onClick:p=>p.stopPropagation(),children:[e.jsx("h3",{children:"New Chat"}),e.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{r("agent"),T("")},children:"Agent"}),e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{r("model"),I("")},children:"Model"})]}),e.jsxs("form",{onSubmit:pe,children:[l==="agent"&&e.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",M?e.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):f.length===0?e.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):e.jsx("div",{className:"chat-new-dialog-agent-list",children:f.map(p=>e.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${X===p.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>I(p.id),"data-testid":`agent-option-${p.id}`,children:[e.jsx(je,{size:16}),e.jsx("span",{className:"chat-new-dialog-agent-name",children:p.name}),e.jsx("span",{className:"chat-new-dialog-agent-role",children:p.role})]},p.id))})]}),l==="model"&&e.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:ce?e.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):e.jsx(zt,{models:F,value:O,onChange:T,label:"Model",placeholder:"Select a model"})}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:i,children:"Cancel"}),e.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:P,children:"Create"})]})]})]})})}function Qt({projectId:n,addToast:i}){const{activeSession:c,sessionsLoading:l,messages:r,messagesLoading:f,isStreaming:v,streamingText:M,streamingThinking:w,streamingToolCalls:X,selectSession:I,createSession:F,archiveSession:R,deleteSession:ce,sendMessage:E,stopStreaming:O,pendingMessage:T,clearPendingMessage:pe,searchQuery:P,setSearchQuery:p,filteredSessions:D}=Ft(n),[Z,U]=s.useState(!1),[A,V]=s.useState(""),[q,ne]=s.useState(null),[N,J]=s.useState(null),[K,xe]=s.useState(!0),[B,ke]=s.useState(new Map),[ae,ee]=s.useState([]),[Ne,te]=s.useState(!0),[Q,_]=s.useState(!1),[oe,de]=s.useState(""),[ue,ie]=s.useState(0),[he,se]=s.useState(""),[H,G]=s.useState(!1),[Se,u]=s.useState(0),[m,h]=s.useState(-1),[k,W]=s.useState(()=>new Set),[,j]=s.useState(!1),[be,x]=s.useState({top:0,left:0}),d=kt({projectId:n}),S=s.useCallback(t=>{if(!t||!d.mentionActive)return;const a=t.getBoundingClientRect();x({top:a.top-260,left:a.left+8})},[d.mentionActive]),b=s.useRef(null),g=s.useRef(null),L=s.useRef(null),C=s.useRef(null),ve=s.useRef(0),me=Nt()==="mobile",z=s.useMemo(()=>{const t=oe.trim().toLowerCase();return(t?ae.filter(o=>o.name.toLowerCase().includes(t)):ae).slice(0,10)},[ae,oe]),ge=s.useMemo(()=>Array.from(B.values()),[B]),le=s.useMemo(()=>{const t=he.trim().toLowerCase();return t?ge.filter(a=>a.name.toLowerCase().includes(t)):ge},[ge,he]),ze=s.useMemo(()=>{const t=new Map;for(const a of ge)t.set(a.name.toLowerCase(),a);return t},[ge]);s.useEffect(()=>{ie(0)},[z]),s.useEffect(()=>{u(0)},[he,H]),s.useEffect(()=>()=>{g.current!==null&&window.clearTimeout(g.current)},[]),s.useEffect(()=>{b.current?.scrollIntoView({behavior:"smooth"})},[r,M]),s.useEffect(()=>{const t=()=>ne(null);if(q)return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[q]),s.useEffect(()=>{let t=!1;const a=n;return _e(void 0,n).then(o=>{if(t||a!==n)return;const y=new Map;for(const $ of o)y.set($.id,$);ke(y)}).catch(()=>{}),()=>{t=!0}},[n]),s.useEffect(()=>{let t=!1;return te(!0),Ct(n).then(a=>{t||ee(a)}).catch(()=>{t||ee([])}).finally(()=>{t||te(!1)}),()=>{t=!0}},[n]);const Ye=s.useCallback(async t=>{try{await F(t),U(!1),me&&xe(!1)}catch{i("Failed to create chat session","error")}},[F,i,me]),Te=s.useCallback(()=>{const t=A.trim();!t||!c||(V(""),_(!1),de(""),G(!1),se(""),h(-1),E(t))},[A,c,E]),Ae=s.useCallback(t=>{V(a=>{const o=We(a);if(!o)return a;const y=`/skill:${t.name} `,$=a.slice(0,o.start)+y+a.slice(o.end);return window.requestAnimationFrame(()=>{C.current&&(C.current.style.height="auto",C.current.style.height=`${Math.min(C.current.scrollHeight,120)}px`,C.current.focus())}),$}),_(!1),de(""),ie(0)},[]),$e=s.useCallback(t=>{const a=C.current;if(!a||m<0)return;const o=a.selectionStart??ve.current,y=a.selectionEnd??o,$=Math.max(o,y),we=Math.min(m,$),re=`${`@${t.name.replace(/\s+/g,"_")}`} `,De=A.slice(0,we)+re+A.slice($),fe=we+re.length;V(De),G(!1),se(""),u(0),h(-1),window.requestAnimationFrame(()=>{C.current&&(C.current.style.height="auto",C.current.style.height=`${Math.min(C.current.scrollHeight,120)}px`,C.current.focus(),C.current.setSelectionRange(fe,fe))})},[m,A]),Xe=s.useCallback(t=>{const a=/@([\w-]+)/g,o=[];let y=0,$=a.exec(t);for(;$;){const[we,Be=""]=$,re=$.index;re>y&&o.push(t.slice(y,re));const De=Be.replace(/_/g," ").toLowerCase(),fe=ze.get(De);fe?o.push(e.jsxs("span",{className:"chat-mention-chip",children:["@",fe.name.replace(/\s+/g,"_")]},`${fe.id}-${re}`)):o.push(we),y=re+we.length,$=a.exec(t)}return y<t.length&&o.push(t.slice(y)),o.length===0?t:o},[ze]),Ze=s.useCallback(t=>{if(ve.current=t.currentTarget.selectionStart??ve.current,d.mentionActive&&d.files.length>0){if(d.handleKeyDown(t,A),t.key==="Enter"||t.key==="Tab"){const a=d.files[d.selectedIndex];if(a){const o=d.selectFile(a,A);V(o),d.dismissMention(),j(!1)}}return}if(H&&t.key==="ArrowDown"){t.preventDefault(),le.length>0&&u(a=>(a+1)%le.length);return}if(H&&t.key==="ArrowUp"){t.preventDefault(),le.length>0&&u(a=>a===0?le.length-1:a-1);return}if(H&&t.key==="Enter"){t.preventDefault();const a=le[Se]??le[0];a&&$e(a);return}if(H&&t.key==="Escape"){t.preventDefault(),G(!1),se(""),h(-1);return}if(Q&&t.key==="ArrowDown"){t.preventDefault(),z.length>0&&ie(a=>(a+1)%z.length);return}if(Q&&t.key==="ArrowUp"){t.preventDefault(),z.length>0&&ie(a=>a===0?z.length-1:a-1);return}if(Q&&(t.key==="Enter"||t.key==="Tab")&&z.length>0){t.preventDefault();const a=z[ue]??z[0];a&&Ae(a);return}if(Q&&t.key==="Escape"){t.preventDefault(),_(!1);return}t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),Te())},[H,le,Se,$e,Q,z,ue,Ae,Te,d,A]),Ce=s.useCallback((t,a)=>{const o=Ht(t,a);if(o){G(!0),se(o.filter),h(o.start);return}G(!1),se(""),h(-1)},[]),et=s.useCallback(t=>{const a=t.target,o=a.value,y=a.selectionStart??o.length;ve.current=y,V(o);const $=We(o);$?(_(!0),de($.filter)):(_(!1),de("")),Ce(o,y),d.detectMention(o,y),j(d.mentionActive),d.mentionActive&&S(a),a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`},[Ce]),Ee=s.useCallback(t=>{const a=t.currentTarget,o=a.selectionStart??a.value.length;ve.current=o,Ce(a.value,o),d.detectMention(a.value,o),j(d.mentionActive),d.mentionActive&&S(a)},[Ce,d,S]),tt=s.useCallback(t=>{t.key!=="Escape"&&Ee(t)},[Ee]),st=s.useCallback(()=>{g.current!==null&&window.clearTimeout(g.current),g.current=window.setTimeout(()=>{_(!1),G(!1),se(""),h(-1),j(!1),d.dismissMention(),g.current=null},120)},[d]),nt=s.useCallback(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null)},[]),at=s.useCallback(async t=>{ne(null);try{await R(t),i("Conversation archived","success")}catch{i("Failed to archive conversation","error")}},[R,i]),it=s.useCallback(async t=>{J(null),ne(null);try{await ce(t),i("Conversation deleted","success")}catch{i("Failed to delete conversation","error")}},[ce,i]),lt=s.useCallback(t=>{I(t),me&&xe(!1)},[I,me]),rt=s.useCallback(()=>{I(""),xe(!0)},[I]),ct=()=>e.jsxs("div",{className:"chat-empty-state",children:[e.jsx(Rt,{size:48,strokeWidth:1.5}),e.jsx("h2",{children:"Start a new conversation"}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>U(!0),children:[e.jsx(Re,{size:16}),"New Chat"]})]}),Y=Ke(c?.modelProvider,c?.modelId),Ie=c?.agentId===ye?Y??"Fusion":c?.title||B.get(c?.agentId??"")?.name||c?.agentId||"Chat",ot=!!(Y&&Y!==Ie),Pe=B.get(c?.agentId??"")?.name||(c?.agentId===ye?Y??"Fusion":c?.agentId?.slice(0,30)??"Fusion"),Fe=!!(Y&&Y!==Pe),dt=T.length>50?`${T.slice(0,50)}…`:T,Oe=s.useCallback(t=>{W(a=>{const o=new Set(a);return o.has(t)?o.delete(t):o.add(t),o})},[]),Ve=s.useCallback((t,a=!1)=>a?e.jsx("div",{className:"chat-message-content chat-message-content--plain",children:t}):e.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:e.jsx(jt,{remarkPlugins:[Mt],components:Bt,children:t})}),[]);return e.jsxs("div",{className:"chat-view",children:[e.jsxs("div",{className:`chat-sidebar${K?"":" chat-sidebar--hidden"}`,children:[e.jsx("div",{className:"chat-sidebar-header",children:e.jsxs("button",{className:"btn btn-sm btn-primary",onClick:()=>U(!0),"data-testid":"chat-new-btn",children:[e.jsx(Re,{size:14}),"New Chat"]})}),e.jsx("div",{className:"chat-sidebar-search",children:e.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[e.jsx(yt,{size:14,className:"chat-sidebar-search-icon"}),e.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:P,onChange:t=>p(t.target.value),"data-testid":"chat-search-input"})]})}),e.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l?e.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):D.length===0?e.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):D.map(t=>e.jsxs("div",{className:`chat-session-item${c?.id===t.id?" chat-session-item--active":""}`,onClick:()=>lt(t.id),onContextMenu:a=>{a.preventDefault(),ne({sessionId:t.id,x:a.clientX,y:a.clientY})},"data-testid":`chat-session-${t.id}`,children:[e.jsx("button",{className:"chat-session-delete-btn",onClick:a=>{a.stopPropagation(),J(t.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:e.jsx(He,{size:14})}),e.jsx("div",{className:"chat-session-title",children:t.title||"Untitled"}),e.jsx("div",{className:"chat-session-preview",children:t.lastMessagePreview||"No messages"}),e.jsxs("div",{className:"chat-session-meta",children:[e.jsx("span",{children:B.get(t.agentId)?.name||(t.agentId===ye?Ke(t.modelProvider,t.modelId)??"Fusion":t.agentId.slice(0,30))}),e.jsx("span",{children:t.updatedAt?Je(t.updatedAt):""})]})]},t.id))}),e.jsx("div",{className:"chat-sidebar-footer",children:e.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>U(!0),"data-testid":"chat-new-btn-mobile",children:[e.jsx(Re,{size:14}),"New Chat"]})})]}),q&&e.jsxs("div",{className:"chat-session-context-menu",style:{top:q.y,left:q.x},onClick:t=>t.stopPropagation(),children:[e.jsxs("button",{onClick:()=>at(q.sessionId),"data-testid":"chat-context-archive",children:[e.jsx(Tt,{size:14}),"Archive"]}),e.jsxs("button",{onClick:()=>{ne(null),J(q.sessionId)},"data-testid":"chat-context-delete",children:[e.jsx(He,{size:14}),"Delete"]})]}),N&&e.jsx("div",{className:"chat-new-dialog-backdrop",onClick:()=>J(null),children:e.jsxs("div",{className:"chat-new-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:"Delete Conversation?"}),e.jsx("p",{style:{fontSize:"14px",color:"var(--text-secondary)",marginBottom:"16px"},children:"This action cannot be undone. All messages in this conversation will be permanently deleted."}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>J(null),children:"Cancel"}),e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void it(N),children:"Delete"})]})]})}),e.jsxs("div",{className:"chat-thread",children:[(c||!me)&&e.jsxs("div",{className:"chat-thread-header",children:[me&&c&&e.jsx("button",{className:"btn-icon",onClick:rt,"data-testid":"chat-back-btn",children:e.jsx(At,{size:16})}),e.jsx(je,{size:16}),e.jsx("span",{className:"chat-thread-header-title",children:Ie}),ot&&e.jsx("span",{className:"chat-model-tag",children:Y})]}),e.jsxs("div",{className:"chat-messages",ref:L,children:[f?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):r.length===0&&!c?ct():r.length===0&&c?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):e.jsxs(e.Fragment,{children:[r.map(t=>{const a=t.role==="assistant",o=k.has(t.id);return e.jsxs("div",{className:`chat-message chat-message--${t.role}`,"data-testid":`chat-message-${t.id}`,children:[a&&e.jsxs("div",{className:"chat-message-avatar",children:[e.jsx(je,{size:14}),e.jsx("span",{children:Pe}),Fe&&e.jsx("span",{className:"chat-model-tag",children:Y}),e.jsx("button",{type:"button",className:`btn btn-icon chat-message-render-toggle${o?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":o?"Show rendered markdown":"Show plain text",onClick:()=>Oe(t.id),children:o?e.jsx(Ge,{size:14}):e.jsx(Ue,{size:14})})]}),a?Ve(t.content,o):e.jsx("div",{className:"chat-message-content",children:Xe(t.content)}),Qe(t.toolCalls),t.thinkingOutput&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:"Thinking"}),e.jsx("pre",{className:"chat-message-thinking-content",children:t.thinkingOutput})]}),e.jsx("div",{className:"chat-message-time",children:Je(t.createdAt)})]},t.id)}),v&&e.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[e.jsxs("div",{className:"chat-message-avatar",children:[e.jsx(je,{size:14}),e.jsx("span",{children:Pe}),Fe&&e.jsx("span",{className:"chat-model-tag",children:Y}),e.jsx("button",{type:"button",className:`btn btn-icon chat-message-render-toggle${k.has("__streaming__")?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":k.has("__streaming__")?"Show rendered markdown":"Show plain text",onClick:()=>Oe("__streaming__"),children:k.has("__streaming__")?e.jsx(Ge,{size:14}):e.jsx(Ue,{size:14})})]}),M?Ve(M,k.has("__streaming__")):e.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:w?"Thinking…":"Connecting…"}),Qe(X),w&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:"Thinking"}),e.jsx("pre",{className:"chat-message-thinking-content",children:w})]}),e.jsxs("div",{className:"chat-typing-indicator",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})]})]}),e.jsx("div",{ref:b})]}),c&&e.jsxs("div",{className:"chat-input-area",children:[Q&&e.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:Ne?e.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):z.length===0?e.jsx("div",{className:"chat-skill-menu-empty",children:oe?"No skills found":"No skills available"}):z.map((t,a)=>e.jsxs("button",{type:"button",role:"option","aria-selected":a===ue,className:`chat-skill-menu-item${a===ue?" chat-skill-menu-item--highlighted":""}`,onMouseDown:o=>o.preventDefault(),onMouseEnter:()=>ie(a),onClick:()=>Ae(t),children:[e.jsx("span",{className:"chat-skill-menu-item-name",children:t.name}),e.jsx("span",{className:"chat-skill-menu-item-description",title:t.relativePath,children:t.relativePath})]},t.id))}),e.jsxs("div",{className:"chat-input-wrapper",children:[e.jsx("textarea",{ref:C,className:"chat-input-textarea",placeholder:"Type a message...",value:A,onChange:et,onKeyDown:Ze,onKeyUp:tt,onClick:Ee,onBlur:st,onFocus:nt,rows:1,"data-testid":"chat-input"}),e.jsx($t,{agents:ge,filter:he,highlightedIndex:Se,visible:H,onSelect:$e,position:"below"}),e.jsx(Et,{visible:d.mentionActive&&!H,position:be,files:d.files,selectedIndex:d.selectedIndex,onSelect:t=>{const a=d.selectFile(t,A);V(a),d.dismissMention(),j(!1),C.current?.focus()},loading:d.loading}),T&&e.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[e.jsx("span",{children:`Queued: ${dt}`}),e.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:pe,children:"×"})]})]}),v?e.jsx("button",{className:"chat-input-stop",onClick:O,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:e.jsx(Pt,{size:14})}):e.jsx("button",{className:"chat-input-send",onClick:()=>void Te(),disabled:!A.trim(),"data-testid":"chat-send-btn",children:e.jsx(Dt,{size:16})})]})]}),Z&&e.jsx(Gt,{projectId:n,onClose:()=>U(!1),onCreate:Ye})]})}export{Qt as ChatView};
@@ -1,11 +0,0 @@
1
- import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{c as De,bm as Me,bn as de,bo as et,bp as ue,s as Ue,bq as ge,br as we,bs as xe,bt as ye,bu as tt,bv as ae,bw as rt,bx as st,by as nt,bz as at,bA as it,bB as ie,L as ee,S as lt,bC as ct,bD as ot,K as dt,T as Ae,bE as ut,E as vt,aJ as mt,a3 as ft,ah as pt,R as ht}from"./index-Cf4wCcWp.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
- * @license lucide-react v1.7.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const bt=[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]],gt=De("rotate-cw",bt);/**
7
- * @license lucide-react v1.7.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const wt=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]],Pe=De("shield-alert",wt),ve=500,xt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function Te(e){return e.length<=ve?e:e.slice(-ve)}function le(e,i){return Te([...e,i])}function X(e){try{return JSON.parse(e)}catch{return null}}function Q(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function yt(e){return e?.previewUrl??null}async function Ne(e){return rt(e)}async function Se(e,i){return st(e,i)}async function Nt(e){return nt(e)}async function St(e){return at(e)}async function ke(e){return it(e)}function V(e){try{return e()}catch{return null}}function ce(){return typeof V(()=>de)=="function"&&typeof V(()=>Me)=="function"}function W(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function kt(e){const[i,o]=r.useState(null),[b,y]=r.useState([]),[w,f]=r.useState([]),[j,M]=r.useState([]),[C,P]=r.useState(!0),[N,u]=r.useState(null),n=r.useRef(0),[d,U]=r.useState(null),R=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-ve).map(Q);f(s)}},[]),A=r.useCallback(async()=>{const a=n.current;try{if(ce())if(d){const s=await Me(d,e);if(n.current!==a)return;R(s)}else{const s=await de(e);if(n.current!==a)return;y(s),s.length>0&&(U(s[0].config.id),R(s[0]))}else{const s=await Ne(e);if(n.current!==a)return;const c=W(s);y([c]),R(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[R,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),M([]),P(!0),u(null),U(null),(async()=>{try{const[c,l]=await Promise.allSettled([ce()?de(e):Ne(e).then(S=>[W(S)]),typeof V(()=>ae)=="function"?ae(e):ke(e).then(S=>S.map(g=>({name:g.name,command:g.command,cwd:g.cwd,scriptName:g.scriptName,packagePath:g.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const S=c.value;if(y(S),S.length>0){const g=S[0];ce()&&U(g.config.id),R(g)}}else v=B(c.reason);l.status==="fulfilled"&&M(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&P(!1)}})()},[R,e]),r.useEffect(()=>{const a=d?et(d,e):typeof V(()=>ue)=="function"?ue(e):null;if(!a)return;const s=n.current,c=Ue(a,{events:{history:l=>{if(n.current!==s)return;const v=X(l.data);if(v?.lines){const S=v.lines.map(Q);f(Te(S))}},log:l=>{if(n.current!==s)return;const v=X(l.data);if(v){const S=typeof v.line=="string"?v.line:Q(v);f(g=>le(g,S))}},"dev-server:log":l=>{if(n.current!==s)return;const v=X(l.data);if(v){const S=typeof v.line=="string"?v.line:Q(v);f(g=>le(g,S))}},"dev-server:output":l=>{if(n.current!==s)return;const v=X(l.data);v?.line&&f(S=>le(S,v.line))},status:l=>{if(n.current!==s)return;const v=X(l.data),S=v?.status;S&&o(g=>g&&{...g,status:S,runtime:v.pid?{...g.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:g.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=X(l.data);if(v?.status){const S=W(v);o(S),y([S])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&A()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,A,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{A()},xt);return()=>{clearInterval(a)}},[A,i?.status]);const _=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>ge)=="function")l=await ge(d,e);else{const v=await Se({command:a,cwd:s},e);l=W(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>we)=="function")s=await we(d,e);else{const c=await Nt(e);s=W(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),k=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>xe)=="function")s=await xe(d,e);else{const c=await St(e);s=W(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),T=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>ye)=="function")c=await ye(d,a,e);else{const l=await tt({url:a},e);c={url:l.manualUrl??l.previewUrl??l.detectedUrl??null,source:l.manualUrl?"manual":"auto"}}if(n.current!==s)return;o(l=>l?{...l,previewUrl:c.url??void 0}:null),u(null)}catch(c){if(n.current!==s)return;throw u(B(c)),c}},[e,d]),h=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;try{s=await ae(e)}catch{s=(await ke(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;M(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e]),p=r.useCallback(async(a,s)=>{if(typeof a!="string"&&!d)try{const v=a,S=await Se({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),g=W(S);o(g),y([g]),u(null);return}catch(v){throw u(B(v)),v}const c=typeof a=="string"?a:a.command,l=typeof a=="string"?s:a.cwd;await _(c,l)},[e,_,d]),E=r.useCallback(async()=>{await D()},[D]),L=r.useCallback(async()=>{await k()},[k]),z=r.useCallback(async a=>{await T(a)},[T]),F=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await A()},[A]),H=yt(i),x=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:b,logs:w,detectedCommands:j,previewUrl:H,isLoading:C,error:N,startServer:_,stopServer:D,restartServer:k,setPreviewUrl:T,detectCommands:h,refresh:A,candidates:j,serverState:x,loading:C,start:p,stop:E,restart:L,setManualUrl:z,detect:F,refreshStatus:O}}const je=500,Ce=100;function ze(e){return e.length>je?e.slice(-je):e}function $e(e){return e==="stderr"?"stderr":"stdout"}function Y(e){try{return JSON.parse(e.data)}catch{return null}}function Z(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:$e(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function jt(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function oe(e,i){if(i.length===0)return e;const o=[...e],b=new Set(e.map(y=>y.id));for(const y of i)b.has(y.id)||(b.add(y.id),o.push(y));return o.sort((y,w)=>y.id-w.id),ze(o)}function Ct(e,i){const[o,b]=r.useState([]),[y,w]=r.useState(!1),[f,j]=r.useState(!1),[M,C]=r.useState(!1),[P,N]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),U=r.useRef(0),R=r.useRef(e),A=r.useRef(i),_=r.useRef(0),D=r.useRef(1);(R.current!==e||A.current!==i)&&(R.current=e,A.current=i,d.current++,n.current=!0,_.current=0,D.current=1,b([]),w(!1),j(!1),C(!1),N(null),u.current&&(u.current(),u.current=null)),r.useEffect(()=>{if(!i){u.current&&(u.current(),u.current=null);return}const E=d.current,L=++U.current;n.current=!1,w(!0);const z=(x,a)=>{const s=ze(x);b(s),N(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;_.current=c,D.current=c+1},F=x=>{if(n.current||d.current!==E||!x||typeof x!="object")return;const a=x.lines;if(!Array.isArray(a))return;if(a.length>0&&typeof a[0]=="string"){const c=a.filter(l=>typeof l=="string").map((l,v)=>jt(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>Z(c,l+1));z(s,s.length)},O=x=>{if(n.current||d.current!==E)return;const a=typeof x.text=="string"?x.text:typeof x.line=="string"?x.line:null;if(!a)return;const s=D.current,c=typeof x.id=="number"&&Number.isFinite(x.id)?x.id:s,l={id:c,text:a,stream:$e(x.stream),timestamp:typeof x.timestamp=="string"?x.timestamp:""};_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1),b(v=>oe(v,[l])),N(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await ie({maxLines:Ce},e);if(n.current||d.current!==E||U.current!==L)return;const s=a.lines.map((c,l)=>Z(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==E||U.current!==L)return;z([],null)}finally{!n.current&&d.current===E&&U.current===L&&w(!1)}const x=ue(e);u.current=Ue(x,{events:{"dev-server:log":a=>{const s=Y(a);s&&O(s)},log:a=>{const s=Y(a);s&&O(s)},history:a=>{const s=Y(a);F(s)},"dev-server:history":a=>{const s=Y(a);F(s)}},onReconnect:()=>{n.current||d.current!==E||ie({lastEventId:_.current,maxLines:50},e).then(a=>{if(n.current||d.current!==E)return;const s=a.lines.map((c,l)=>Z(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1)}b(c=>oe(c,s)),N(a.totalLines)}).catch(()=>{})}})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const T=r.useCallback(async()=>{if(!i||f)return;const E=d.current,L=o.length;j(!0);try{const z=await ie({maxLines:Ce,offset:L},e);if(n.current||d.current!==E)return;const F=z.lines.map((O,H)=>Z(O,H+1));b(O=>oe(F,O)),C(z.totalLines>L+F.length),N(z.totalLines)}catch{}finally{j(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{b([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:M,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const Et="This preview appears to block iframe embedding. Open it in a new tab instead.",Lt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Rt="Preview is taking longer than expected and may block iframe embedding.";function _t(e){return e==="blocked"?Et:e==="error"?Lt:null}function Dt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:b=null}=i,y=r.useRef(null),w=r.useRef(null),[f,j]=r.useState("unknown"),[M,C]=r.useState(null),[P]=r.useState(b),N=r.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),u=r.useCallback(k=>{j(k),C(_t(k))},[]),n=r.useCallback(()=>{j("blocked"),C(Rt)},[]);r.useEffect(()=>{if(N(),!e){j("unknown"),C(null);return}j("unknown"),C(null);let k=!1;return queueMicrotask(()=>{k||(j("loading"),C(null))}),()=>{k=!0,N()}},[N,e]),r.useEffect(()=>{if(f!=="loading"){N();return}const k=setTimeout(()=>{w.current=null,n()},o);return w.current=k,()=>{clearTimeout(k),w.current===k&&(w.current=null)}},[N,f,o,n]);const d=r.useCallback(()=>{const k=y.current;if(!k){u("embedded");return}try{if(k.contentWindow?.location?.href==="about:blank"&&k.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),U=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(N(),!e){j("unknown"),C(null);return}j("unknown"),C(null)},[N]);const R=r.useCallback(()=>{N(),j("unknown"),C(null)},[N]),A=R,_=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:_,isBlocked:D,blockReason:M,detectionMethod:P,iframeRef:y,resetEmbedStatus:R,setEmbedStatus:u,retry:A,embedContext:M,handleIframeLoad:d,handleIframeError:U}}const Mt=/\x1b\[[0-9;]*m/g;function me(e){return e.replace(Mt,"")}function Ut(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function At(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pt(e){if(e.stream==="stderr")return"error";const i=me(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Tt(e,i){if(!i)return e;const o=new RegExp(`(${At(i)})`,"ig"),b=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:b.map((w,f)=>w.toLowerCase()===y?t.jsx("mark",{children:w},`${w}-${f}`):t.jsx("span",{children:w},`${w}-${f}`))})}function zt({entries:e,loading:i,loadingMore:o,hasMore:b,total:y,onLoadMore:w,isRunning:f}){const j=r.useRef(null),M=r.useRef(e.length),C=r.useRef(f),[P,N]=r.useState(!1),[u,n]=r.useState(!1),[d,U]=r.useState(""),[R,A]=r.useState("all"),_=r.useMemo(()=>R==="all"?e:e.filter(p=>Pt(p)===R),[e,R]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?_.filter(E=>me(E.text).toLowerCase().includes(p)):_},[_,d]),k=D.length,T=r.useCallback(()=>{const p=j.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,E=M.current,L=e.length>E;f&&(!p||!u&&L)&&T(),C.current=f,M.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=j.current;if(!p)return;const L=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!L)},[]);return r.useEffect(()=>{i||e.length===0||!u&&f&&T()},[e,f,u,i,T]),i&&e.length===0?t.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:t.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[t.jsx(ee,{size:16,className:"devserver-log-viewer__spinner"}),t.jsx("span",{children:"Loading logs…"})]})}):t.jsxs("section",{className:`devserver-log-viewer${P?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[t.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[t.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[t.jsx("span",{className:"devserver-log-viewer__title",children:"Logs"}),t.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[y!==null?`${e.length}/${y}`:`${e.length}`," lines"]})]}),t.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[t.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[t.jsx("span",{className:"visually-hidden",children:"Filter logs by severity"}),t.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:R,onChange:p=>A(p.target.value),"data-testid":"devserver-log-severity-filter","aria-label":"Filter logs by severity",children:[t.jsx("option",{value:"all",children:"All severities"}),t.jsx("option",{value:"info",children:"Info"}),t.jsx("option",{value:"warn",children:"Warn"}),t.jsx("option",{value:"error",children:"Error"})]})]}),t.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[t.jsx("span",{className:"visually-hidden",children:"Search logs"}),t.jsx(lt,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>U(p.target.value),placeholder:"Search logs","data-testid":"devserver-log-search-input","aria-label":"Search logs"})]}),d.trim().length>0&&t.jsxs("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:[k," match",k===1?"":"es"]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>N(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":P?"Exit fullscreen logs":"Enter fullscreen logs",children:P?t.jsx(ct,{size:14}):t.jsx(ot,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[b&&t.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:t.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:w,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(ee,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:j,className:"devserver-log-viewer__content",onScroll:h,"data-testid":"devserver-log-content",children:[!i&&D.length===0&&t.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?"No logs yet. Start the dev server to see output.":_.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const E=me(p.text),L=Ut(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[L&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:L}),p.stream==="stderr"&&t.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:"ERR"}),t.jsx("span",{className:"devserver-log-text",children:Tt(E,d.trim())})]},p.id)})]}),u&&f&&t.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:T,"data-testid":"devserver-log-jump-button",children:[t.jsx(dt,{size:14}),"New logs"]})]})]})}const $t="devserver-preview-iframe";function Ft({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:b,blockReason:y,onRetry:w,className:f=$t,embedContext:j}){const M=y??j??null,[C,P]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(P(d=>d+1),o("loading"))},[i,o,e]);const N=r.useCallback(()=>{const d=b.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[b,o]),u=r.useCallback(d=>{d.stopPropagation(),o("error")},[o]),n=r.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?t.jsxs("div",{className:"devserver-preview-iframe-shell",children:[t.jsx("iframe",{src:e,ref:b,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:N,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${C}`),i==="loading"&&t.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading preview..."})]}),i==="blocked"&&t.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Preview cannot be embedded"}),M&&t.jsx("p",{className:"devserver-preview-blocked-context",children:M})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Unable to load preview"}),M&&t.jsx("p",{className:"devserver-preview-blocked-context",children:M})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]})]}):null}const Ee={stopped:{className:"dev-server-status-badge--stopped",label:"Stopped"},starting:{className:"dev-server-status-badge--starting",label:"Starting..."},running:{className:"dev-server-status-badge--running",label:"Running"},stopping:{className:"dev-server-status-badge--starting",label:"Stopping..."},failed:{className:"dev-server-status-badge--failed",label:"Failed"}};function Le(e){return e instanceof Error?e.message:String(e)}function Fe(e){return e==="."?"root":e}function Re(e){return e?e==="root"?".":e:null}function _e(e,i,o){return!i||e.scriptName!==i?!1:o?Fe(e.cwd)===o:!0}function Ot(e){return e.cwd==="."?"root":e.cwd}function Bt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Wt({addToast:e,projectId:i}){const{session:o,detectedCommands:b,previewUrl:y,isLoading:w,error:f,startServer:j,stopServer:M,restartServer:C,setPreviewUrl:P,detectCommands:N,refresh:u}=kt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",U=Ee[n]??Ee.stopped,{entries:R,loading:A,loadingMore:_,hasMore:D,total:k,loadMore:T}=Ct(i,!!i),h=y,p=o?.config?.cwd??null,[E,L]=r.useState(!0),[z,F]=r.useState(""),[O,H]=r.useState(""),[x,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),S=l==="embedded"?h:null,{embedStatus:g,setEmbedStatus:Oe,resetEmbedStatus:G,iframeRef:I,isEmbedded:Be,isBlocked:te,blockReason:re,retry:fe}=Dt(S),[pe,q]=r.useState(!1),he=r.useRef(g);r.useEffect(()=>{const m=he.current!==g;te&&m&&q(!0),g==="embedded"&&q(!1),he.current=g},[g,te]),r.useEffect(()=>{q(!1)},[h]);const J=r.useMemo(()=>{if(!x)return null;const m=Re(p);return b.find($=>!($.scriptName!==x||m&&$.cwd!==m||o?.config?.command&&$.command!==o.config.command))??b.find($=>_e($,x,p))??null},[b,o?.config?.command,x,p]);r.useEffect(()=>{typeof N=="function"&&N().catch(m=>{e(Le(m),"error")})},[e,N]),r.useEffect(()=>{if(x){L(!1);return}L(!0)},[x]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&F(o.config.command);return}if(J){F(J.command);return}b.length>0&&F(m=>m.trim().length>0?m:b[0]?.command??"")},[b,J,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const se=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),be=r.useCallback(()=>{q(!1),fe()},[fe]),He=r.useCallback(()=>{try{const m=I.current;if(m?.contentWindow){m.contentWindow.location.reload(),q(!1),G();return}}catch{}if(!(!h||!I.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),I.current.src=m.toString(),q(!1),G()}catch{I.current.src=h,q(!1),G()}},[h,I,G]),K=r.useCallback(async(m,$,ne)=>{c(m);try{await $(),e(ne,"success")}catch(Ze){e(Le(Ze),"error")}finally{c(null)}},[e]),Ve=r.useCallback(m=>{a(m.scriptName),L(!1),F(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),qe=r.useCallback(()=>{a(null),L(!0),e("Cleared selected dev server script.","success")},[e]),We=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const $=Re(p)??".",ne=J?.cwd??$;K("start",()=>j(m,ne),"Dev server started.")},Ie=()=>{K("stop",M,"Dev server stopped.")},Xe=()=>{K("restart",C,"Dev server restarted.")},Ge=()=>{const m=O.trim(),$=m.length>0?m:null;K("preview",()=>P($),$?"Preview URL updated.":"Preview URL override cleared.")},Je=r.useCallback(()=>{f&&u()},[f,u]),Ke=n==="starting"||n==="running"||s!==null,Qe=n==="stopped"||s!==null,Ye=n==="stopped"||n==="starting"||s!==null;return t.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[t.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[t.jsxs("div",{className:"dev-server-header-title",children:[t.jsx(ut,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${U.className}`,"data-testid":"dev-server-status-badge",children:U.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:We,disabled:Ke,"data-testid":"dev-server-start-button",children:[t.jsx(vt,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ie,disabled:Qe,"data-testid":"dev-server-stop-button",children:[t.jsx(mt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Xe,disabled:Ye,"data-testid":"dev-server-restart-button",children:[t.jsx(gt,{size:14}),t.jsx("span",{children:s==="restart"?"Restarting...":"Restart"})]})]})]}),t.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Configuration"}),w&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),w&&!o&&b.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading dev server configuration..."})]}),f&&t.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[t.jsx("p",{children:f}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:Je,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),x&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:x}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:qe,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),E&&b.length===0&&t.jsxs("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:["No dev server scripts detected. Check that your project has a ",t.jsx("code",{children:"package.json"})," with a ",t.jsx("code",{children:"dev"}),", ",t.jsx("code",{children:"start"}),", or similar script."]}),E&&b.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:b.map(m=>{const $=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${$?"dev-server-candidate--selected":""}`,onClick:()=>Ve(m),"data-testid":`dev-server-candidate-${m.scriptName}-${Fe(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:Bt(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:Ot(m)})]},`${m.cwd}::${m.scriptName}::${m.command}`)})})]}),t.jsxs("div",{className:"dev-server-field-group",children:[t.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:"Command"}),t.jsx("input",{id:"dev-server-command",className:"input",value:z,onChange:m=>F(m.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:n==="running"||n==="starting"})]}),(n==="running"||n==="starting")&&o&&t.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[t.jsx("span",{className:"dev-server-label",children:"Running command"}),t.jsx("code",{children:o.config?.command??z})]}),t.jsxs("div",{className:"dev-server-preview-override",children:[t.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:"Preview URL Override"}),t.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:O,onChange:m=>H(m.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ge,disabled:s==="preview","data-testid":"dev-server-set-preview",children:"Save"})]}),h&&t.jsxs("p",{className:"dev-server-preview-hint",children:["Auto-detected: ",h]})]}),t.jsxs("div",{className:"dev-server-content",children:[t.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Logs"}),t.jsxs("span",{className:"dev-server-muted",children:[k??R.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(zt,{entries:R,loading:A,loadingMore:_,hasMore:D,total:k,onLoadMore:T,isRunning:d})})]}),t.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[t.jsxs("div",{className:"devserver-preview-header",children:[t.jsxs("div",{className:"devserver-preview-title",children:[t.jsx(ft,{size:14}),t.jsx("span",{children:"Preview"})]}),t.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:h??"No preview URL","data-testid":"devserver-preview-url-badge",children:["Auto",h?` · ${h}`:" · Not available"]}),t.jsxs("div",{className:"devserver-preview-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(m=>m==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:l==="embedded"?"External only":"Embedded"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Open in new tab",onClick:se,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(pt,{size:14})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:He,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(ht,{size:14})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":g,"data-embedded":Be?"true":"false",children:[!h&&!d&&t.jsx("p",{className:"devserver-preview-empty",children:"Start a dev server to see a live preview here."}),!h&&d&&t.jsx("p",{className:"devserver-preview-empty",children:"No preview URL detected. Start the dev server or set a manual URL to preview your app."}),h&&l==="external"&&t.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[t.jsx("p",{children:"Embedded preview is disabled. Open your app in a separate browser tab."}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:se,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&pe&&te&&t.jsxs("div",{className:g==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[g==="error"?t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:g==="error"?"Preview failed":"Preview blocked"}),re&&t.jsx("p",{className:"devserver-preview-blocked-context",children:re})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"Open the preview in a new tab, or retry embedded mode after checking your server settings."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:se,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:be,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!pe&&t.jsx(Ft,{url:h,embedStatus:g,onEmbedStatusChange:Oe,iframeRef:I,blockReason:re,onRetry:be})]})]})]})]})}export{Wt as DevServerView};
@@ -1 +0,0 @@
1
- .dev-server-view{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg);min-height:0;height:100%;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain}.dev-server-header{display:flex;justify-content:space-between;align-items:center;gap:var(--space-md);padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card)}.dev-server-header-title{display:flex;align-items:center;gap:var(--space-sm)}.dev-server-header-title h2{margin:0;font-size:1.125rem;font-weight:600;color:var(--text)}.dev-server-header-actions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.dev-server-status-badge{display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;border-radius:var(--radius-pill);padding:var(--space-xs) var(--space-sm);font-family:var(--font-mono)}.dev-server-status-badge--stopped{color:var(--color-muted);background:color-mix(in srgb,var(--color-muted) 16%,transparent);border-color:color-mix(in srgb,var(--color-muted) 40%,transparent)}.dev-server-status-badge--starting{color:var(--color-warning);background:color-mix(in srgb,var(--color-warning) 16%,transparent);border-color:color-mix(in srgb,var(--color-warning) 40%,transparent)}.dev-server-status-badge--running{color:var(--color-success);background:color-mix(in srgb,var(--color-success) 16%,transparent);border-color:color-mix(in srgb,var(--color-success) 40%,transparent)}.dev-server-status-badge--failed{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 16%,transparent);border-color:color-mix(in srgb,var(--color-error) 40%,transparent)}.dev-server-panel{display:flex;flex-direction:column;gap:var(--space-md);min-height:0;padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);cursor:default;user-select:text;touch-action:auto}.dev-server-config{flex:0 0 auto;min-height:0;max-height:min(52vh,calc(var(--space-2xl) * 16));overflow-y:auto;overscroll-behavior:contain}.dev-server-section-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.dev-server-section-header h3{margin:0}.dev-server-muted{color:var(--text-muted);font-family:var(--font-mono)}.dev-server-field-group{display:flex;flex-direction:column;gap:var(--space-xs)}.dev-server-label{color:var(--text-muted)}.dev-server-empty-state{margin:0;color:var(--text-muted)}.dev-server-empty-state code{font-family:var(--font-mono)}.dev-server-section{display:flex;flex-direction:column;gap:var(--space-md);min-height:0;padding:var(--space-xl);max-width:calc(var(--space-2xl) * 25);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.dev-server-section h3{margin:0}.dev-server-candidates{display:flex;flex-direction:column;gap:var(--space-sm);min-height:0;max-height:min(36vh,calc(var(--space-2xl) * 9));overflow-y:auto;overscroll-behavior:contain}.dev-server-candidate{display:flex;align-items:center;gap:var(--space-md);width:100%;padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text);text-align:left;cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.dev-server-candidate:hover{background:var(--card-hover)}.dev-server-candidate:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.dev-server-candidate--selected{border-left:calc(var(--btn-border-width) * 3) solid var(--todo);background:var(--status-todo-bg)}.dev-server-candidate-name{font-family:var(--font-mono);font-size:.8125rem;font-weight:600}.dev-server-candidate-command{color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem;max-width:calc(var(--space-2xl) * 9 + var(--space-md));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dev-server-candidate-source{margin-left:auto;color:var(--text-dim);font-size:.6875rem}.dev-server-selected{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.dev-server-selected .btn{margin-left:0}.dev-server-preview-override{display:flex;align-items:center;gap:var(--space-sm);margin-top:var(--space-xl)}.dev-server-preview-override .input{flex:1}.dev-server-preview-hint{margin:0;color:var(--text-muted)}.dev-server-loading-state{display:flex;align-items:center;gap:var(--space-sm);color:var(--text-muted)}.dev-server-error-box{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm);border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--color-error) 10%,transparent);color:var(--color-error)}.dev-server-error-box p{margin:0}.dev-server-current-command{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.dev-server-current-command code{font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word}.dev-server-error{margin:0;padding:var(--space-sm);border-radius:var(--radius-sm);border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent);color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.dev-server-content{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--space-md)}.dev-server-logs-panel,.dev-server-preview{min-height:0}.dev-server-logs-viewer{flex:1;min-height:0}.dev-server-logs{flex:1;min-height:clamp(calc(var(--space-2xl) * 3 + var(--space-xs)),28vh,calc(var(--space-2xl) * 5));max-height:clamp(calc(var(--space-2xl) * 8),55vh,calc(var(--space-2xl) * 14));padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);overflow-y:auto;font-family:var(--font-mono)}.dev-server-log-line{margin:0;white-space:pre-wrap;word-break:break-word}.devserver-preview-panel{display:flex;flex-direction:column;border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;background:var(--surface)}.devserver-preview-header{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--border)}.devserver-preview-title{display:flex;align-items:center;gap:var(--space-xs);font-size:.8125rem;font-weight:600;color:var(--text)}.devserver-preview-url-badge{flex:1 1 auto;min-width:0;max-width:calc(var(--space-2xl) * 9);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);font-family:var(--font-mono);font-size:.6875rem}.devserver-preview-url-badge--manual{color:var(--color-info);background:color-mix(in srgb,var(--color-info) 14%,transparent)}.devserver-preview-url-badge--auto{color:var(--text-muted);background:color-mix(in srgb,var(--surface) 70%,var(--text))}.devserver-preview-actions{display:flex;gap:var(--space-xs);margin-left:auto}.devserver-preview-container{position:relative;flex:1;min-height:clamp(calc(var(--space-2xl) * 4),42vh,calc(var(--space-2xl) * 9 + var(--space-sm)));max-height:clamp(calc(var(--space-2xl) * 10),72vh,calc(var(--space-2xl) * 18 + var(--space-lg)));overflow:hidden}.devserver-preview-iframe-shell{position:relative;width:100%;height:100%}.devserver-preview-iframe{width:100%;height:100%;border:none;background:var(--surface)}.devserver-preview-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);background:color-mix(in srgb,var(--bg) 85%,transparent);color:var(--text-muted)}.devserver-preview-blocked-panel,.devserver-preview-error-panel{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100%;gap:var(--space-md);padding:var(--space-xl);text-align:center;border-radius:var(--radius-lg)}.devserver-preview-blocked-panel{background:color-mix(in srgb,var(--color-warning) 8%,transparent);border:1px solid color-mix(in srgb,var(--color-warning) 20%,transparent)}.devserver-preview-error-panel{background:color-mix(in srgb,var(--color-error) 8%,transparent);border:1px solid color-mix(in srgb,var(--color-error) 20%,transparent)}.devserver-preview-blocked-icon{width:calc(var(--space-2xl) + var(--space-lg));height:calc(var(--space-2xl) + var(--space-lg));color:var(--color-warning)}.devserver-preview-error-panel .devserver-preview-blocked-icon{color:var(--color-error)}.devserver-preview-blocked-title{margin:0 0 var(--space-xs);font-size:1rem;font-weight:600;color:var(--text)}.devserver-preview-blocked-context{margin:0;font-size:.75rem;color:var(--text-muted);font-family:var(--font-mono);background:color-mix(in srgb,var(--bg) 80%,transparent);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm)}.devserver-preview-blocked-description{margin:0;color:var(--text-muted);font-size:.8125rem}.devserver-preview-blocked-actions{display:flex;gap:var(--space-sm);flex-wrap:wrap;justify-content:center}.devserver-preview-empty{margin:0;padding:var(--space-2xl);text-align:center;color:var(--text-dim);font-size:.8125rem}.devserver-preview-external-only{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);min-height:100%;padding:var(--space-lg);text-align:center;color:var(--text-muted);background:color-mix(in srgb,var(--surface) 80%,var(--text))}.devserver-preview-external-only p{margin:0}.dev-server-preview-fallback{border:1px solid color-mix(in srgb,var(--color-warning) 40%,transparent);background:color-mix(in srgb,var(--color-warning) 10%,transparent)}.dev-server-preview-external-only{border:1px solid var(--border);background:var(--surface)}.dev-server-spin{animation:dev-server-spin 1s linear infinite}@media(max-width:768px){.dev-server-view{padding:var(--space-md)}.dev-server-header{flex-direction:column;align-items:flex-start}.dev-server-header-actions{width:100%}.dev-server-content{grid-template-columns:minmax(0,1fr)}.devserver-preview-header{flex-wrap:wrap}.devserver-preview-url-badge{flex:1 1 auto;min-width:0}.devserver-preview-actions{width:100%;margin-left:0;justify-content:flex-end}.dev-server-preview-override{flex-direction:column;align-items:stretch}.dev-server-candidate,.dev-server-selected{flex-wrap:wrap}.dev-server-config{max-height:min(48vh,calc(var(--space-2xl) * 13))}.dev-server-candidates{max-height:min(32vh,calc(var(--space-2xl) * 7))}.dev-server-candidate-source{margin-left:0}.dev-server-header-actions .btn,.devserver-preview-actions .btn,.dev-server-preview-override .btn,.devserver-preview-external-only .btn,.devserver-preview-blocked-panel .btn,.devserver-preview-error-panel .btn,.devserver-log-viewer__load-more .btn{min-height:calc(var(--space-lg) + var(--space-lg) + var(--space-xs))}.devserver-preview-actions .btn-icon{min-width:calc(var(--space-lg) + var(--space-lg) + var(--space-xs));min-height:calc(var(--space-lg) + var(--space-lg) + var(--space-xs))}.devserver-log-viewer__toolbar{flex-wrap:wrap;padding:var(--space-xs) var(--space-sm)}.devserver-log-viewer__toolbar-actions{width:100%;justify-content:space-between}.devserver-log-viewer__search{flex:1}.devserver-log-viewer__search-input{min-width:0;width:100%}.devserver-log-viewer__content{padding:var(--space-xs);font-size:.6875rem}.devserver-log-viewer__new-logs-button{bottom:var(--space-lg);min-height:calc(var(--space-lg) + var(--space-lg) + var(--space-xs))}.dev-server-logs,.devserver-preview-container,.devserver-preview-iframe{min-height:calc(var(--space-2xl) * 4 + var(--space-md))}.devserver-preview-blocked-panel,.devserver-preview-error-panel,.devserver-preview-external-only{word-break:break-word}.devserver-preview-blocked-panel,.devserver-preview-error-panel{padding:var(--space-md)}.devserver-preview-blocked-actions .btn{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-sm))}.chat-tool-calls-header,.chat-tool-call summary,.chat-tool-call-content,.chat-tool-call-preview,.chat-tool-call-value{font-size:.6875rem}.chat-tool-call summary{padding:var(--space-xs)}.chat-tool-call-content{margin:var(--space-xs);padding:var(--space-xs)}.chat-tool-call-status-text{font-size:.625rem}}.devserver-log-viewer{display:flex;flex-direction:column;height:100%;min-height:0;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);overflow:hidden}.devserver-log-viewer--fullscreen{position:fixed;inset:0;z-index:120;border-radius:0}.devserver-log-viewer__toolbar{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--border);background:var(--card)}.devserver-log-viewer__toolbar-meta{display:flex;align-items:baseline;gap:var(--space-sm)}.devserver-log-viewer__title{color:var(--text);font-weight:600}.devserver-log-viewer__count{color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem}.devserver-log-viewer__toolbar-actions{display:flex;align-items:center;gap:var(--space-sm)}.devserver-log-viewer__severity,.devserver-log-viewer__search{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--text-muted)}.devserver-log-viewer__severity-select{min-height:calc(var(--space-lg) + var(--space-md));min-width:calc(var(--space-2xl) * 3);font-size:.75rem}.devserver-log-viewer__search-input{min-height:calc(var(--space-lg) + var(--space-md));min-width:calc(var(--space-2xl) * 4);font-size:.75rem}.devserver-log-viewer__matches{color:var(--text-muted);font-family:var(--font-mono);font-size:.6875rem}.devserver-log-viewer__body{position:relative;display:flex;flex:1;flex-direction:column;min-height:0}.devserver-log-viewer__load-more{display:flex;justify-content:center;padding:var(--space-sm);border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--surface) 95%,var(--text))}.devserver-log-viewer__content{flex:1;min-height:0;overflow-y:auto;padding:var(--space-sm);font-family:var(--font-mono);font-size:.75rem;line-height:1.5;background:var(--surface)}.devserver-log-viewer__loading,.devserver-log-viewer__empty{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);min-height:calc(var(--space-2xl) * 4);margin:0;color:var(--text-muted)}.devserver-log-viewer__spinner{animation:dev-server-spin 1s linear infinite}.devserver-log-line{padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm);white-space:pre-wrap;word-break:break-all}.devserver-log-line:nth-child(2n){background:color-mix(in srgb,var(--surface) 95%,var(--text))}.devserver-log-timestamp{margin-right:var(--space-sm);color:var(--text-dim);font-size:.6875rem}.devserver-log-stream-badge{margin-right:var(--space-sm);padding:0 var(--space-xs);border-radius:var(--radius-pill);background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error);font-size:.625rem;font-weight:600}.devserver-log-text{color:var(--text)}.devserver-log-text mark{border-radius:var(--radius-sm);background:color-mix(in srgb,var(--todo) 40%,transparent);color:var(--text)}.devserver-log-viewer__new-logs-button{position:absolute;left:50%;bottom:var(--space-xl);transform:translate(-50%);z-index:10;border-color:var(--border);background:var(--card);box-shadow:var(--shadow-md)}.devserver-log-viewer__new-logs-button:active{transform:translate(-50%) scale(.97)}@keyframes dev-server-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media(max-width:480px){.devserver-preview-blocked-actions{width:100%;flex-direction:column}.devserver-preview-blocked-actions .btn{width:100%;min-height:calc(var(--space-lg) + var(--space-lg) + var(--space-xs))}}
@@ -1 +0,0 @@
1
- .documents-view{display:flex;flex-direction:column;height:100%;min-height:0}.documents-view-header{padding:var(--space-lg);border-bottom:1px solid var(--border);background:var(--surface)}.documents-view-title-row{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-md)}.documents-view-title{display:flex;align-items:center;gap:var(--space-sm);font-size:18px;font-weight:600;margin:0;color:var(--text)}.documents-view-title svg{color:var(--todo)}.documents-view-count{font-size:14px;color:var(--text-muted)}.documents-tab-bar{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.documents-tab{display:inline-flex;align-items:center;gap:var(--space-sm);border:1px solid var(--border);background:var(--surface);color:var(--text-muted)}.documents-tab:hover{background:var(--card-hover);color:var(--text)}.documents-tab.active{color:var(--todo);border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.documents-tab:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.documents-tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;padding:0 var(--space-xs);border-radius:var(--radius-pill);background:color-mix(in srgb,var(--text) 10%,transparent);color:inherit;font-size:11px;font-family:var(--font-mono)}.documents-hidden-toggle{align-self:flex-start;margin-bottom:var(--space-sm)}.documents-hidden-toggle[aria-pressed=true]{color:var(--todo);border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.documents-search{position:relative;display:flex;align-items:center}.documents-search-icon{position:absolute;left:var(--space-sm);color:var(--text-muted);pointer-events:none}.documents-search-input{width:100%;max-width:420px;padding:var(--space-sm) var(--space-sm) var(--space-sm) calc(var(--space-sm) + 24px);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);color:var(--text);font-size:14px;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.documents-search-input:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.documents-search-input::placeholder{color:var(--text-dim)}.documents-search-clear{position:absolute;right:var(--space-sm);display:flex;align-items:center;justify-content:center;background:none;border:none;color:var(--text-muted);cursor:pointer;padding:var(--space-xs);border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.documents-search-clear:hover{color:var(--text);background:var(--card-hover)}.documents-search-clear:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.documents-view-content{flex:1;min-height:0;overflow:auto;padding:var(--space-lg)}.documents-view-loading,.documents-view-empty,.documents-view-error{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:var(--space-2xl);color:var(--text-muted);min-height:200px}.documents-view-empty-icon{margin-bottom:var(--space-md);color:var(--text-dim)}.documents-view-empty-hint{font-size:13px;color:var(--text-dim);margin-top:var(--space-xs)}.documents-view-error{color:var(--color-error)}.documents-view-error .btn{margin-top:var(--space-md)}.documents-project-layout{display:grid;grid-template-columns:minmax(280px,320px) minmax(0,1fr);min-height:0;height:100%;border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;background:var(--card)}.documents-project-layout--mobile{grid-template-columns:1fr}.documents-view-sidebar{width:100%;min-width:0;overflow-y:auto;border-right:1px solid var(--border);background:var(--surface)}.markdown-file-list{margin:0;padding:0;list-style:none}.markdown-file-list-item{margin:0}.markdown-file-item{width:100%;display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-xs);border:none;border-left:3px solid transparent;border-bottom:1px solid var(--border);padding:var(--space-md);background:transparent;color:var(--text);text-align:left;cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast)}.markdown-file-list-item:last-child .markdown-file-item{border-bottom:none}.markdown-file-item:hover{background:var(--card-hover)}.markdown-file-item:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.markdown-file-item--selected{border-left-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.markdown-file-item-name{font-size:13px;font-weight:600;color:var(--text)}.markdown-file-item-path{font-size:12px;color:var(--text-muted);font-family:var(--font-mono);word-break:break-word}.markdown-file-item-meta{font-size:12px;color:var(--text-dim)}.documents-view-main{min-width:0;overflow-y:auto;background:var(--card);padding:var(--space-lg)}.documents-mobile-back{margin-bottom:var(--space-md)}.documents-content-viewer{display:flex;flex-direction:column;gap:var(--space-md);margin:0 auto;width:min(100%,880px)}.documents-content-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.documents-file-path-header{margin:0;padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text-muted);font-family:var(--font-mono);font-size:12px;word-break:break-word;flex:1}.documents-content-viewer-text,.documents-content-markdown{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);padding:var(--space-md);min-height:220px}.documents-content-state{margin:0;color:var(--text-muted)}.documents-content-state--error{color:var(--color-error)}.documents-task-list-wrap{width:min(100%,960px);margin:0 auto}.documents-view-list{display:flex;flex-direction:column;gap:var(--space-md)}.documents-group{border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;background:var(--card)}.documents-group-header{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);background:var(--surface);border-bottom:1px solid var(--border)}.documents-group-toggle-btn{display:flex;align-items:center;gap:var(--space-sm);min-width:0;border:none;background:none;color:var(--text);text-align:left;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast);min-height:36px}.documents-group-toggle-btn:hover{background:var(--card-hover)}.documents-group-toggle-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.documents-group-toggle{display:flex;align-items:center;justify-content:center;color:var(--text-muted);flex-shrink:0}.documents-group-task-id{font-family:var(--font-mono);font-size:12px;color:var(--text-muted);flex-shrink:0}.documents-group-task-title{font-size:14px;font-weight:500;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.documents-group-count{font-size:12px;color:var(--text-dim);justify-self:end}.documents-group-task-link{border:1px solid var(--border);background:var(--card);color:var(--text-muted);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),color var(--transition-fast),background var(--transition-fast);min-height:36px}.documents-group-task-link:hover{border-color:var(--todo);color:var(--todo);background:color-mix(in srgb,var(--todo) 10%,transparent)}.documents-group-task-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.documents-group-content{padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.document-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;transition:border-color var(--transition-fast)}.document-card:hover{border-color:var(--text-dim)}.document-card-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);background:var(--surface);border-bottom:1px solid var(--border)}.document-card-key{display:flex;align-items:center;gap:var(--space-xs);color:var(--text)}.document-card-key svg{color:var(--text-muted);flex-shrink:0}.document-card-key-text{font-family:var(--font-mono);font-size:13px;font-weight:500}.document-card-revision-badge{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);background:var(--surface);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);border:1px solid var(--border)}.document-card-expand-btn{padding:var(--space-xs);color:var(--text-muted)}.document-card-expand-btn:hover{color:var(--text)}.document-card-actions{display:flex;align-items:center;gap:var(--space-xs)}.document-mode-toggle{padding:var(--space-xs) var(--space-sm);font-size:11px;font-weight:500;color:var(--text-muted);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:var(--transition-fast);line-height:1}.document-mode-toggle:hover{background:var(--card-hover);color:var(--text)}.document-mode-toggle:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.document-mode-toggle[aria-pressed=true]{background:var(--accent);color:var(--text-on-accent);border-color:var(--accent)}.document-card-content-header{display:flex;justify-content:flex-end;margin-bottom:var(--space-sm)}.document-card-meta{display:flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-md);font-size:12px;color:var(--text-dim);border-bottom:1px solid var(--border)}.document-card-separator{color:var(--border)}.document-card-content{padding:var(--space-md)}.document-card-preview{margin:0;font-size:13px;color:var(--text-muted);line-height:1.5;word-break:break-word}.document-card-preview-truncated{margin:0;font-size:13px;color:var(--text-dim)}.document-card-content--expanded .document-card-preview,.document-card-content--expanded .document-card-preview-truncated{display:none}.document-card-content-text{margin:0;font-size:13px;color:var(--text);line-height:1.5;white-space:pre-wrap;word-break:break-word;font-family:var(--font-primary)}@media(max-width:768px){.agent-board{grid-template-columns:1fr}.agent-board-actions .btn,.agent-card-actions .btn{min-height:calc(var(--space-2xl) + var(--space-xs))}.agent-card-details-btn{margin-left:auto}.agent-controls-panel{left:var(--space-md);right:var(--space-md);top:calc(var(--header-height) + var(--space-sm));width:auto;max-height:calc(100dvh - var(--header-height) - var(--space-2xl));overflow-y:auto}.agent-controls{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.agent-controls-filters{flex-direction:column;align-items:stretch;width:100%;padding:var(--space-sm)}.agent-controls-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-controls-actions .btn{width:100%;min-height:calc(var(--space-2xl) + var(--space-xs))}.agent-controls-panel .agent-controls-actions{justify-content:flex-start}.agent-state-filter,.agent-system-filter{width:100%;min-height:calc(var(--space-2xl) + var(--space-xs))}.agent-state-filter-select{width:100%}.agent-heartbeat-control{align-items:flex-start}.agent-heartbeat-select{min-height:calc(var(--space-2xl) + var(--space-xs))}.heartbeat-multiplier-controls{flex-direction:column;align-items:stretch}.heartbeat-multiplier-value{text-align:left}.agent-global-controls{padding:var(--space-sm)}.heartbeat-multiplier-label{margin-bottom:var(--space-sm)}.agents-view-content{padding:var(--space-md)}.skills-view-header{padding:var(--space-sm) var(--space-md);flex-wrap:wrap}.skills-view-title h2{font-size:16px}.skills-view-count{font-size:12px}.skills-view-actions{min-height:36px;display:flex;align-items:center}.skills-view-actions .btn{min-height:36px}.skills-view-content{padding:var(--space-md)}.skills-view-section{margin-bottom:var(--space-md)}.skills-view-section-title{font-size:13px}.skills-view-search .form-input{max-width:none;width:100%}.skills-view-grid{grid-template-columns:1fr}.skills-view-item{flex-wrap:wrap;gap:var(--space-sm);padding:var(--space-md);min-height:36px}.skills-view-item-info{width:100%}.skills-view-item-toggle{padding:var(--space-sm)}.skills-view-toggle-slider{min-width:40px;min-height:22px}.skills-view-card{padding:var(--space-sm)}.skills-view-card-title{font-size:13px}.skills-view-card-description{font-size:12px}.skills-view-empty,.skills-view-error{padding:var(--space-lg)}.skills-view-loading{padding:var(--space-md)}.skills-view-item--selected{border-color:var(--todo)}.skills-view-detail{padding:var(--space-md);border-left-width:2px}.skills-view-detail-content{font-size:11px;max-height:calc(60dvh - 200px);-webkit-overflow-scrolling:touch}.skills-view-detail-close{min-height:36px;min-width:36px}.agent-tree__indent--1{padding-left:var(--space-lg)}.agent-tree__indent--2{padding-left:calc(var(--space-lg) * 2)}.agent-tree__indent--3{padding-left:calc(var(--space-lg) * 3)}.agent-tree__indent--4{padding-left:calc(var(--space-lg) * 4)}.agent-tree__toggle{min-width:calc(var(--space-lg) * 2 + var(--space-xs));min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.rating-summary-card{padding:16px}.rating-average{font-size:28px}.category-breakdown{grid-template-columns:1fr}.rating-history{max-height:250px}.documents-view-header{padding:var(--space-md)}.documents-view-title-row{flex-direction:column;align-items:flex-start;gap:var(--space-sm)}.documents-view-title{font-size:16px}.documents-tab-bar{width:100%}.documents-tab{flex:1;justify-content:center;min-height:44px}.documents-hidden-toggle{width:100%;justify-content:center;min-height:44px}.documents-search-input{max-width:none;width:100%}.documents-view-content{padding:var(--space-md)}.documents-project-layout,.documents-project-layout--mobile{display:flex;flex-direction:column;min-height:0}.documents-view-sidebar{border-right:none;border-bottom:1px solid var(--border);max-height:none}.markdown-file-item{min-height:44px;padding:var(--space-sm) var(--space-md)}.documents-view-main{padding:var(--space-md)}.documents-content-viewer{width:100%}.documents-content-viewer-text{min-height:160px}.documents-group-header{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"toggle count" "link link";row-gap:var(--space-xs)}.documents-group-toggle-btn{grid-area:toggle}.documents-group-count{grid-area:count;justify-self:end}.documents-group-task-link{grid-area:link;width:100%;justify-self:stretch;min-height:44px}.documents-group-task-title{max-width:180px}.document-card-key-text{font-size:12px}.document-mode-toggle{min-width:36px;min-height:36px}}
@@ -1 +0,0 @@
1
- import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{Y as oe,$ as G,a0 as le,a1 as ie,F as z,a2 as de,a3 as ue,S as me,X as he,R as pe,a4 as fe,a5 as W,a6 as V,K as X,D as je,a7 as xe}from"./index-Cf4wCcWp.js";import"./vendor-xterm-DzcZoU0P.js";function we(n){const{projectId:c,searchQuery:u,includeProjectFiles:a=!0}=n??{},[x,l]=s.useState([]),[h,i]=s.useState([]),[o,p]=s.useState(!0),[k,b]=s.useState(null),f=s.useRef(null),g=s.useRef(!1),m=s.useRef(null),j=s.useCallback(async()=>{f.current&&f.current.abort();const C=new AbortController;f.current=C;const E=!g.current;E&&p(!0),b(null);const L=oe(u?{q:u}:void 0,c),y=a?G(c):Promise.resolve({files:[]}),[v,F]=await Promise.allSettled([L,y]);if(C.signal.aborted)return;let R=null;if(v.status==="fulfilled"?(l(v.value),g.current=!0):R=v.reason instanceof Error?v.reason.message:String(v.reason),F.status==="fulfilled"){const M=F.value.files,P=u?.trim().toLowerCase(),T=P?M.filter(N=>N.name.toLowerCase().includes(P)||N.path.toLowerCase().includes(P)):M;i(T)}b(R),E&&p(!1)},[a,c,u]);return s.useEffect(()=>(m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{j()},300),()=>{m.current&&clearTimeout(m.current)}),[j]),s.useEffect(()=>(j(),()=>{f.current&&f.current.abort()}),[]),{documents:x,projectFiles:h,loading:o,error:k,refresh:j}}function ke(n,c){const[u,a]=s.useState([]),[x,l]=s.useState(!0),[h,i]=s.useState(null),o=s.useRef(null),p=s.useRef(!1),k=c?.showHidden??!1,b=s.useCallback(async f=>{o.current&&o.current.abort();const g=new AbortController;o.current=g;const m=!p.current;m&&l(!0),i(null);try{const j=await G(n,{showHidden:f?.showHidden??k});if(g.signal.aborted)return;a(j.files),p.current=!0}catch(j){if(g.signal.aborted)return;i(j instanceof Error?j.message:String(j))}finally{!g.signal.aborted&&m&&l(!1)}},[n,k]);return s.useEffect(()=>(p.current=!1,b({showHidden:k}),()=>{o.current&&o.current.abort()}),[b,k]),{files:u,loading:x,error:h,refresh:b}}const be=768;function Y(n){return n?new Date(n).toLocaleString():""}function ge(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(n>=10*1024?0:1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function ve(n,c=200){return n.length<=c?n:`${n.substring(0,c)}…`}function Ne({document:n,renderMarkdown:c,onToggleMarkdown:u}){const[a,x]=s.useState(!1),l=ve(n.content),h=n.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(z,{size:14}),e.jsx("span",{className:"document-card-key-text",children:n.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",n.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>x(i=>!i),title:a?"Collapse":"Expand","aria-label":a?"Collapse content":"Expand content",children:a?e.jsx(xe,{size:14}):e.jsx(X,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:n.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:Y(n.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${a?" document-card-content--expanded":""}`,children:[a?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:u,"aria-label":c?"Switch to plain text":"Switch to markdown","aria-pressed":c,title:c?"Switch to plain text":"Switch to markdown",children:c?"Markdown":"Plain"})}),c?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(W,{remarkPlugins:[V],children:n.content})})}):e.jsx("pre",{className:"document-card-content-text",children:n.content})]}):e.jsx("p",{className:"document-card-preview",children:l}),h&&!a&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function Se({taskId:n,taskTitle:c,documents:u,onOpenTask:a,renderMarkdownStates:x,onToggleMarkdown:l}){const[h,i]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>i(o=>!o),"aria-expanded":h,"aria-label":`${h?"Collapse":"Expand"} documents for task ${n}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:h?e.jsx(X,{size:16}):e.jsx(je,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:n}),e.jsx("span",{className:"documents-group-task-title",children:c||"Untitled"})]}),e.jsxs("span",{className:"documents-group-count",children:[u.length," doc",u.length!==1?"s":""]}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>a(n),"aria-label":`Open task ${n}: ${c||"Untitled"}`,children:"Open task"})]}),h&&e.jsx("div",{className:"documents-group-content",children:u.map(o=>e.jsx(Ne,{document:o,renderMarkdown:x.get(o.id)??!1,onToggleMarkdown:()=>l(o.id)},o.id))})]})}function ye({projectId:n,addToast:c,onOpenDetail:u}){const[a,x]=s.useState("project"),[l,h]=s.useState(""),[i,o]=s.useState(null),[p,k]=s.useState(!1),[b,f]=s.useState(null),[g,m]=s.useState(!1),[j,C]=s.useState(null),[E,L]=s.useState(!1),y=s.useRef(0),v=s.useRef(!1),[F,R]=s.useState(!1),[M,P]=s.useState(new Map),T=a==="tasks"?l.trim():"",{documents:N,loading:D,error:_,refresh:B}=we({projectId:n,searchQuery:T||void 0,includeProjectFiles:!1}),{files:S,loading:$,error:J,refresh:O}=ke(n,{showHidden:p});s.useEffect(()=>{const t=()=>{L(window.innerWidth<=be)};return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[]),s.useEffect(()=>{v.current=!1,x("project"),o(null),k(!1),f(null),C(null),m(!1),R(!1),P(new Map)},[n]),s.useEffect(()=>{v.current||D||$||(S.length>0?x("project"):N.length>0&&x("tasks"),v.current=!0)},[N.length,D,S.length,$]);const H=s.useMemo(()=>{const t=new Map;for(const r of N){const d=t.get(r.taskId)||[];t.set(r.taskId,[...d,r])}return Array.from(t.entries()).map(([r,d])=>{const w=[...d].sort((re,ce)=>ce.updatedAt.localeCompare(re.updatedAt));return{taskId:r,taskTitle:w[0]?.taskTitle,documents:w,latestUpdated:w[0]?.updatedAt??""}}).sort((r,d)=>d.latestUpdated.localeCompare(r.latestUpdated))},[N]),A=s.useMemo(()=>{const t=l.trim().toLowerCase();return t?S.filter(r=>{const d=r.path.toLowerCase(),w=r.name.toLowerCase();return d.includes(t)||w.includes(t)}):S},[S,l]);s.useEffect(()=>{if(!i)return;S.some(r=>r.path===i.path)||(o(null),f(null),C(null),m(!1))},[S,i]);const Z=s.useCallback(t=>{h(t.target.value)},[]),I=s.useCallback(()=>{h("")},[]),Q=s.useCallback(t=>{x(t)},[]),ee=s.useCallback(async t=>{try{const r=await le(t,n);u(r)}catch{c(`Failed to open task ${t}`,"error")}},[n,u,c]),se=s.useCallback(async t=>{o(t),m(!0),C(null),f(null);const r=y.current+1;y.current=r;try{const d=await ie("project",t.path,n);if(y.current!==r)return;f(d.content)}catch(d){if(y.current!==r)return;const w=d instanceof Error?d.message:`Failed to open ${t.path}`;C(w),c(w,"error")}finally{y.current===r&&m(!1)}},[n,c]),te=s.useCallback(()=>{o(null),f(null),C(null),m(!1)},[]),ne=s.useCallback(t=>{P(r=>{const d=new Map(r),w=d.get(t)??!1;return d.set(t,!w),d})},[]),U=a==="project"?J:_,ae=s.useCallback(async()=>{if(a==="project"){await O();return}await B()},[a,O,B]),q=a==="project"?A.length:N.length,K=a==="project"?"Search project markdown files…":"Search task documents…";return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(z,{size:20}),"Documents"]}),e.jsxs("span",{className:"documents-view-count",children:[q," result",q!==1?"s":""]})]}),e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${a==="project"?" active":""}`,role:"tab","aria-selected":a==="project","aria-label":"Show project markdown files",onClick:()=>Q("project"),children:["Project Files",e.jsx("span",{className:"documents-tab-count",children:S.length})]}),e.jsxs("button",{className:`btn documents-tab${a==="tasks"?" active":""}`,role:"tab","aria-selected":a==="tasks","aria-label":"Show task documents",onClick:()=>Q("tasks"),children:["Task Documents",e.jsx("span",{className:"documents-tab-count",children:H.length})]})]}),a==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>k(t=>!t),"aria-pressed":p,"aria-label":p?"Hide hidden project files":"Show hidden project files",title:p?"Hide hidden files":"Show hidden files",children:[p?e.jsx(de,{size:14}):e.jsx(ue,{size:14}),p?"Hide Hidden":"Show Hidden"]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(me,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:K,value:l,onChange:Z,"aria-label":K}),l&&e.jsx("button",{className:"documents-search-clear",onClick:I,"aria-label":"Clear search",children:e.jsx(he,{size:16})})]})]}),e.jsx("div",{className:"documents-view-content",children:U?e.jsxs("div",{className:"documents-view-error",children:[e.jsxs("p",{children:["Failed to load ",a==="project"?"project files":"task documents",": ",U]}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void ae(),"aria-label":"Retry loading documents",children:[e.jsx(pe,{size:16}),"Retry"]})]}):a==="project"?$&&S.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading project markdown files…"})}):A.length===0?e.jsx("div",{className:"documents-view-empty",children:l.trim()?e.jsxs("p",{children:['No project markdown files match "',l.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(z,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No Markdown files found in this project."})]})}):e.jsxs("div",{className:`documents-project-layout${E?" documents-project-layout--mobile":""}`,children:[(!E||!i)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:A.map(t=>{const r=i?.path===t.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void se(t),"aria-label":`Open ${t.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:t.name}),e.jsx("span",{className:"markdown-file-item-path",children:t.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[ge(t.size)," · ",Y(t.mtime)]})]})},t.path)})})}),(!E||i)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[E&&i&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:te,"aria-label":"Back to project files list",children:[e.jsx(fe,{size:14}),"Back to files"]}),i?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:i.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>R(t=>!t),"aria-label":F?"Switch to plain text":"Switch to markdown","aria-pressed":F,title:F?"Switch to plain text":"Switch to markdown",children:F?"Markdown":"Plain"})]}),g?e.jsx("p",{className:"documents-content-state",children:"Loading file content…"}):j?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:j}):F?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(W,{remarkPlugins:[V],children:b??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:b??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:"Select a Markdown file to view its content."})})]})]}):D&&N.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading task documents…"})}):H.length===0?e.jsx("div",{className:"documents-view-empty",children:l.trim()?e.jsxs("p",{children:['No task documents match "',l.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(z,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No task documents yet."}),e.jsx("p",{className:"documents-view-empty-hint",children:"Documents are created in task detail tabs."})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:H.map(({taskId:t,taskTitle:r,documents:d})=>e.jsx(Se,{taskId:t,taskTitle:r,documents:d,onOpenTask:ee,renderMarkdownStates:M,onToggleMarkdown:ne},t))})})})]})}export{ye as DocumentsView};
@@ -1 +0,0 @@
1
- .plugin-manager,.plugin-manager-detail{display:flex;flex-direction:column;gap:var(--space-lg)}.plugin-manager-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--space-sm);border-bottom:var(--btn-border-width) solid var(--border)}.plugin-manager-actions{display:flex;gap:var(--space-sm);align-items:center}.plugin-install-form{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-lg);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.plugin-install-hint{margin:0;font-size:.85rem;color:var(--text-secondary, var(--text-muted));line-height:1.45}.plugin-install-hint code{padding:var(--btn-border-width) var(--space-xs);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--text-muted) 12%,transparent);font-size:.85em}.plugin-install-actions{display:flex;gap:var(--space-sm);justify-content:flex-end}.plugin-list{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);background:var(--surface);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast)}.plugin-item:hover{border-color:var(--text-dim)}.plugin-info{display:flex;align-items:center;gap:var(--space-sm);min-width:0}.plugin-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.plugin-version{font-size:.85rem}.plugin-state-badge{display:inline-flex;align-items:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;background:color-mix(in srgb,currentColor 12%,transparent)}.plugin-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.plugin-manager-detail-header,.plugin-detail-title{display:flex;align-items:center;gap:var(--space-md);flex-wrap:wrap}.plugin-detail-name{margin:0}.plugin-detail-content{display:flex;flex-direction:column;gap:var(--space-lg)}.plugin-detail-card{background:var(--surface);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.plugin-description{font-size:.95rem;color:var(--text-secondary, var(--text-muted));line-height:1.5}.plugin-detail-meta-row{display:flex;align-items:center;gap:var(--space-xs);font-size:.9rem;color:var(--text-muted)}.plugin-homepage a{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--color-info);font-size:.85rem}.plugin-detail-section-heading{margin:0;padding:0;border:0;font-size:.95rem}.plugin-settings-form{display:flex;flex-direction:column;gap:var(--space-lg);margin-top:var(--space-xs)}.plugin-settings-form .form-group{padding:0;margin:0}.plugin-settings-array{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-settings-array-item{display:flex;align-items:center;gap:var(--space-sm)}.plugin-settings-array-item input{flex:1}.plugin-detail-actions{display:flex;gap:var(--space-sm);padding-top:var(--space-md);border-top:var(--btn-border-width) solid var(--border);justify-content:flex-end}.plugin-manager .empty-state,.plugin-manager .loading-state,.plugin-manager .settings-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);text-align:center;color:var(--text-muted)}.plugin-bundled-runtime-list{width:100%;display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.plugin-bundled-runtime-item{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.plugin-bundled-runtime-meta{display:flex;align-items:center;gap:var(--space-sm);min-width:0}.plugin-bundled-runtime-name{color:var(--text);font-size:.9rem;font-weight:500}.plugin-bundled-runtime-badge{display:inline-flex;align-items:center;padding:var(--btn-border-width) var(--space-xs);border-radius:var(--radius-pill);background:var(--status-in-review-bg);color:var(--in-review);font-size:.75rem;font-weight:600;text-transform:uppercase}.plugin-bundled-runtime-section{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-bundled-runtime-header{display:flex;flex-direction:column;gap:var(--space-xs)}.plugin-bundled-runtime-heading{margin:0;font-size:.95rem}.plugin-bundled-runtime-description{margin:0;font-size:.85rem;color:var(--text-muted)}.plugin-bundled-runtime-status{display:inline-flex;align-items:center;padding:var(--btn-border-width) var(--space-xs);border-radius:var(--radius-pill);font-size:.75rem;font-weight:600;text-transform:uppercase}.plugin-bundled-runtime-status--installed{background:var(--status-done-bg);color:var(--done)}.plugin-bundled-runtime-status--available{background:var(--status-todo-bg);color:var(--todo)}@media(max-width:768px){.plugin-manager-detail-header{gap:var(--space-sm)}.plugin-detail-title{gap:var(--space-xs)}.plugin-detail-card{padding:var(--space-md);gap:var(--space-sm)}.plugin-list{gap:var(--space-xs)}.plugin-item{padding:var(--space-md);flex-direction:column;align-items:stretch;gap:var(--space-sm)}.plugin-info{width:100%;flex-wrap:wrap;row-gap:var(--space-xs)}.plugin-name{flex:1 1 100%;white-space:normal}.plugin-actions{width:100%;justify-content:flex-end;flex-wrap:wrap;gap:var(--space-sm)}.plugin-actions .btn-icon,.plugin-actions .toggle-switch{min-width:36px;min-height:36px}.plugin-actions .toggle-switch{display:inline-flex;align-items:center;justify-content:center}.plugin-detail-actions{flex-wrap:wrap;justify-content:flex-start}.plugin-detail-actions button{flex:1 1 auto;min-height:36px}.plugin-bundled-runtime-item{flex-direction:column;align-items:stretch}.plugin-bundled-runtime-item .btn{min-height:36px}}
@@ -1 +0,0 @@
1
- import{r as o,j as e}from"./vendor-react-K0fH_qHe.js";import{cW as Y,s as Z,X as k,ah as Q,w as U,cX as O,I as A,R as T,cY as ee,aq as se,cZ as ne,c_ as te,c$ as ie,d0 as ae,d1 as le,d2 as _,d3 as re}from"./index-Cf4wCcWp.js";import{D as ce}from"./DirectoryPicker-B3ejJOl0.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-DJxjQmf1.js";const de=[{id:"fusion-plugin-hermes-runtime",name:"Hermes Runtime",path:"./plugins/fusion-plugin-hermes-runtime",experimental:!0},{id:"fusion-plugin-paperclip-runtime",name:"Paperclip Runtime",path:"./plugins/fusion-plugin-paperclip-runtime"},{id:"fusion-plugin-openclaw-runtime",name:"OpenClaw Runtime",path:"./plugins/fusion-plugin-openclaw-runtime",experimental:!0}],N={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function xe({addToast:l,projectId:c}){const[x,b]=o.useState([]),[S,w]=o.useState(!0),[V,f]=o.useState(!1),[j,v]=o.useState(""),[C,$]=o.useState(!1),[h,P]=o.useState(null),[i,y]=o.useState(null),[a,g]=o.useState({}),[H,I]=o.useState(!1),[R,E]=o.useState(null),u=o.useCallback(async()=>{try{w(!0);const s=await Y(c);b(s)}catch(s){l(`Failed to load plugins: ${s instanceof Error?s.message:String(s)}`,"error")}finally{w(!1)}},[c,l]);o.useEffect(()=>{u()},[u]);const M=o.useRef([]);M.current=x,o.useEffect(()=>{const s=c?`?projectId=${encodeURIComponent(c)}`:"",n=p=>{try{const t=JSON.parse(p.data);if(c&&t.projectId&&t.projectId!==c)return;switch(t.transition){case"installing":case"enabled":case"disabled":case"settings-updated":b(d=>{const m=d.findIndex(r=>r.id===t.pluginId);if(m>=0){const r=[...d];return r[m]={...r[m],enabled:t.enabled,state:t.state,settings:t.settings,error:t.error},r}else return u(),d});break;case"uninstalled":b(d=>d.filter(m=>m.id!==t.pluginId));break;case"error":b(d=>{const m=d.findIndex(r=>r.id===t.pluginId);if(m>=0){const r=[...d];return r[m]={...r[m],state:t.state,error:t.error},r}return d});break}}catch{}};return Z(`/api/events${s}`,{events:{"plugin:lifecycle":n},onReconnect:()=>{u()}})},[c,u]);const z=async()=>{if(!j.trim()){l("Please enter a plugin path","error");return}try{$(!0),await _({path:j},c),l("Plugin installed successfully","success"),f(!1),v(""),await u()}catch(s){l(`Failed to install plugin: ${s instanceof Error?s.message:String(s)}`,"error")}finally{$(!1)}},X=async s=>{try{E(s.id),await _({path:s.path},c),l(`${s.name} installed successfully`,"success"),await u()}catch(n){l(`Failed to install ${s.name}: ${n instanceof Error?n.message:String(n)}`,"error")}finally{E(null)}},F=async s=>{try{await ae(s.id,c),l(`${s.name} enabled`,"success"),await u()}catch(n){l(`Failed to enable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},B=async s=>{try{await ie(s.id,c),l(`${s.name} disabled`,"success"),await u()}catch(n){l(`Failed to disable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},L=async s=>{try{P(s.id),await te(s.id,c),l(`${s.name} reloaded`,"success"),await u()}catch(n){l(`Failed to reload plugin: ${n instanceof Error?n.message:String(n)}`,"error")}finally{P(null)}},q=async s=>{if(confirm(`Are you sure you want to uninstall "${s.name}"?`))try{await le(s.id,c),l(`${s.name} uninstalled`,"success"),await u(),y(null)}catch(n){l(`Failed to uninstall plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},G=async s=>{y(s);try{I(!0);const n=await re(s.id,c);g(n)}catch{g({})}finally{I(!1)}},J=async()=>{if(i)try{await ne(i.id,a,c),l("Settings saved","success")}catch(s){l(`Failed to save settings: ${s instanceof Error?s.message:String(s)}`,"error")}};if(i)return e.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[e.jsxs("div",{className:"plugin-manager-detail-header",children:[e.jsx("button",{className:"btn-icon",onClick:()=>y(null),"aria-label":"Back to plugin list",children:e.jsx(k,{size:16})}),e.jsxs("div",{className:"plugin-detail-title",children:[e.jsx("h4",{className:"plugin-detail-name",children:i.name}),e.jsx("span",{className:"plugin-state-badge",style:{color:N[i.state]||N.installed},children:i.state})]})]}),e.jsxs("div",{className:"plugin-detail-content",children:[e.jsxs("div",{className:"plugin-detail-card",children:[i.description&&e.jsx("p",{className:"plugin-description",children:i.description}),i.author&&e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Author:"}),i.author]}),i.homepage&&e.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[e.jsx("span",{className:"text-muted",children:"Homepage:"}),e.jsxs("a",{href:i.homepage,target:"_blank",rel:"noopener noreferrer",children:[i.homepage,e.jsx(Q,{size:12})]})]}),e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Version:"}),i.version]})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h5",{className:"plugin-detail-section-heading",children:"Settings"}),H?e.jsx("p",{className:"text-muted",children:"Loading..."}):i.settingsSchema&&Object.keys(i.settingsSchema).length>0?e.jsxs("div",{className:"plugin-settings-form",children:[Object.entries(i.settingsSchema).map(([s,n])=>{const p=`setting-${s}-help`;return e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:`setting-${s}`,children:[n.label||s,n.required&&" *"]}),n.type==="string"&&!n.multiline&&e.jsx("input",{type:"text",id:`setting-${s}`,value:a[s]??"",onChange:t=>g({...a,[s]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?p:void 0}),n.type==="string"&&n.multiline&&e.jsx("textarea",{id:`setting-${s}`,rows:4,value:a[s]??"",onChange:t=>g({...a,[s]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?p:void 0}),n.type==="password"&&e.jsx("input",{type:"password",id:`setting-${s}`,value:a[s]??"",onChange:t=>g({...a,[s]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?p:void 0}),n.type==="number"&&e.jsx("input",{type:"number",id:`setting-${s}`,value:a[s]??"",onChange:t=>g({...a,[s]:Number(t.target.value)}),"aria-describedby":n.description&&!n.required?p:void 0}),n.type==="boolean"&&e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:a[s]??!1,onChange:t=>g({...a,[s]:t.target.checked})}),n.description]}),n.type==="enum"&&e.jsxs("select",{id:`setting-${s}`,value:a[s]??"",onChange:t=>g({...a,[s]:t.target.value}),"aria-describedby":n.description&&!n.required?p:void 0,children:[e.jsx("option",{value:"",children:"Select..."}),n.enumValues?.map(t=>e.jsx("option",{value:t,children:t},t))]}),n.type==="array"&&e.jsxs("div",{className:"plugin-settings-array",children:[a[s]?.map((t,d)=>e.jsxs("div",{className:"plugin-settings-array-item",children:[e.jsx("input",{type:n.itemType==="number"?"number":"text",value:t??"",onChange:m=>{const r=m.target.value,D=[...a[s]||[]];D[d]=n.itemType==="number"?Number(r):r,g({...a,[s]:D})}}),e.jsx("button",{className:"btn-icon",onClick:()=>{const r=[...a[s]||[]];r.splice(d,1),g({...a,[s]:r})},"aria-label":"Remove item",children:e.jsx(k,{size:14})})]},d)),e.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const t=a[s]||[],d=n.itemType==="number"?0:"";g({...a,[s]:[...t,d]})},children:[e.jsx(U,{size:14})," Add Item"]})]}),n.description&&!n.required&&!n.multiline&&e.jsx("span",{id:p,className:"form-help",children:n.description})]},s)}),e.jsx("button",{className:"btn btn-primary",onClick:J,children:"Save Settings"})]}):e.jsx("p",{className:"text-muted",children:"No configurable settings."})]}),e.jsxs("div",{className:"plugin-detail-actions",children:[i.state==="started"&&e.jsxs("button",{className:"btn btn-secondary",onClick:()=>L(i),disabled:h===i.id,children:[e.jsx(O,{size:14,className:h===i.id?"spin":""}),h===i.id?"Reloading...":"Reload"]}),i.enabled?e.jsx("button",{className:"btn btn-secondary",onClick:()=>B(i),children:"Disable"}):e.jsx("button",{className:"btn btn-primary",onClick:()=>F(i),children:"Enable"}),e.jsxs("button",{className:"btn btn-danger",onClick:()=>q(i),children:[e.jsx(A,{size:14})," Uninstall"]})]})]})]});const K=new Set(x.map(s=>s.id)),W=()=>e.jsxs("section",{className:"plugin-bundled-runtime-section","aria-label":"Bundled Runtime Plugins",children:[e.jsxs("div",{className:"plugin-bundled-runtime-header",children:[e.jsx("h4",{className:"plugin-bundled-runtime-heading",children:"Bundled Runtime Plugins"}),e.jsx("p",{className:"plugin-bundled-runtime-description",children:"Install Fusion's bundled runtimes directly from this screen."})]}),e.jsx("div",{className:"plugin-bundled-runtime-list","aria-label":"Bundled runtime plugin recommendations",children:de.map(s=>{const n=K.has(s.id);return e.jsxs("div",{className:"plugin-bundled-runtime-item",children:[e.jsxs("div",{className:"plugin-bundled-runtime-meta",children:[e.jsx("span",{className:"plugin-bundled-runtime-name",children:s.name}),s.experimental&&e.jsx("span",{className:"plugin-bundled-runtime-badge",children:"Experimental"}),e.jsx("span",{className:`plugin-bundled-runtime-status ${n?"plugin-bundled-runtime-status--installed":"plugin-bundled-runtime-status--available"}`,children:n?"Installed":"Not installed"})]}),e.jsx("button",{className:`btn ${n?"btn-secondary":"btn-primary"} btn-sm`,onClick:()=>X(s),disabled:n||R===s.id,children:n?"Installed":R===s.id?"Installing...":`Install ${s.name}`})]},s.id)})})]});return e.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[e.jsx("div",{className:"plugin-manager-header",children:e.jsxs("div",{className:"plugin-manager-actions",children:[e.jsx("button",{className:"btn-icon",onClick:u,title:"Refresh",children:e.jsx(T,{size:16,className:S?"spin":""})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>f(!0),children:[e.jsx(U,{size:14})," Install"]})]})}),V&&e.jsxs("div",{className:"plugin-install-form",children:[e.jsxs("p",{className:"plugin-install-hint",children:["Browse to a plugin package root (contains ",e.jsx("code",{children:"manifest.json"}),") or a built ",e.jsx("code",{children:"dist"})," directory."]}),e.jsx(ce,{value:j,onChange:v,placeholder:"Absolute path to plugin directory or dist folder",onInputKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),z())}}),e.jsxs("div",{className:"plugin-install-actions",children:[e.jsx("button",{className:"btn btn-primary",onClick:z,disabled:C||!j.trim(),children:C?"Installing...":"Install Plugin"}),e.jsx("button",{className:"btn btn-secondary",onClick:()=>{f(!1),v("")},children:"Cancel"})]})]}),S?e.jsx("div",{className:"settings-empty-state",children:"Loading plugins..."}):e.jsxs(e.Fragment,{children:[x.length===0?e.jsxs("div",{className:"settings-empty-state",children:[e.jsx(ee,{size:32,className:"text-muted"}),e.jsx("p",{children:"No plugins installed."}),e.jsx("p",{className:"text-muted",children:"Install a plugin to get started, or use a bundled runtime below."})]}):e.jsx("div",{className:"plugin-list",children:x.map(s=>e.jsxs("div",{className:"plugin-item",children:[e.jsxs("div",{className:"plugin-info",children:[e.jsx("span",{className:"plugin-name",children:s.name}),e.jsxs("span",{className:"plugin-version text-muted",children:["v",s.version]}),e.jsx("span",{className:"plugin-state-badge",style:{color:N[s.state]||N.installed},children:s.state})]}),e.jsxs("div",{className:"plugin-actions",children:[s.state==="started"&&e.jsx("button",{className:"btn-icon",onClick:()=>L(s),disabled:h===s.id,title:"Reload",children:e.jsx(O,{size:14,className:h===s.id?"spin":""})}),e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>s.enabled?B(s):F(s)}),e.jsx("span",{className:"toggle-slider"})]}),e.jsx("button",{className:"btn-icon",onClick:()=>G(s),title:"Settings",children:e.jsx(se,{size:14})}),e.jsx("button",{className:"btn-icon",onClick:()=>q(s),title:"Uninstall",children:e.jsx(A,{size:14})})]})]},s.id))}),W()]})]})}export{xe as PluginManager,N as STATE_COLORS};
@@ -1,6 +0,0 @@
1
- import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as St,aN as Et,aO as kt,aP as Ft,aQ as Dt,aR as Mt,aS as tt,aT as Rt,aU as It,aV as at,aW as $t,aX as zt,aY as At,aZ as Ot,a_ as Bt,a$ as Ht,b0 as Tt,b1 as Gt,aF as Pt,w as Ae,b2 as me,X as ae,as as Ee,I as Le,a7 as Lt,ad as ut,ar as rt,a4 as Vt,b3 as Ye,b4 as Ut}from"./index-Cf4wCcWp.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
- * @license lucide-react v1.7.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const Kt=[["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m16.2 7.8 2.9-2.9",key:"r700ao"}],["path",{d:"M18 12h4",key:"wj9ykh"}],["path",{d:"m16.2 16.2 2.9 2.9",key:"1bxg5t"}],["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"m4.9 19.1 2.9-2.9",key:"bwix9q"}],["path",{d:"M2 12h4",key:"j09sii"}],["path",{d:"m4.9 4.9 2.9 2.9",key:"giyufr"}]],Wt=St("loader",Kt);function Yt(l){const n=l?.projectId,[j,f]=a.useState([]),[b,C]=a.useState(null),[S,m]=a.useState(null),[I,E]=a.useState([]),[_,y]=a.useState({}),[re,z]=a.useState(!1),[W,A]=a.useState(null),[ke,se]=a.useState(null),[ge,ne]=a.useState(!1),[Oe,ie]=a.useState(null),[he,R]=a.useState([]),[J,oe]=a.useState(!1),[X,B]=a.useState({}),[Fe,le]=a.useState({}),P=a.useRef(X),De=a.useRef(Fe),Y=a.useRef(he);P.current=X,De.current=Fe,Y.current=he;const Me=a.useRef(n),F=a.useRef(0),Q=a.useRef(0),Be=a.useRef(j),v=a.useRef(b),He=a.useRef(I),fe=a.useRef(_),M=a.useRef(n),Z=a.useRef(ke);Be.current=j,v.current=b,He.current=I,fe.current=_,M.current=n,Z.current=ke,a.useEffect(()=>{Me.current!==n&&(Me.current=n,F.current++,C(null),m(null),E([]),y({}),se(null),ie(null),R([]),oe(!1),B({}),le({}))},[n]);const be=a.useCallback(async()=>{z(!0),A(null);try{const r=await Et(n);f(r)}catch(r){A(r instanceof Error?r:new Error("Failed to fetch roadmaps"))}finally{z(!1)}},[n]),N=a.useCallback(async r=>{try{const c=await kt(r,n);m(c),E(c.milestones||[]);const i={};for(const s of c.milestones||[])i[s.id]=s.features||[];y(i)}catch(c){A(c instanceof Error?c:new Error("Failed to fetch roadmap"))}},[n]);a.useEffect(()=>{be()},[be]),a.useEffect(()=>{b?N(b):(m(null),E([]),y({}))},[b,N]);const ve=a.useCallback(async(r,c)=>{try{const i=await Ft(r,M.current);f(s=>[...s,i]),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to create roadmap");throw c?.onError?.(s),s}},[]),Te=a.useCallback(async(r,c,i)=>{try{const s=await Dt(r,c,M.current);f(d=>d.map(o=>o.id===r?s:o)),v.current===r&&m(d=>d?{...d,...s}:null),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update roadmap");throw i?.onError?.(d),d}},[]),h=a.useCallback(async(r,c)=>{try{await Mt(r,M.current),f(i=>i.filter(s=>s.id!==r)),v.current===r&&(C(null),m(null),E([]),y({})),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete roadmap");throw c?.onError?.(s),s}},[]),$=a.useCallback(r=>{C(r)},[]),H=a.useCallback(async(r,c)=>{const i=v.current;if(!i){const s=new Error("No roadmap selected");throw c?.onError?.(s),s}try{const s=await tt(i,r,M.current);E(d=>[...d,s]),y(d=>({...d,[s.id]:[]})),v.current&&N(v.current),c?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create milestone");throw c?.onError?.(d),d}},[N]),xe=a.useCallback(async(r,c,i)=>{try{const s=await Rt(r,c,M.current);E(d=>d.map(o=>o.id===r?s:o)),v.current&&N(v.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update milestone");throw i?.onError?.(d),d}},[N]),Ve=a.useCallback(async(r,c)=>{try{await It(r,M.current),E(i=>i.filter(s=>s.id!==r)),y(i=>{const s={...i};return delete s[r],s}),v.current&&N(v.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete milestone");throw c?.onError?.(s),s}},[N]),Re=a.useCallback(async(r,c,i)=>{try{const s=await at(r,c,M.current);y(d=>({...d,[r]:[...d[r]||[],s]})),v.current&&N(v.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to create feature");throw i?.onError?.(d),d}},[N]),D=a.useCallback(async(r,c,i)=>{try{const s=await $t(r,c,M.current);y(d=>{const o={};for(const[g,p]of Object.entries(d))o[g]=p.map(x=>x.id===r?s:x);return o}),v.current&&N(v.current),i?.onSuccess?.()}catch(s){const d=s instanceof Error?s:new Error("Failed to update feature");throw i?.onError?.(d),d}},[N]),T=a.useCallback(async(r,c)=>{try{await zt(r,M.current),y(i=>{const s={};for(const[d,o]of Object.entries(i))s[d]=o.filter(g=>g.id!==r);return s}),v.current&&N(v.current),c?.onSuccess?.()}catch(i){const s=i instanceof Error?i:new Error("Failed to delete feature");throw c?.onError?.(s),s}},[N]),ee=a.useCallback(async(r,c,i)=>{const s=He.current,d=c.map(o=>s.find(g=>g.id===o)).filter(o=>o!==void 0).map((o,g)=>({...o,orderIndex:g}));E(d);try{await At(r,c,M.current),v.current&&N(v.current),i?.onSuccess?.()}catch(o){E(s);const g=o instanceof Error?o:new Error("Failed to reorder milestones");throw i?.onError?.(g),g}},[N]),q=a.useCallback(async(r,c,i)=>{const s=fe.current[r]||[],d=s.map(p=>p.id);if(JSON.stringify(d)===JSON.stringify(c)){i?.onSuccess?.();return}const o=fe.current,g=c.map(p=>s.find(x=>x.id===p)).filter(p=>p!==void 0).map((p,x)=>({...p,orderIndex:x}));y(p=>({...p,[r]:g}));try{await Ot(r,c,M.current),v.current&&N(v.current),i?.onSuccess?.()}catch(p){y(o);const x=p instanceof Error?p:new Error("Failed to reorder features");throw i?.onError?.(x),x}},[N]),we=a.useCallback(async(r,c,i,s)=>{const d=fe.current;let o=null;for(const[k,U]of Object.entries(d))if(U.some(Ue=>Ue.id===r)){o=k;break}if(!o){const k=new Error("Feature not found");throw s?.onError?.(k),k}if(o===c){const k=d[o]||[],U=Math.max(0,Math.min(i,k.length-1));if(k.findIndex(We=>We.id===r)===U){s?.onSuccess?.();return}}const g=d[o]||[],p=d[c]||[],x=g.find(k=>k.id===r);if(!x){const k=new Error("Feature not found");throw s?.onError?.(k),k}const V=g.filter(k=>k.id!==r).map((k,U)=>({...k,orderIndex:U})),te={...x,milestoneId:c,orderIndex:i},Ce=[...p];Ce.splice(i,0,te);const Ke=Ce.map((k,U)=>({...k,orderIndex:U}));y(o===c?k=>({...k,[o]:Ke}):k=>({...k,[o]:V,[c]:Ke}));try{await Bt(r,c,i,n),v.current&&N(v.current),s?.onSuccess?.()}catch(k){y(d);const U=k instanceof Error?k:new Error("Failed to move feature");throw s?.onError?.(U),U}},[N,n]);function ce(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`draft-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}const Ie=a.useCallback(async(r,c=5,i)=>{const s=v.current;if(!s){const g=new Error("No roadmap selected");throw i?.onError?.(g),g}const d=F.current,o=M.current;oe(!0);try{const g=await Ht(s,r,c,o);if(F.current!==d)return;const p=g.suggestions.map(x=>({id:ce(),title:x.title,description:x.description}));R(p),i?.onSuccess?.()}catch(g){if(F.current!==d)return;const p=g instanceof Error?g:new Error("Failed to generate suggestions");throw i?.onError?.(p),p}finally{F.current===d&&oe(!1)}},[]),de=a.useCallback((r,c)=>{const s=Y.current.map(d=>d.id===r?{...d,...c}:d);Y.current=s,R(d=>d.map(o=>o.id===r?{...o,...c}:o))},[]),L=a.useCallback(async(r,c)=>{const i=v.current;if(!i){const p=new Error("No roadmap selected");throw c?.onError?.(p),p}const s=F.current,d=Y.current,o=d.findIndex(p=>p.id===r);if(o===-1){const p=new Error("Suggestion draft not found");throw c?.onError?.(p),p}const g=d[o];if(!g.title.trim()){const p=new Error("Title cannot be empty");throw c?.onError?.(p),p}R(p=>p.filter(x=>x.id!==r));try{if(await tt(i,{title:g.title,description:g.description},M.current),F.current!==s){R(p=>{const x=[...p];return x.splice(o,0,g),x});return}v.current&&N(v.current),c?.onSuccess?.()}catch(p){R(V=>{const te=[...V];return te.splice(o,0,g),te});const x=p instanceof Error?p:new Error("Failed to accept suggestion");throw c?.onError?.(x),x}},[N]),qe=a.useCallback(async r=>{const c=v.current;if(!c){const o=new Error("No roadmap selected");throw r?.onError?.(o),o}const i=[...Y.current];if(i.length===0)return;const s=i.findIndex(o=>!o.title.trim());if(s!==-1){const o=new Error(`Title cannot be empty at position ${s+1}`);throw r?.onError?.(o),o}R([]);const d=F.current;for(let o=0;o<i.length&&F.current===d;o++){const g=i[o];try{await tt(c,{title:g.title,description:g.description},M.current)}catch(p){const x=p instanceof Error?p:new Error("Failed to accept all suggestions");throw r?.onError?.(x),x}}F.current===d&&(v.current&&N(v.current),r?.onSuccess?.())},[N]),Ge=a.useCallback(r=>De.current[r]??!1,[]),je=a.useCallback(async(r,c,i)=>{const s=F.current,d=M.current;le(o=>({...o,[r]:!0}));try{const o=await Tt(r,c,d);if(F.current!==s)return;const g=o.suggestions.map(p=>({id:ce(),title:p.title,description:p.description}));B(p=>({...p,[r]:g})),i?.onSuccess?.()}catch(o){if(F.current!==s)return;const g=o instanceof Error?o:new Error("Failed to generate feature suggestions");throw i?.onError?.(g),g}finally{F.current===s&&le(o=>({...o,[r]:!1}))}},[]),Pe=a.useCallback((r,c,i)=>{const d=(P.current[r]||[]).map(o=>o.id===c?{...o,...i}:o);P.current={...P.current,[r]:d},B(o=>({...o,[r]:o[r]?.map(g=>g.id===c?{...g,...i}:g)||[]}))},[]),Je=a.useCallback(async(r,c,i)=>{const s=F.current,d=P.current[r]||[],o=d.findIndex(p=>p.id===c);if(o===-1){const p=new Error("Suggestion draft not found");throw i?.onError?.(p),p}const g=d[o];if(!g.title.trim()){const p=new Error("Title cannot be empty");throw i?.onError?.(p),p}B(p=>({...p,[r]:p[r]?.filter(x=>x.id!==c)||[]}));try{if(await at(r,{title:g.title,description:g.description},M.current),F.current!==s){B(p=>{const V=[...p[r]||[]];return V.splice(o,0,g),{...p,[r]:V}});return}v.current&&N(v.current),i?.onSuccess?.()}catch(p){B(V=>{const Ce=[...V[r]||[]];return Ce.splice(o,0,g),{...V,[r]:Ce}});const x=p instanceof Error?p:new Error("Failed to accept suggestion");throw i?.onError?.(x),x}},[N]),_e=a.useCallback(async(r,c)=>{const i=[...P.current[r]||[]];if(i.length===0)return;const s=i.findIndex(o=>!o.title.trim());if(s!==-1){const o=new Error(`Title cannot be empty at position ${s+1}`);throw c?.onError?.(o),o}B(o=>({...o,[r]:[]}));const d=F.current;for(let o=0;o<i.length&&F.current===d;o++){const g=i[o];try{await at(r,{title:g.title,description:g.description},M.current)}catch(p){const x=p instanceof Error?p:new Error("Failed to accept all suggestions");throw c?.onError?.(x),x}}F.current===d&&(v.current&&N(v.current),c?.onSuccess?.())},[N]),Xe=a.useCallback(()=>{R([]),oe(!1)},[]),ue=a.useCallback(r=>{B(c=>{const i={...c};return delete i[r],i}),le(c=>{const i={...c};return delete i[r],i})},[]),$e=a.useCallback(async(r,c)=>{const i=++Q.current,s=n;ne(!0),ie(null);try{const d=await Gt(r,s);if(Q.current!==i||n!==s)return;se(d),c?.onSuccess?.()}catch(d){if(Q.current!==i||n!==s)return;const o=d instanceof Error?d:new Error(String(d));ie(o),se(null),c?.onError?.(o)}finally{Q.current===i&&ne(!1)}},[n]),Qe=a.useCallback(()=>{se(null),ie(null),ne(!1)},[]),pe=a.useCallback(async()=>{await be(),v.current&&await N(v.current)},[be,N]);return{roadmaps:j,selectedRoadmapId:b,selectedRoadmap:S,milestones:I,featuresByMilestoneId:_,loading:re,error:W,createRoadmap:ve,updateRoadmap:Te,deleteRoadmap:h,selectRoadmap:$,createMilestone:H,updateMilestone:xe,deleteMilestone:Ve,reorderMilestones:ee,createFeature:Re,updateFeature:D,deleteFeature:T,reorderFeatures:q,moveFeature:we,milestoneSuggestions:he,isGeneratingSuggestions:J,generateMilestoneSuggestions:Ie,updateMilestoneSuggestionDraft:de,acceptMilestoneSuggestion:L,acceptAllMilestoneSuggestions:qe,clearMilestoneSuggestions:Xe,featureSuggestionsByMilestoneId:X,isGeneratingFeatureSuggestions:Ge,generateFeatureSuggestions:je,updateFeatureSuggestionDraft:Pe,acceptFeatureSuggestion:Je,acceptAllFeatureSuggestions:_e,clearFeatureSuggestions:ue,handoffPayload:ke,isFetchingHandoff:ge,handoffError:Oe,fetchHandoff:$e,clearHandoff:Qe,refresh:pe}}function qt({isOpen:l,onClose:n,roadmapTitle:j,handoffPayload:f,isLoading:b,error:C,onFetchHandoff:S,onCopyToClipboard:m}){return l?e.jsx("div",{className:"modal-overlay open",onClick:n,role:"presentation",children:e.jsxs("div",{className:"modal modal-lg",onClick:I=>I.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":"handoff-modal-title",children:[e.jsxs("div",{className:"modal-header",children:[e.jsxs("h2",{id:"handoff-modal-title",children:["Export Roadmap: ",j]}),e.jsx("button",{className:"modal-close",onClick:n,"aria-label":"Close modal",children:e.jsx(ae,{size:18})})]}),e.jsxs("div",{className:"modal-body",children:[e.jsx("p",{className:"text-muted",style:{marginBottom:"var(--space-lg)"},children:"Export roadmap data for use in mission and task planning flows. This is a read-only export — no missions or tasks will be created."}),C&&e.jsxs("div",{className:"form-error",style:{marginBottom:"var(--space-lg)"},children:["Error loading handoff data: ",C.message]}),!f&&!b&&e.jsx("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:e.jsxs("button",{className:"btn btn-primary",onClick:S,children:[e.jsx(rt,{size:16,style:{marginRight:"var(--space-sm)"}}),"Load Handoff Data"]})}),b&&e.jsxs("div",{style:{textAlign:"center",padding:"var(--space-xl)"},children:[e.jsx(Wt,{size:24,className:"spin"}),e.jsx("p",{style:{marginTop:"var(--space-md)"},children:"Loading handoff data..."})]}),f&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsx("h3",{style:{marginBottom:"var(--space-sm)"},children:"Mission Planning Handoff"}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"200px",overflow:"auto"},children:JSON.stringify(f.mission,null,2)})})]}),e.jsxs("div",{style:{marginBottom:"var(--space-lg)"},children:[e.jsxs("h3",{style:{marginBottom:"var(--space-sm)"},children:["Feature Task Planning Handoffs (",f.features.length,")"]}),e.jsx("div",{className:"card",style:{padding:"var(--space-md)"},children:e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:"12px",maxHeight:"300px",overflow:"auto"},children:JSON.stringify(f.features,null,2)})})]})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("div",{className:"modal-actions-left",children:f&&e.jsxs("button",{className:"btn btn-sm",onClick:m,children:[e.jsx(Ut,{size:14,style:{marginRight:"var(--space-xs)"}}),"Copy to Clipboard"]})}),e.jsx("div",{className:"modal-actions-right",children:e.jsx("button",{className:"btn",onClick:n,children:"Close"})})]})]})}):null}function Jt({roadmap:l,isSelected:n,onSelect:j,onEdit:f,onDelete:b,onExport:C}){const S=_=>{_.key==="Enter"&&j()},m=_=>{_.stopPropagation(),f()},I=_=>{_.stopPropagation(),b()},E=_=>{_.stopPropagation(),C()};return e.jsxs("div",{className:`roadmaps-view__sidebar-item${n?" roadmaps-view__sidebar-item--active":""}`,onClick:j,onKeyDown:S,role:"button",tabIndex:0,"aria-selected":n,"data-testid":`roadmap-item-${l.id}`,children:[e.jsxs("div",{className:"roadmaps-view__sidebar-item-content",children:[e.jsx("div",{className:"roadmaps-view__sidebar-item-title",children:l.title}),l.description&&e.jsx("div",{className:"roadmaps-view__sidebar-item-desc",children:l.description})]}),e.jsxs("div",{className:"roadmaps-view__sidebar-item-actions",onClick:m,role:"presentation",children:[e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:E,role:"button",title:"Export roadmap","aria-label":"Export roadmap","data-testid":`roadmap-export-${l.id}`,tabIndex:0,children:e.jsx(rt,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn",onClick:m,role:"button",title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`roadmap-edit-${l.id}`,tabIndex:0,children:e.jsx(Ee,{size:14})}),e.jsx("span",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:I,role:"button",title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`roadmap-delete-${l.id}`,tabIndex:0,children:e.jsx(Le,{size:14})})]})]})}function Xt({roadmaps:l,selectedRoadmapId:n,onSelect:j,onCreate:f,onEdit:b,onDelete:C,onExport:S,showCreateForm:m,onCancelCreate:I,onSaveCreate:E}){return e.jsxs("div",{className:"roadmaps-view__mobile-list","data-testid":"roadmaps-view__mobile-list",children:[e.jsxs("div",{className:"roadmaps-view__mobile-list-header",children:[e.jsx("h2",{className:"roadmaps-view__mobile-list-title",children:"Roadmaps"}),!m&&e.jsx("button",{className:"roadmaps-view__mobile-add-btn",onClick:f,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-create-roadmap-btn",children:e.jsx(Ae,{size:18})})]}),m&&e.jsx("div",{className:"roadmaps-view__mobile-create-form",children:e.jsx(pt,{onSave:E,onCancel:I})}),l.length===0&&!m?e.jsxs("div",{className:"roadmaps-view__mobile-empty",children:[e.jsx("p",{children:"No roadmaps yet."}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:f,children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Create Roadmap"})]})]}):e.jsx("div",{className:"roadmaps-view__mobile-list-items",children:l.map(_=>e.jsxs("div",{className:`roadmaps-view__mobile-item${_.id===n?" roadmaps-view__mobile-item--active":""}`,onClick:()=>j(_.id),role:"button",tabIndex:0,onKeyDown:y=>{y.key==="Enter"&&j(_.id)},"data-testid":`mobile-roadmap-item-${_.id}`,children:[e.jsxs("div",{className:"roadmaps-view__mobile-item-content",children:[e.jsx("span",{className:"roadmaps-view__mobile-item-title",children:_.title}),_.description&&e.jsx("span",{className:"roadmaps-view__mobile-item-desc",children:_.description})]}),e.jsxs("div",{className:"roadmaps-view__mobile-item-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),S(_)},title:"Export roadmap","aria-label":"Export roadmap","data-testid":`mobile-roadmap-export-${_.id}`,children:e.jsx(rt,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:y=>{y.stopPropagation(),b(_)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`mobile-roadmap-edit-${_.id}`,children:e.jsx(Ee,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:y=>{y.stopPropagation(),C(_.id)},title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`mobile-roadmap-delete-${_.id}`,children:e.jsx(Le,{size:16})})]})]},_.id))})]})}function Qt({roadmapTitle:l,onBack:n,onEdit:j,onDelete:f,onCreate:b}){return e.jsxs("div",{className:"roadmaps-view__mobile-header","data-testid":"roadmaps-view__mobile-header",children:[e.jsx("button",{className:"roadmaps-view__mobile-back-btn",onClick:n,title:"Back to roadmap list","aria-label":"Back to roadmap list","data-testid":"mobile-back-btn",children:e.jsx(Vt,{size:20})}),e.jsx("h2",{className:"roadmaps-view__mobile-header-title",children:l}),e.jsxs("div",{className:"roadmaps-view__mobile-header-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:b,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-header-create-btn",children:e.jsx(Ae,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:j,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"mobile-header-edit-btn",children:e.jsx(Ee,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:f,title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"mobile-header-delete-btn",children:e.jsx(Le,{size:18})})]})]})}function Zt({milestone:l,features:n,onEditMilestone:j,onDeleteMilestone:f,onAddFeature:b,onEditFeature:C,onDeleteFeature:S,milestoneEdit:m,onStartMilestoneEdit:I,onCancelMilestoneEdit:E,onSaveMilestoneEdit:_,featureEdit:y,onStartFeatureEdit:re,onCancelFeatureEdit:z,onSaveFeatureEdit:W,projectId:A,addToast:ke,isMilestoneDragging:se,isMilestoneDropTarget:ge,milestoneDropPosition:ne,onMilestoneDragStart:Oe,onMilestoneDragEnd:ie,onMilestoneDragOver:he,onMilestoneDrop:R,onMilestoneDragLeave:J,isFeatureDragging:oe,isFeatureDropTarget:X,featureDropIndex:B,onFeatureDragStart:Fe,onFeatureDragEnd:le,onFeatureDragOver:P,onFeatureDrop:De,onFeatureDragLeave:Y,onFeatureDropOnMilestone:Me,featureSuggestions:F,isGeneratingFeatureSuggestions:Q,onGenerateFeatureSuggestions:Be,onAcceptFeatureSuggestion:v,onAcceptAllFeatureSuggestions:He,onUpdateFeatureSuggestionDraft:fe,onClearFeatureSuggestions:M}){const Z=m?.milestoneId===l.id,be=h=>{h.key==="Enter"?(h.preventDefault(),m&&_({title:m.value})):h.key==="Escape"&&E()},N=h=>{h.key==="Escape"&&E()},ve=["roadmaps-view__milestone",se?"roadmaps-view__milestone--dragging":"",ge?"roadmaps-view__milestone--drop-target":"",ge&&ne==="before"?"roadmaps-view__milestone--drop-before":"",ge&&ne==="after"?"roadmaps-view__milestone--drop-after":""].filter(Boolean).join(" "),Te=["roadmaps-view__feature-list",X?"roadmaps-view__feature-list--drop-target":""].filter(Boolean).join(" ");return e.jsxs("div",{className:ve,draggable:!Z,onDragStart:h=>{Z||(Oe(l.id),h.dataTransfer.setData("text/plain",`milestone:${l.id}`),h.dataTransfer.effectAllowed="move")},onDragEnd:ie,onDragOver:h=>{h.dataTransfer.types.includes("text/plain")&&h.dataTransfer.types.includes("text/plain")&&(h.preventDefault(),h.dataTransfer.dropEffect="move",he(l.id))},onDrop:h=>{h.preventDefault(),h.dataTransfer.getData("text/plain")?.startsWith("feature:")||R(l.id)},onDragLeave:J,"data-testid":`milestone-card-${l.id}`,children:[e.jsx("div",{className:"roadmaps-view__milestone-header",children:Z?e.jsxs("div",{className:"roadmaps-view__inline-edit",children:[e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:m.value,onChange:()=>I(),onKeyDown:be,placeholder:"Milestone title",autoFocus:!0,"data-testid":`milestone-title-input-${l.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>_({title:m.value}),"aria-label":"Save milestone title",title:"Save",children:e.jsx(me,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:E,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(ae,{size:14})})]}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:m.field==="description"?m.value:l.description||"",onChange:()=>{},onKeyDown:N,placeholder:"Milestone description (optional)",rows:2,"data-testid":`milestone-desc-input-${l.id}`})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__milestone-title-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${l.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("h3",{className:"roadmaps-view__milestone-title",children:l.title}),e.jsxs("div",{className:"roadmaps-view__milestone-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:j,title:"Edit milestone","aria-label":"Edit milestone","data-testid":`milestone-edit-${l.id}`,children:e.jsx(Ee,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:f,title:"Delete milestone","aria-label":"Delete milestone","data-testid":`milestone-delete-${l.id}`,children:e.jsx(Le,{size:14})})]})]}),l.description&&e.jsx("p",{className:"roadmaps-view__milestone-desc",children:l.description})]})}),e.jsxs("div",{className:"roadmaps-view__milestone-actions-bar",children:[e.jsxs("button",{className:"roadmaps-view__add-feature-btn",onClick:b,title:"Add feature","aria-label":"Add feature","data-testid":`add-feature-${l.id}`,children:[e.jsx(Ae,{size:12}),e.jsx("span",{children:"Add Feature"})]}),e.jsxs("button",{className:"roadmaps-view__suggest-btn",onClick:()=>{Be?.()},disabled:Q??!1,title:"Generate feature suggestions with AI","aria-label":"Generate feature suggestions","data-testid":`generate-features-${l.id}`,children:[e.jsx(ut,{size:12}),e.jsx("span",{children:Q?"Generating...":"AI Suggestions"})]})]}),e.jsxs("div",{className:Te,onDragOver:h=>{h.preventDefault(),h.dataTransfer.dropEffect="move",h.dataTransfer.getData("text/plain")?.startsWith("feature:")&&Me()},onDrop:h=>{h.preventDefault();const $=h.dataTransfer.getData("text/plain");$?.startsWith("feature:")&&De($.split(":")[1],n.length)},onDragLeave:Y,children:[n.length===0?e.jsx("p",{className:"roadmaps-view__empty-features",children:"No features yet."}):n.map((h,$)=>{const H=y?.featureId===h.id,xe=oe(h.id),Ve=D=>{D.key==="Enter"?(D.preventDefault(),y&&W({title:y.value})):D.key==="Escape"&&z()},Re=["roadmaps-view__feature-item",xe?"roadmaps-view__feature-item--dragging":"",X&&B===$?"roadmaps-view__feature-item--drop-before":"",X&&B===$+1?"roadmaps-view__feature-item--drop-after":""].filter(Boolean).join(" ");return e.jsx("div",{className:Re,draggable:!H,onDragStart:D=>{H||(Fe(h.id,l.id),D.dataTransfer.setData("text/plain",`feature:${h.id}`),D.dataTransfer.effectAllowed="move")},onDragEnd:le,onDragOver:D=>{if(D.preventDefault(),D.stopPropagation(),D.dataTransfer.dropEffect="move",D.dataTransfer.getData("text/plain")?.startsWith("feature:")){const ee=D.currentTarget.getBoundingClientRect(),q=ee.top+ee.height/2,we=D.clientY<q?"before":"after";P(h.id,we)}},onDrop:D=>{D.preventDefault(),D.stopPropagation();const T=D.dataTransfer.getData("text/plain");if(T?.startsWith("feature:")){const ee=T.split(":")[1],q=D.currentTarget.getBoundingClientRect(),we=q.top+q.height/2,ce=D.clientY<we?"before":"after";let Ie=$;ce==="after"&&(Ie=$+1),De(ee,Ie)}},onDragLeave:Y,"data-testid":`feature-item-${h.id}`,children:H?e.jsx("div",{className:"roadmaps-view__inline-edit roadmaps-view__inline-edit--compact",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:y.value,onChange:()=>{},onKeyDown:Ve,placeholder:"Feature title",autoFocus:!0,"data-testid":`feature-title-input-${h.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>W({title:y.value}),"aria-label":"Save feature title",title:"Save",children:e.jsx(me,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:z,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(ae,{size:14})})]})}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${h.id}`,children:e.jsx(Ye,{size:12})}),e.jsxs("div",{className:"roadmaps-view__feature-content",children:[e.jsx("span",{className:"roadmaps-view__feature-title",children:h.title}),h.description&&e.jsx("p",{className:"roadmaps-view__feature-desc",children:h.description})]}),e.jsxs("div",{className:"roadmaps-view__feature-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>C(h.id),title:"Edit feature","aria-label":"Edit feature","data-testid":`feature-edit-${h.id}`,children:e.jsx(Ee,{size:12})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>S(h.id),title:"Delete feature","aria-label":"Delete feature","data-testid":`feature-delete-${h.id}`,children:e.jsx(Le,{size:12})})]})]})},h.id)}),F&&F.length>0&&e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h4",{className:"roadmap-suggestion-title",children:"AI Feature Suggestions"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-accept-all-btn",onClick:()=>He?.(),title:"Accept all suggestions","aria-label":"Accept all","data-testid":`accept-all-features-${l.id}`,children:"Accept All"}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:()=>M?.(),title:"Clear suggestions","aria-label":"Clear","data-testid":`clear-features-${l.id}`,children:"Clear"})]})]}),e.jsx("div",{className:"roadmap-suggestion-list",children:F.map(h=>e.jsx(ea,{suggestion:h,onUpdateDraft:$=>fe?.(l.id,h.id,$),onAccept:()=>{v?.(l.id,h.id)},testIdPrefix:`feature-suggestion-${l.id}`},h.id))})]})]})]})}function ea({suggestion:l,onUpdateDraft:n,onAccept:j,testIdPrefix:f}){const[b,C]=a.useState(!1),[S,m]=a.useState(l.title),[I,E]=a.useState(l.description||""),_=()=>{m(l.title),E(l.description||""),C(!0)},y=()=>{n({title:S.trim(),description:I.trim()||void 0}),C(!1)},re=()=>{m(l.title),E(l.description||""),C(!1)},z=()=>{l.title.trim()&&j()},W=l.title.trim().length>0;return b?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:A=>m(A.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:I,onChange:A=>E(A.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(me,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:re,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(ae,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:_,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Ee,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:z,disabled:!W,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(me,{size:12})})]})]})}function dt({suggestion:l,onUpdateDraft:n,onAccept:j,testIdPrefix:f}){const[b,C]=a.useState(!1),[S,m]=a.useState(l.title),[I,E]=a.useState(l.description||""),_=()=>{m(l.title),E(l.description||""),C(!0)},y=()=>{n({title:S.trim(),description:I.trim()||void 0}),C(!1)},re=()=>{m(l.title),E(l.description||""),C(!1)},z=()=>{l.title.trim()&&j()},W=l.title.trim().length>0;return b?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:S,onChange:A=>m(A.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":`${f}-${l.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:I,onChange:A=>E(A.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${f}-${l.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:y,disabled:!S.trim(),title:"Save","data-testid":`${f}-${l.id}-save`,children:e.jsx(me,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:re,title:"Cancel","data-testid":`${f}-${l.id}-cancel`,children:e.jsx(ae,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${f}-${l.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:l.title}),l.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:l.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:_,title:"Edit suggestion","aria-label":"Edit","data-testid":`${f}-${l.id}-edit`,children:e.jsx(Ee,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:z,disabled:!W,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${f}-${l.id}-accept`,children:e.jsx(me,{size:12})})]})]})}function pt({onSave:l,onCancel:n}){const[j,f]=a.useState(""),[b,C]=a.useState(""),S=m=>{m.preventDefault(),j.trim()&&l({title:j.trim(),description:b.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form","data-testid":"create-roadmap-form",children:e.jsxs("form",{onSubmit:S,children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:j,onChange:m=>f(m.target.value),placeholder:"Roadmap title",autoFocus:!0,"data-testid":"create-roadmap-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:b,onChange:m=>C(m.target.value),placeholder:"Roadmap description (optional)",rows:2,"data-testid":"create-roadmap-description"}),e.jsxs("div",{className:"roadmaps-view__create-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__btn roadmaps-view__btn--primary",disabled:!j.trim(),"data-testid":"create-roadmap-submit",children:"Create"}),e.jsx("button",{type:"button",className:"roadmaps-view__btn",onClick:n,"data-testid":"create-roadmap-cancel",children:"Cancel"})]})]})})}function ta({onSave:l,onCancel:n}){const[j,f]=a.useState(""),[b,C]=a.useState(""),S=m=>{m.preventDefault(),j.trim()&&l({title:j.trim(),description:b.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-milestone-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:j,onChange:m=>f(m.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":"create-milestone-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:b,onChange:m=>C(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-milestone-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!j.trim(),"aria-label":"Save milestone",title:"Save","data-testid":"create-milestone-submit",children:e.jsx(me,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-milestone-cancel",children:e.jsx(ae,{size:14})})]})]})})}function aa({onSave:l,onCancel:n}){const[j,f]=a.useState(""),[b,C]=a.useState(""),S=m=>{m.preventDefault(),j.trim()&&l({title:j.trim(),description:b.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-feature-form",children:e.jsxs("form",{onSubmit:S,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:j,onChange:m=>f(m.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":"create-feature-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:b,onChange:m=>C(m.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-feature-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!j.trim(),"aria-label":"Save feature",title:"Save","data-testid":"create-feature-submit",children:e.jsx(me,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:n,"aria-label":"Cancel",title:"Cancel","data-testid":"create-feature-cancel",children:e.jsx(ae,{size:14})})]})]})})}function oa({projectId:l,addToast:n}){const j=Pt()==="mobile",{roadmaps:f,selectedRoadmapId:b,selectedRoadmap:C,milestones:S,featuresByMilestoneId:m,loading:I,error:E,createRoadmap:_,updateRoadmap:y,deleteRoadmap:re,selectRoadmap:z,createMilestone:W,updateMilestone:A,deleteMilestone:ke,createFeature:se,updateFeature:ge,deleteFeature:ne,reorderMilestones:Oe,reorderFeatures:ie,moveFeature:he,milestoneSuggestions:R,isGeneratingSuggestions:J,generateMilestoneSuggestions:oe,updateMilestoneSuggestionDraft:X,acceptMilestoneSuggestion:B,acceptAllMilestoneSuggestions:Fe,clearMilestoneSuggestions:le,featureSuggestionsByMilestoneId:P,isGeneratingFeatureSuggestions:De,generateFeatureSuggestions:Y,updateFeatureSuggestionDraft:Me,acceptFeatureSuggestion:F,acceptAllFeatureSuggestions:Q,clearFeatureSuggestions:Be,handoffPayload:v,isFetchingHandoff:He,handoffError:fe,fetchHandoff:M,clearHandoff:Z}=Yt({projectId:l}),[be,N]=a.useState(!1),[ve,Te]=a.useState(null),[h,$]=a.useState(""),[H,xe]=a.useState(""),[Ve,Re]=a.useState(!1),D=a.useRef(null);a.useEffect(()=>{D.current!==null&&D.current!==b&&Re(!1),D.current=b},[b]);const[T,ee]=a.useState({roadmapId:null,field:null,value:""}),[q,we]=a.useState({milestoneId:null,field:null,value:""}),[ce,Ie]=a.useState({featureId:null,field:null,value:""}),[de,L]=a.useState({type:null,parentId:void 0,title:"",description:""}),[qe,Ge]=a.useState(!1),[je,Pe]=a.useState({draggingId:null,dropTargetId:null,dropPosition:null}),Je=a.useCallback(t=>{Pe(u=>({...u,draggingId:t}))},[]),_e=a.useCallback(()=>{Pe({draggingId:null,dropTargetId:null,dropPosition:null})},[]),Xe=a.useCallback(t=>{Pe(u=>u.draggingId===t?u:{...u,dropTargetId:t,dropPosition:null})},[]),[ue,$e]=a.useState({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}),Qe=a.useCallback((t,u)=>{$e(w=>({...w,draggingId:t,draggingMilestoneId:u}))},[]),pe=a.useCallback(()=>{$e({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null})},[]),r=a.useCallback((t,u)=>{$e(w=>{if(w.draggingId===t)return w;const G=(m[w.draggingMilestoneId||""]||[]).findIndex(Ne=>Ne.id===t);let K;return u==="before"?K=G:K=G+1,{...w,dropTargetMilestoneId:w.draggingMilestoneId,dropTargetIndex:K,dropPosition:u}})},[m]),c=a.useCallback(()=>{$e(t=>({...t,dropTargetMilestoneId:t.draggingMilestoneId,dropTargetIndex:(m[t.draggingMilestoneId||""]||[]).length}))},[m]),i=a.useCallback(async(t,u)=>{const{draggingMilestoneId:w,dropTargetMilestoneId:O}=ue;if(!w){pe();return}const G=O||w,K=m[w]||[],Ne=K.find(Se=>Se.id===t);if(!Ne){pe();return}if(w!==G){if(w===G){pe();return}try{await he(t,G,u,{onError:Se=>{n(`Failed to move feature: ${Se.message}`,"error")}})}catch{}}else{const Se=[...K],yt=Se.findIndex(ze=>ze.id===t);Se.splice(yt,1),Se.splice(u,0,Ne);const ct=Se.map(ze=>ze.id),Nt=K.map(ze=>ze.id);if(ct.join(",")===Nt.join(",")){pe();return}try{await ie(w,ct,{onError:ze=>{n(`Failed to reorder features: ${ze.message}`,"error")}})}catch{}}pe()},[ue,m,ie,he,n,pe]),s=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),w=t.clientX,O=t.clientY;(w<u.left||w>u.right||O<u.top||O>u.bottom)&&$e(G=>({...G,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}))},[]),d=a.useCallback(t=>ue.draggingId===t,[ue.draggingId]),o=a.useCallback(async t=>{const{draggingId:u}=je;if(!u||u===t){_e();return}const w=S.map(Ne=>Ne.id),O=w.indexOf(u),G=w.indexOf(t);if(O===-1||G===-1){_e();return}const K=[...w];if(K.splice(O,1),K.splice(G,0,u),K.join(",")===w.join(",")){_e();return}try{await Oe(b,K,{onError:Ne=>{n(`Failed to reorder milestones: ${Ne.message}`,"error")}})}catch{}_e()},[je,S,b,Oe,n,_e]),g=a.useCallback(t=>{const u=t.currentTarget.getBoundingClientRect(),w=t.clientX,O=t.clientY;(w<u.left||w>u.right||O<u.top||O>u.bottom)&&Pe(G=>({...G,dropTargetId:null,dropPosition:null}))},[]),p=a.useCallback(t=>{z(t.id),ee({roadmapId:t.id,field:"title",value:t.title})},[z]),x=a.useCallback(()=>{ee({roadmapId:null,field:null,value:""})},[]),V=a.useCallback(async t=>{if(T.roadmapId)try{await y(T.roadmapId,t,{onError:u=>n(u.message,"error")}),x()}catch{}},[T.roadmapId,y,x,n]),te=a.useCallback(async t=>{if(window.confirm("Delete this roadmap? This cannot be undone."))try{await re(t,{onError:u=>n(u.message,"error")}),n("Roadmap deleted","success")}catch{}},[re,n]),Ce=a.useCallback((t,u)=>{Te(t),$(u),N(!0),Z()},[Z]),Ke=a.useCallback(()=>{N(!1),Te(null),$(""),Z()},[Z]),k=a.useCallback(()=>{ve&&M(ve,{onError:t=>n(`Failed to load handoff: ${t.message}`,"error")})},[ve,M,n]),U=a.useCallback(()=>{if(v){const t=JSON.stringify(v,null,2);navigator.clipboard.writeText(t).then(()=>{n("Handoff data copied to clipboard","success")}).catch(()=>{n("Failed to copy to clipboard","error")})}},[v,n]),Ue=a.useCallback(async t=>{try{await _(t,{onError:u=>n(u.message,"error")}),L({type:null,parentId:void 0,title:"",description:""}),n("Roadmap created","success")}catch{}},[_,n]),We=a.useCallback(t=>{we({milestoneId:t.id,field:"title",value:t.title})},[]),Ze=a.useCallback(()=>{we({milestoneId:null,field:null,value:""})},[]),mt=a.useCallback(async t=>{if(q.milestoneId)try{await A(q.milestoneId,t,{onError:u=>n(u.message,"error")}),Ze()}catch{}},[q.milestoneId,A,Ze,n]),gt=a.useCallback(async t=>{if(window.confirm("Delete this milestone and all its features?"))try{await ke(t,{onError:u=>n(u.message,"error")}),n("Milestone deleted","success")}catch{}},[ke,n]),ht=a.useCallback(async t=>{try{await W(t,{onError:u=>n(u.message,"error")}),L({type:null,parentId:void 0,title:"",description:""}),n("Milestone created","success")}catch{}},[W,n]),st=a.useCallback((t,u,w)=>{Ie({featureId:t,field:"title",value:u})},[]),et=a.useCallback(()=>{Ie({featureId:null,field:null,value:""})},[]),ft=a.useCallback(async t=>{if(ce.featureId)try{await ge(ce.featureId,t,{onError:u=>n(u.message,"error")}),et()}catch{}},[ce.featureId,ge,et,n]),bt=a.useCallback(async t=>{if(window.confirm("Delete this feature?"))try{await ne(t,{onError:u=>n(u.message,"error")}),n("Feature deleted","success")}catch{}},[ne,n]),nt=a.useCallback(async()=>{if(H.trim())try{await oe(H,5,{onError:t=>n(t.message,"error")})}catch{}},[H,oe,n]),it=a.useCallback(async t=>{try{await B(t,{onError:u=>n(u.message,"error")}),n("Milestone added","success")}catch{}},[B,n]),ot=a.useCallback(async()=>{try{await Fe({onError:t=>n(t.message,"error")}),n(`${R.length} milestones added`,"success"),xe("")}catch{}},[Fe,R.length,n]),lt=a.useCallback(()=>{le(),xe("")},[le]),vt=a.useCallback(async t=>{try{await Y(t,{count:5},{onError:u=>n(u.message,"error")})}catch{}},[Y,n]),xt=a.useCallback(async(t,u)=>{try{await F(t,u,{onError:w=>n(w.message,"error")}),n("Feature added","success")}catch{}},[F,n]),wt=a.useCallback((t,u,w)=>{Me(t,u,w)},[Me]),jt=a.useCallback(async t=>{const u=P[t]||[];try{await Q(t,{onError:w=>n(w.message,"error")}),n(`${u.length} features added`,"success")}catch{}},[Q,P,n]),_t=a.useCallback(t=>{Be(t)},[Be]),Ct=a.useCallback(async(t,u)=>{try{await se(t,u,{onError:w=>n(w.message,"error")}),L({type:null,parentId:void 0,title:"",description:""}),n("Feature created","success")}catch{}},[se,n]),ye=b;return I&&f.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--loading",children:e.jsx("div",{className:"roadmaps-view__loading-state",children:"Loading roadmaps..."})}):E&&f.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--error",children:e.jsxs("div",{className:"roadmaps-view__error-state",children:[e.jsx("p",{children:"Failed to load roadmaps"}),e.jsx("p",{className:"roadmaps-view__error-msg",children:E.message})]})}):e.jsxs("div",{className:"roadmaps-view",children:[j&&!ye&&e.jsx(Xt,{roadmaps:f,selectedRoadmapId:ye,onSelect:t=>z(t),onCreate:()=>Ge(!0),onEdit:p,onDelete:te,onExport:t=>Ce(t.id,t.title),showCreateForm:qe,onCancelCreate:()=>Ge(!1),onSaveCreate:async t=>{await Ue(t),Ge(!1)}}),!j&&e.jsxs("aside",{className:"roadmaps-view__sidebar","aria-label":"Roadmaps",children:[e.jsxs("div",{className:"roadmaps-view__sidebar-header",children:[e.jsx("h2",{className:"roadmaps-view__sidebar-title",children:"Roadmaps"}),e.jsx("button",{className:"roadmaps-view__add-btn",onClick:()=>L({type:"roadmap",title:"",description:""}),title:"Create roadmap","aria-label":"Create roadmap","data-testid":"create-roadmap-btn",children:e.jsx(Ae,{size:16})})]}),de.type==="roadmap"&&e.jsx(pt,{onSave:Ue,onCancel:()=>L({type:null,parentId:void 0,title:"",description:""})}),e.jsx("div",{className:"roadmaps-view__sidebar-list",children:f.length===0?e.jsx("p",{className:"roadmaps-view__empty-sidebar",children:"No roadmaps yet. Click + to create one."}):f.map(t=>e.jsx(Jt,{roadmap:t,isSelected:t.id===ye,onSelect:()=>z(t.id),onEdit:()=>p(t),onDelete:()=>te(t.id),onExport:()=>Ce(t.id,t.title)},t.id))})]}),e.jsxs("main",{className:"roadmaps-view__main","aria-label":"Roadmap content",children:[j&&ye&&e.jsx(Qt,{roadmapTitle:C?.title||"Untitled Roadmap",onBack:()=>z(null),onEdit:()=>{C&&p(C)},onDelete:()=>te(ye),onCreate:()=>Ge(!0)}),ye?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"roadmaps-view__roadmap-header",children:T.roadmapId===ye?e.jsx("div",{className:"roadmaps-view__inline-edit",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input roadmaps-view__inline-input--large",value:T.value,onChange:t=>ee(u=>({...u,value:t.target.value})),onKeyDown:t=>{t.key==="Enter"?V({title:T.value}):t.key==="Escape"&&x()},placeholder:"Roadmap title",autoFocus:!0,"data-testid":"roadmap-title-input"}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>V({title:T.value}),"aria-label":"Save",title:"Save",children:e.jsx(me,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:x,"aria-label":"Cancel",title:"Cancel",children:e.jsx(ae,{size:16})})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__roadmap-title-row",children:[e.jsx("h1",{className:"roadmaps-view__roadmap-title",children:C?.title||"Untitled Roadmap"}),e.jsxs("div",{className:"roadmaps-view__roadmap-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>{C&&p(C)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"edit-roadmap-btn",children:e.jsx(Ee,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>te(ye),title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"delete-roadmap-btn",children:e.jsx(Le,{size:16})})]})]}),C?.description&&e.jsx("p",{className:"roadmaps-view__roadmap-desc",children:C.description})]})}),j?Ve?e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"}),e.jsx("button",{className:"roadmap-suggestion-collapse-btn",onClick:()=>Re(!1),"aria-label":"Collapse suggestion panel","data-testid":"collapse-suggestion-panel-btn",children:e.jsx(Lt,{size:16})})]}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:H,onChange:t=>xe(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:J||!b,"data-testid":"goal-prompt-input",autoFocus:!0}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:nt,disabled:!H.trim()||J||!b,"data-testid":"generate-suggestions-btn",children:J?"Generating...":"Generate Milestones"}),R.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:ot,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",R.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:lt,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(ae,{size:14})})]})]})]}),R.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:R.map(t=>e.jsx(dt,{suggestion:t,onUpdateDraft:u=>X(t.id,u),onAccept:()=>it(t.id),testIdPrefix:"suggestion"},t.id))})]}):e.jsx("div",{className:"roadmap-suggestion-section",children:e.jsxs("button",{className:"roadmap-suggestion-expand-btn",onClick:()=>Re(!0),disabled:!b,"data-testid":"expand-suggestion-panel-btn",children:[e.jsx(ut,{size:16}),"Generate Milestone Ideas"]})}):e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsx("div",{className:"roadmap-suggestion-header",children:e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"})}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:H,onChange:t=>xe(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:J||!b,"data-testid":"goal-prompt-input"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:nt,disabled:!H.trim()||J||!b,"data-testid":"generate-suggestions-btn",children:J?"Generating...":"Generate Milestones"}),R.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:ot,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",R.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:lt,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(ae,{size:14})})]})]})]}),R.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:R.map(t=>e.jsx(dt,{suggestion:t,onUpdateDraft:u=>X(t.id,u),onAccept:()=>it(t.id),testIdPrefix:"suggestion"},t.id))})]}),e.jsxs("div",{className:"roadmaps-view__milestone-lanes",children:[de.type==="milestone"&&e.jsx(ta,{onSave:ht,onCancel:()=>L({type:null,parentId:void 0,title:"",description:""})}),S.length===0&&de.type!=="milestone"?e.jsxs("div",{className:"roadmaps-view__empty-milestones",children:[e.jsx("p",{children:"This roadmap has no milestones."}),e.jsxs("button",{className:"roadmaps-view__add-milestone-btn",onClick:()=>L({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn-empty",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]})]}):e.jsxs(e.Fragment,{children:[de.type!=="milestone"&&e.jsxs("button",{className:"roadmaps-view__add-milestone-fab",onClick:()=>L({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn",children:[e.jsx(Ae,{size:14}),e.jsx("span",{children:"Add Milestone"})]}),S.map(t=>e.jsx(Zt,{milestone:t,features:m[t.id]||[],onEditMilestone:()=>We(t),onDeleteMilestone:()=>gt(t.id),onAddFeature:()=>L({type:"feature",parentId:t.id,title:"",description:""}),onEditFeature:u=>{const w=m[t.id]?.find(O=>O.id===u);w&&st(u,w.title,w.description)},onDeleteFeature:bt,milestoneEdit:q,onStartMilestoneEdit:()=>We(t),onCancelMilestoneEdit:Ze,onSaveMilestoneEdit:mt,featureEdit:ce,onStartFeatureEdit:st,onCancelFeatureEdit:et,onSaveFeatureEdit:ft,projectId:l,addToast:n,isMilestoneDragging:je.draggingId===t.id,isMilestoneDropTarget:je.dropTargetId===t.id,milestoneDropPosition:je.dropTargetId===t.id?je.dropPosition:null,onMilestoneDragStart:Je,onMilestoneDragEnd:_e,onMilestoneDragOver:Xe,onMilestoneDrop:o,onMilestoneDragLeave:g,isFeatureDragging:d,isFeatureDropTarget:ue.dropTargetMilestoneId===t.id,featureDropIndex:ue.dropTargetMilestoneId===t.id?ue.dropTargetIndex:null,onFeatureDragStart:Qe,onFeatureDragEnd:pe,onFeatureDragOver:r,onFeatureDrop:i,onFeatureDragLeave:s,onFeatureDropOnMilestone:c,featureSuggestions:P[t.id],isGeneratingFeatureSuggestions:De(t.id),onGenerateFeatureSuggestions:()=>vt(t.id),onAcceptFeatureSuggestion:u=>xt(t.id,u),onAcceptAllFeatureSuggestions:()=>jt(t.id),onUpdateFeatureSuggestionDraft:(u,w,O)=>wt(u,w,O),onClearFeatureSuggestions:()=>_t(t.id)},t.id))]})]})]}):e.jsx("div",{className:"roadmaps-view__empty-main",children:e.jsx("p",{children:"Select a roadmap from the sidebar to view its milestones."})})]}),de.type==="feature"&&de.parentId&&e.jsx("div",{className:"roadmaps-view__feature-create-overlay",children:e.jsx(aa,{onSave:t=>Ct(de.parentId,t),onCancel:()=>L({type:null,parentId:void 0,title:"",description:""})})}),e.jsx(qt,{isOpen:be,onClose:Ke,roadmapId:ve||"",roadmapTitle:h,handoffPayload:v,isLoading:He,error:fe,onFetchHandoff:k,onCopyToClipboard:U})]})}export{oa as RoadmapsView};