@runfusion/fusion 0.21.0 → 0.23.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 (65) hide show
  1. package/dist/bin.js +6505 -2184
  2. package/dist/client/assets/AgentDetailView-C1XceMgi.js +18 -0
  3. package/dist/client/assets/AgentDetailView-CeO_1MK7.css +1 -0
  4. package/dist/client/assets/AgentsView-DSGQWObq.css +1 -0
  5. package/dist/client/assets/AgentsView-Deh125ss.js +527 -0
  6. package/dist/client/assets/ChatView-7D_RQDqT.js +1 -0
  7. package/dist/client/assets/DevServerView-C9lzHrcT.js +1 -0
  8. package/dist/client/assets/DirectoryPicker-aVdFaV37.js +1 -0
  9. package/dist/client/assets/DocumentsView-DIpg3NSP.js +1 -0
  10. package/dist/client/assets/{InsightsView-CqDethVs.js → InsightsView-jKjEFAx_.js} +2 -2
  11. package/dist/client/assets/{MemoryView-BLIm9Vr7.js → MemoryView-nXlTqebk.js} +2 -2
  12. package/dist/client/assets/{NodesView-DEXvp3WT.js → NodesView-Di2SvOhg.js} +3 -3
  13. package/dist/client/assets/{PiExtensionsManager-C2YjI9o2.js → PiExtensionsManager-Buopv-jb.js} +2 -2
  14. package/dist/client/assets/PluginManager-B9-NbQ8f.js +1 -0
  15. package/dist/client/assets/PluginManager-C1DbPaar.css +1 -0
  16. package/dist/client/assets/ResearchView-_BHXUv2j.js +1 -0
  17. package/dist/client/assets/{RoadmapsView-DPcfX5MS.js → RoadmapsView-DHWjUoc8.js} +2 -2
  18. package/dist/client/assets/{SettingsModal-BRNAPR1u.js → SettingsModal-C89Ikhfm.js} +1 -1
  19. package/dist/client/assets/SettingsModal-DHitIpsa.css +1 -0
  20. package/dist/client/assets/SettingsModal-DR_yirvK.js +31 -0
  21. package/dist/client/assets/SetupWizardModal-BtDMY9pa.js +1 -0
  22. package/dist/client/assets/SkillsView-hDpTBdFT.js +1 -0
  23. package/dist/client/assets/agentSkills-B-w5wFHh.js +1 -0
  24. package/dist/client/assets/agentSkills-DDHJnrkn.css +1 -0
  25. package/dist/client/assets/folder-open-usZkXdq2.js +6 -0
  26. package/dist/client/assets/index-Bc6ZdGMz.css +1 -0
  27. package/dist/client/assets/index-D__RMku8.js +694 -0
  28. package/dist/client/assets/{star-B314SwLA.js → star-BAT_ObKE.js} +2 -2
  29. package/dist/client/assets/upload-BC2YKNEV.js +6 -0
  30. package/dist/client/assets/{users-Bu_ltePs.js → users-Dkd4rtrN.js} +2 -2
  31. package/dist/client/index.html +2 -2
  32. package/dist/client/version.json +1 -1
  33. package/dist/droid-cli/package.json +1 -1
  34. package/dist/extension.js +4411 -932
  35. package/dist/pi-claude-cli/package.json +1 -1
  36. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  37. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraphView.css +12 -3
  38. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/storage.test.ts +12 -2
  39. package/dist/plugins/fusion-plugin-dependency-graph/src/storage.ts +6 -7
  40. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +649 -0
  41. package/dist/plugins/fusion-plugin-hermes-runtime/manifest.json +14 -0
  42. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +11 -0
  43. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +369 -0
  44. package/dist/plugins/fusion-plugin-openclaw-runtime/manifest.json +14 -0
  45. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +11 -0
  46. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +966 -0
  47. package/dist/plugins/fusion-plugin-paperclip-runtime/manifest.json +15 -0
  48. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +11 -0
  49. package/package.json +2 -1
  50. package/skill/fusion/references/engine-tools.md +6 -3
  51. package/dist/client/assets/AgentDetailView-CUtWvXBn.css +0 -1
  52. package/dist/client/assets/AgentDetailView-Dg7Qa1rG.js +0 -18
  53. package/dist/client/assets/ChatView-ODq-kBk6.js +0 -1
  54. package/dist/client/assets/DevServerView-6PS9Lvl7.js +0 -1
  55. package/dist/client/assets/DirectoryPicker-B3dza2Dq.js +0 -1
  56. package/dist/client/assets/DocumentsView-Bu9YYlki.js +0 -1
  57. package/dist/client/assets/PluginManager-DA_T0GHn.css +0 -1
  58. package/dist/client/assets/PluginManager-Dnf-LhYw.js +0 -1
  59. package/dist/client/assets/ResearchView-Z0TZ7WGo.js +0 -1
  60. package/dist/client/assets/SettingsModal-B6RN9VYe.js +0 -31
  61. package/dist/client/assets/SettingsModal-BWe0KrGY.css +0 -1
  62. package/dist/client/assets/SetupWizardModal-BFc3xID2.js +0 -1
  63. package/dist/client/assets/SkillsView-CipGahOR.js +0 -1
  64. package/dist/client/assets/index-Df1bHDY4.css +0 -1
  65. package/dist/client/assets/index-NFptaeUQ.js +0 -1222
@@ -0,0 +1 @@
1
+ import{r as s,j as t}from"./vendor-react-K0fH_qHe.js";import{n as it,b1 as ft,z as qt,b2 as Jt,E as Xt,b3 as Qt,b4 as Yt,b5 as Zt,b6 as es,b7 as ts,b8 as ss,b9 as ns,s as as,ba as rs,x as is,bb as cs,u as ls,bc as os,ag as yt,ah as kt,S as ds,a1 as gt,P as He,Q as nt,ar as us,bd as hs,B as Be,ad as ms,ae as fs,a as gs,be as ps,bf as xs,bg as vs,aR as bs,bh as ws,bi as Ss,bj as pt,bk as ys,m as ks,o as xt,t as js}from"./index-D__RMku8.js";import"./vendor-xterm-DzcZoU0P.js";const at="kb-chat-active-session";function Ns(a){const r=typeof a=="string"?a.trim():"",i=r.indexOf("/");return!r||i<=0||i>=r.length-1?{}:{modelProvider:r.slice(0,i),modelId:r.slice(i+1)}}function Cs(a){const r=a?.toolCalls;if(!Array.isArray(r))return;const i=r.map(d=>{if(!d||typeof d!="object")return null;const c=d,v=typeof c.toolName=="string"?c.toolName:"";if(!v)return null;const k=c.args;return{toolName:v,...k&&typeof k=="object"?{args:k}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(d=>d!==null);return i.length>0?i:void 0}function Ms(a){const r=a?.fallback;if(!r||typeof r!="object")return;const i=r,d=typeof i.primaryModel=="string"?i.primaryModel:"",c=typeof i.fallbackModel=="string"?i.fallbackModel:"",v=i.triggerPoint;if(!(!d||!c||v!=="session-creation"&&v!=="prompt-time"))return{primaryModel:d,fallbackModel:c,triggerPoint:v}}function rt(a){return{id:a.id,sessionId:a.sessionId,role:a.role,content:a.content,thinkingOutput:a.thinkingOutput,toolCalls:Cs(a.metadata),fallbackInfo:Ms(a.metadata),attachments:a.attachments,createdAt:a.createdAt}}function As(a,r){const[i,d]=s.useState([]),[c,v]=s.useState(null),[k,I]=s.useState(!0),[L,y]=s.useState([]),[D,b]=s.useState(!1),[E,P]=s.useState(!1),[M,p]=s.useState(""),[w,x]=s.useState(""),[F,j]=s.useState([]),[K,B]=s.useState(""),[G,R]=s.useState(""),[Q,h]=s.useState(!0),[N,oe]=s.useState(new Map),f=s.useRef(null),se=s.useRef(!1),Y=s.useRef(""),Z=s.useRef(null),Ce=s.useRef(i),U=s.useRef(c),we=s.useRef(E);Ce.current=i,U.current=c,we.current=E,s.useEffect(()=>{Y.current=K},[K]);const pe=s.useRef(new Set),de=s.useRef(0),Ie=s.useRef(a);Ie.current!==a&&(Ie.current=a,de.current++),s.useEffect(()=>{const o=de.current;it(void 0,a).then(m=>{if(de.current!==o)return;const g=new Map;for(const S of m)g.set(S.id,S);oe(g)}).catch(()=>{})},[a]);const ue=s.useCallback(async()=>{I(!0);try{const m=[...(await ft(a)).sessions].sort((g,S)=>new Date(S.updatedAt).getTime()-new Date(g.updatedAt).getTime());d(m)}catch{}finally{I(!1)}},[a]);s.useEffect(()=>{ue()},[ue]);const re=s.useRef(()=>{}),ee=s.useRef(!1);s.useEffect(()=>{ee.current=!1},[a]),s.useEffect(()=>{if(k||ee.current||U.current)return;const o=qt(at,a);if(!o){ee.current=!0;return}const m=i.find(g=>g.id===o);if(m){ee.current=!0,re.current(o,m);return}ee.current=!0},[k,i,a]);const ne=s.useCallback(async(o,m)=>{b(!0);try{const g=await Jt(o,{limit:50,...m},a),S=g.messages.map(rt);m?.offset&&m.offset>0?y(q=>[...S,...q]):y(S),h(g.messages.length>=50)}catch{}finally{b(!1)}},[a]),ie=s.useCallback(()=>{Z.current?.(),Z.current=null,Y.current="",B(""),p(""),x(""),j([]),P(!1)},[]),ce=s.useCallback((o,m)=>{const g=U.current?.id??null;if(o&&g===o&&!m)return;f.current&&(f.current.close(),f.current=null);const S=m??i.find(q=>q.id===o);v(S||null),ie(),h(!0),o?ne(o):y([]),S?.isGenerating&&(P(!0),p("")),o?Xt(at,o,a):Qt(at,a)},[i,ne,a,ie]);re.current=ce;const xe=s.useCallback(async o=>{const m=await Yt(o,a);f.current&&(f.current.close(),f.current=null);const g={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 d(S=>S.some(q=>q.id===g.id)?S:[g,...S]),ie(),ce(g.id,g),y([]),g},[a,ie,ce]),Se=s.useCallback(async o=>{await Zt(o,{status:"archived"},a),d(m=>m.filter(g=>g.id!==o)),c?.id===o&&(v(null),y([]))},[c,a]),he=s.useCallback(async o=>{c?.id===o&&f.current&&(f.current.close(),f.current=null),await es(o,a),d(m=>m.filter(g=>g.id!==o)),c?.id===o&&(v(null),y([]))},[c,a]),ae=s.useCallback(async()=>{!c||!Q||await ne(c.id,{offset:L.length})},[c,Q,ne,L.length]),me=s.useCallback(()=>{c&&(se.current=!0,Z.current?.(),Z.current=null,f.current?.close(),f.current=null,ts(c.id,a).catch(()=>{}),P(!1),p(""),x(""),j([]))},[c,a]),Me=s.useCallback(()=>{Y.current="",B("")},[]),fe=s.useCallback((o,m)=>{if(!c)return;if(E){Y.current=o,B(o),r?.("Still waiting for previous response — message queued","warning");return}se.current=!1,f.current&&(f.current.close(),f.current=null);const g=`temp-${Date.now()}`,S={id:g,sessionId:c.id,role:"user",content:o,createdAt:new Date().toISOString()};y(V=>[...V,S]),p(""),x(""),j([]),P(!0);const{handlers:q}=ss({sessionId:c.id,tempUserMessageId:g,setStreamingText:p,setStreamingThinking:x,setStreamingToolCalls:j,cancelStreamingFlushesRef:Z,addToast:r,onFallbackSession:(V,J)=>{const O=Ns(V.fallbackModel);d(_=>_.map(A=>A.id===J?{...A,...O}:A)),v(_=>_&&_.id===J?{..._,...O}:_)},onDone:({messageId:V,message:J,accumulated:O})=>{const _=J?rt(J):{id:V||`msg-${Date.now()}`,sessionId:c.id,role:"assistant",content:O.text,thinkingOutput:O.thinking,toolCalls:O.toolCalls.length>0?O.toolCalls:void 0,fallbackInfo:O.fallbackInfo,createdAt:new Date().toISOString()};pe.current.add(_.id),y(z=>[...z,_]),p(""),x(""),j([]),P(!1),f.current=null,setTimeout(()=>{pe.current.delete(_.id)},1e3),ue();const A=Y.current.trim();A&&(Y.current="",B(""),fe(A))},onError:(V,J)=>{if(y(O=>O.filter(_=>_.id!==J)),p(""),x(""),j([]),P(!1),f.current=null,console.error("[useChat] Stream error:",V),r?.(typeof V=="string"&&V.trim()?V:"Failed to get response","error"),!se.current){const O=Y.current.trim();O&&(Y.current="",B(""),fe(O))}}});f.current=ns(c.id,o,q,m,a)},[c,E,a,ue,r]),Ae=G?i.filter(o=>o.title?.toLowerCase().includes(G.toLowerCase())||o.agentId.toLowerCase().includes(G.toLowerCase())):i;return s.useEffect(()=>{if(!E||f.current||!U.current)return;const o=setInterval(async()=>{if(!we.current||f.current||!U.current){clearInterval(o);return}try{(await ft(a)).sessions.find(S=>S.id===U.current?.id)?.isGenerating||(clearInterval(o),await ne(U.current.id),p(""),x(""),j([]),P(!1))}catch{}},3e3);return()=>clearInterval(o)},[E,ne,a]),s.useEffect(()=>{const o=de.current,m=a?`?projectId=${encodeURIComponent(a)}`:"",g=()=>de.current!==o,S=A=>{if(g())return;const z=JSON.parse(A.data);d(C=>C.some(u=>u.id===z.id)?C:[z,...C])},q=A=>{if(g())return;const z=JSON.parse(A.data);d(C=>[...C.map(X=>X.id===z.id?z:X)]),U.current?.id===z.id&&v(z)},V=A=>{if(g())return;const{id:z}=JSON.parse(A.data);d(C=>C.filter(u=>u.id!==z)),U.current?.id===z&&(v(null),y([]))},J=A=>{if(g())return;const z=JSON.parse(A.data),C=rt(z);if(!pe.current.has(C.id)){if(U.current?.id===C.sessionId&&we.current&&!f.current&&C.role==="assistant"){y(u=>u.some(X=>X.id===C.id)?u:[...u,C]),p(""),x(""),j([]),P(!1);return}U.current?.id===C.sessionId&&!we.current&&y(u=>{if(u.some(X=>X.id===C.id))return u;if(C.role==="user"){const X=u.findIndex(ge=>ge.role==="user"&&ge.id.startsWith("temp-")&&ge.content.trim()===C.content.trim());if(X>=0){const ge=[...u];return ge[X]=C,ge}}return[...u,C]})}},O=A=>{if(g())return;const{id:z}=JSON.parse(A.data);y(C=>C.filter(u=>u.id!==z))};return as(`/api/events${m}`,{events:{"chat:session:created":S,"chat:session:updated":q,"chat:session:deleted":V,"chat:message:added":J,"chat:message:deleted":O}})},[a]),s.useEffect(()=>()=>{f.current&&(f.current.close(),f.current=null)},[]),{sessions:i,activeSession:c,sessionsLoading:k,messages:L,messagesLoading:D,isStreaming:E,streamingText:M,streamingThinking:w,streamingToolCalls:F,pendingMessage:K,selectSession:ce,createSession:xe,archiveSession:Se,deleteSession:he,sendMessage:fe,stopStreaming:me,clearPendingMessage:Me,loadMoreMessages:ae,hasMoreMessages:Q,searchQuery:G,setSearchQuery:R,filteredSessions:Ae,refreshSessions:ue,agentsMap:N}}function jt(a){const r=new Date(a),d=new Date().getTime()-r.getTime(),c=Math.floor(d/1e3),v=Math.floor(c/60),k=Math.floor(v/60),I=Math.floor(k/24);return c<60?"just now":v<60?`${v}m ago`:k<24?`${k}h ago`:I<7?`${I}d ago`:r.toLocaleDateString()}function vt(a,r){if(!a||!r)return null;const i=r.toLowerCase();if(i.includes("claude")){let c=r.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 c=c.replace(/\s+/g," "),c.length>30?c.slice(0,30)+"…":c}if(i.includes("gpt")||i.includes("openai")){const c=r.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 c.length>30?c.slice(0,30)+"…":c}if(i.includes("gemini")){const c=r.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 c.length>30?c.slice(0,30)+"…":c}const d=r.replace(/-/g," ").replace(/^\w/,c=>c.toUpperCase()).replace(/\s+/g," ").trim();return d.length>30?d.slice(0,30)+"…":d}function We(a,r){return a.length<=r?a:`${a.slice(0,r)}…`}function Ts(a){if(!a)return null;const r=Object.entries(a);return r.length===0?null:r.map(([i,d])=>{const c=typeof d=="string"?d:(()=>{try{return JSON.stringify(d)}catch{return String(d)}})();return`${i}=${We(c,50)}`}).join(", ")}function Ps(a){if(a===void 0)return null;if(typeof a=="string")return We(a,200);try{return We(JSON.stringify(a),200)}catch{return We(String(a),200)}}function Nt(a){if(!a||a.length===0)return null;const r=(b,E)=>{const P=b.status==="running",M=b.status==="completed"&&b.isError,p=Ts(b.args),w=Ps(b.result),x=P?p:w?`result: ${w}`:p?`args: ${p}`:null,F=P?"running":M?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${P?" chat-tool-call--running":""}${M?" chat-tool-call--error":""}`,open:P,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",title:b.toolName,children:b.toolName}),x&&t.jsx("span",{className:"chat-tool-call-preview",title:x,children:x}),t.jsx("span",{className:"chat-tool-call-status-text",children:F})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[p&&t.jsxs("div",{className:"chat-tool-call-row",children:[t.jsx("span",{className:"chat-tool-call-label",children:"args"}),t.jsx("span",{className:"chat-tool-call-value",children:p})]}),w&&t.jsxs("div",{className:`chat-tool-call-row${M?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:"result"}),t.jsx("span",{className:"chat-tool-call-value",children:w})]})]})]},`${b.toolName}-${E}`)},i="chat-tool-calls";if(a.length===1)return t.jsxs("div",{className:i,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(pt,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),r(a[0],0)]});const d=a.filter(b=>b.status==="running").length,c=a.filter(b=>b.status==="completed"&&b.isError).length,v=d>0,k=Array.from(new Set(a.map(b=>b.toolName))),I=k.slice(0,5),L=Math.max(0,k.length-I.length),y=L>0?`${I.join(", ")}, +${L} more`:I.join(", "),D=v?`(${d} running)`:c>0?`(${c} ${c===1?"error":"errors"})`:null;return t.jsx("div",{className:i,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:v,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(pt,{size:12,"aria-hidden":"true"}),t.jsxs("span",{className:"chat-tool-calls-count",children:[a.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:y,children:y}),D&&t.jsx("span",{className:"chat-tool-calls-group-status",children:D})]}),a.map((b,E)=>r(b,E))]})})}const Ct={pre:({children:a,...r})=>t.jsx("pre",{...r,className:"chat-markdown-pre",children:a}),table:({children:a,...r})=>t.jsx("table",{...r,className:"chat-markdown-table",children:a})},$e="__fn_agent__",Ds=280,Oe=180,_e=500,bt="fusion:chat-sidebar-width",Es=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function wt(a){const r=/(^|[\s])\/([^\s]*)$/.exec(a);if(!r)return null;const i=r[1]??"",d=r[2]??"",c=r.index+i.length;return{filter:d,start:c,end:a.length}}function Rs(a,r){const i=a.slice(0,r),d=/(^|[\s\n])@([\w-]*)$/.exec(i);if(!d)return null;const c=d[2]??"",v=i.length-c.length-1;return{filter:c,start:v,end:r}}function $s({projectId:a,onClose:r,onCreate:i}){const[d,c]=s.useState("agent"),[v,k]=s.useState([]),[I,L]=s.useState(!0),[y,D]=s.useState(""),[b,E]=s.useState([]),[P,M]=s.useState(!0),[p,w]=s.useState(""),[x,F]=s.useState([]),[j,K]=s.useState([]);s.useEffect(()=>{let h=!1;return L(!0),it(void 0,a).then(N=>{h||k(N)}).catch(()=>{h||k([])}).finally(()=>{h||L(!1)}),()=>{h=!0}},[a]),s.useEffect(()=>{M(!0),ks().then(h=>{E(h.models),F(h.favoriteProviders),K(h.favoriteModels)}).catch(()=>{E([]),F([]),K([])}).finally(()=>{M(!1)})},[]);const B=s.useCallback(async h=>{const N=x,f=N.includes(h)?N.filter(se=>se!==h):[h,...N];F(f);try{await xt({favoriteProviders:f,favoriteModels:j})}catch{F(N)}},[x,j]),G=s.useCallback(async h=>{const N=j,f=N.includes(h)?N.filter(se=>se!==h):[h,...N];K(f);try{await xt({favoriteProviders:x,favoriteModels:f})}catch{K(N)}},[j,x]),R=h=>{if(h.preventDefault(),d==="agent"){if(!y)return;i({agentId:y});return}if(!p)return;const N=p.indexOf("/");if(N<=0)return;const oe=p.slice(0,N),f=p.slice(N+1);i({agentId:$e,modelProvider:oe,modelId:f})},Q=d==="agent"?!y:!p;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:h=>h.stopPropagation(),children:[t.jsx("h3",{children:"New Chat"}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{c("agent"),w("")},children:"Agent"}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{c("model"),D("")},children:"Model"})]}),t.jsxs("form",{onSubmit:R,children:[d==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",I?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):v.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:v.map(h=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${y===h.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>D(h.id),"data-testid":`agent-option-${h.id}`,children:[t.jsx(Be,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:h.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:h.role})]},h.id))})]}),d==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:P?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(js,{models:b,value:p,onChange:w,label:"Model",placeholder:"Select a model",favoriteProviders:x,onToggleFavorite:B,favoriteModels:j,onToggleModelFavorite:G})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:Q,children:"Create"})]})]})]})})}const St=s.memo(function({message:r,forcePlain:i,agentName:d,hideAssistantIdentity:c,showAssistantModelTag:v,activeModelTag:k,activeModelProvider:I,activeSessionId:L,mentionAgentsByName:y}){const D=r.role==="assistant",b=s.useMemo(()=>{if(D)return null;const M=r.content,p=/@([\w-]+)/g,w=[];let x=0,F=p.exec(M);for(;F;){const[j,K=""]=F,B=F.index;B>x&&w.push(M.slice(x,B));const G=K.replace(/_/g," ").toLowerCase(),R=y.get(G);R?w.push(t.jsxs("span",{className:"chat-mention-chip",children:["@",R.name.replace(/\s+/g,"_")]},`${R.id}-${B}`)):w.push(j),x=B+j.length,F=p.exec(M)}return x<M.length&&w.push(M.slice(x)),w.length===0?M:w},[D,r.content,y]),E=s.useMemo(()=>{const M=r.attachments;if(!M||M.length===0||!L)return null;const p=`/api/chat/sessions/${encodeURIComponent(L)}/attachments/`;return t.jsx("div",{className:"chat-message-attachments",children:M.map(w=>{const x=w.mimeType.startsWith("image/"),F=w.id||w.filename,j=`${p}${encodeURIComponent(w.filename)}`;return x?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:j,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:j,alt:w.originalName})},F):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:j,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(Ss,{size:14}),t.jsx("span",{children:w.originalName})]},F)})})},[r.attachments,L]),P=s.useMemo(()=>D?i?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:r.content}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(yt,{remarkPlugins:[kt],components:Ct,children:r.content})}):null,[D,i,r.content]);return t.jsxs("div",{className:`chat-message chat-message--${r.role}`,"data-testid":`chat-message-${r.id}`,children:[D&&!c&&t.jsxs("div",{className:"chat-message-avatar",children:[I?t.jsx(He,{provider:I,size:"sm"}):t.jsx(Be,{size:14}),t.jsx("span",{children:d}),v&&k&&t.jsx("span",{className:"chat-model-tag",children:k})]}),D?P:t.jsx("div",{className:"chat-message-content",children:b}),Nt(r.toolCalls),r.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:r.thinkingOutput})]}),E,t.jsx("div",{className:"chat-message-time",children:jt(r.createdAt)})]})});function Us({projectId:a,addToast:r}){const{activeSession:i,sessionsLoading:d,messages:c,messagesLoading:v,isStreaming:k,streamingText:I,streamingThinking:L,streamingToolCalls:y,selectSession:D,createSession:b,archiveSession:E,deleteSession:P,sendMessage:M,stopStreaming:p,pendingMessage:w,clearPendingMessage:x,searchQuery:F,setSearchQuery:j,filteredSessions:K}=As(a,r),[B,G]=s.useState(!1),[R,Q]=s.useState(""),[h,N]=s.useState(null),[oe,f]=s.useState(null),[se,Y]=s.useState(!0),[Z,Ce]=s.useState(Ds),[U,we]=s.useState(new Map),[pe,de]=s.useState([]),[Ie,ue]=s.useState(!0),[re,ee]=s.useState(!1),[ne,ie]=s.useState(""),[ce,xe]=s.useState(0),[Se,he]=s.useState(""),[ae,me]=s.useState(!1),[Me,fe]=s.useState(0),[Ae,o]=s.useState(-1),[m,g]=s.useState(!1),[S,q]=s.useState([]),[V,J]=s.useState(!1),[O,_]=s.useState(!1),[,A]=s.useState(!1),[z,C]=s.useState({top:0,left:0}),u=rs({projectId:a}),X=s.useCallback(e=>{if(!e||!u.mentionActive)return;const n=e.getBoundingClientRect();C({top:n.top-260,left:n.left+8})},[u.mentionActive]),ge=s.useRef(null),Ge=s.useRef(!1),le=s.useRef(null),Le=s.useRef(null),H=s.useRef(null),ct=s.useRef(null),lt=s.useRef([]),Te=s.useRef(0),$=is()==="mobile";s.useEffect(()=>{try{const e=localStorage.getItem(bt);if(!e)return;const n=Number.parseInt(e,10);if(Number.isNaN(n))return;const l=Math.max(Oe,Math.min(_e,n));Ce(l)}catch{}},[]);const{keyboardOverlap:Fe,viewportHeight:ot,viewportOffsetTop:dt,keyboardOpen:Pe}=cs({enabled:$&&!!i}),ut=Fe>0||dt>0,Mt=Pe&&ut?{"--keyboard-overlap":`${Fe}px`,"--vv-offset-top":`${dt}px`,...ot!==null?{"--vv-height":`${ot}px`}:{}}:{},te=s.useMemo(()=>{const e=ne.trim().toLowerCase();return(e?pe.filter(l=>l.name.toLowerCase().includes(e)):pe).slice(0,10)},[pe,ne]),ye=s.useMemo(()=>Array.from(U.values()),[U]),ve=s.useMemo(()=>{const e=Se.trim().toLowerCase();return e?ye.filter(n=>n.name.toLowerCase().includes(e)):ye},[ye,Se]),ht=s.useMemo(()=>{const e=new Map;for(const n of ye)e.set(n.name.toLowerCase(),n);return e},[ye]);s.useEffect(()=>{xe(0)},[te]),s.useEffect(()=>{fe(0)},[Se,ae]),s.useEffect(()=>()=>{le.current!==null&&window.clearTimeout(le.current)},[]);const At=s.useCallback(()=>{const e=Le.current;if(!e)return;const l=e.scrollTop+e.clientHeight>=e.scrollHeight-50;_(!l),Ge.current=!l},[]),De=s.useCallback(()=>{const e=Le.current;e&&(e.scrollTop=e.scrollHeight,_(!1),Ge.current=!1)},[]);s.useEffect(()=>{Ge.current||De()},[c,I,L,k,De]),s.useEffect(()=>{Fe<=0||!Le.current||De()},[Fe,De]),ls($&&Pe),s.useEffect(()=>{const e=()=>N(null);if(h)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[h]),s.useEffect(()=>{if(!$||!Pe)return;const e=n=>{n.target?.closest(".chat-messages")||n.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[$,Pe]),s.useEffect(()=>{if(!$||!i)return;const e=()=>{const n=H.current;n&&document.activeElement===n&&(n.blur(),window.setTimeout(()=>{n.focus({preventScroll:!0})},0))};return document.addEventListener("visibilitychange",e),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",e),window.removeEventListener("pageshow",e)}},[$,i]),s.useEffect(()=>{let e=!1;const n=a;return it(void 0,a).then(l=>{if(e||n!==a)return;const T=new Map;for(const W of l)T.set(W.id,W);we(T)}).catch(()=>{}),()=>{e=!0}},[a]),s.useEffect(()=>{let e=!1;return ue(!0),os(a).then(n=>{e||de(n)}).catch(()=>{e||de([])}).finally(()=>{e||ue(!1)}),()=>{e=!0}},[a]),s.useEffect(()=>{lt.current=S},[S]),s.useEffect(()=>()=>{for(const e of lt.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl)},[]);const ze=s.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const l of Array.from(e)){if(!Es.includes(l.type))continue;const T=l.type.startsWith("image/");n.push({file:l,previewUrl:T?URL.createObjectURL(l):""})}n.length>0&&q(l=>[...l,...n])},[]),Tt=s.useCallback(e=>{q(n=>{const l=n[e];return l?.previewUrl&&URL.revokeObjectURL(l.previewUrl),n.filter((T,W)=>W!==e)})},[]),Pt=s.useCallback(e=>{const n=e.clipboardData?.files;if(!n||n.length===0)return;const l=Array.from(n).filter(T=>T.type.startsWith("image/"));l.length!==0&&ze(l)},[ze]),Dt=s.useCallback(async e=>{try{await b(e),G(!1),$&&Y(!1)}catch{r("Failed to create chat session","error")}},[b,r,$]),Ve=s.useCallback(()=>{Q(""),ee(!1),ie(""),me(!1),he(""),o(-1),q(e=>{for(const n of e)n.previewUrl&&URL.revokeObjectURL(n.previewUrl);return[]})},[]),Ke=s.useCallback(()=>{const e=R.trim(),n=S.map(l=>l.file);if(!(!e&&n.length===0||!i)){if(e==="/clear"){Ve(),p(),x(),b({agentId:i.agentId,modelProvider:i.modelProvider??void 0,modelId:i.modelId??void 0}).catch(()=>{r("Failed to clear conversation","error")});return}Ve(),M(e,n)}},[R,S,i,Ve,p,x,b,r,M]),qe=s.useCallback(e=>{Q(n=>{const l=wt(n);if(!l)return n;const T=`/skill:${e.name} `,W=n.slice(0,l.start)+T+n.slice(l.end);return window.requestAnimationFrame(()=>{H.current&&(H.current.style.height="auto",H.current.style.height=`${Math.min(H.current.scrollHeight,120)}px`,H.current.focus())}),W}),ee(!1),ie(""),xe(0)},[]),Je=s.useCallback(e=>{const n=H.current;if(!n||Ae<0)return;const l=n.selectionStart??Te.current,T=n.selectionEnd??l,W=Math.max(l,T),Re=Math.min(Ae,W),je=`${`@${e.name.replace(/\s+/g,"_")}`} `,st=R.slice(0,Re)+je+R.slice(W),Ne=Re+je.length;Q(st),me(!1),he(""),fe(0),o(-1),window.requestAnimationFrame(()=>{H.current&&(H.current.style.height="auto",H.current.style.height=`${Math.min(H.current.scrollHeight,120)}px`,H.current.focus(),H.current.setSelectionRange(Ne,Ne))})},[Ae,R]),Et=s.useCallback(e=>{if(Te.current=e.currentTarget.selectionStart??Te.current,u.mentionActive&&u.files.length>0){if(u.handleKeyDown(e,R),e.key==="Enter"||e.key==="Tab"){const n=u.files[u.selectedIndex];if(n){const l=u.selectFile(n,R);Q(l),u.dismissMention(),A(!1)}}return}if(ae&&e.key==="ArrowDown"){e.preventDefault(),ve.length>0&&fe(n=>(n+1)%ve.length);return}if(ae&&e.key==="ArrowUp"){e.preventDefault(),ve.length>0&&fe(n=>n===0?ve.length-1:n-1);return}if(ae&&e.key==="Enter"){e.preventDefault();const n=ve[Me]??ve[0];n&&Je(n);return}if(ae&&e.key==="Escape"){e.preventDefault(),me(!1),he(""),o(-1);return}if(re&&e.key==="ArrowDown"){e.preventDefault(),te.length>0&&xe(n=>(n+1)%te.length);return}if(re&&e.key==="ArrowUp"){e.preventDefault(),te.length>0&&xe(n=>n===0?te.length-1:n-1);return}if(re&&(e.key==="Enter"||e.key==="Tab")&&te.length>0){e.preventDefault();const n=te[ce]??te[0];n&&qe(n);return}if(re&&e.key==="Escape"){e.preventDefault(),ee(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Ke())},[ae,ve,Me,Je,re,te,ce,qe,Ke,u,R]),Ue=s.useCallback((e,n)=>{const l=Rs(e,n);if(l){me(!0),he(l.filter),o(l.start);return}me(!1),he(""),o(-1)},[]),Rt=s.useCallback(e=>{const n=e.target,l=n.value,T=n.selectionStart??l.length;Te.current=T,Q(l);const W=wt(l);W?(ee(!0),ie(W.filter)):(ee(!1),ie("")),Ue(l,T),u.detectMention(l,T),A(u.mentionActive),u.mentionActive&&X(n),n.style.height="auto",n.style.height=`${Math.min(n.scrollHeight,120)}px`},[Ue]),Xe=s.useCallback(e=>{const n=e.currentTarget,l=n.selectionStart??n.value.length;Te.current=l,Ue(n.value,l),u.detectMention(n.value,l),A(u.mentionActive),u.mentionActive&&X(n)},[Ue,u,X]),$t=s.useCallback(e=>{e.key!=="Escape"&&Xe(e)},[Xe]),It=s.useCallback(()=>{le.current!==null&&window.clearTimeout(le.current),le.current=window.setTimeout(()=>{ee(!1),me(!1),he(""),o(-1),A(!1),u.dismissMention(),le.current=null},120)},[u]),Lt=s.useCallback(()=>{le.current!==null&&(window.clearTimeout(le.current),le.current=null),typeof window<"u"&&window.innerWidth<=768&&window.setTimeout(()=>{(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},0)},[]),Ft=s.useCallback(async e=>{N(null);try{await E(e),r("Conversation archived","success")}catch{r("Failed to archive conversation","error")}},[E,r]),zt=s.useCallback(async e=>{f(null),N(null);try{await P(e),r("Conversation deleted","success")}catch{r("Failed to delete conversation","error")}},[P,r]),Ee=s.useCallback(e=>{try{localStorage.setItem(bt,String(e))}catch{}},[]),Ut=s.useCallback(e=>{if($)return;e.preventDefault(),e.stopPropagation();const n=e.currentTarget;typeof n.setPointerCapture=="function"&&n.setPointerCapture(e.pointerId);const l=e.clientX,T=Z;let W=T;document.body.style.userSelect="none";const Re=je=>{const st=je.clientX-l,Ne=Math.max(Oe,Math.min(_e,T+st));W=Ne,Ce(Ne),Ee(Ne)},tt=je=>{typeof n.releasePointerCapture=="function"&&n.releasePointerCapture(je.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",Re),document.removeEventListener("pointerup",tt),Ee(W)};document.addEventListener("pointermove",Re),document.addEventListener("pointerup",tt)},[$,Ee,Z]),Ot=s.useCallback(e=>{if($||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const n=e.shiftKey?50:10,l=e.key==="ArrowLeft"?-n:n,T=Math.max(Oe,Math.min(_e,Z+l));Ce(T),Ee(T)},[$,Ee,Z]),_t=s.useCallback(e=>{D(e),$&&Y(!1)},[D,$]),Ht=s.useCallback(()=>{D(""),Y(!0)},[D]),Wt=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(ys,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>G(!0),children:[t.jsx(nt,{size:16}),"New Chat"]})]}),be=vt(i?.modelProvider,i?.modelId),ke=i?.modelProvider??null,Qe=!!(i||k||c.length>0),mt=i?.agentId===$e?be??"Fusion":i?.title||U.get(i?.agentId??"")?.name||i?.agentId||"Chat",Bt=!!(be&&be!==mt),Ye=U.get(i?.agentId??"")?.name||(i?.agentId===$e?be??"Fusion":i?.agentId?.slice(0,30)??"Fusion"),Ze=!1,et=i?.agentId===$e,Gt=w.length>50?`${w.slice(0,50)}…`:w,Vt=s.useCallback(()=>{g(e=>!e)},[]),Kt=s.useCallback((e,n=!1)=>n?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:e}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(yt,{remarkPlugins:[kt],components:Ct,children:e})}),[]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${se?"":" chat-sidebar--hidden"}`,style:$?void 0:{width:`${Z}px`},children:[t.jsx("div",{className:"chat-sidebar-search",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(ds,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:F,onChange:e=>j(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:d?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):K.length===0?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):K.map(e=>t.jsxs("div",{className:`chat-session-item${i?.id===e.id?" chat-session-item--active":""}`,onClick:()=>_t(e.id),onContextMenu:n=>{n.preventDefault(),N({sessionId:e.id,x:n.clientX,y:n.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:n=>{n.stopPropagation(),f(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(gt,{size:14})}),t.jsx("div",{className:"chat-session-title",children:e.title||"Untitled"}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||"No messages"}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[e.modelProvider&&t.jsx(He,{provider:e.modelProvider,size:"sm"}),t.jsx("span",{children:U.get(e.agentId)?.name||(e.agentId===$e?vt(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?jt(e.updatedAt):""})]})]},e.id))}),t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>G(!0),"data-testid":"chat-new-btn",children:[t.jsx(nt,{size:14}),"New Chat"]})})]}),!$&&se&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":Oe,"aria-valuemax":_e,"aria-valuenow":Z,"aria-label":"Resize chat sidebar",tabIndex:0,onPointerDown:Ut,onKeyDown:Ot}),h&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:h.y,left:h.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Ft(h.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(us,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{N(null),f(h.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(gt,{size:14}),"Delete"]})]}),oe&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>f(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Conversation?"}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:"This action cannot be undone. All messages in this conversation will be permanently deleted."}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>f(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void zt(oe),children:"Delete"})]})]})}),t.jsxs("div",{className:`chat-thread${Pe&&ut?" chat-thread--keyboard-active":""}`,style:Mt,children:[(Qe||!$)&&t.jsxs("div",{className:"chat-thread-header",children:[$&&Qe&&t.jsx("button",{className:"btn-icon",onClick:Ht,"data-testid":"chat-back-btn",children:t.jsx(hs,{size:16})}),t.jsxs("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:[ke?t.jsx(He,{provider:ke,size:"md"}):t.jsx(Be,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:mt}),Bt&&t.jsx("span",{className:"chat-model-tag",children:be})]}),Qe&&t.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${m?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":m?"Show all messages as rendered Markdown":"Show all messages as plain text",onClick:Vt,children:m?t.jsx(ms,{size:14}):t.jsx(fs,{size:14})}),!$&&t.jsxs("button",{className:"btn btn-sm btn-primary chat-thread-header-new-chat",onClick:()=>G(!0),"data-testid":"chat-thread-new-chat-btn",children:[t.jsx(nt,{size:14}),"New Chat"]})]}),t.jsxs("div",{className:"chat-messages",ref:Le,onScroll:At,children:[k?t.jsxs(t.Fragment,{children:[c.map(e=>t.jsx(St,{message:e,forcePlain:m,agentName:Ye,hideAssistantIdentity:et,showAssistantModelTag:Ze,activeModelTag:be,activeModelProvider:ke,activeSessionId:i?.id??null,mentionAgentsByName:ht},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!et&&t.jsxs("div",{className:"chat-message-avatar",children:[ke?t.jsx(He,{provider:ke,size:"sm"}):t.jsx(Be,{size:14}),t.jsx("span",{children:Ye}),Ze]}),I?Kt(I,m):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:L?"Thinking…":"Connecting…"}),Nt(y),L&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:L})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):v?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):c.length===0&&!i?Wt():c.length===0&&i?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):t.jsx(t.Fragment,{children:c.map(e=>t.jsx(St,{message:e,forcePlain:m,agentName:Ye,hideAssistantIdentity:et,showAssistantModelTag:Ze,activeModelTag:be,activeModelProvider:ke,activeSessionId:i?.id??null,mentionAgentsByName:ht},e.id))}),t.jsx("div",{ref:ge})]}),O&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:De,children:[t.jsx(gs,{size:14}),"Latest"]}),i&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:ct,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{ze(e.target.files),e.target.value=""}}),re&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:Ie?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):te.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:ne?"No skills found":"No skills available"}):te.map((e,n)=>t.jsxs("button",{type:"button",role:"option","aria-selected":n===ce,className:`chat-skill-menu-item${n===ce?" chat-skill-menu-item--highlighted":""}`,onMouseDown:l=>l.preventDefault(),onMouseEnter:()=>xe(n),onClick:()=>qe(e),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.relativePath,children:e.relativePath})]},e.id))}),S.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:S.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>Tt(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":"Attach files",onClick:()=>ct.current?.click(),children:t.jsx(ps,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${V?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),J(!0)},onDragLeave:()=>J(!1),onDrop:e=>{e.preventDefault(),J(!1),ze(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:H,className:"chat-input-textarea",placeholder:"Type a message...",value:R,onChange:Rt,onKeyDown:Et,onKeyUp:$t,onClick:Xe,onBlur:It,onFocus:Lt,onPaste:Pt,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(xs,{agents:ye,filter:Se,highlightedIndex:Me,visible:ae,onSelect:Je,position:"below"}),t.jsx(vs,{visible:u.mentionActive&&!ae,position:z,files:u.files,selectedIndex:u.selectedIndex,onSelect:e=>{const n=u.selectFile(e,R);Q(n),u.dismissMention(),A(!1),H.current?.focus()},loading:u.loading}),w&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${Gt}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:x,children:"×"})]})]}),k?t.jsx("button",{className:"chat-input-stop",onClick:p,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(bs,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{e.pointerType&&e.pointerType!=="mouse"&&e.preventDefault()},onMouseDown:e=>{e.preventDefault()},onClick:()=>{Ke()},disabled:!R.trim()&&S.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(ws,{size:16})})]})]})]}),B&&t.jsx($s,{projectId:a,onClose:()=>G(!1),onCreate:Dt})]})}export{Us as ChatView};
@@ -0,0 +1 @@
1
+ import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{bX as De,bY as de,bZ as Ze,b_ as ue,s as Ue,b$ as be,c0 as we,c1 as xe,c2 as ye,c3 as et,c4 as ae,c5 as tt,c6 as rt,c7 as st,c8 as nt,c9 as at,ca as ie,L as ee,S as it,V as lt,cb as ct,a as ot,cc as Me,T as Ae,cd as dt,$ as ut,aR as vt,aS as mt,ae as ft,av as pt,R as ht}from"./index-D__RMku8.js";import"./vendor-xterm-DzcZoU0P.js";const ve=500,gt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function Pe(e){return e.length<=ve?e:e.slice(-ve)}function le(e,i){return Pe([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function Q(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function bt(e){return e?.previewUrl??null}async function Se(e){return tt(e)}async function Ne(e,i){return rt(e,i)}async function wt(e){return st(e)}async function xt(e){return nt(e)}async function je(e){return at(e)}function V(e){try{return e()}catch{return null}}function ce(){return typeof V(()=>de)=="function"&&typeof V(()=>De)=="function"}function X(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 yt(e){const[i,o]=r.useState(null),[g,y]=r.useState([]),[w,f]=r.useState([]),[k,U]=r.useState([]),[C,P]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,M]=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 De(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&&(M(s[0].config.id),R(s[0]))}else{const s=await Se(e);if(n.current!==a)return;const c=X(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([]),U([]),P(!0),u(null),M(null),(async()=>{try{const[c,l]=await Promise.allSettled([ce()?de(e):Se(e).then(N=>[X(N)]),typeof V(()=>ae)=="function"?ae(e):je(e).then(N=>N.map(b=>({name:b.name,command:b.command,cwd:b.cwd,scriptName:b.scriptName,packagePath:b.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const b=N[0];ce()&&M(b.config.id),R(b)}}else v=B(c.reason);l.status==="fulfilled"&&U(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?Ze(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=G(l.data);if(v?.lines){const N=v.lines.map(Q);f(Pe(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Q(v);f(b=>le(b,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Q(v);f(b=>le(b,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>le(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(b=>b&&{...b,status:N,runtime:v.pid?{...b.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:b.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=X(v);o(N),y([N])}},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()},gt);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(()=>be)=="function")l=await be(d,e);else{const v=await Ne({command:a,cwd:s},e);l=X(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 wt(e);s=X(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),j=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 xt(e);s=X(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 et({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 je(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;U(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,N=await Ne({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),b=X(N);o(b),y([b]),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 j()},[j]),z=r.useCallback(async a=>{await T(a)},[T]),F=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await A()},[A]),H=bt(i),x=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:g,logs:w,detectedCommands:k,previewUrl:H,isLoading:C,error:S,startServer:_,stopServer:D,restartServer:j,setPreviewUrl:T,detectCommands:h,refresh:A,candidates:k,serverState:x,loading:C,start:p,stop:E,restart:L,setManualUrl:z,detect:F,refreshStatus:O}}const ke=500,Ce=100;function Te(e){return e.length>ke?e.slice(-ke):e}function ze(e){return e==="stderr"?"stderr":"stdout"}function K(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:ze(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function St(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function oe(e,i){if(i.length===0)return e;const o=[...e],g=new Set(e.map(y=>y.id));for(const y of i)g.has(y.id)||(g.add(y.id),o.push(y));return o.sort((y,w)=>y.id-w.id),Te(o)}function Nt(e,i){const[o,g]=r.useState([]),[y,w]=r.useState(!1),[f,k]=r.useState(!1),[U,C]=r.useState(!1),[P,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),M=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,g([]),w(!1),k(!1),C(!1),S(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=++M.current;n.current=!1,w(!0);const z=(x,a)=>{const s=Te(x);g(s),S(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)=>St(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:ze(x.stream),timestamp:typeof x.timestamp=="string"?x.timestamp:""};_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1),g(v=>oe(v,[l])),S(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||M.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||M.current!==L)return;z([],null)}finally{!n.current&&d.current===E&&M.current===L&&w(!1)}const x=ue(e);u.current=Ue(x,{events:{"dev-server:log":a=>{const s=K(a);s&&O(s)},log:a=>{const s=K(a);s&&O(s)},history:a=>{const s=K(a);F(s)},"dev-server:history":a=>{const s=K(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)}g(c=>oe(c,s)),S(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;k(!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));g(O=>oe(F,O)),C(z.totalLines>L+F.length),S(z.totalLines)}catch{}finally{k(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{g([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:U,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const jt="This preview appears to block iframe embedding. Open it in a new tab instead.",kt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Ct="Preview is taking longer than expected and may block iframe embedding.";function Et(e){return e==="blocked"?jt:e==="error"?kt:null}function Lt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:g=null}=i,y=r.useRef(null),w=r.useRef(null),[f,k]=r.useState("unknown"),[U,C]=r.useState(null),[P]=r.useState(g),S=r.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),u=r.useCallback(j=>{k(j),C(Et(j))},[]),n=r.useCallback(()=>{k("blocked"),C(Ct)},[]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null);let j=!1;return queueMicrotask(()=>{j||(k("loading"),C(null))}),()=>{j=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const j=setTimeout(()=>{w.current=null,n()},o);return w.current=j,()=>{clearTimeout(j),w.current===j&&(w.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const j=y.current;if(!j){u("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),M=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null)},[S]);const R=r.useCallback(()=>{S(),k("unknown"),C(null)},[S]),A=R,_=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:_,isBlocked:D,blockReason:U,detectionMethod:P,iframeRef:y,resetEmbedStatus:R,setEmbedStatus:u,retry:A,embedContext:U,handleIframeLoad:d,handleIframeError:M}}const Rt=/\x1b\[[0-9;]*m/g;function me(e){return e.replace(Rt,"")}function _t(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 Dt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ut(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 Mt(e,i){if(!i)return e;const o=new RegExp(`(${Dt(i)})`,"ig"),g=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:g.map((w,f)=>w.toLowerCase()===y?t.jsx("mark",{children:w},`${w}-${f}`):t.jsx("span",{children:w},`${w}-${f}`))})}function At({entries:e,loading:i,loadingMore:o,hasMore:g,total:y,onLoadMore:w,isRunning:f}){const k=r.useRef(null),U=r.useRef(e.length),C=r.useRef(f),[P,S]=r.useState(!1),[u,n]=r.useState(!1),[d,M]=r.useState(""),[R,A]=r.useState("all"),_=r.useMemo(()=>R==="all"?e:e.filter(p=>Ut(p)===R),[e,R]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?_.filter(E=>me(E.text).toLowerCase().includes(p)):_},[_,d]),j=D.length,T=r.useCallback(()=>{const p=k.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,E=U.current,L=e.length>E;f&&(!p||!u&&L)&&T(),C.current=f,U.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=k.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(it,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>M(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:[j," match",j===1?"":"es"]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>S(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":P?"Exit fullscreen logs":"Enter fullscreen logs",children:P?t.jsx(lt,{size:14}):t.jsx(ct,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[g&&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:k,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=_t(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:Mt(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(ot,{size:14}),"New logs"]})]})]})}const Pt="devserver-preview-iframe";function Tt({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:g,blockReason:y,onRetry:w,className:f=Pt,embedContext:k}){const U=y??k??null,[C,P]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(P(d=>d+1),o("loading"))},[i,o,e]);const S=r.useCallback(()=>{const d=g.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[g,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:g,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:S,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(Me,{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"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),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"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),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 $e(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?$e(e.cwd)===o:!0}function zt(e){return e.cwd==="."?"root":e.cwd}function $t(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Ht({addToast:e,projectId:i}){const{session:o,detectedCommands:g,previewUrl:y,isLoading:w,error:f,startServer:k,stopServer:U,restartServer:C,setPreviewUrl:P,detectCommands:S,refresh:u}=yt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",M=Ee[n]??Ee.stopped,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,loadMore:T}=Nt(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"),N=l==="embedded"?h:null,{embedStatus:b,setEmbedStatus:Fe,resetEmbedStatus:I,iframeRef:q,isEmbedded:Oe,isBlocked:te,blockReason:re,retry:fe}=Lt(N),[pe,W]=r.useState(!1),he=r.useRef(b);r.useEffect(()=>{const m=he.current!==b;te&&m&&W(!0),b==="embedded"&&W(!1),he.current=b},[b,te]),r.useEffect(()=>{W(!1)},[h]);const J=r.useMemo(()=>{if(!x)return null;const m=Re(p);return g.find($=>!($.scriptName!==x||m&&$.cwd!==m||o?.config?.command&&$.command!==o.config.command))??g.find($=>_e($,x,p))??null},[g,o?.config?.command,x,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(Le(m),"error")})},[e,S]),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}g.length>0&&F(m=>m.trim().length>0?m:g[0]?.command??"")},[g,J,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const se=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),ge=r.useCallback(()=>{W(!1),fe()},[fe]),Be=r.useCallback(()=>{try{const m=q.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),I();return}}catch{}if(!(!h||!q.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),q.current.src=m.toString(),W(!1),I()}catch{q.current.src=h,W(!1),I()}},[h,q,I]),Y=r.useCallback(async(m,$,ne)=>{c(m);try{await $(),e(ne,"success")}catch(Ke){e(Le(Ke),"error")}finally{c(null)}},[e]),He=r.useCallback(m=>{a(m.scriptName),L(!1),F(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),Ve=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??$;Y("start",()=>k(m,ne),"Dev server started.")},Xe=()=>{Y("stop",U,"Dev server stopped.")},qe=()=>{Y("restart",C,"Dev server restarted.")},Ge=()=>{const m=O.trim(),$=m.length>0?m:null;Y("preview",()=>P($),$?"Preview URL updated.":"Preview URL override cleared.")},Ie=r.useCallback(()=>{f&&u()},[f,u]),Je=n==="starting"||n==="running"||s!==null,Ye=n==="stopped"||s!==null,Qe=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(dt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${M.className}`,"data-testid":"dev-server-status-badge",children:M.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:We,disabled:Je,"data-testid":"dev-server-start-button",children:[t.jsx(ut,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Xe,disabled:Ye,"data-testid":"dev-server-stop-button",children:[t.jsx(vt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:qe,disabled:Qe,"data-testid":"dev-server-restart-button",children:[t.jsx(mt,{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&&g.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:Ie,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:Ve,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),E&&g.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&&g.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:g.map(m=>{const $=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${$?"dev-server-candidate--selected":""}`,onClick:()=>He(m),"data-testid":`dev-server-candidate-${m.scriptName}-${$e(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:$t(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:zt(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.jsx("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:[j??R.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(At,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,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,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Be,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(ht,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":b,"data-embedded":Oe?"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:b==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[b==="error"?t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:b==="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:ge,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!pe&&t.jsx(Tt,{url:h,embedStatus:b,onEmbedStatusChange:Fe,iframeRef:q,blockReason:re,onRetry:ge})]})]})]})}export{Ht as DevServerView};
@@ -0,0 +1 @@
1
+ import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{e9 as f,ea as g,d6 as b,b as y,ai as P,ad as H,ae as C,L as O,as as v}from"./index-D__RMku8.js";import{F as z}from"./folder-open-usZkXdq2.js";function D({value:o,onChange:d,placeholder:m,onInputKeyDown:x,nodeId:l,localNodeId:h}){const[e,n]=i.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1}),a=i.useCallback(async(s,c=!1)=>{n(t=>({...t,loading:!0,error:null}));try{const t=await f(s,c,l,h);n(u=>({...u,loading:!1,currentPath:t.currentPath,parentPath:t.parentPath,entries:t.entries}))}catch(t){n(u=>({...u,loading:!1,error:t instanceof Error?t.message:"Failed to browse directory"}))}},[l,h]),j=i.useCallback(()=>{n(s=>s.isOpen?{...s,isOpen:!1}:{...s,isOpen:!0})},[]);i.useEffect(()=>{e.isOpen&&!e.loading&&e.entries.length===0&&!e.error&&a(o||void 0,e.showHidden)},[e.isOpen,e.loading,e.entries.length,e.error,o,e.showHidden,a,l,h]);const p=i.useCallback(s=>{a(s,e.showHidden)},[a,e.showHidden]),k=i.useCallback(()=>{d(e.currentPath),n(s=>({...s,isOpen:!1}))},[e.currentPath,d]),w=i.useCallback(()=>{n(s=>{const c=!s.showHidden;return{...s,showHidden:c}})},[]);i.useEffect(()=>{e.isOpen&&e.currentPath&&a(e.currentPath,e.showHidden)},[e.showHidden]);const N=e.currentPath?g(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:o,onChange:s=>d(s.target.value),onKeyDown:x,placeholder:m||"/path/to/your/project"}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:j,"aria-label":e.isOpen?"Close directory browser":"Browse directories",children:[e.isOpen?r.jsx(z,{size:16}):r.jsx(b,{size:16}),r.jsx("span",{children:"Browse"})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":"Directory browser",children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:N.map((s,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(y,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>p(s.path),title:s.path,children:s.label})]},s.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>p(e.parentPath),"aria-label":"Go to parent directory",title:"Parent directory",children:[r.jsx(P,{size:14}),r.jsx("span",{children:"Up"})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:w,"aria-label":e.showHidden?"Hide hidden directories":"Show hidden directories",title:e.showHidden?"Hide hidden":"Show hidden",children:[e.showHidden?r.jsx(H,{size:14}):r.jsx(C,{size:14}),r.jsx("span",{children:e.showHidden?"Hide hidden":"Show hidden"})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(O,{size:20,className:"animate-spin"}),r.jsx("span",{children:"Loading…"})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(v,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:"No subdirectories"}):e.entries.map(s=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>p(s.path),role:"treeitem",title:s.path,children:[r.jsx(b,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:s.name}),s.hasChildren&&r.jsx(y,{size:14,className:"directory-picker-entry-arrow"})]},s.path))}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:k,children:"Select"})]})]})]})}export{D};
@@ -0,0 +1 @@
1
+ import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{aa as oe,ab as K,f as le,ac as ie,F as z,ad as de,ae as ue,S as me,X as he,R as pe,af as fe,ag as W,ah as V,a as X,b as je,ai as xe}from"./index-D__RMku8.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?K(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 K(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 _(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:_(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:J,refresh:B}=we({projectId:n,searchQuery:T||void 0,includeProjectFiles:!1}),{files:S,loading:$,error:Y,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"?Y:J,ae=s.useCallback(async()=>{if(a==="project"){await O();return}await B()},[a,O,B]),q=a==="project"?A.length:N.length,G=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-controls-row",children:[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:G,value:l,onChange:Z,"aria-label":G}),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)," · ",_(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,4 +1,4 @@
1
- import{r,j as s}from"./vendor-react-K0fH_qHe.js";import{h as os,i as vs,j as xs,t as fs,k as ps,l as ys,m as is,u as ws,n as y,X as ns,o as J,R as w,p as hs,q as Q,T as as,L as bs,P as us,s as js,v as ds,w as ks}from"./index-NFptaeUQ.js";import{U as rs}from"./users-Bu_ltePs.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r,j as s}from"./vendor-react-K0fH_qHe.js";import{c as os,aj as vs,ak as xs,al as fs,am as ps,an as ys,ao as is,ap as ws,aq as y,X as as,ar as J,R as w,C as hs,as as Y,at as ns,au as bs,Q as us,av as js,aw as ds,ax as ks}from"./index-D__RMku8.js";import{U as rs}from"./users-Dkd4rtrN.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -8,4 +8,4 @@ import{r,j as s}from"./vendor-react-K0fH_qHe.js";import{h as os,i as vs,j as xs,
8
8
  *
9
9
  * This source code is licensed under the ISC license.
10
10
  * See the LICENSE file in the root directory of this source tree.
11
- */const Cs=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"m19 9-5 5-4-4-3 3",key:"2osh9i"}]],Ms=os("chart-line",Cs),X=["architecture","quality","workflow","performance","reliability","security","ux","testability","documentation","dependency","features","competitive_analysis","research","trends","other"],cs={quality:"Quality",performance:"Performance",architecture:"Architecture",security:"Security",reliability:"Reliability",ux:"User Experience",testability:"Testability",documentation:"Documentation",dependency:"Dependencies",workflow:"Workflow",other:"Other",features:"Features",competitive_analysis:"Competitive Analysis",research:"Research",trends:"Trends"};function As(u){const[o,f]=r.useState([]),[b,L]=r.useState(()=>X.map(t=>({category:t,label:cs[t]??t,items:[],isLoading:!1,error:null}))),[I,E]=r.useState(!0),[m,F]=r.useState(null),[U,z]=r.useState(null),[G,$]=r.useState(!1),[_,k]=r.useState(null),[O,R]=r.useState(new Map),[T,N]=r.useState(new Map),[q,S]=r.useState(new Map),[B,C]=r.useState(new Map),[M,A]=r.useState(!1),c=r.useCallback(async()=>{E(!0),F(null);try{const t=await vs({status:void 0,limit:1e3},u);f(t.insights.filter(i=>i.status!=="dismissed"));const e=await xs(u);e.runs.length>0&&z(e.runs[0])}catch(t){const e=t instanceof Error?t.message:"Failed to fetch insights";F(e)}finally{E(!1)}},[u]),j=r.useCallback(()=>{A(t=>!t)},[]),h=r.useCallback(async()=>{$(!0),k(null);try{const t=await fs("manual",void 0,u);z(t),t.status==="completed"?await c():t.status==="failed"&&t.error&&k(t.error)}catch(t){const e=t instanceof Error?t.message:"Failed to generate insights";throw k(e),t}finally{$(!1)}},[u,c]),v=r.useCallback(async t=>{R(e=>{const i=new Map(e);return i.set(t,{running:!0,error:null}),i});try{await ps(t,u),f(e=>e.filter(i=>i.id!==t)),R(e=>{const i=new Map(e);return i.set(t,{running:!1,error:null}),i})}catch(e){const i=e instanceof Error?e.message:"Failed to dismiss insight";throw R(d=>{const a=new Map(d);return a.set(t,{running:!1,error:i}),a}),e}},[u]),p=r.useCallback(async t=>{N(e=>{const i=new Map(e);return i.set(t,{running:!0,error:null}),i});try{const e=await ys(t,u);return await is(t,u),f(i=>i.map(d=>d.id===t?{...d,status:"archived",updatedAt:new Date().toISOString()}:d)),N(i=>{const d=new Map(i);return d.set(t,{running:!1,error:null}),d}),{title:e.suggestedTitle,description:e.suggestedDescription}}catch(e){const i=e instanceof Error?e.message:"Failed to create task";throw N(d=>{const a=new Map(d);return a.set(t,{running:!1,error:i}),a}),e}},[u]);r.useEffect(()=>{const t=new Map;for(const e of X)t.set(e,[]);for(const e of o){if(!M&&e.status==="archived")continue;const i=t.get(e.category)??[];t.set(e.category,[...i,e])}L(X.map(e=>({category:e,label:cs[e]??e,items:t.get(e)??[],isLoading:!1,error:null})))},[o,M]);const D=r.useCallback(async t=>{S(e=>{const i=new Map(e);return i.set(t,{running:!0,error:null}),i});try{await is(t,u),f(e=>e.map(i=>i.id===t?{...i,status:"archived",updatedAt:new Date().toISOString()}:i)),S(e=>{const i=new Map(e);return i.set(t,{running:!1,error:null}),i})}catch(e){const i=e instanceof Error?e.message:"Failed to archive insight";throw S(d=>{const a=new Map(d);return a.set(t,{running:!1,error:i}),a}),e}},[u]),x=r.useCallback(async t=>{C(e=>{const i=new Map(e);return i.set(t,{running:!0,error:null}),i});try{await ws(t,u),f(e=>e.map(i=>i.id===t?{...i,status:"confirmed",updatedAt:new Date().toISOString()}:i)),C(e=>{const i=new Map(e);return i.set(t,{running:!1,error:null}),i})}catch(e){const i=e instanceof Error?e.message:"Failed to unarchive insight";throw C(d=>{const a=new Map(d);return a.set(t,{running:!1,error:i}),a}),e}},[u]),H=r.useMemo(()=>b.reduce((t,e)=>t+e.items.length,0),[b]),V=r.useMemo(()=>0,[]),W=r.useMemo(()=>o.filter(t=>t.status==="archived").length,[o]);return r.useEffect(()=>{c()},[c]),{sections:b,loading:I,error:m,latestRun:U,isRunInFlight:G,runError:_,refresh:c,runInsights:h,dismiss:v,createTask:p,archive:D,unarchive:x,toggleShowArchived:j,dismissStates:O,createTaskStates:T,archiveStates:q,unarchiveStates:B,totalCount:H,dismissedCount:V,archivedCount:W,showArchived:M}}const ls={architecture:Ss,quality:hs,workflow:ds,performance:as,reliability:w,security:Q,ux:rs,testability:J,documentation:js,dependency:us,features:bs,competitive_analysis:rs,research:Ms,trends:as,other:y};function $s({projectId:u,addToast:o,onClose:f,onCreateTask:b}){const{sections:L,loading:I,error:E,latestRun:m,isRunInFlight:F,runError:U,refresh:z,runInsights:G,dismiss:$,createTask:_,archive:k=async()=>{},unarchive:O=async()=>{},toggleShowArchived:R=()=>{},dismissStates:T,createTaskStates:N,archiveStates:q=new Map,unarchiveStates:S=new Map,totalCount:B,archivedCount:C=0,showArchived:M=!1}=As(u),[A,c]=r.useState(null),[j,h]=r.useState("info"),v=r.useMemo(()=>L.filter(a=>a.items.length>0),[L]),[p,D]=r.useState(null);r.useEffect(()=>{if(v.length===0){p!==null&&D(null);return}p&&v.some(n=>n.category===p)||D(v[0].category)},[v,p]);const x=r.useMemo(()=>v.find(a=>a.category===p)??v[0],[v,p]);r.useEffect(()=>{if(A){const a=setTimeout(()=>c(null),5e3);return()=>clearTimeout(a)}},[A]);const H=r.useCallback(async()=>{try{c("Generating insights..."),h("info"),await G(),c("Insight generation started"),h("success"),o("Insight generation started","success")}catch(a){const n=a instanceof Error?a.message:"Failed to start generation";c(n),h("error"),o(n,"error")}},[G,o]),V=r.useCallback(async(a,n)=>{try{c(`Dismissing "${n}"...`),h("info"),await $(a),c(`Dismissed "${n}"`),h("success"),o(`Insight dismissed: ${n}`,"success")}catch(l){const g=l instanceof Error?l.message:"Failed to dismiss insight";c(g),h("error"),o(g,"error")}},[$,o]),W=r.useCallback(async(a,n)=>{try{c(`Archiving "${n}"...`),h("info"),await k(a),c(`Archived "${n}"`),h("success"),o(`Insight archived: ${n}`,"success")}catch(l){const g=l instanceof Error?l.message:"Failed to archive insight";c(g),h("error"),o(g,"error")}},[k,o]),t=r.useCallback(async(a,n)=>{try{c(`Unarchiving "${n}"...`),h("info"),await O(a),c(`Unarchived "${n}"`),h("success"),o(`Insight unarchived: ${n}`,"success")}catch(l){const g=l instanceof Error?l.message:"Failed to unarchive insight";c(g),h("error"),o(g,"error")}},[O,o]),e=r.useCallback(async(a,n)=>{try{if(c(`Creating task from "${n}"...`),h("info"),!b)throw new Error("Task creation is unavailable in this view");const l=await _(a);if(!l)throw new Error("Failed to prepare task payload from insight");await b({insightId:a,title:l.title,description:l.description}),c(`Task created from "${n}"`),h("success"),o(`Task created: ${l.title}`,"success")}catch(l){const g=l instanceof Error?l.message:"Failed to create task";c(g),h("error"),o(g,"error")}},[_,b,o]),i=a=>{const n=ls[a.category]??y,l=x?.category===a.category;return s.jsx("li",{children:s.jsxs("button",{type:"button",className:`insights-category-item${l?" insights-category-item--active":""}`,onClick:()=>D(a.category),"aria-current":l?"true":void 0,"data-testid":`insights-category-${a.category}`,children:[s.jsx(n,{size:16,className:"insights-category-icon"}),s.jsx("span",{className:"insights-category-label",children:a.label}),s.jsx("span",{className:"insights-category-count",children:a.items.length})]})},a.category)},d=()=>{if(!x)return null;const a=ls[x.category]??y;return s.jsxs("section",{className:"insights-section","data-testid":`insights-section-${x.category}`,children:[s.jsx("div",{className:"insights-section-header",children:s.jsxs("div",{className:"insights-section-title",children:[s.jsx(a,{size:20,className:"insights-section-icon"}),s.jsx("h3",{children:x.label}),s.jsx("span",{className:"insights-section-count",children:x.items.length})]})}),s.jsx("div",{className:"insights-section-content",children:s.jsx("ul",{className:"insights-list",children:x.items.map(n=>{const l=T.get(n.id),g=N.get(n.id),gs=q.get(n.id),ms=S.get(n.id),K=l?.running??!1,Z=g?.running??!1,ss=gs?.running??!1,es=ms?.running??!1,ts=n.status==="archived",P=x.items.some(Y=>T.get(Y.id)?.running||N.get(Y.id)?.running||q.get(Y.id)?.running||S.get(Y.id)?.running);return s.jsxs("li",{className:`insight-item${ts?" insight-item--archived":""}`,"data-insight-id":n.id,children:[s.jsxs("div",{className:"insight-item-header",children:[s.jsx("h4",{className:"insight-item-title",children:n.title}),s.jsxs("div",{className:"insight-item-actions",children:[ts?s.jsx("button",{className:"insight-item-action-btn",onClick:()=>void t(n.id,n.title),disabled:es||P,title:"Unarchive this insight","aria-label":"Unarchive this insight","data-testid":`unarchive-${n.id}`,children:es?s.jsx(w,{size:20,className:"spin"}):s.jsx(ks,{size:20})}):s.jsxs(s.Fragment,{children:[s.jsx("button",{className:"insight-item-action-btn",onClick:()=>void e(n.id,n.title),disabled:Z||P,title:"Create task from this insight","aria-label":"Create task from this insight","data-testid":`create-task-${n.id}`,children:Z?s.jsx(w,{size:20,className:"spin"}):s.jsx(us,{size:20})}),s.jsx("button",{className:"insight-item-action-btn",onClick:()=>void W(n.id,n.title),disabled:ss||P,title:"Archive this insight","aria-label":"Archive this insight","data-testid":`archive-${n.id}`,children:ss?s.jsx(w,{size:20,className:"spin"}):s.jsx(J,{size:20})})]}),s.jsx("button",{className:"insight-item-action-btn",onClick:()=>void V(n.id,n.title),disabled:K||P,title:"Dismiss this insight","aria-label":"Dismiss this insight","data-testid":`dismiss-${n.id}`,children:K?s.jsx(w,{size:20,className:"spin"}):s.jsx(ns,{size:20})})]})]}),n.content&&s.jsx("p",{className:"insight-item-content",children:n.content}),s.jsxs("div",{className:"insight-item-meta",children:[s.jsx("span",{className:`insight-item-status insight-item-status--${n.status}`,children:n.status}),n.createdAt&&s.jsxs("span",{className:"insight-item-date",children:[s.jsx(ds,{size:12}),new Date(n.createdAt).toLocaleDateString()]})]})]},n.id)})})})]})};return s.jsxs("div",{className:"insights-view","data-testid":"insights-view",children:[s.jsxs("div",{className:"insights-view-header",children:[s.jsxs("div",{className:"insights-view-title",children:[s.jsxs("h2",{children:[s.jsx(y,{size:20}),"Insights"]}),s.jsxs("span",{className:"insights-view-count",children:[B," total"]})]}),s.jsxs("div",{className:"insights-view-actions",children:[f&&s.jsx("button",{className:"btn btn-sm insights-view-close",onClick:f,"aria-label":"Close insights view",title:"Close",children:s.jsx(ns,{size:16})}),C>0&&s.jsxs("button",{className:"btn btn-sm insights-show-archived-toggle",onClick:R,"aria-label":M?"Hide archived insights":"Show archived insights","data-testid":"toggle-archived-insights",children:[s.jsx(J,{size:14}),M?"Hide Archived":`Show Archived (${C})`]}),s.jsxs("button",{className:"btn btn-sm",onClick:()=>void z(),disabled:I,"aria-label":"Refresh insights","data-testid":"refresh-insights",children:[s.jsx(w,{size:14,className:I?"spin":""}),"Refresh"]}),s.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void H(),disabled:F,"aria-label":"Generate new insights","data-testid":"run-insights",children:F?s.jsxs(s.Fragment,{children:[s.jsx(w,{size:14,className:"spin"}),"Generating..."]}):s.jsxs(s.Fragment,{children:[s.jsx(y,{size:14}),"Generate Insights"]})})]})]}),s.jsx("div",{className:"insights-status-region","aria-live":"polite","data-testid":"insights-status",children:A&&s.jsxs("div",{className:`insights-status-message insights-status-message--${j}`,role:j==="error"?"alert":void 0,children:[j==="success"&&s.jsx(hs,{size:16}),j==="error"&&s.jsx(Q,{size:16}),j==="info"&&s.jsx(y,{size:16}),s.jsx("span",{children:A})]})}),U&&s.jsxs("div",{className:"insights-error-callout",role:"alert","data-testid":"run-error",children:[s.jsx(Q,{size:16}),s.jsx("span",{children:U})]}),m&&s.jsx("div",{className:"insights-run-info","data-testid":"latest-run",children:s.jsxs("span",{className:"insights-run-status",children:["Latest run: ",m.status,m.status==="completed"&&s.jsxs(s.Fragment,{children:[" — ",m.insightsCreated," created, ",m.insightsUpdated," updated"]}),m.status==="failed"&&m.error&&s.jsxs(s.Fragment,{children:[" — ",m.error]})]})}),I?s.jsxs("div",{className:"insights-loading","data-testid":"insights-loading",children:[s.jsx(w,{size:24,className:"spin"}),s.jsx("p",{children:"Loading insights..."})]}):E?s.jsxs("div",{className:"insights-error","data-testid":"insights-error",children:[s.jsx(Q,{size:24}),s.jsx("p",{children:E}),s.jsx("button",{className:"btn btn-sm",onClick:()=>void z(),children:"Retry"})]}):B===0?s.jsxs("div",{className:"insights-empty","data-testid":"insights-empty",children:[s.jsx(y,{size:48}),s.jsx("h3",{children:"No insights yet"}),s.jsx("p",{children:"Generate insights to get AI-powered recommendations for your project."}),s.jsxs("button",{className:"btn btn-primary",onClick:()=>void H(),children:[s.jsx(y,{size:14}),"Generate First Insights"]})]}):s.jsxs("div",{className:"insights-body",children:[s.jsx("aside",{className:"insights-sidebar","aria-label":"Insight categories",children:s.jsx("ul",{className:"insights-category-list",children:v.map(i)})}),s.jsx("div",{className:"insights-detail",children:d()})]})]})}export{$s as InsightsView};
11
+ */const Cs=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"m19 9-5 5-4-4-3 3",key:"2osh9i"}]],Ms=os("chart-line",Cs),X=["architecture","quality","workflow","performance","reliability","security","ux","testability","documentation","dependency","features","competitive_analysis","research","trends","other"],cs={quality:"Quality",performance:"Performance",architecture:"Architecture",security:"Security",reliability:"Reliability",ux:"User Experience",testability:"Testability",documentation:"Documentation",dependency:"Dependencies",workflow:"Workflow",other:"Other",features:"Features",competitive_analysis:"Competitive Analysis",research:"Research",trends:"Trends"};function As(u){const[o,f]=r.useState([]),[b,L]=r.useState(()=>X.map(t=>({category:t,label:cs[t]??t,items:[],isLoading:!1,error:null}))),[I,E]=r.useState(!0),[m,F]=r.useState(null),[U,z]=r.useState(null),[G,$]=r.useState(!1),[_,k]=r.useState(null),[O,R]=r.useState(new Map),[T,N]=r.useState(new Map),[q,S]=r.useState(new Map),[B,C]=r.useState(new Map),[M,A]=r.useState(!1),c=r.useCallback(async()=>{E(!0),F(null);try{const t=await vs({status:void 0,limit:1e3},u);f(t.insights.filter(i=>i.status!=="dismissed"));const e=await xs(u);e.runs.length>0&&z(e.runs[0])}catch(t){const e=t instanceof Error?t.message:"Failed to fetch insights";F(e)}finally{E(!1)}},[u]),j=r.useCallback(()=>{A(t=>!t)},[]),h=r.useCallback(async()=>{$(!0),k(null);try{const t=await fs("manual",void 0,u);z(t),t.status==="completed"?await c():t.status==="failed"&&t.error&&k(t.error)}catch(t){const e=t instanceof Error?t.message:"Failed to generate insights";throw k(e),t}finally{$(!1)}},[u,c]),v=r.useCallback(async t=>{R(e=>{const i=new Map(e);return i.set(t,{running:!0,error:null}),i});try{await ps(t,u),f(e=>e.filter(i=>i.id!==t)),R(e=>{const i=new Map(e);return i.set(t,{running:!1,error:null}),i})}catch(e){const i=e instanceof Error?e.message:"Failed to dismiss insight";throw R(d=>{const n=new Map(d);return n.set(t,{running:!1,error:i}),n}),e}},[u]),p=r.useCallback(async t=>{N(e=>{const i=new Map(e);return i.set(t,{running:!0,error:null}),i});try{const e=await ys(t,u);return await is(t,u),f(i=>i.map(d=>d.id===t?{...d,status:"archived",updatedAt:new Date().toISOString()}:d)),N(i=>{const d=new Map(i);return d.set(t,{running:!1,error:null}),d}),{title:e.suggestedTitle,description:e.suggestedDescription}}catch(e){const i=e instanceof Error?e.message:"Failed to create task";throw N(d=>{const n=new Map(d);return n.set(t,{running:!1,error:i}),n}),e}},[u]);r.useEffect(()=>{const t=new Map;for(const e of X)t.set(e,[]);for(const e of o){if(!M&&e.status==="archived")continue;const i=t.get(e.category)??[];t.set(e.category,[...i,e])}L(X.map(e=>({category:e,label:cs[e]??e,items:t.get(e)??[],isLoading:!1,error:null})))},[o,M]);const D=r.useCallback(async t=>{S(e=>{const i=new Map(e);return i.set(t,{running:!0,error:null}),i});try{await is(t,u),f(e=>e.map(i=>i.id===t?{...i,status:"archived",updatedAt:new Date().toISOString()}:i)),S(e=>{const i=new Map(e);return i.set(t,{running:!1,error:null}),i})}catch(e){const i=e instanceof Error?e.message:"Failed to archive insight";throw S(d=>{const n=new Map(d);return n.set(t,{running:!1,error:i}),n}),e}},[u]),x=r.useCallback(async t=>{C(e=>{const i=new Map(e);return i.set(t,{running:!0,error:null}),i});try{await ws(t,u),f(e=>e.map(i=>i.id===t?{...i,status:"confirmed",updatedAt:new Date().toISOString()}:i)),C(e=>{const i=new Map(e);return i.set(t,{running:!1,error:null}),i})}catch(e){const i=e instanceof Error?e.message:"Failed to unarchive insight";throw C(d=>{const n=new Map(d);return n.set(t,{running:!1,error:i}),n}),e}},[u]),H=r.useMemo(()=>b.reduce((t,e)=>t+e.items.length,0),[b]),V=r.useMemo(()=>0,[]),W=r.useMemo(()=>o.filter(t=>t.status==="archived").length,[o]);return r.useEffect(()=>{c()},[c]),{sections:b,loading:I,error:m,latestRun:U,isRunInFlight:G,runError:_,refresh:c,runInsights:h,dismiss:v,createTask:p,archive:D,unarchive:x,toggleShowArchived:j,dismissStates:O,createTaskStates:T,archiveStates:q,unarchiveStates:B,totalCount:H,dismissedCount:V,archivedCount:W,showArchived:M}}const ls={architecture:Ss,quality:hs,workflow:ds,performance:ns,reliability:w,security:Y,ux:rs,testability:J,documentation:js,dependency:us,features:bs,competitive_analysis:rs,research:Ms,trends:ns,other:y};function $s({projectId:u,addToast:o,onClose:f,onCreateTask:b}){const{sections:L,loading:I,error:E,latestRun:m,isRunInFlight:F,runError:U,refresh:z,runInsights:G,dismiss:$,createTask:_,archive:k=async()=>{},unarchive:O=async()=>{},toggleShowArchived:R=()=>{},dismissStates:T,createTaskStates:N,archiveStates:q=new Map,unarchiveStates:S=new Map,totalCount:B,archivedCount:C=0,showArchived:M=!1}=As(u),[A,c]=r.useState(null),[j,h]=r.useState("info"),v=r.useMemo(()=>L.filter(n=>n.items.length>0),[L]),[p,D]=r.useState(null);r.useEffect(()=>{if(v.length===0){p!==null&&D(null);return}p&&v.some(a=>a.category===p)||D(v[0].category)},[v,p]);const x=r.useMemo(()=>v.find(n=>n.category===p)??v[0],[v,p]);r.useEffect(()=>{if(A){const n=setTimeout(()=>c(null),5e3);return()=>clearTimeout(n)}},[A]);const H=r.useCallback(async()=>{try{c("Generating insights..."),h("info"),await G(),c("Insight generation started"),h("success"),o("Insight generation started","success")}catch(n){const a=n instanceof Error?n.message:"Failed to start generation";c(a),h("error"),o(a,"error")}},[G,o]),V=r.useCallback(async(n,a)=>{try{c(`Dismissing "${a}"...`),h("info"),await $(n),c(`Dismissed "${a}"`),h("success"),o(`Insight dismissed: ${a}`,"success")}catch(l){const g=l instanceof Error?l.message:"Failed to dismiss insight";c(g),h("error"),o(g,"error")}},[$,o]),W=r.useCallback(async(n,a)=>{try{c(`Archiving "${a}"...`),h("info"),await k(n),c(`Archived "${a}"`),h("success"),o(`Insight archived: ${a}`,"success")}catch(l){const g=l instanceof Error?l.message:"Failed to archive insight";c(g),h("error"),o(g,"error")}},[k,o]),t=r.useCallback(async(n,a)=>{try{c(`Unarchiving "${a}"...`),h("info"),await O(n),c(`Unarchived "${a}"`),h("success"),o(`Insight unarchived: ${a}`,"success")}catch(l){const g=l instanceof Error?l.message:"Failed to unarchive insight";c(g),h("error"),o(g,"error")}},[O,o]),e=r.useCallback(async(n,a)=>{try{if(c(`Creating task from "${a}"...`),h("info"),!b)throw new Error("Task creation is unavailable in this view");const l=await _(n);if(!l)throw new Error("Failed to prepare task payload from insight");await b({insightId:n,title:l.title,description:l.description}),c(`Task created from "${a}"`),h("success"),o(`Task created: ${l.title}`,"success")}catch(l){const g=l instanceof Error?l.message:"Failed to create task";c(g),h("error"),o(g,"error")}},[_,b,o]),i=n=>{const a=ls[n.category]??y,l=x?.category===n.category;return s.jsx("li",{children:s.jsxs("button",{type:"button",className:`insights-category-item${l?" insights-category-item--active":""}`,onClick:()=>D(n.category),"aria-current":l?"true":void 0,"data-testid":`insights-category-${n.category}`,children:[s.jsx(a,{size:16,className:"insights-category-icon"}),s.jsx("span",{className:"insights-category-label",children:n.label}),s.jsx("span",{className:"insights-category-count",children:n.items.length})]})},n.category)},d=()=>{if(!x)return null;const n=ls[x.category]??y;return s.jsxs("section",{className:"insights-section","data-testid":`insights-section-${x.category}`,children:[s.jsx("div",{className:"insights-section-header",children:s.jsxs("div",{className:"insights-section-title",children:[s.jsx(n,{size:20,className:"insights-section-icon"}),s.jsx("h3",{children:x.label}),s.jsx("span",{className:"insights-section-count",children:x.items.length})]})}),s.jsx("div",{className:"insights-section-content",children:s.jsx("ul",{className:"insights-list",children:x.items.map(a=>{const l=T.get(a.id),g=N.get(a.id),gs=q.get(a.id),ms=S.get(a.id),K=l?.running??!1,Z=g?.running??!1,ss=gs?.running??!1,es=ms?.running??!1,ts=a.status==="archived",P=x.items.some(Q=>T.get(Q.id)?.running||N.get(Q.id)?.running||q.get(Q.id)?.running||S.get(Q.id)?.running);return s.jsxs("li",{className:`insight-item${ts?" insight-item--archived":""}`,"data-insight-id":a.id,children:[s.jsxs("div",{className:"insight-item-header",children:[s.jsx("h4",{className:"insight-item-title",children:a.title}),s.jsxs("div",{className:"insight-item-actions",children:[ts?s.jsx("button",{className:"insight-item-action-btn",onClick:()=>void t(a.id,a.title),disabled:es||P,title:"Unarchive this insight","aria-label":"Unarchive this insight","data-testid":`unarchive-${a.id}`,children:es?s.jsx(w,{size:20,className:"spin"}):s.jsx(ks,{size:20})}):s.jsxs(s.Fragment,{children:[s.jsx("button",{className:"insight-item-action-btn",onClick:()=>void e(a.id,a.title),disabled:Z||P,title:"Create task from this insight","aria-label":"Create task from this insight","data-testid":`create-task-${a.id}`,children:Z?s.jsx(w,{size:20,className:"spin"}):s.jsx(us,{size:20})}),s.jsx("button",{className:"insight-item-action-btn",onClick:()=>void W(a.id,a.title),disabled:ss||P,title:"Archive this insight","aria-label":"Archive this insight","data-testid":`archive-${a.id}`,children:ss?s.jsx(w,{size:20,className:"spin"}):s.jsx(J,{size:20})})]}),s.jsx("button",{className:"insight-item-action-btn",onClick:()=>void V(a.id,a.title),disabled:K||P,title:"Dismiss this insight","aria-label":"Dismiss this insight","data-testid":`dismiss-${a.id}`,children:K?s.jsx(w,{size:20,className:"spin"}):s.jsx(as,{size:20})})]})]}),a.content&&s.jsx("p",{className:"insight-item-content",children:a.content}),s.jsxs("div",{className:"insight-item-meta",children:[s.jsx("span",{className:`insight-item-status insight-item-status--${a.status}`,children:a.status}),a.createdAt&&s.jsxs("span",{className:"insight-item-date",children:[s.jsx(ds,{size:12}),new Date(a.createdAt).toLocaleDateString()]})]})]},a.id)})})})]})};return s.jsxs("div",{className:"insights-view","data-testid":"insights-view",children:[s.jsxs("div",{className:"insights-view-header",children:[s.jsxs("div",{className:"insights-view-title",children:[s.jsxs("h2",{children:[s.jsx(y,{size:20}),"Insights"]}),s.jsxs("span",{className:"insights-view-count",children:[B," total"]})]}),s.jsxs("div",{className:"insights-view-actions",children:[f&&s.jsx("button",{className:"btn btn-sm insights-view-close",onClick:f,"aria-label":"Close insights view",title:"Close",children:s.jsx(as,{size:16})}),C>0&&s.jsxs("button",{className:"btn btn-sm insights-show-archived-toggle",onClick:R,"aria-label":M?"Hide archived insights":"Show archived insights","data-testid":"toggle-archived-insights",children:[s.jsx(J,{size:14}),M?"Hide Archived":`Show Archived (${C})`]}),s.jsxs("button",{className:"btn btn-sm",onClick:()=>void z(),disabled:I,"aria-label":"Refresh insights","data-testid":"refresh-insights",children:[s.jsx(w,{size:14,className:I?"spin":""}),"Refresh"]}),s.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void H(),disabled:F,"aria-label":"Generate new insights","data-testid":"run-insights",children:F?s.jsxs(s.Fragment,{children:[s.jsx(w,{size:14,className:"spin"}),"Generating..."]}):s.jsxs(s.Fragment,{children:[s.jsx(y,{size:14}),"Generate Insights"]})})]})]}),s.jsx("div",{className:"insights-status-region","aria-live":"polite","data-testid":"insights-status",children:A&&s.jsxs("div",{className:`insights-status-message insights-status-message--${j}`,role:j==="error"?"alert":void 0,children:[j==="success"&&s.jsx(hs,{size:16}),j==="error"&&s.jsx(Y,{size:16}),j==="info"&&s.jsx(y,{size:16}),s.jsx("span",{children:A})]})}),U&&s.jsxs("div",{className:"insights-error-callout",role:"alert","data-testid":"run-error",children:[s.jsx(Y,{size:16}),s.jsx("span",{children:U})]}),m&&s.jsx("div",{className:"insights-run-info","data-testid":"latest-run",children:s.jsxs("span",{className:"insights-run-status",children:["Latest run: ",m.status,m.status==="completed"&&s.jsxs(s.Fragment,{children:[" — ",m.insightsCreated," created, ",m.insightsUpdated," updated"]}),m.status==="failed"&&m.error&&s.jsxs(s.Fragment,{children:[" — ",m.error]})]})}),I?s.jsxs("div",{className:"insights-loading","data-testid":"insights-loading",children:[s.jsx(w,{size:24,className:"spin"}),s.jsx("p",{children:"Loading insights..."})]}):E?s.jsxs("div",{className:"insights-error","data-testid":"insights-error",children:[s.jsx(Y,{size:24}),s.jsx("p",{children:E}),s.jsx("button",{className:"btn btn-sm",onClick:()=>void z(),children:"Retry"})]}):B===0?s.jsxs("div",{className:"insights-empty","data-testid":"insights-empty",children:[s.jsx(y,{size:48}),s.jsx("h3",{children:"No insights yet"}),s.jsx("p",{children:"Generate insights to get AI-powered recommendations for your project."}),s.jsxs("button",{className:"btn btn-primary",onClick:()=>void H(),children:[s.jsx(y,{size:14}),"Generate First Insights"]})]}):s.jsxs("div",{className:"insights-body",children:[s.jsx("aside",{className:"insights-sidebar","aria-label":"Insight categories",children:s.jsx("ul",{className:"insights-category-list",children:v.map(i)})}),s.jsx("div",{className:"insights-detail",children:d()})]})]})}export{$s as InsightsView};
@@ -1,2 +1,2 @@
1
- import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{u as Le}from"./SettingsModal-BRNAPR1u.js";import{b8 as Ee,b9 as ke,ba as Ie,bb as Re,bc as qe,bd as _e,be as Pe,bf as Me,bg as we,bh as We,bi as Oe,bj as Te,bk as Ae,bl as $e,Q as Ue,bm as Qe,V as w,bn as Fe}from"./index-NFptaeUQ.js";import"./vendor-xterm-DzcZoU0P.js";const O=".fusion/memory/MEMORY.md",He=5e4,Ye="0 3 * * *",Be="0 4 * * *";function he(i){return{memoryEnabled:i.memoryEnabled!==!1,memoryAutoSummarizeEnabled:i.memoryAutoSummarizeEnabled??!1,memoryAutoSummarizeThresholdChars:i.memoryAutoSummarizeThresholdChars??He,memoryAutoSummarizeSchedule:i.memoryAutoSummarizeSchedule??Ye,memoryDreamsEnabled:i.memoryDreamsEnabled??!1,memoryDreamsSchedule:i.memoryDreamsSchedule??Be}}function De(i,t){return i.some(m=>m.path===t)?t:i.find(m=>m.path===O)?.path??i[0]?.path??O}function Ve(i={}){const{projectId:t}=i,[m,u]=a.useState(""),[C,A]=a.useState(!0),[E,k]=a.useState(!1),[b,x]=a.useState(!1),[r,p]=a.useState(null),[T,X]=a.useState(!0),[J,L]=a.useState(!1),[S,P]=a.useState(()=>he({})),[F,ee]=a.useState(!0),[ue,$]=a.useState(!1),[o,v]=a.useState([]),[se,I]=a.useState(!0),[c,M]=a.useState(O),[W,y]=a.useState(""),[d,te]=a.useState(!1),[U,f]=a.useState(!1),[ae,Q]=a.useState(!1),[ne,H]=a.useState(!1),[Y,re]=a.useState(!1),[D,z]=a.useState(null),[ye,R]=a.useState(!0),[ge,B]=a.useState(!1),[ie,V]=a.useState(!1),[le,G]=a.useState(null),{status:me,loading:Z,refresh:j}=Le({projectId:t}),be=a.useCallback(n=>{y(n),f(!0)},[]),N=a.useCallback(async n=>{te(!0);try{const{content:l}=await Ee(n,t);M(n),y(l),f(!1)}finally{te(!1)}},[t]),q=a.useCallback(async()=>{I(!0);try{const{files:n}=await ke(t);if(v(n),n.length===0){M(O),y(""),f(!1);return}const l=De(n,c);l!==c&&await N(l)}finally{I(!1)}},[t,c,N]);a.useEffect(()=>{let n=!1;async function l(){try{const s=await $e(t);n||(u(s.content),A(!1))}catch{n||(u(""),A(!1))}}return l(),()=>{n=!0}},[t]),a.useEffect(()=>{let n=!1;async function l(){try{const s=await we(t);n||(p(s.content),L(s.exists),X(!1))}catch{n||(p(null),L(!1),X(!1))}}return l(),()=>{n=!0}},[t]),a.useEffect(()=>{let n=!1;async function l(){ee(!0);try{const s=await Ue(t);n||P(he(s))}catch{n||P(he({}))}finally{n||ee(!1)}}return l(),()=>{n=!0}},[t]),a.useEffect(()=>{let n=!1;async function l(){I(!0);try{const{files:s}=await ke(t);if(n)return;if(v(s),s.length===0){M(O),y(""),f(!1);return}const h=De(s,c),{content:g}=await Ee(h,t);if(n)return;M(h),y(g),f(!1)}catch{n||(v([]),M(O),y(""),f(!1))}finally{n||I(!1)}}return l(),()=>{n=!0}},[t,c]),a.useEffect(()=>{let n=!1;async function l(){try{const s=await Me(t);n||(z(s),R(!1))}catch{n||(z(null),R(!1))}}return l(),()=>{n=!0}},[t]),a.useEffect(()=>{let n=!1;async function l(){try{const s=await Qe(t);n||G(s)}catch{n||G(null)}}return l(),()=>{n=!0}},[t]);const ce=a.useCallback(n=>{u(n),k(!0)},[]),oe=a.useCallback(async()=>{if(E){x(!0);try{await Ie(m,t),k(!1)}finally{x(!1)}}},[m,E,t]),xe=a.useCallback(async n=>{$(!0);try{const l=await Re(n,t);P(he(l))}finally{$(!1)}},[t]),pe=a.useCallback(async n=>{await N(n)},[N]),fe=a.useCallback(async()=>{if(U){Q(!0);try{await qe(c,W,t),f(!1),await q()}finally{Q(!1)}}},[W,U,c,t,q]),je=a.useCallback(async()=>{V(!0);try{const n=await _e(t);return await j(),n}finally{V(!1)}},[t,j]),Se=a.useCallback(async n=>Pe(n,t),[t]),K=a.useCallback(async()=>{try{const n=await Me(t);z(n)}catch{z(null)}},[t]),_=a.useCallback(async()=>{try{const n=await we(t);p(n.content),L(n.exists)}catch{p(null),L(!1)}},[t]),de=a.useCallback(async n=>{await We(n,t),await _()},[t,_]),ve=a.useCallback(async()=>{H(!0);try{const n=await Oe(t);return await Promise.all([_(),K()]),{success:n.success,summary:n.summary}}finally{H(!1)}},[t,_,K]),Ne=a.useCallback(async()=>{re(!0);try{return await Te(t)}finally{re(!1)}},[t]),Ce=a.useCallback(async n=>{B(!0);try{const l=n?await Ae(n,t):await Ae(t);if(n){const s=l.path??n;M(s),y(l.content),f(!1),await q();return}u(l.content),k(!0)}finally{B(!1)}},[t,q]);return{workingMemory:m,workingMemoryLoading:C,workingMemoryDirty:E,setWorkingMemory:ce,saveWorkingMemory:oe,savingWorkingMemory:b,insightsContent:r,insightsLoading:T,insightsExists:J,refreshInsights:_,saveInsights:de,memorySettings:S,settingsLoading:F,savingMemorySettings:ue,saveMemorySettings:xe,memoryFiles:o,memoryFilesLoading:se,selectedFilePath:c,selectedFileContent:W,selectedFileLoading:d,selectedFileDirty:U,setSelectedFileContent:be,selectFile:pe,saveSelectedFile:fe,savingSelectedFile:ae,reloadMemoryFiles:q,backendStatus:me,backendLoading:Z,extractInsights:ve,extracting:ne,triggerDreamNow:Ne,dreamRunning:Y,auditReport:D,auditLoading:ye,refreshAudit:K,compactMemory:Ce,compacting:ge,installQmdAction:je,installingQmd:ie,testRetrieval:Se,stats:le}}const Ge={Patterns:"pattern",Principles:"principle",Conventions:"convention",Pitfalls:"pitfall",Context:"context"},Ze={"long-term":"Long-term",daily:"Daily",dreams:"Dreams"},Ke={"long-term":"Curated durable decisions, conventions, constraints, and pitfalls promoted from dreams.",daily:"Raw daily observations, open loops, and running context for dream processing.",dreams:"Synthesized patterns and open loops promoted from daily memory."},Xe=72;function Je(i,t){if(i.length<=t)return i;const m=Math.max(1,t-1),u=Math.ceil(m/2),C=Math.floor(m/2);return`${i.slice(0,u)}…${i.slice(i.length-C)}`}function es(i){const t=`${i.label} — ${i.path}`;return Je(t,Xe)}function ss(i){if(!i)return[];const t=[],m=i.split(/(?=^## )/m);for(const u of m){const C=u.trim();if(!C)continue;const A=C.match(/^##\s+(.+?)(\n|$)/);if(A){const E=A[1].trim(),k=Ge[E]??E.toLowerCase(),b=C.slice(A[0].length).trim(),x=b.split(`
2
- `).map(r=>r.replace(/^-\s+/,"").trim()).filter(r=>r.length>0&&(r.startsWith("- ")||r.startsWith("* ")));(x.length>0||b.length>0)&&t.push({name:E,key:k,items:x.length>0?x:b.length>0?[b]:[],expanded:!0})}}return t}function ts(i){if(!i)return null;const t=i.match(/##\s+Last\s+Updated:\s*(\d{4}-\d{2}-\d{2})/i);return t?t[1]:null}function as(i){return i.reduce((t,m)=>t+m.items.length,0)}function ns(i){switch(i){case"file":return"File (.fusion/memory/, agent/<agent-name>/memory/)";case"readonly":return"Read-Only";case"qmd":return"QMD (Quantized Memory Distillation)";default:return i}}function rs(i){switch(i){case"healthy":return"Healthy";case"warning":return"Warning";case"issues":return"Issues Found"}}function os({projectId:i,addToast:t}){const[m,u]=a.useState("working"),[C,A]=a.useState(new Set),[E,k]=a.useState(!1),[b,x]=a.useState(null),[r,p]=a.useState({memoryEnabled:!0,memoryAutoSummarizeEnabled:!1,memoryAutoSummarizeThresholdChars:5e4,memoryAutoSummarizeSchedule:"0 3 * * *",memoryDreamsEnabled:!1,memoryDreamsSchedule:"0 4 * * *"}),[T,X]=a.useState(""),[J,L]=a.useState(!1),[S,P]=a.useState(null),{insightsContent:F,insightsLoading:ee,insightsExists:ue,saveInsights:$,memorySettings:o,settingsLoading:v,saveMemorySettings:se,savingMemorySettings:I,backendStatus:c,backendLoading:M,extractInsights:W,extracting:y,auditReport:d,auditLoading:te,refreshAudit:U,compactMemory:f,compacting:ae,installQmdAction:Q,installingQmd:ne,testRetrieval:H,memoryFiles:Y,memoryFilesLoading:re,selectedFilePath:D,selectedFileContent:z,selectedFileLoading:ye,selectedFileDirty:R,setSelectedFileContent:ge,selectFile:B,saveSelectedFile:ie,savingSelectedFile:V,reloadMemoryFiles:le,triggerDreamNow:G,dreamRunning:me}=Ve({projectId:i});a.useEffect(()=>{p(o)},[o]);const Z=a.useMemo(()=>r.memoryEnabled!==o.memoryEnabled||r.memoryAutoSummarizeEnabled!==o.memoryAutoSummarizeEnabled||r.memoryAutoSummarizeThresholdChars!==o.memoryAutoSummarizeThresholdChars||r.memoryAutoSummarizeSchedule!==o.memoryAutoSummarizeSchedule||r.memoryDreamsEnabled!==o.memoryDreamsEnabled||r.memoryDreamsSchedule!==o.memoryDreamsSchedule,[r,o]),j=a.useMemo(()=>Y.find(s=>s.path===D),[Y,D]),be=j?Ke[j.layer]:"Edits the selected memory file.",N=a.useMemo(()=>ss(F),[F]),q=a.useMemo(()=>as(N),[N]),ce=a.useMemo(()=>ts(F),[F]),oe=a.useCallback(s=>{A(h=>{const g=new Set(h);return g.has(s)?g.delete(s):g.add(s),g})},[]),xe=a.useCallback(async s=>{try{await B(s)}catch{t("Failed to load memory file","error")}},[B,t]),pe=a.useCallback(async()=>{try{await ie(),t("Memory saved","success")}catch{t("Failed to save memory","error")}},[ie,t]),fe=a.useCallback(async()=>{if(!Z)return;const s={};r.memoryEnabled!==o.memoryEnabled&&(s.memoryEnabled=r.memoryEnabled),r.memoryAutoSummarizeEnabled!==o.memoryAutoSummarizeEnabled&&(s.memoryAutoSummarizeEnabled=r.memoryAutoSummarizeEnabled),r.memoryAutoSummarizeThresholdChars!==o.memoryAutoSummarizeThresholdChars&&(s.memoryAutoSummarizeThresholdChars=r.memoryAutoSummarizeThresholdChars),r.memoryAutoSummarizeSchedule!==o.memoryAutoSummarizeSchedule&&(s.memoryAutoSummarizeSchedule=r.memoryAutoSummarizeSchedule),r.memoryDreamsEnabled!==o.memoryDreamsEnabled&&(s.memoryDreamsEnabled=r.memoryDreamsEnabled),r.memoryDreamsSchedule!==o.memoryDreamsSchedule&&(s.memoryDreamsSchedule=r.memoryDreamsSchedule);try{await se(s),t("Memory settings saved","success")}catch{t("Failed to save memory settings","error")}},[Z,r,o,se,t]),je=a.useCallback(async()=>{try{const s=await Q();t(s.qmdAvailable?"qmd installed successfully":"qmd install finished, but qmd is still unavailable",s.qmdAvailable?"success":"info")}catch{t("Failed to install qmd","error")}},[Q,t]),Se=a.useCallback(async()=>{L(!0),P(null);try{const s=await H(T);P(s),t(s.qmdAvailable?"Memory retrieval test complete":"qmd is not installed; local fallback was used",s.qmdAvailable?"success":"info")}catch{t("Failed to test memory retrieval","error")}finally{L(!1)}},[T,H,t]),K=a.useCallback(async()=>{try{await G(),t("Dream processing completed","success"),await le()}catch(s){t(s instanceof Error?s.message:"Failed to run dream processing","error")}},[G,le,t]),_=a.useCallback(async()=>{try{await f(D),t("Memory file compacted","success")}catch{t("Failed to compact memory","error")}},[f,D,t]),de=a.useCallback(async()=>{try{const s=await W();t(s.summary,"success")}catch(s){t(s instanceof Error?s.message:"Failed to extract insights","error")}},[W,t]),ve=a.useCallback(async()=>{if(b!==null)try{await $(b),k(!1),x(null),t("Insights saved","success")}catch{t("Failed to save insights","error")}},[b,$,t]),Ne=a.useCallback(()=>{x(F??""),k(!0)},[F]),Ce=a.useCallback(()=>{k(!1),x(null)},[]),n=!M&&c!==null,l=c?.capabilities?.writable??!1;return e.jsxs("div",{className:"memory-view",children:[e.jsx("div",{className:"memory-view-header",children:e.jsxs("div",{children:[e.jsx("h2",{children:"Memory"}),e.jsx("p",{className:"memory-view-description",children:"Working memory, long-term insights, and engine status"})]})}),e.jsxs("div",{className:"memory-view-tabs",role:"tablist",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":m==="working",className:`memory-view-tab${m==="working"?" memory-view-tab--active":""}`,onClick:()=>u("working"),"data-testid":"memory-tab-working",children:"Working Memory"}),e.jsx("button",{type:"button",role:"tab","aria-selected":m==="insights",className:`memory-view-tab${m==="insights"?" memory-view-tab--active":""}`,onClick:()=>u("insights"),"data-testid":"memory-tab-insights",children:"Insights"}),e.jsx("button",{type:"button",role:"tab","aria-selected":m==="engines",className:`memory-view-tab${m==="engines"?" memory-view-tab--active":""}`,onClick:()=>u("engines"),"data-testid":"memory-tab-engines",children:"Engines"})]}),e.jsxs("div",{className:"memory-view-content",children:[m==="working"&&e.jsxs("div",{className:"memory-working-tab",children:[n&&!l&&e.jsx("div",{className:"memory-readonly-banner",children:"This memory backend is read-only. Changes cannot be saved."}),re||ye?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(w,{size:20,className:"animate-spin"}),e.jsx("span",{children:"Loading memory file…"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-editor-section",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryViewFilePath",children:"Memory File"}),e.jsx("select",{id:"memoryViewFilePath",className:"select",value:D,onChange:s=>{xe(s.target.value)},disabled:R,children:Y.map(s=>e.jsx("option",{value:s.path,title:`${s.label} — ${s.path}`,children:es(s)},s.path))}),e.jsx("small",{children:R?"Save or discard the current edits before switching files.":"Choose any project memory file to view or edit."})]}),j&&e.jsxs("div",{className:"memory-file-summary",children:[e.jsx("span",{children:Ze[j.layer]}),e.jsx("strong",{children:j.path}),e.jsxs("small",{children:[j.size.toLocaleString()," bytes · updated ",new Date(j.updatedAt).toLocaleString()]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:j?.label||"Memory Editor"}),e.jsx("small",{children:be}),e.jsx("div",{className:"memory-editor-container",children:e.jsx(Fe,{content:z,onChange:ge,readOnly:!l,filePath:D})})]})]}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsxs("span",{className:"memory-char-count",children:[z.length," characters"]}),e.jsx("div",{className:"memory-flex-spacer"}),l&&z.length>0&&e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:_,disabled:ae||R,children:ae?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Compacting…"]}):"Compact Selected File"}),R&&l&&e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:pe,disabled:V,children:V?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Saving…"]}):"Save"})]}),e.jsxs("div",{className:"memory-config-section",children:[e.jsxs("div",{className:"memory-settings-group",children:[e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"memoryDreamsEnabled",className:"checkbox-label",children:[e.jsx("input",{id:"memoryDreamsEnabled",type:"checkbox",checked:r.memoryDreamsEnabled,onChange:s=>{p(h=>({...h,memoryDreamsEnabled:s.target.checked}))},disabled:!r.memoryEnabled||v}),"Process dreams from daily memory"]}),e.jsx("small",{children:"Turns daily notes into DREAMS.md and promotes reusable lessons into MEMORY.md."})]}),r.memoryEnabled&&r.memoryDreamsEnabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryDreamsSchedule",children:"Dream Schedule"}),e.jsx("input",{id:"memoryDreamsSchedule",type:"text",className:"input",value:r.memoryDreamsSchedule,onChange:s=>{p(h=>({...h,memoryDreamsSchedule:s.target.value}))},placeholder:"0 4 * * *",disabled:v}),e.jsx("small",{children:"Cron expression for dream processing."})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:K,disabled:me||!r.memoryDreamsEnabled,children:me?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Dreaming…"]}):"Dream Now"}),e.jsx("small",{children:"Manually trigger dream processing now."})]})]})]}),e.jsxs("div",{className:"memory-settings-group",children:[e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"memoryAutoSummarizeEnabled",className:"checkbox-label",children:[e.jsx("input",{id:"memoryAutoSummarizeEnabled",type:"checkbox",checked:r.memoryAutoSummarizeEnabled,onChange:s=>{p(h=>({...h,memoryAutoSummarizeEnabled:s.target.checked}))},disabled:!r.memoryEnabled||v}),"Auto-Summarize Memory"]}),e.jsx("small",{children:"Automatically compact memory when it exceeds the threshold on a schedule"})]}),r.memoryEnabled&&r.memoryAutoSummarizeEnabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryAutoSummarizeThresholdChars",children:"Compaction Threshold (chars)"}),e.jsx("input",{id:"memoryAutoSummarizeThresholdChars",type:"number",className:"input",value:r.memoryAutoSummarizeThresholdChars,onChange:s=>{p(h=>({...h,memoryAutoSummarizeThresholdChars:parseInt(s.target.value,10)||5e4}))},min:1e3,disabled:v}),e.jsx("small",{children:"Memory will be compacted when it exceeds this character count"})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryAutoSummarizeSchedule",children:"Schedule (cron)"}),e.jsx("input",{id:"memoryAutoSummarizeSchedule",type:"text",className:"input",value:r.memoryAutoSummarizeSchedule,onChange:s=>{p(h=>({...h,memoryAutoSummarizeSchedule:s.target.value}))},placeholder:"0 3 * * *",disabled:v}),e.jsx("small",{children:"Cron expression for auto-summarize schedule (default: daily at 3 AM)"})]})]})]}),!r.memoryEnabled&&e.jsx("div",{className:"settings-empty-state memory-status-message",children:"Memory is currently disabled. Enable memory tools in Settings to edit these automations."}),Z&&e.jsx("div",{className:"memory-action-bar",children:e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:fe,disabled:I||v,children:I?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Saving…"]}):"Save Settings"})})]})]})]}),m==="insights"&&e.jsx("div",{className:"memory-insights-tab",children:ee?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(w,{size:20,className:"animate-spin"}),e.jsx("span",{children:"Loading insights…"})]}):E?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"memory-editor-container",children:e.jsx(Fe,{content:b??"",onChange:x,readOnly:!1,filePath:".fusion/memory/INSIGHTS.md"})}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:Ce,children:"Cancel"}),e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:ve,children:"Save Insights"})]})]}):!ue||N.length===0?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx("p",{children:"No insights extracted yet."}),e.jsx("p",{children:'Insights are automatically extracted from working memory. Click "Extract Now" to trigger extraction manually.'}),e.jsx("button",{type:"button",className:"btn btn-primary btn-sm memory-empty-extract-button",onClick:de,disabled:y,children:y?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Extracting…"]}):"Extract Now"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-stats-row",children:[e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value",children:q}),e.jsx("div",{className:"memory-stat-label",children:"Total Insights"})]}),e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value",children:N.length}),e.jsx("div",{className:"memory-stat-label",children:"Categories"})]}),ce&&e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value memory-stat-value--updated",children:ce}),e.jsx("div",{className:"memory-stat-label",children:"Last Updated"})]})]}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:de,disabled:y,children:y?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Extracting…"]}):"Extract Now"}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:Ne,children:"Edit Raw"})]}),e.jsx("div",{className:"memory-categories-list",children:N.map(s=>{const h=!C.has(s.key);return e.jsxs("div",{className:"memory-category-section",children:[e.jsxs("div",{className:"memory-category-header",onClick:()=>oe(s.key),role:"button",tabIndex:0,onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),oe(s.key))},children:[e.jsx("h4",{children:s.name}),e.jsx("span",{className:"memory-category-count",children:s.items.length})]}),h&&e.jsx("div",{className:"memory-category-items",children:s.items.map((g,ze)=>e.jsx("div",{className:"memory-insight-item",children:g.replace(/^-\s+/,"").replace(/^\*\s+/,"")},ze))})]},s.key)})})]})}),m==="engines"&&e.jsx("div",{className:"memory-engines-tab",children:M||te?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(w,{size:20,className:"animate-spin"}),e.jsx("span",{children:"Loading engine status…"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-engine-card memory-qmd-card",children:[e.jsx("h3",{children:"QMD Integration"}),c?.qmdAvailable===!0?e.jsxs("div",{className:"memory-engine-status",children:[e.jsx("span",{className:"memory-health-badge memory-health-badge--healthy",children:"Installed"}),e.jsx("span",{className:"memory-char-count",children:"qmd is available on PATH."})]}):c?.qmdAvailable===!1?e.jsxs("div",{className:"settings-empty-state memory-status-message",children:[e.jsxs("span",{children:["qmd is not installed. Search will use local files. Install indexed retrieval: ",e.jsx("code",{children:c.qmdInstallCommand||"bun install -g @tobilu/qmd"})]}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:je,disabled:ne,children:ne?"Installing…":"Install qmd"})]}):e.jsxs("div",{className:"memory-engine-status",children:[e.jsx("span",{className:"memory-health-badge",children:"Checking"}),e.jsx("span",{className:"memory-char-count",children:"Checking qmd availability…"})]}),e.jsxs("div",{className:"memory-capability-row",children:[c?.capabilities?.readable&&e.jsx("span",{className:"memory-capability-badge",children:"Readable"}),c?.capabilities?.writable&&e.jsx("span",{className:"memory-capability-badge",children:"Writable"}),c?.capabilities?.supportsAtomicWrite&&e.jsx("span",{className:"memory-capability-badge",children:"Atomic Writes"}),c?.capabilities?.persistent&&e.jsx("span",{className:"memory-capability-badge",children:"Persistent"})]})]}),e.jsxs("div",{className:"memory-engine-card memory-retrieval-card",children:[e.jsx("h3",{children:"Test Memory Search"}),e.jsxs("div",{className:"memory-retrieval-input-row",children:[e.jsx("input",{type:"text",className:"input",value:T,onChange:s=>X(s.target.value),placeholder:"Search memory with qmd"}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:Se,disabled:J,children:J?"Testing…":"Test Retrieval"})]}),e.jsx("small",{className:"settings-muted",children:"Runs the same qmd-backed memory_search path agents use."}),S&&e.jsxs("div",{className:"memory-test-result",children:[e.jsxs("strong",{children:[S.results.length," result",S.results.length===1?"":"s"," ",'for "',S.query,'"']}),e.jsxs("small",{children:["qmd ",S.qmdAvailable?"available":"missing"," · ",S.usedFallback?"local fallback used":"qmd path used"]}),S.results.length>0?e.jsx("ul",{children:S.results.map((s,h)=>e.jsxs("li",{children:[e.jsxs("span",{children:[s.path,":",s.lineStart]}),e.jsx("p",{children:s.snippet})]},`${s.path}-${s.lineStart}-${h}`))}):e.jsx("small",{children:"No matching memory found."})]})]}),e.jsxs("div",{className:"memory-engine-card",children:[e.jsx("h3",{children:"Current Backend"}),e.jsx("div",{className:"memory-engine-status",children:e.jsx("span",{className:"memory-emphasis-text",children:ns(c?.currentBackend??"unknown")})}),e.jsxs("div",{className:"memory-capability-row",children:[c?.capabilities?.readable&&e.jsx("span",{className:"memory-capability-badge",children:"Readable"}),c?.capabilities?.writable&&e.jsx("span",{className:"memory-capability-badge",children:"Writable"}),c?.capabilities?.supportsAtomicWrite&&e.jsx("span",{className:"memory-capability-badge",children:"Atomic Writes"}),c?.capabilities?.persistent&&e.jsx("span",{className:"memory-capability-badge",children:"Persistent"})]})]}),d&&e.jsxs("div",{className:"memory-engine-card",children:[e.jsxs("div",{className:"memory-health-header",children:[e.jsx("h3",{children:"Health Status"}),e.jsx("span",{className:`memory-health-badge memory-health-badge--${d.health}`,children:rs(d.health)})]}),e.jsxs("div",{className:"memory-health-grid",children:[e.jsxs("div",{children:[e.jsx("div",{className:"memory-health-label",children:"Working Memory"}),e.jsxs("div",{className:"memory-emphasis-text",children:[d.workingMemory.size," chars"]}),e.jsxs("div",{className:"memory-health-detail",children:[d.workingMemory.sectionCount," sections"]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"memory-health-label",children:"Insights Memory"}),e.jsxs("div",{className:"memory-emphasis-text",children:[d.insightsMemory.size," chars"]}),e.jsxs("div",{className:"memory-health-detail",children:[d.insightsMemory.insightCount," insights"]})]})]}),e.jsxs("div",{className:"memory-health-section",children:[e.jsx("div",{className:"memory-health-label",children:"Last Extraction"}),e.jsx("div",{className:"memory-emphasis-text",children:d.extraction.success?e.jsx("span",{className:"memory-status-text memory-status-text--success",children:"Success"}):e.jsx("span",{className:"memory-status-text memory-status-text--error",children:"Failed"})}),e.jsx("div",{className:"memory-health-detail",children:d.extraction.summary||`${d.extraction.insightCount} insights extracted`})]}),e.jsxs("div",{className:"memory-health-section",children:[e.jsx("div",{className:"memory-health-label",children:"Pruning"}),e.jsx("div",{className:"memory-emphasis-text",children:d.pruning.applied?e.jsx("span",{className:"memory-status-text memory-status-text--warning",children:"Applied"}):e.jsx("span",{className:"memory-status-text memory-status-text--muted",children:"Not needed"})}),d.pruning.applied&&e.jsx("div",{className:"memory-health-detail",children:d.pruning.reason})]})]}),d&&d.checks.length>0&&e.jsxs("div",{className:"memory-engine-card",children:[e.jsx("h3",{children:"Audit Checks"}),e.jsx("div",{children:d.checks.map(s=>e.jsxs("div",{className:"memory-audit-check",children:[e.jsx("span",{className:s.passed?"memory-audit-check-passed":"memory-audit-check-failed",children:s.passed?"✓":"✗"}),e.jsxs("div",{className:"memory-audit-check-content",children:[e.jsx("div",{className:"memory-emphasis-text",children:s.name}),e.jsx("div",{className:"memory-health-detail",children:s.details})]})]},s.id))})]}),e.jsx("div",{className:"memory-action-bar",children:e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:()=>U(),children:"Run Audit"})}),e.jsxs("div",{className:"memory-settings-note",children:[e.jsx("span",{children:"Note: Change backend type in"}),e.jsx("button",{type:"button",className:"memory-settings-note-button",onClick:()=>{t("Open Settings → Memory to change backend type","info")},children:"Settings → Memory"})]})]})})]})]})}export{os as MemoryView};
1
+ import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{u as Le}from"./SettingsModal-C89Ikhfm.js";import{bI as Ee,bJ as Me,bK as Ie,I as Re,bL as qe,bM as Pe,bN as _e,bO as ke,bP as we,bQ as We,bR as Oe,bS as Te,bT as Ae,bU as Ue,H as $e,bV as He,L as w,bW as Fe}from"./index-D__RMku8.js";import"./vendor-xterm-DzcZoU0P.js";const O=".fusion/memory/MEMORY.md",Qe=5e4,Ye="0 3 * * *",Be="0 4 * * *";function he(i){return{memoryEnabled:i.memoryEnabled!==!1,memoryAutoSummarizeEnabled:i.memoryAutoSummarizeEnabled??!1,memoryAutoSummarizeThresholdChars:i.memoryAutoSummarizeThresholdChars??Qe,memoryAutoSummarizeSchedule:i.memoryAutoSummarizeSchedule??Ye,memoryDreamsEnabled:i.memoryDreamsEnabled??!1,memoryDreamsSchedule:i.memoryDreamsSchedule??Be}}function De(i,t){return i.some(m=>m.path===t)?t:i.find(m=>m.path===O)?.path??i[0]?.path??O}function Ve(i={}){const{projectId:t}=i,[m,u]=a.useState(""),[C,A]=a.useState(!0),[E,M]=a.useState(!1),[b,x]=a.useState(!1),[r,p]=a.useState(null),[T,J]=a.useState(!0),[X,L]=a.useState(!1),[S,_]=a.useState(()=>he({})),[F,ee]=a.useState(!0),[ue,U]=a.useState(!1),[o,v]=a.useState([]),[se,I]=a.useState(!0),[c,k]=a.useState(O),[W,y]=a.useState(""),[d,te]=a.useState(!1),[$,f]=a.useState(!1),[ae,H]=a.useState(!1),[ne,Q]=a.useState(!1),[Y,re]=a.useState(!1),[D,z]=a.useState(null),[ye,R]=a.useState(!0),[ge,B]=a.useState(!1),[ie,V]=a.useState(!1),[le,G]=a.useState(null),{status:me,loading:K,refresh:j}=Le({projectId:t}),be=a.useCallback(n=>{y(n),f(!0)},[]),N=a.useCallback(async n=>{te(!0);try{const{content:l}=await Ee(n,t);k(n),y(l),f(!1)}finally{te(!1)}},[t]),q=a.useCallback(async()=>{I(!0);try{const{files:n}=await Me(t);if(v(n),n.length===0){k(O),y(""),f(!1);return}const l=De(n,c);l!==c&&await N(l)}finally{I(!1)}},[t,c,N]);a.useEffect(()=>{let n=!1;async function l(){try{const s=await Ue(t);n||(u(s.content),A(!1))}catch{n||(u(""),A(!1))}}return l(),()=>{n=!0}},[t]),a.useEffect(()=>{let n=!1;async function l(){try{const s=await we(t);n||(p(s.content),L(s.exists),J(!1))}catch{n||(p(null),L(!1),J(!1))}}return l(),()=>{n=!0}},[t]),a.useEffect(()=>{let n=!1;async function l(){ee(!0);try{const s=await $e(t);n||_(he(s))}catch{n||_(he({}))}finally{n||ee(!1)}}return l(),()=>{n=!0}},[t]),a.useEffect(()=>{let n=!1;async function l(){I(!0);try{const{files:s}=await Me(t);if(n)return;if(v(s),s.length===0){k(O),y(""),f(!1);return}const h=De(s,c),{content:g}=await Ee(h,t);if(n)return;k(h),y(g),f(!1)}catch{n||(v([]),k(O),y(""),f(!1))}finally{n||I(!1)}}return l(),()=>{n=!0}},[t,c]),a.useEffect(()=>{let n=!1;async function l(){try{const s=await ke(t);n||(z(s),R(!1))}catch{n||(z(null),R(!1))}}return l(),()=>{n=!0}},[t]),a.useEffect(()=>{let n=!1;async function l(){try{const s=await He(t);n||G(s)}catch{n||G(null)}}return l(),()=>{n=!0}},[t]);const ce=a.useCallback(n=>{u(n),M(!0)},[]),oe=a.useCallback(async()=>{if(E){x(!0);try{await Ie(m,t),M(!1)}finally{x(!1)}}},[m,E,t]),xe=a.useCallback(async n=>{U(!0);try{const l=await Re(n,t);_(he(l))}finally{U(!1)}},[t]),pe=a.useCallback(async n=>{await N(n)},[N]),fe=a.useCallback(async()=>{if($){H(!0);try{await qe(c,W,t),f(!1),await q()}finally{H(!1)}}},[W,$,c,t,q]),je=a.useCallback(async()=>{V(!0);try{const n=await Pe(t);return await j(),n}finally{V(!1)}},[t,j]),Se=a.useCallback(async n=>_e(n,t),[t]),Z=a.useCallback(async()=>{try{const n=await ke(t);z(n)}catch{z(null)}},[t]),P=a.useCallback(async()=>{try{const n=await we(t);p(n.content),L(n.exists)}catch{p(null),L(!1)}},[t]),de=a.useCallback(async n=>{await We(n,t),await P()},[t,P]),ve=a.useCallback(async()=>{Q(!0);try{const n=await Oe(t);return await Promise.all([P(),Z()]),{success:n.success,summary:n.summary}}finally{Q(!1)}},[t,P,Z]),Ne=a.useCallback(async()=>{re(!0);try{return await Te(t)}finally{re(!1)}},[t]),Ce=a.useCallback(async n=>{B(!0);try{const l=n?await Ae(n,t):await Ae(t);if(n){const s=l.path??n;k(s),y(l.content),f(!1),await q();return}u(l.content),M(!0)}finally{B(!1)}},[t,q]);return{workingMemory:m,workingMemoryLoading:C,workingMemoryDirty:E,setWorkingMemory:ce,saveWorkingMemory:oe,savingWorkingMemory:b,insightsContent:r,insightsLoading:T,insightsExists:X,refreshInsights:P,saveInsights:de,memorySettings:S,settingsLoading:F,savingMemorySettings:ue,saveMemorySettings:xe,memoryFiles:o,memoryFilesLoading:se,selectedFilePath:c,selectedFileContent:W,selectedFileLoading:d,selectedFileDirty:$,setSelectedFileContent:be,selectFile:pe,saveSelectedFile:fe,savingSelectedFile:ae,reloadMemoryFiles:q,backendStatus:me,backendLoading:K,extractInsights:ve,extracting:ne,triggerDreamNow:Ne,dreamRunning:Y,auditReport:D,auditLoading:ye,refreshAudit:Z,compactMemory:Ce,compacting:ge,installQmdAction:je,installingQmd:ie,testRetrieval:Se,stats:le}}const Ge={Patterns:"pattern",Principles:"principle",Conventions:"convention",Pitfalls:"pitfall",Context:"context"},Ke={"long-term":"Long-term",daily:"Daily",dreams:"Dreams"},Ze={"long-term":"Curated durable decisions, conventions, constraints, and pitfalls promoted from dreams.",daily:"Raw daily observations, open loops, and running context for dream processing.",dreams:"Synthesized patterns and open loops promoted from daily memory."},Je=72;function Xe(i,t){if(i.length<=t)return i;const m=Math.max(1,t-1),u=Math.ceil(m/2),C=Math.floor(m/2);return`${i.slice(0,u)}…${i.slice(i.length-C)}`}function es(i){const t=`${i.label} — ${i.path}`;return Xe(t,Je)}function ss(i){if(!i)return[];const t=[],m=i.split(/(?=^## )/m);for(const u of m){const C=u.trim();if(!C)continue;const A=C.match(/^##\s+(.+?)(\n|$)/);if(A){const E=A[1].trim(),M=Ge[E]??E.toLowerCase(),b=C.slice(A[0].length).trim(),x=b.split(`
2
+ `).map(r=>r.replace(/^-\s+/,"").trim()).filter(r=>r.length>0&&(r.startsWith("- ")||r.startsWith("* ")));(x.length>0||b.length>0)&&t.push({name:E,key:M,items:x.length>0?x:b.length>0?[b]:[],expanded:!0})}}return t}function ts(i){if(!i)return null;const t=i.match(/##\s+Last\s+Updated:\s*(\d{4}-\d{2}-\d{2})/i);return t?t[1]:null}function as(i){return i.reduce((t,m)=>t+m.items.length,0)}function ns(i){switch(i){case"file":return"File (.fusion/memory/, agent/<agent-name>/memory/)";case"readonly":return"Read-Only";case"qmd":return"QMD (Quantized Memory Distillation)";default:return i}}function rs(i){switch(i){case"healthy":return"Healthy";case"warning":return"Warning";case"issues":return"Issues Found"}}function os({projectId:i,addToast:t}){const[m,u]=a.useState("working"),[C,A]=a.useState(new Set),[E,M]=a.useState(!1),[b,x]=a.useState(null),[r,p]=a.useState({memoryEnabled:!0,memoryAutoSummarizeEnabled:!1,memoryAutoSummarizeThresholdChars:5e4,memoryAutoSummarizeSchedule:"0 3 * * *",memoryDreamsEnabled:!1,memoryDreamsSchedule:"0 4 * * *"}),[T,J]=a.useState(""),[X,L]=a.useState(!1),[S,_]=a.useState(null),{insightsContent:F,insightsLoading:ee,insightsExists:ue,saveInsights:U,memorySettings:o,settingsLoading:v,saveMemorySettings:se,savingMemorySettings:I,backendStatus:c,backendLoading:k,extractInsights:W,extracting:y,auditReport:d,auditLoading:te,refreshAudit:$,compactMemory:f,compacting:ae,installQmdAction:H,installingQmd:ne,testRetrieval:Q,memoryFiles:Y,memoryFilesLoading:re,selectedFilePath:D,selectedFileContent:z,selectedFileLoading:ye,selectedFileDirty:R,setSelectedFileContent:ge,selectFile:B,saveSelectedFile:ie,savingSelectedFile:V,reloadMemoryFiles:le,triggerDreamNow:G,dreamRunning:me}=Ve({projectId:i});a.useEffect(()=>{p(o)},[o]);const K=a.useMemo(()=>r.memoryEnabled!==o.memoryEnabled||r.memoryAutoSummarizeEnabled!==o.memoryAutoSummarizeEnabled||r.memoryAutoSummarizeThresholdChars!==o.memoryAutoSummarizeThresholdChars||r.memoryAutoSummarizeSchedule!==o.memoryAutoSummarizeSchedule||r.memoryDreamsEnabled!==o.memoryDreamsEnabled||r.memoryDreamsSchedule!==o.memoryDreamsSchedule,[r,o]),j=a.useMemo(()=>Y.find(s=>s.path===D),[Y,D]),be=j?Ze[j.layer]:"Edits the selected memory file.",N=a.useMemo(()=>ss(F),[F]),q=a.useMemo(()=>as(N),[N]),ce=a.useMemo(()=>ts(F),[F]),oe=a.useCallback(s=>{A(h=>{const g=new Set(h);return g.has(s)?g.delete(s):g.add(s),g})},[]),xe=a.useCallback(async s=>{try{await B(s)}catch{t("Failed to load memory file","error")}},[B,t]),pe=a.useCallback(async()=>{try{await ie(),t("Memory saved","success")}catch{t("Failed to save memory","error")}},[ie,t]),fe=a.useCallback(async()=>{if(!K)return;const s={};r.memoryEnabled!==o.memoryEnabled&&(s.memoryEnabled=r.memoryEnabled),r.memoryAutoSummarizeEnabled!==o.memoryAutoSummarizeEnabled&&(s.memoryAutoSummarizeEnabled=r.memoryAutoSummarizeEnabled),r.memoryAutoSummarizeThresholdChars!==o.memoryAutoSummarizeThresholdChars&&(s.memoryAutoSummarizeThresholdChars=r.memoryAutoSummarizeThresholdChars),r.memoryAutoSummarizeSchedule!==o.memoryAutoSummarizeSchedule&&(s.memoryAutoSummarizeSchedule=r.memoryAutoSummarizeSchedule),r.memoryDreamsEnabled!==o.memoryDreamsEnabled&&(s.memoryDreamsEnabled=r.memoryDreamsEnabled),r.memoryDreamsSchedule!==o.memoryDreamsSchedule&&(s.memoryDreamsSchedule=r.memoryDreamsSchedule);try{await se(s),t("Memory settings saved","success")}catch{t("Failed to save memory settings","error")}},[K,r,o,se,t]),je=a.useCallback(async()=>{try{const s=await H();t(s.qmdAvailable?"qmd installed successfully":"qmd install finished, but qmd is still unavailable",s.qmdAvailable?"success":"info")}catch{t("Failed to install qmd","error")}},[H,t]),Se=a.useCallback(async()=>{L(!0),_(null);try{const s=await Q(T);_(s),t(s.qmdAvailable?"Memory retrieval test complete":"qmd is not installed; local fallback was used",s.qmdAvailable?"success":"info")}catch{t("Failed to test memory retrieval","error")}finally{L(!1)}},[T,Q,t]),Z=a.useCallback(async()=>{try{await G(),t("Dream processing completed","success"),await le()}catch(s){t(s instanceof Error?s.message:"Failed to run dream processing","error")}},[G,le,t]),P=a.useCallback(async()=>{try{await f(D),t("Memory file compacted","success")}catch{t("Failed to compact memory","error")}},[f,D,t]),de=a.useCallback(async()=>{try{const s=await W();t(s.summary,"success")}catch(s){t(s instanceof Error?s.message:"Failed to extract insights","error")}},[W,t]),ve=a.useCallback(async()=>{if(b!==null)try{await U(b),M(!1),x(null),t("Insights saved","success")}catch{t("Failed to save insights","error")}},[b,U,t]),Ne=a.useCallback(()=>{x(F??""),M(!0)},[F]),Ce=a.useCallback(()=>{M(!1),x(null)},[]),n=!k&&c!==null,l=c?.capabilities?.writable??!1;return e.jsxs("div",{className:"memory-view",children:[e.jsx("div",{className:"memory-view-header",children:e.jsxs("div",{children:[e.jsx("h2",{children:"Memory"}),e.jsx("p",{className:"memory-view-description",children:"Working memory, long-term insights, and engine status"})]})}),e.jsxs("div",{className:"memory-view-tabs",role:"tablist",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":m==="working",className:`memory-view-tab${m==="working"?" memory-view-tab--active":""}`,onClick:()=>u("working"),"data-testid":"memory-tab-working",children:"Working Memory"}),e.jsx("button",{type:"button",role:"tab","aria-selected":m==="insights",className:`memory-view-tab${m==="insights"?" memory-view-tab--active":""}`,onClick:()=>u("insights"),"data-testid":"memory-tab-insights",children:"Insights"}),e.jsx("button",{type:"button",role:"tab","aria-selected":m==="engines",className:`memory-view-tab${m==="engines"?" memory-view-tab--active":""}`,onClick:()=>u("engines"),"data-testid":"memory-tab-engines",children:"Engines"})]}),e.jsxs("div",{className:"memory-view-content",children:[m==="working"&&e.jsxs("div",{className:"memory-working-tab",children:[n&&!l&&e.jsx("div",{className:"memory-readonly-banner",children:"This memory backend is read-only. Changes cannot be saved."}),re||ye?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(w,{size:20,className:"animate-spin"}),e.jsx("span",{children:"Loading memory file…"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-editor-section",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryViewFilePath",children:"Memory File"}),e.jsx("select",{id:"memoryViewFilePath",className:"select",value:D,onChange:s=>{xe(s.target.value)},disabled:R,children:Y.map(s=>e.jsx("option",{value:s.path,title:`${s.label} — ${s.path}`,children:es(s)},s.path))}),e.jsx("small",{children:R?"Save or discard the current edits before switching files.":"Choose any project memory file to view or edit."})]}),j&&e.jsxs("div",{className:"memory-file-summary",children:[e.jsx("span",{children:Ke[j.layer]}),e.jsx("strong",{children:j.path}),e.jsxs("small",{children:[j.size.toLocaleString()," bytes · updated ",new Date(j.updatedAt).toLocaleString()]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:j?.label||"Memory Editor"}),e.jsx("small",{children:be}),e.jsx("div",{className:"memory-editor-container",children:e.jsx(Fe,{content:z,onChange:ge,readOnly:!l,filePath:D})})]})]}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsxs("span",{className:"memory-char-count",children:[z.length," characters"]}),e.jsx("div",{className:"memory-flex-spacer"}),l&&z.length>0&&e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:P,disabled:ae||R,children:ae?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Compacting…"]}):"Compact Selected File"}),R&&l&&e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:pe,disabled:V,children:V?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Saving…"]}):"Save"})]}),e.jsxs("div",{className:"memory-config-section",children:[e.jsxs("div",{className:"memory-settings-group",children:[e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"memoryDreamsEnabled",className:"checkbox-label",children:[e.jsx("input",{id:"memoryDreamsEnabled",type:"checkbox",checked:r.memoryDreamsEnabled,onChange:s=>{p(h=>({...h,memoryDreamsEnabled:s.target.checked}))},disabled:!r.memoryEnabled||v}),"Process dreams from daily memory"]}),e.jsx("small",{children:"Turns daily notes into DREAMS.md and promotes reusable lessons into MEMORY.md."})]}),r.memoryEnabled&&r.memoryDreamsEnabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryDreamsSchedule",children:"Dream Schedule"}),e.jsx("input",{id:"memoryDreamsSchedule",type:"text",className:"input",value:r.memoryDreamsSchedule,onChange:s=>{p(h=>({...h,memoryDreamsSchedule:s.target.value}))},placeholder:"0 4 * * *",disabled:v}),e.jsx("small",{children:"Cron expression for dream processing."})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:Z,disabled:me||!r.memoryDreamsEnabled,children:me?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Dreaming…"]}):"Dream Now"}),e.jsx("small",{children:"Manually trigger dream processing now."})]})]})]}),e.jsxs("div",{className:"memory-settings-group",children:[e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"memoryAutoSummarizeEnabled",className:"checkbox-label",children:[e.jsx("input",{id:"memoryAutoSummarizeEnabled",type:"checkbox",checked:r.memoryAutoSummarizeEnabled,onChange:s=>{p(h=>({...h,memoryAutoSummarizeEnabled:s.target.checked}))},disabled:!r.memoryEnabled||v}),"Auto-Summarize Memory"]}),e.jsx("small",{children:"Automatically compact memory when it exceeds the threshold on a schedule"})]}),r.memoryEnabled&&r.memoryAutoSummarizeEnabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryAutoSummarizeThresholdChars",children:"Compaction Threshold (chars)"}),e.jsx("input",{id:"memoryAutoSummarizeThresholdChars",type:"number",className:"input",value:r.memoryAutoSummarizeThresholdChars,onChange:s=>{p(h=>({...h,memoryAutoSummarizeThresholdChars:parseInt(s.target.value,10)||5e4}))},min:1e3,disabled:v}),e.jsx("small",{children:"Memory will be compacted when it exceeds this character count"})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryAutoSummarizeSchedule",children:"Schedule (cron)"}),e.jsx("input",{id:"memoryAutoSummarizeSchedule",type:"text",className:"input",value:r.memoryAutoSummarizeSchedule,onChange:s=>{p(h=>({...h,memoryAutoSummarizeSchedule:s.target.value}))},placeholder:"0 3 * * *",disabled:v}),e.jsx("small",{children:"Cron expression for auto-summarize schedule (default: daily at 3 AM)"})]})]})]}),!r.memoryEnabled&&e.jsx("div",{className:"settings-empty-state memory-status-message",children:"Memory is currently disabled. Enable memory tools in Settings to edit these automations."}),K&&e.jsx("div",{className:"memory-action-bar",children:e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:fe,disabled:I||v,children:I?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Saving…"]}):"Save Settings"})})]})]})]}),m==="insights"&&e.jsx("div",{className:"memory-insights-tab",children:ee?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(w,{size:20,className:"animate-spin"}),e.jsx("span",{children:"Loading insights…"})]}):E?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"memory-editor-container",children:e.jsx(Fe,{content:b??"",onChange:x,readOnly:!1,filePath:".fusion/memory/INSIGHTS.md"})}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:Ce,children:"Cancel"}),e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:ve,children:"Save Insights"})]})]}):!ue||N.length===0?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx("p",{children:"No insights extracted yet."}),e.jsx("p",{children:'Insights are automatically extracted from working memory. Click "Extract Now" to trigger extraction manually.'}),e.jsx("button",{type:"button",className:"btn btn-primary btn-sm memory-empty-extract-button",onClick:de,disabled:y,children:y?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Extracting…"]}):"Extract Now"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-stats-row",children:[e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value",children:q}),e.jsx("div",{className:"memory-stat-label",children:"Total Insights"})]}),e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value",children:N.length}),e.jsx("div",{className:"memory-stat-label",children:"Categories"})]}),ce&&e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value memory-stat-value--updated",children:ce}),e.jsx("div",{className:"memory-stat-label",children:"Last Updated"})]})]}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:de,disabled:y,children:y?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Extracting…"]}):"Extract Now"}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:Ne,children:"Edit Raw"})]}),e.jsx("div",{className:"memory-categories-list",children:N.map(s=>{const h=!C.has(s.key);return e.jsxs("div",{className:"memory-category-section",children:[e.jsxs("div",{className:"memory-category-header",onClick:()=>oe(s.key),role:"button",tabIndex:0,onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),oe(s.key))},children:[e.jsx("h4",{children:s.name}),e.jsx("span",{className:"memory-category-count",children:s.items.length})]}),h&&e.jsx("div",{className:"memory-category-items",children:s.items.map((g,ze)=>e.jsx("div",{className:"memory-insight-item",children:g.replace(/^-\s+/,"").replace(/^\*\s+/,"")},ze))})]},s.key)})})]})}),m==="engines"&&e.jsx("div",{className:"memory-engines-tab",children:k||te?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(w,{size:20,className:"animate-spin"}),e.jsx("span",{children:"Loading engine status…"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-engine-card memory-qmd-card",children:[e.jsx("h3",{children:"QMD Integration"}),c?.qmdAvailable===!0?e.jsxs("div",{className:"memory-engine-status",children:[e.jsx("span",{className:"memory-health-badge memory-health-badge--healthy",children:"Installed"}),e.jsx("span",{className:"memory-char-count",children:"qmd is available on PATH."})]}):c?.qmdAvailable===!1?e.jsxs("div",{className:"settings-empty-state memory-status-message",children:[e.jsxs("span",{children:["qmd is not installed. Search will use local files. Install indexed retrieval: ",e.jsx("code",{children:c.qmdInstallCommand||"bun install -g @tobilu/qmd"})]}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:je,disabled:ne,children:ne?"Installing…":"Install qmd"})]}):e.jsxs("div",{className:"memory-engine-status",children:[e.jsx("span",{className:"memory-health-badge",children:"Checking"}),e.jsx("span",{className:"memory-char-count",children:"Checking qmd availability…"})]}),e.jsxs("div",{className:"memory-capability-row",children:[c?.capabilities?.readable&&e.jsx("span",{className:"memory-capability-badge",children:"Readable"}),c?.capabilities?.writable&&e.jsx("span",{className:"memory-capability-badge",children:"Writable"}),c?.capabilities?.supportsAtomicWrite&&e.jsx("span",{className:"memory-capability-badge",children:"Atomic Writes"}),c?.capabilities?.persistent&&e.jsx("span",{className:"memory-capability-badge",children:"Persistent"})]})]}),e.jsxs("div",{className:"memory-engine-card memory-retrieval-card",children:[e.jsx("h3",{children:"Test Memory Search"}),e.jsxs("div",{className:"memory-retrieval-input-row",children:[e.jsx("input",{type:"text",className:"input",value:T,onChange:s=>J(s.target.value),placeholder:"Search memory with qmd"}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:Se,disabled:X,children:X?"Testing…":"Test Retrieval"})]}),e.jsx("small",{className:"settings-muted",children:"Runs the same qmd-backed memory_search path agents use."}),S&&e.jsxs("div",{className:"memory-test-result",children:[e.jsxs("strong",{children:[S.results.length," result",S.results.length===1?"":"s"," ",'for "',S.query,'"']}),e.jsxs("small",{children:["qmd ",S.qmdAvailable?"available":"missing"," · ",S.usedFallback?"local fallback used":"qmd path used"]}),S.results.length>0?e.jsx("ul",{children:S.results.map((s,h)=>e.jsxs("li",{children:[e.jsxs("span",{children:[s.path,":",s.lineStart]}),e.jsx("p",{children:s.snippet})]},`${s.path}-${s.lineStart}-${h}`))}):e.jsx("small",{children:"No matching memory found."})]})]}),e.jsxs("div",{className:"memory-engine-card",children:[e.jsx("h3",{children:"Current Backend"}),e.jsx("div",{className:"memory-engine-status",children:e.jsx("span",{className:"memory-emphasis-text",children:ns(c?.currentBackend??"unknown")})}),e.jsxs("div",{className:"memory-capability-row",children:[c?.capabilities?.readable&&e.jsx("span",{className:"memory-capability-badge",children:"Readable"}),c?.capabilities?.writable&&e.jsx("span",{className:"memory-capability-badge",children:"Writable"}),c?.capabilities?.supportsAtomicWrite&&e.jsx("span",{className:"memory-capability-badge",children:"Atomic Writes"}),c?.capabilities?.persistent&&e.jsx("span",{className:"memory-capability-badge",children:"Persistent"})]})]}),d&&e.jsxs("div",{className:"memory-engine-card",children:[e.jsxs("div",{className:"memory-health-header",children:[e.jsx("h3",{children:"Health Status"}),e.jsx("span",{className:`memory-health-badge memory-health-badge--${d.health}`,children:rs(d.health)})]}),e.jsxs("div",{className:"memory-health-grid",children:[e.jsxs("div",{children:[e.jsx("div",{className:"memory-health-label",children:"Working Memory"}),e.jsxs("div",{className:"memory-emphasis-text",children:[d.workingMemory.size," chars"]}),e.jsxs("div",{className:"memory-health-detail",children:[d.workingMemory.sectionCount," sections"]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"memory-health-label",children:"Insights Memory"}),e.jsxs("div",{className:"memory-emphasis-text",children:[d.insightsMemory.size," chars"]}),e.jsxs("div",{className:"memory-health-detail",children:[d.insightsMemory.insightCount," insights"]})]})]}),e.jsxs("div",{className:"memory-health-section",children:[e.jsx("div",{className:"memory-health-label",children:"Last Extraction"}),e.jsx("div",{className:"memory-emphasis-text",children:d.extraction.success?e.jsx("span",{className:"memory-status-text memory-status-text--success",children:"Success"}):e.jsx("span",{className:"memory-status-text memory-status-text--error",children:"Failed"})}),e.jsx("div",{className:"memory-health-detail",children:d.extraction.summary||`${d.extraction.insightCount} insights extracted`})]}),e.jsxs("div",{className:"memory-health-section",children:[e.jsx("div",{className:"memory-health-label",children:"Pruning"}),e.jsx("div",{className:"memory-emphasis-text",children:d.pruning.applied?e.jsx("span",{className:"memory-status-text memory-status-text--warning",children:"Applied"}):e.jsx("span",{className:"memory-status-text memory-status-text--muted",children:"Not needed"})}),d.pruning.applied&&e.jsx("div",{className:"memory-health-detail",children:d.pruning.reason})]})]}),d&&d.checks.length>0&&e.jsxs("div",{className:"memory-engine-card",children:[e.jsx("h3",{children:"Audit Checks"}),e.jsx("div",{children:d.checks.map(s=>e.jsxs("div",{className:"memory-audit-check",children:[e.jsx("span",{className:s.passed?"memory-audit-check-passed":"memory-audit-check-failed",children:s.passed?"✓":"✗"}),e.jsxs("div",{className:"memory-audit-check-content",children:[e.jsx("div",{className:"memory-emphasis-text",children:s.name}),e.jsx("div",{className:"memory-health-detail",children:s.details})]})]},s.id))})]}),e.jsx("div",{className:"memory-action-bar",children:e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:()=>$(),children:"Run Audit"})}),e.jsxs("div",{className:"memory-settings-note",children:[e.jsx("span",{children:"Note: Change backend type in"}),e.jsx("button",{type:"button",className:"memory-settings-note-button",onClick:()=>{t("Open Settings → Memory to change backend type","info")},children:"Settings → Memory"})]})]})})]})]})}export{os as MemoryView};