@runfusion/fusion 0.40.1 → 0.42.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 (83) hide show
  1. package/dist/bin.js +44240 -41922
  2. package/dist/client/.vite/manifest.json +75 -75
  3. package/dist/client/assets/AgentDetailView-C5Lb3fd3.js +18 -0
  4. package/dist/client/assets/AgentDetailView-DiWELtb1.css +1 -0
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-BP6d1LFG.js → AgentPermissionPolicyEditor-DtRcvE6M.js} +2 -2
  6. package/dist/client/assets/{AgentsView-COx3draV.js → AgentsView-BVW-NOYD.js} +3 -3
  7. package/dist/client/assets/ChatView-Dy-oIkrK.js +6 -0
  8. package/dist/client/assets/{DevServerView-DXQ1LX4H.js → DevServerView-DLsFSP4s.js} +1 -1
  9. package/dist/client/assets/{DirectoryPicker-B_8ICSPl.js → DirectoryPicker-_QawX-uL.js} +1 -1
  10. package/dist/client/assets/{DocumentsView-DmNB9rJZ.js → DocumentsView-DierUJsj.js} +1 -1
  11. package/dist/client/assets/{EvalsView-72w3_AO6.js → EvalsView-B83lYKQl.js} +1 -1
  12. package/dist/client/assets/{ExperimentalAgentOnboardingModal-Be4oaohM.js → ExperimentalAgentOnboardingModal-CTctYTPU.js} +1 -1
  13. package/dist/client/assets/{GoalsView-DkEXO_mx.js → GoalsView-CKn8i0i0.js} +1 -1
  14. package/dist/client/assets/{InsightsView-_-wd4BOJ.js → InsightsView-EpRHCD8G.js} +1 -1
  15. package/dist/client/assets/{MemoryView-BOCIc8HT.js → MemoryView-Df_ocTc5.js} +2 -2
  16. package/dist/client/assets/NodesView-DF7xJ_3z.js +14 -0
  17. package/dist/client/assets/{PiExtensionsManager-BqaI9GKX.js → PiExtensionsManager-BOooOEDx.js} +2 -2
  18. package/dist/client/assets/{PluginManager-DYaVwsXd.js → PluginManager-CHrDAzK6.js} +1 -1
  19. package/dist/client/assets/{PullRequestView-Dk9a7jRZ.js → PullRequestView-CJU21OZ6.js} +2 -2
  20. package/dist/client/assets/{ReliabilityView-B-i5SOoD.js → ReliabilityView-uHkW1Qeu.js} +1 -1
  21. package/dist/client/assets/{ResearchView-C2Gx8jC9.js → ResearchView-oZ2-vbjL.js} +1 -1
  22. package/dist/client/assets/{SecretsView-Db2HAGi2.js → SecretsView-BpkqSV_E.js} +1 -1
  23. package/dist/client/assets/SessionTerminal-D9IW4cDj.js +2 -0
  24. package/dist/client/assets/{SettingsModal-B-d30TVy.js → SettingsModal-BmB5l2bA.js} +1 -1
  25. package/dist/client/assets/SettingsModal-C8gsAazm.js +31 -0
  26. package/dist/client/assets/{SetupWizardModal-Cw3RdN83.js → SetupWizardModal-BYLEU_7o.js} +1 -1
  27. package/dist/client/assets/{SkillsView-BGyynaI4.js → SkillsView-8GgQ8Z_Z.js} +1 -1
  28. package/dist/client/assets/{StashRecoveryView-CFaU-hym.js → StashRecoveryView-CT1t1Uf2.js} +1 -1
  29. package/dist/client/assets/{TodoView-Djjwcb49.js → TodoView-BUj6ITAb.js} +2 -2
  30. package/dist/client/assets/WorkflowNodeEditor-CN7GPmvV.js +8 -0
  31. package/dist/client/assets/WorkflowNodeEditor-aPj8cv81.css +1 -0
  32. package/dist/client/assets/app-B2ZxMfJT.js +13 -0
  33. package/dist/client/assets/app-BffGU_HQ.js +13 -0
  34. package/dist/client/assets/app-C8AHhs5N.js +13 -0
  35. package/dist/client/assets/app-DCot4oXA.js +13 -0
  36. package/dist/client/assets/app-Ri9Te2Dv.js +13 -0
  37. package/dist/client/assets/app-sEkTyT-w.js +13 -0
  38. package/dist/client/assets/{dashboard-view-O5j3PSGY.js → dashboard-view-C3SsjXo1.js} +1621 -1621
  39. package/dist/client/assets/{dashboard-view-DOEa6gWS.js → dashboard-view-CrYwb0oQ.js} +1 -1
  40. package/dist/client/assets/dashboard-view-Du53JbmQ.css +1 -0
  41. package/dist/client/assets/{folder-open-BtEAEp7E.js → folder-open-CREXTATY.js} +1 -1
  42. package/dist/client/assets/index-2kYpdJrx.js +793 -0
  43. package/dist/client/assets/index-CJUfvGdC.css +1 -0
  44. package/dist/client/assets/{upload-Y9NiLQ9o.js → upload-BvLUlwaH.js} +1 -1
  45. package/dist/client/assets/{users-B13HD4Tp.js → users-CjhbU-sF.js} +1 -1
  46. package/dist/client/index.html +2 -2
  47. package/dist/client/version.json +1 -1
  48. package/dist/droid-cli/package.json +1 -1
  49. package/dist/extension.js +43622 -41519
  50. package/dist/pi-claude-cli/package.json +1 -1
  51. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  52. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  53. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +59 -8
  54. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  55. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  56. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  57. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  58. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  59. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  60. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  61. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  62. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  63. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  64. package/package.json +4 -3
  65. package/skill/fusion/references/extension-tools.md +3 -3
  66. package/skill/fusion/references/fusion-capabilities.md +2 -2
  67. package/dist/client/assets/AgentDetailView-BrETpTDj.js +0 -18
  68. package/dist/client/assets/AgentDetailView-CY-O6VkV.css +0 -1
  69. package/dist/client/assets/ChatView-CrVSqQK_.js +0 -6
  70. package/dist/client/assets/NodesView-DTQP1j4H.js +0 -14
  71. package/dist/client/assets/SessionTerminal-DwlNZLlr.js +0 -2
  72. package/dist/client/assets/SettingsModal-Dje7N0hv.js +0 -31
  73. package/dist/client/assets/WorkflowNodeEditor-Po5uv_dN.css +0 -1
  74. package/dist/client/assets/WorkflowNodeEditor-vnXnKvAr.js +0 -8
  75. package/dist/client/assets/app-CTRT_hQh.js +0 -13
  76. package/dist/client/assets/app-CVg6W-HU.js +0 -13
  77. package/dist/client/assets/app-CY3pQXOr.js +0 -13
  78. package/dist/client/assets/app-DNh04p5I.js +0 -13
  79. package/dist/client/assets/app-DhHgtB9j.js +0 -13
  80. package/dist/client/assets/app-NL_hPGDS.js +0 -13
  81. package/dist/client/assets/dashboard-view-BgiLoG1G.css +0 -1
  82. package/dist/client/assets/index-BHGM5W8a.css +0 -1
  83. package/dist/client/assets/index-CW4OzecJ.js +0 -793
@@ -1 +1 @@
1
- import{r as t,j as r}from"./vendor-react-D37HfzIf.js";import{cb as Pe,cc as pe,cd as sr,ce as he,s as Te,cf as Ne,cg as ke,ch as Ce,ci as je,cj as nr,ck as ce,cl as ar,cm as ir,cn as lr,co as or,cp as cr,aG as Q,cq as de,L as se,S as dr,M as vr,cr as ur,bO as mr,a as fr,cs as ze,T as Fe,ct as pr,Q as hr,b1 as gr,b2 as br,af as wr,aB as xr,R as yr}from"./index-CW4OzecJ.js";import{u as ne}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const ge=500,Sr=3e3;function W(e){return e instanceof Error?e.message:String(e)}function Oe(e){return e.length<=ge?e:e.slice(-ge)}function ve(e,o){return Oe([...e,o])}function J(e){try{return JSON.parse(e)}catch{return null}}function ee(e){const o=e.text??"";return e.stream==="stderr"?`[stderr] ${o}`:o}function Nr(e){return e?.previewUrl??null}async function Ee(e){return ar(e)}async function Le(e,o){return ir(e,o)}async function kr(e){return lr(e)}async function Cr(e){return or(e)}async function Re(e){return cr(e)}function q(e){try{return e()}catch{return null}}function ue(){return typeof q(()=>pe)=="function"&&typeof q(()=>Pe)=="function"}function I(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(o=>({timestamp:new Date().toISOString(),stream:o.startsWith("[stderr]")?"stderr":"stdout",text:o.replace(/^\[stderr\]\s*/,"")}))}}function jr(e){const{t:o}=ne("app"),[s,f]=t.useState(null),[b,g]=t.useState([]),[x,d]=t.useState([]),[E,S]=t.useState([]),[z,N]=t.useState(!0),[y,u]=t.useState(null),i=t.useRef(0),[m,A]=t.useState(null),M=t.useCallback(n=>{if(f(n),n?.logHistory){const a=n.logHistory.slice(-ge).map(ee);d(a)}},[]),L=t.useCallback(async()=>{const n=i.current;try{if(ue())if(m){const a=await Pe(m,e);if(i.current!==n)return;M(a)}else{const a=await pe(e);if(i.current!==n)return;g(a),a.length>0&&(A(a[0].config.id),M(a[0]))}else{const a=await Ee(e);if(i.current!==n)return;const v=I(a);g([v]),M(v)}u(null)}catch(a){if(i.current!==n)return;u(W(a))}},[M,e,m]);t.useEffect(()=>{i.current+=1;const n=i.current;f(null),g([]),d([]),S([]),N(!0),u(null),A(null),(async()=>{try{const[v,c]=await Promise.allSettled([ue()?pe(e):Ee(e).then(C=>[I(C)]),typeof q(()=>ce)=="function"?ce(e):Re(e).then(C=>C.map(R=>({name:R.name,command:R.command,cwd:R.cwd,scriptName:R.scriptName,packagePath:R.packagePath})))]);if(i.current!==n)return;let h=null;if(v.status==="fulfilled"){const C=v.value;if(g(C),C.length>0){const R=C[0];ue()&&A(R.config.id),M(R)}}else h=W(v.reason);c.status==="fulfilled"&&S(c.value),h&&u(h)}catch(v){if(i.current!==n)return;u(W(v))}finally{i.current===n&&N(!1)}})()},[M,e]),t.useEffect(()=>{const n=m?sr(m,e):typeof q(()=>he)=="function"?he(e):null;if(!n)return;const a=i.current,v=Te(n,{events:{history:c=>{if(i.current!==a)return;const h=J(c.data);if(h?.lines){const C=h.lines.map(ee);d(Oe(C))}},log:c=>{if(i.current!==a)return;const h=J(c.data);if(h){const C=typeof h.line=="string"?h.line:ee(h);d(R=>ve(R,C))}},"dev-server:log":c=>{if(i.current!==a)return;const h=J(c.data);if(h){const C=typeof h.line=="string"?h.line:ee(h);d(R=>ve(R,C))}},"dev-server:output":c=>{if(i.current!==a)return;const h=J(c.data);h?.line&&d(C=>ve(C,h.line))},status:c=>{if(i.current!==a)return;const h=J(c.data),C=h?.status;C&&f(R=>R&&{...R,status:C,runtime:h.pid?{...R.runtime??{startedAt:new Date().toISOString()},pid:h.pid}:R.runtime})},"dev-server:status":c=>{if(i.current!==a)return;const h=J(c.data);if(h?.status){const C=I(h);f(C),g([C])}},stopped:()=>{i.current},failed:()=>{i.current}},onReconnect:()=>{i.current===a&&L()},onError:()=>{i.current===a&&u(c=>c??o("devserver.lostConnection","Lost log stream connection."))}});return()=>{v()}},[e,L,m]),t.useEffect(()=>{if(s?.status!=="running"&&s?.status!=="starting")return;const n=setInterval(()=>{L()},Sr);return()=>{clearInterval(n)}},[L,s?.status]);const _=t.useCallback(async(n,a)=>{i.current+=1;const v=i.current;try{let c;if(m&&typeof q(()=>Ne)=="function")c=await Ne(m,e);else{const h=await Le({command:n,cwd:a},e);c=I(h)}if(i.current!==v)return;f(c),u(null)}catch(c){if(i.current!==v)return;throw u(W(c)),c}},[e,m]),j=t.useCallback(async()=>{i.current+=1;const n=i.current;try{let a;if(m&&typeof q(()=>ke)=="function")a=await ke(m,e);else{const v=await kr(e);a=I(v)}if(i.current!==n)return;f(a),u(null)}catch(a){if(i.current!==n)return;throw u(W(a)),a}},[e,m]),B=t.useCallback(async()=>{i.current+=1;const n=i.current;try{let a;if(m&&typeof q(()=>Ce)=="function")a=await Ce(m,e);else{const v=await Cr(e);a=I(v)}if(i.current!==n)return;f(a),u(null)}catch(a){if(i.current!==n)return;throw u(W(a)),a}},[e,m]),P=t.useCallback(async n=>{i.current+=1;const a=i.current;try{let v;if(m&&typeof q(()=>je)=="function")v=await je(m,n,e);else{const c=await nr({url:n},e);v={url:c.manualUrl??c.previewUrl??c.detectedUrl??null,source:c.manualUrl?"manual":"auto"}}if(i.current!==a)return;f(c=>c?{...c,previewUrl:v.url??void 0}:null),u(null)}catch(v){if(i.current!==a)return;throw u(W(v)),v}},[e,m]),V=t.useCallback(async()=>{i.current+=1;const n=i.current;try{let a;try{a=await ce(e)}catch{a=(await Re(e)).map(c=>({name:c.name,command:c.command,cwd:c.cwd,scriptName:c.scriptName,packagePath:c.packagePath}))}if(i.current!==n)return;S(a),u(null)}catch(a){if(i.current!==n)return;throw u(W(a)),a}},[e]),l=t.useCallback(async(n,a)=>{if(typeof n!="string"&&!m)try{const h=n,C=await Le({command:h.command,cwd:h.cwd,scriptName:h.scriptName,packagePath:h.packagePath??h.cwd},e),R=I(C);f(R),g([R]),u(null);return}catch(h){throw u(W(h)),h}const v=typeof n=="string"?n:n.command,c=typeof n=="string"?a:n.cwd;await _(v,c)},[e,_,m]),D=t.useCallback(async()=>{await j()},[j]),U=t.useCallback(async()=>{await B()},[B]),F=t.useCallback(async n=>{await P(n)},[P]),O=t.useCallback(async()=>{await V()},[V]),$=t.useCallback(async()=>{await L()},[L]),k=Nr(s),w=s?{...s,pid:s.runtime?.pid}:null;return{session:s,sessions:b,logs:x,detectedCommands:E,previewUrl:k,isLoading:z,error:y,startServer:_,stopServer:j,restartServer:B,setPreviewUrl:P,detectCommands:V,refresh:L,candidates:E,serverState:w,loading:z,start:l,stop:D,restart:U,setManualUrl:F,detect:O,refreshStatus:$}}const De=500,_e=100;function $e(e){return e.length>De?e.slice(-De):e}function Be(e){return e==="stderr"?"stderr":"stdout"}function re(e){try{return JSON.parse(e.data)}catch{return null}}function te(e,o){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:o,text:typeof e.text=="string"?e.text:"",stream:Be(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Er(e,o){return{id:o,text:e,stream:"stdout",timestamp:""}}function me(e,o){if(o.length===0)return e;const s=[...e],f=new Set(e.map(b=>b.id));for(const b of o)f.has(b.id)||(f.add(b.id),s.push(b));return s.sort((b,g)=>b.id-g.id),$e(s)}function Lr(e,o){const[s,f]=t.useState([]),[b,g]=t.useState(!1),[x,d]=t.useState(!1),[E,S]=t.useState(!1),[z,N]=t.useState(null),y=t.useRef(null),u=t.useRef(!1),i=t.useRef(0),m=t.useRef(0),A=t.useRef(e),M=t.useRef(o),L=t.useRef(0),_=t.useRef(1);(A.current!==e||M.current!==o)&&(A.current=e,M.current=o,i.current++,Q({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),u.current=!0,L.current=0,_.current=1,f([]),g(!1),d(!1),S(!1),N(null),y.current&&(y.current(),y.current=null)),t.useEffect(()=>{if(!o){y.current&&(y.current(),y.current=null);return}const l=i.current,D=++m.current;u.current=!1,g(!0);const U=(k,w)=>{const n=$e(k);f(n),N(w),S(w!==null?w>n.length:!1);const a=n.length>0?n[n.length-1].id:0;L.current=a,_.current=a+1},F=k=>{if(u.current||i.current!==l||!k||typeof k!="object")return;const w=k.lines;if(!Array.isArray(w))return;if(w.length>0&&typeof w[0]=="string"){const a=w.filter(v=>typeof v=="string").map((v,c)=>Er(v,c+1));U(a,a.length);return}const n=w.filter(a=>!!a&&typeof a=="object").map((a,v)=>te(a,v+1));U(n,n.length)},O=k=>{if(u.current||i.current!==l)return;const w=typeof k.text=="string"?k.text:typeof k.line=="string"?k.line:null;if(!w)return;const n=_.current,a=typeof k.id=="number"&&Number.isFinite(k.id)?k.id:n,v={id:a,text:w,stream:Be(k.stream),timestamp:typeof k.timestamp=="string"?k.timestamp:""};L.current=Math.max(L.current,a),_.current=Math.max(_.current,a+1),f(c=>me(c,[v])),N(c=>c===null?c:Math.max(c+1,v.id))};async function $(){try{const w=await de({maxLines:_e},e);if(u.current||i.current!==l||m.current!==D)return;const n=w.lines.map((a,v)=>te(a,v+1));U(n,w.totalLines)}catch{if(u.current||i.current!==l||m.current!==D)return;U([],null)}finally{!u.current&&i.current===l&&m.current===D&&g(!1)}const k=he(e);y.current=Te(k,{events:{"dev-server:log":w=>{const n=re(w);n&&O(n)},log:w=>{const n=re(w);n&&O(n)},history:w=>{const n=re(w);F(n)},"dev-server:history":w=>{const n=re(w);F(n)}},onReconnect:()=>{Q({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:L.current??null,sseChannel:k,reason:"history-replay"}),!(u.current||i.current!==l)&&de({lastEventId:L.current,maxLines:50},e).then(w=>{if(u.current||i.current!==l)return;const n=w.lines.map((a,v)=>te(a,_.current+v));if(n.length>0){const a=n[n.length-1].id;L.current=Math.max(L.current,a),_.current=Math.max(_.current,a+1)}f(a=>me(a,n)),N(w.totalLines)}).catch(()=>{})}}),Q({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:k})}return $(),()=>{u.current=!0,y.current&&(y.current(),y.current=null)}},[o,e]);const B=t.useCallback(async()=>{if(!o||x)return;const l=i.current,D=s.length;d(!0);try{const U=await de({maxLines:_e,offset:D},e);if(u.current||i.current!==l)return;const F=U.lines.map((O,$)=>te(O,$+1));f(O=>me(F,O)),S(U.totalLines>D+F.length),N(U.totalLines)}catch{}finally{d(!1)}},[o,s.length,x,e]),P=t.useCallback(()=>{f([])},[]),V=y.current!==null&&!b&&!u.current;return{entries:s,loading:b,loadingMore:x,hasMore:E,total:z,loadMore:B,clear:P,logs:s,isStreaming:V,clearLogs:P}}const Rr="This preview appears to block iframe embedding. Open it in a new tab instead.",Dr="The preview URL could not be loaded. Verify the server is running and the URL is correct.",_r="Preview is taking longer than expected and may block iframe embedding.";function Ur(e){return e==="blocked"?Rr:e==="error"?Dr:null}function Mr(e,o={}){const{loadTimeoutMs:s=1e4,detectionMethod:f=null}=o,b=t.useRef(null),g=t.useRef(null),[x,d]=t.useState("unknown"),[E,S]=t.useState(null),[z]=t.useState(f),N=t.useCallback(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null)},[]),y=t.useCallback(j=>{d(j),S(Ur(j))},[]),u=t.useCallback(()=>{d("blocked"),S(_r)},[]);t.useEffect(()=>{if(N(),!e){d("unknown"),S(null);return}d("unknown"),S(null);let j=!1;return queueMicrotask(()=>{j||(d("loading"),S(null))}),()=>{j=!0,N()}},[N,e]),t.useEffect(()=>{if(x!=="loading"){N();return}const j=setTimeout(()=>{g.current=null,u()},s);return g.current=j,()=>{clearTimeout(j),g.current===j&&(g.current=null)}},[N,x,s,u]);const i=t.useCallback(()=>{const j=b.current;if(!j){y("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){y("blocked");return}}catch{}y("embedded")},[y]),m=t.useCallback(()=>{y("error")},[y]);t.useEffect(()=>{if(N(),!e){d("unknown"),S(null);return}d("unknown"),S(null)},[N]);const A=t.useCallback(()=>{N(),d("unknown"),S(null)},[N]),M=A,L=t.useMemo(()=>x==="embedded",[x]),_=t.useMemo(()=>x==="blocked"||x==="error",[x]);return{embedStatus:x,isEmbedded:L,isBlocked:_,blockReason:E,detectionMethod:z,iframeRef:b,resetEmbedStatus:A,setEmbedStatus:y,retry:M,embedContext:E,handleIframeLoad:i,handleIframeError:m}}const Ar=/\x1b\[[0-9;]*m/g;function be(e){return e.replace(Ar,"")}function Pr(e){if(!e)return"";const o=new Date(e);return Number.isNaN(o.getTime())?"":o.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Tr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function zr(e){if(e.stream==="stderr")return"error";const o=be(e.text).toLowerCase();return/\b(warn|warning)\b/.test(o)?"warn":/\b(error|fatal)\b/.test(o)?"error":"info"}function Fr(e,o){if(!o)return e;const s=new RegExp(`(${Tr(o)})`,"ig"),f=e.split(s),b=o.toLowerCase();return r.jsx(r.Fragment,{children:f.map((g,x)=>g.toLowerCase()===b?r.jsx("mark",{children:g},`${g}-${x}`):r.jsx("span",{children:g},`${g}-${x}`))})}function Or({entries:e,loading:o,loadingMore:s,hasMore:f,total:b,onLoadMore:g,isRunning:x}){const{t:d}=ne("app"),E=t.useRef(null),S=t.useRef(e.length),z=t.useRef(x),[N,y]=t.useState(!1),[u,i]=t.useState(!1),[m,A]=t.useState(""),[M,L]=t.useState("all"),_=t.useMemo(()=>M==="all"?e:e.filter(l=>zr(l)===M),[e,M]),j=t.useMemo(()=>{const l=m.trim().toLowerCase();return l?_.filter(D=>be(D.text).toLowerCase().includes(l)):_},[_,m]),B=j.length,P=t.useCallback(()=>{const l=E.current;l&&(l.scrollTop=l.scrollHeight,i(!1))},[]);t.useEffect(()=>{const l=z.current,D=S.current,U=e.length>D;x&&(!l||!u&&U)&&P(),z.current=x,S.current=e.length},[e.length,x,u,P]);const V=t.useCallback(()=>{const l=E.current;if(!l)return;const U=l.scrollTop+l.clientHeight>=l.scrollHeight-50;i(!U)},[]);return t.useEffect(()=>{o||e.length===0||!u&&x&&P()},[e,x,u,o,P]),o&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(se,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:d("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${N?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:d("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[b!==null?`${e.length}/${b}`:`${e.length}`," ",d("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:d("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:M,onChange:l=>L(l.target.value),"data-testid":"devserver-log-severity-filter","aria-label":d("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:d("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:d("devserver.info","Info")}),r.jsx("option",{value:"warn",children:d("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:d("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:d("devserver.searchLogs","Search logs")}),r.jsx(dr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:m,onChange:l=>A(l.target.value),placeholder:d("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":d("devserver.searchLogs","Search logs")})]}),m.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:d("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>y(l=>!l),"data-testid":"devserver-log-fullscreen-toggle","aria-label":N?d("devserver.exitFullscreen","Exit fullscreen logs"):d("devserver.enterFullscreen","Enter fullscreen logs"),children:N?r.jsx(vr,{size:14}):r.jsx(ur,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[f&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:g,disabled:s,"data-testid":"devserver-log-load-more-button",children:s?r.jsxs(r.Fragment,{children:[r.jsx(se,{size:14,className:"devserver-log-viewer__spinner"}),d("devserver.loadingOlderLogs","Loading older logs…")]}):d("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:E,className:"devserver-log-viewer__content",onScroll:V,"data-testid":"devserver-log-content",children:[!o&&j.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?d("devserver.noLogsYet","No logs yet. Start the dev server to see output."):_.length===0?d("devserver.noMatchesSeverity","No log lines match the selected severity."):d("devserver.noMatchesSearch","No log lines match your search.")}),j.map(l=>{const D=be(l.text),U=Pr(l.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[U&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:U}),l.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:d("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:mr(Fr(D,m.trim()))})]},l.id)})]}),u&&x&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx(fr,{size:14}),d("devserver.newLogs","New logs")]})]})]})}const $r="devserver-preview-iframe";function Br({url:e,embedStatus:o,onEmbedStatusChange:s,iframeRef:f,blockReason:b,onRetry:g,className:x=$r,embedContext:d}){const{t:E}=ne("app"),S=b??d??null,[z,N]=t.useState(0);t.useEffect(()=>{!e||o!=="unknown"||(N(m=>m+1),s("loading"))},[o,s,e]);const y=t.useCallback(()=>{const m=f.current;if(!m){s("embedded");return}try{if(m.contentWindow?.location?.href==="about:blank"&&m.src!=="about:blank"){s("blocked");return}}catch{}s("embedded")},[f,s]),u=t.useCallback(m=>{m.stopPropagation(),s("error")},[s]),i=t.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:f,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:x,title:"Dev server preview",onLoad:y,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),o==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(se,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:E("preview.loading","Loading preview...")})]}),o==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ze,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:E("preview.blockedTitle","Preview cannot be embedded")}),S&&r.jsx("p",{className:"devserver-preview-blocked-context",children:S})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:E("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:i,children:E("preview.openInNewTab","Open in new tab")}),g&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:g,children:E("actions.retry","Retry")})]})]}),o==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(Fe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:E("preview.errorTitle","Unable to load preview")}),S&&r.jsx("p",{className:"devserver-preview-blocked-context",children:S})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:E("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:i,children:E("preview.openInNewTab","Open in new tab")}),g&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:g,children:E("actions.retry","Retry")})]})]})]}):null}function Hr(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}let fe=!1;function Ue(e){return e instanceof Error?e.message:String(e)}function He(e){return e==="."?"root":e}function Me(e){return e?e==="root"?".":e:null}function Ae(e,o,s){return!o||e.scriptName!==o?!1:s?He(e.cwd)===s:!0}function Vr(e){return e.cwd==="."?"root":e.cwd}function Wr(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Yr({addToast:e,projectId:o}){const{t:s}=ne("app");t.useEffect(()=>(Q({view:"DevServerView",trigger:fe?"route-active":"remount",projectId:o,replayAttempted:!1}),fe=!1,()=>{fe=!0,Q({view:"DevServerView",trigger:"route-inactive",projectId:o,replayAttempted:!1})}),[o]);const{session:f,detectedCommands:b,previewUrl:g,isLoading:x,error:d,startServer:E,stopServer:S,restartServer:z,setPreviewUrl:N,detectCommands:y,refresh:u}=jr(o),i=f?.status??"stopped",m=i==="running"||i==="starting",A=Hr(s),M=A[i]??A.stopped,{entries:L,loading:_,loadingMore:j,hasMore:B,total:P,loadMore:V}=Lr(o,!!o),l=g,D=f?.config?.cwd??null,[U,F]=t.useState(!0),[O,$]=t.useState(""),[k,w]=t.useState(""),[n,a]=t.useState(null),[v,c]=t.useState(null),[h,C]=t.useState("embedded"),R=h==="embedded"?l:null,{embedStatus:H,setEmbedStatus:Ve,resetEmbedStatus:Y,iframeRef:G,isEmbedded:We,isBlocked:ae,blockReason:ie,retry:we}=Mr(R),[xe,X]=t.useState(!1),ye=t.useRef(H);t.useEffect(()=>{const p=ye.current!==H;ae&&p&&X(!0),H==="embedded"&&X(!1),ye.current=H},[H,ae]),t.useEffect(()=>{X(!1)},[l]);const K=t.useMemo(()=>{if(!n)return null;const p=Me(D);return b.find(T=>!(T.scriptName!==n||p&&T.cwd!==p||f?.config?.command&&T.command!==f.config.command))??b.find(T=>Ae(T,n,D))??null},[b,f?.config?.command,n,D]);t.useEffect(()=>{typeof y=="function"&&y().catch(p=>{e(Ue(p),"error")})},[e,y]),t.useEffect(()=>{if(n){F(!1);return}F(!0)},[n]),t.useEffect(()=>{if(f?.status==="running"||f?.status==="starting"){f.config?.command?.trim().length>0&&$(f.config.command);return}if(K){$(K.command);return}b.length>0&&$(p=>p.trim().length>0?p:b[0]?.command??"")},[b,K,f?.config?.command,f?.status]),t.useEffect(()=>{w(l??"")},[l]);const le=t.useCallback(()=>{l&&window.open(l,"_blank","noopener,noreferrer")},[l]),Se=t.useCallback(()=>{X(!1),we()},[we]),qe=t.useCallback(()=>{try{const p=G.current;if(p?.contentWindow){p.contentWindow.location.reload(),X(!1),Y();return}}catch{}if(!(!l||!G.current))try{const p=new URL(l);p.searchParams.set("_t",Date.now().toString()),G.current.src=p.toString(),X(!1),Y()}catch{G.current.src=l,X(!1),Y()}},[l,G,Y]),Z=t.useCallback(async(p,T,oe)=>{c(p);try{await T(),e(oe,"success")}catch(tr){e(Ue(tr),"error")}finally{c(null)}},[e]),Xe=t.useCallback(p=>{a(p.scriptName),F(!1),$(p.command),e(s("devserver.toast.selectedScript","Selected {{name}} script.",{name:p.scriptName}),"success")},[e]),Ie=t.useCallback(()=>{a(null),F(!0),e(s("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Ge=()=>{const p=O.trim();if(p.length===0){e(s("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const T=Me(D)??".",oe=K?.cwd??T;Z("start",()=>E(p,oe),s("devserver.toast.started","Dev server started."))},Je=()=>{Z("stop",S,s("devserver.toast.stopped","Dev server stopped."))},Qe=()=>{Z("restart",z,s("devserver.toast.restarted","Dev server restarted."))},Ye=()=>{const p=k.trim(),T=p.length>0?p:null;Z("preview",()=>N(T),T?s("devserver.toast.previewUpdated","Preview URL updated."):s("devserver.toast.previewCleared","Preview URL override cleared."))},Ke=t.useCallback(()=>{d&&u()},[d,u]),Ze=i==="starting"||i==="running"||v!==null,er=i==="stopped"||v!==null,rr=i==="stopped"||i==="starting"||v!==null;return r.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[r.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[r.jsxs("div",{className:"dev-server-header-title",children:[r.jsx(pr,{size:16}),r.jsx("h2",{children:s("devserver.title","Dev Server")}),r.jsx("span",{className:`dev-server-status-badge ${M.className}`,"data-testid":"dev-server-status-badge",children:M.label})]}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ge,disabled:Ze,"data-testid":"dev-server-start-button",children:[r.jsx(hr,{size:14}),r.jsx("span",{children:v==="start"?s("devserver.starting","Starting..."):s("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Je,disabled:er,"data-testid":"dev-server-stop-button",children:[r.jsx(gr,{size:14}),r.jsx("span",{children:v==="stop"?s("devserver.stopping","Stopping..."):s("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Qe,disabled:rr,"data-testid":"dev-server-restart-button",children:[r.jsx(br,{size:14}),r.jsx("span",{children:v==="restart"?s("devserver.restarting","Restarting..."):s("devserver.restart","Restart")})]})]})]}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.configuration","Configuration")}),x&&r.jsx("span",{className:"dev-server-muted",children:s("devserver.loading","Loading...")})]}),x&&!f&&b.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(se,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:s("devserver.loadingConfig","Loading dev server configuration...")})]}),d&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:d}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ke,children:s("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:s("devserver.scriptSelection","Script Selection")}),n&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:n}),r.jsx("span",{className:"dev-server-candidate-source",children:D??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>F(!0),"data-testid":"dev-server-change-selection",children:s("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ie,"data-testid":"dev-server-clear-selection",children:s("devserver.clear","Clear")})]}),U&&b.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:s("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),U&&b.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:b.map(p=>{const T=Ae(p,n,D);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${T?"dev-server-candidate--selected":""}`,onClick:()=>Xe(p),"data-testid":`dev-server-candidate-${p.scriptName}-${He(p.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:p.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Wr(p.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:Vr(p)})]},`${p.cwd}::${p.scriptName}::${p.command}`)})})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:s("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:O,onChange:p=>$(p.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:i==="running"||i==="starting"})]}),(i==="running"||i==="starting")&&f&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:s("devserver.runningCommand","Running command")}),r.jsx("code",{children:f.config?.command??O})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:s("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:k,onChange:p=>w(p.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ye,disabled:v==="preview","data-testid":"dev-server-set-preview",children:s("devserver.save","Save")})]}),l&&r.jsx("p",{className:"dev-server-preview-hint",children:s("devserver.autoDetected","Auto-detected: {{url}}",{url:l})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:s("devserver.lines","{{count}} lines",{count:P??L.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(Or,{entries:L,loading:_,loadingMore:j,hasMore:B,total:P,onLoadMore:V,isRunning:m})})]})}),r.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(wr,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:l??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[s("devserver.auto","Auto"),l?` · ${l}`:s("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>C(p=>p==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:h==="embedded"?s("devserver.externalOnly","External only"):s("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.openInNewTab","Open in new tab"),onClick:le,disabled:!l,"data-testid":"devserver-preview-open-tab",children:r.jsx(xr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.refreshPreview","Refresh preview"),onClick:qe,disabled:!l,"data-testid":"devserver-preview-refresh",children:r.jsx(yr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":H,"data-embedded":We?"true":"false",children:[!l&&!m&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.startDevServer","Start a dev server to see a live preview here.")}),!l&&m&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),l&&h==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:s("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:le,"data-testid":"devserver-preview-external-open-tab",children:s("devserver.openInNewTab","Open in new tab")})]}),l&&h==="embedded"&&xe&&ae&&r.jsxs("div",{className:H==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[H==="error"?r.jsx(Fe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ze,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:H==="error"?s("devserver.previewFailed","Preview failed"):s("devserver.previewBlocked","Preview blocked")}),ie&&r.jsx("p",{className:"devserver-preview-blocked-context",children:ie})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:s("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:le,"data-testid":"devserver-preview-fallback-open-tab",children:s("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Se,"data-testid":"devserver-preview-fallback-retry",children:s("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),l&&h==="embedded"&&!xe&&r.jsx(Br,{url:l,embedStatus:H,onEmbedStatusChange:Ve,iframeRef:G,blockReason:ie,onRetry:Se})]})]})]})}export{Yr as DevServerView};
1
+ import{r as t,j as r}from"./vendor-react-D37HfzIf.js";import{cc as Ae,cd as pe,ce as sr,cf as he,s as Te,cg as Ne,ch as ke,ci as Ce,cj as je,ck as nr,cl as ce,cm as ar,cn as ir,co as lr,cp as or,cq as cr,aG as Q,cr as de,L as se,S as dr,M as vr,cs as ur,bP as mr,a as fr,ct as ze,T as Fe,cu as pr,Q as hr,b1 as gr,b2 as br,af as wr,aB as xr,R as yr}from"./index-2kYpdJrx.js";import{u as ne}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const ge=500,Sr=3e3;function W(e){return e instanceof Error?e.message:String(e)}function Oe(e){return e.length<=ge?e:e.slice(-ge)}function ve(e,o){return Oe([...e,o])}function J(e){try{return JSON.parse(e)}catch{return null}}function ee(e){const o=e.text??"";return e.stream==="stderr"?`[stderr] ${o}`:o}function Nr(e){return e?.previewUrl??null}async function Ee(e){return ar(e)}async function Le(e,o){return ir(e,o)}async function kr(e){return lr(e)}async function Cr(e){return or(e)}async function Re(e){return cr(e)}function q(e){try{return e()}catch{return null}}function ue(){return typeof q(()=>pe)=="function"&&typeof q(()=>Ae)=="function"}function I(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(o=>({timestamp:new Date().toISOString(),stream:o.startsWith("[stderr]")?"stderr":"stdout",text:o.replace(/^\[stderr\]\s*/,"")}))}}function jr(e){const{t:o}=ne("app"),[s,f]=t.useState(null),[b,g]=t.useState([]),[x,d]=t.useState([]),[E,S]=t.useState([]),[z,N]=t.useState(!0),[y,u]=t.useState(null),i=t.useRef(0),[m,P]=t.useState(null),M=t.useCallback(n=>{if(f(n),n?.logHistory){const a=n.logHistory.slice(-ge).map(ee);d(a)}},[]),L=t.useCallback(async()=>{const n=i.current;try{if(ue())if(m){const a=await Ae(m,e);if(i.current!==n)return;M(a)}else{const a=await pe(e);if(i.current!==n)return;g(a),a.length>0&&(P(a[0].config.id),M(a[0]))}else{const a=await Ee(e);if(i.current!==n)return;const v=I(a);g([v]),M(v)}u(null)}catch(a){if(i.current!==n)return;u(W(a))}},[M,e,m]);t.useEffect(()=>{i.current+=1;const n=i.current;f(null),g([]),d([]),S([]),N(!0),u(null),P(null),(async()=>{try{const[v,c]=await Promise.allSettled([ue()?pe(e):Ee(e).then(C=>[I(C)]),typeof q(()=>ce)=="function"?ce(e):Re(e).then(C=>C.map(R=>({name:R.name,command:R.command,cwd:R.cwd,scriptName:R.scriptName,packagePath:R.packagePath})))]);if(i.current!==n)return;let h=null;if(v.status==="fulfilled"){const C=v.value;if(g(C),C.length>0){const R=C[0];ue()&&P(R.config.id),M(R)}}else h=W(v.reason);c.status==="fulfilled"&&S(c.value),h&&u(h)}catch(v){if(i.current!==n)return;u(W(v))}finally{i.current===n&&N(!1)}})()},[M,e]),t.useEffect(()=>{const n=m?sr(m,e):typeof q(()=>he)=="function"?he(e):null;if(!n)return;const a=i.current,v=Te(n,{events:{history:c=>{if(i.current!==a)return;const h=J(c.data);if(h?.lines){const C=h.lines.map(ee);d(Oe(C))}},log:c=>{if(i.current!==a)return;const h=J(c.data);if(h){const C=typeof h.line=="string"?h.line:ee(h);d(R=>ve(R,C))}},"dev-server:log":c=>{if(i.current!==a)return;const h=J(c.data);if(h){const C=typeof h.line=="string"?h.line:ee(h);d(R=>ve(R,C))}},"dev-server:output":c=>{if(i.current!==a)return;const h=J(c.data);h?.line&&d(C=>ve(C,h.line))},status:c=>{if(i.current!==a)return;const h=J(c.data),C=h?.status;C&&f(R=>R&&{...R,status:C,runtime:h.pid?{...R.runtime??{startedAt:new Date().toISOString()},pid:h.pid}:R.runtime})},"dev-server:status":c=>{if(i.current!==a)return;const h=J(c.data);if(h?.status){const C=I(h);f(C),g([C])}},stopped:()=>{i.current},failed:()=>{i.current}},onReconnect:()=>{i.current===a&&L()},onError:()=>{i.current===a&&u(c=>c??o("devserver.lostConnection","Lost log stream connection."))}});return()=>{v()}},[e,L,m]),t.useEffect(()=>{if(s?.status!=="running"&&s?.status!=="starting")return;const n=setInterval(()=>{L()},Sr);return()=>{clearInterval(n)}},[L,s?.status]);const _=t.useCallback(async(n,a)=>{i.current+=1;const v=i.current;try{let c;if(m&&typeof q(()=>Ne)=="function")c=await Ne(m,e);else{const h=await Le({command:n,cwd:a},e);c=I(h)}if(i.current!==v)return;f(c),u(null)}catch(c){if(i.current!==v)return;throw u(W(c)),c}},[e,m]),j=t.useCallback(async()=>{i.current+=1;const n=i.current;try{let a;if(m&&typeof q(()=>ke)=="function")a=await ke(m,e);else{const v=await kr(e);a=I(v)}if(i.current!==n)return;f(a),u(null)}catch(a){if(i.current!==n)return;throw u(W(a)),a}},[e,m]),B=t.useCallback(async()=>{i.current+=1;const n=i.current;try{let a;if(m&&typeof q(()=>Ce)=="function")a=await Ce(m,e);else{const v=await Cr(e);a=I(v)}if(i.current!==n)return;f(a),u(null)}catch(a){if(i.current!==n)return;throw u(W(a)),a}},[e,m]),A=t.useCallback(async n=>{i.current+=1;const a=i.current;try{let v;if(m&&typeof q(()=>je)=="function")v=await je(m,n,e);else{const c=await nr({url:n},e);v={url:c.manualUrl??c.previewUrl??c.detectedUrl??null,source:c.manualUrl?"manual":"auto"}}if(i.current!==a)return;f(c=>c?{...c,previewUrl:v.url??void 0}:null),u(null)}catch(v){if(i.current!==a)return;throw u(W(v)),v}},[e,m]),V=t.useCallback(async()=>{i.current+=1;const n=i.current;try{let a;try{a=await ce(e)}catch{a=(await Re(e)).map(c=>({name:c.name,command:c.command,cwd:c.cwd,scriptName:c.scriptName,packagePath:c.packagePath}))}if(i.current!==n)return;S(a),u(null)}catch(a){if(i.current!==n)return;throw u(W(a)),a}},[e]),l=t.useCallback(async(n,a)=>{if(typeof n!="string"&&!m)try{const h=n,C=await Le({command:h.command,cwd:h.cwd,scriptName:h.scriptName,packagePath:h.packagePath??h.cwd},e),R=I(C);f(R),g([R]),u(null);return}catch(h){throw u(W(h)),h}const v=typeof n=="string"?n:n.command,c=typeof n=="string"?a:n.cwd;await _(v,c)},[e,_,m]),D=t.useCallback(async()=>{await j()},[j]),U=t.useCallback(async()=>{await B()},[B]),F=t.useCallback(async n=>{await A(n)},[A]),O=t.useCallback(async()=>{await V()},[V]),$=t.useCallback(async()=>{await L()},[L]),k=Nr(s),w=s?{...s,pid:s.runtime?.pid}:null;return{session:s,sessions:b,logs:x,detectedCommands:E,previewUrl:k,isLoading:z,error:y,startServer:_,stopServer:j,restartServer:B,setPreviewUrl:A,detectCommands:V,refresh:L,candidates:E,serverState:w,loading:z,start:l,stop:D,restart:U,setManualUrl:F,detect:O,refreshStatus:$}}const De=500,_e=100;function $e(e){return e.length>De?e.slice(-De):e}function Be(e){return e==="stderr"?"stderr":"stdout"}function re(e){try{return JSON.parse(e.data)}catch{return null}}function te(e,o){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:o,text:typeof e.text=="string"?e.text:"",stream:Be(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Er(e,o){return{id:o,text:e,stream:"stdout",timestamp:""}}function me(e,o){if(o.length===0)return e;const s=[...e],f=new Set(e.map(b=>b.id));for(const b of o)f.has(b.id)||(f.add(b.id),s.push(b));return s.sort((b,g)=>b.id-g.id),$e(s)}function Lr(e,o){const[s,f]=t.useState([]),[b,g]=t.useState(!1),[x,d]=t.useState(!1),[E,S]=t.useState(!1),[z,N]=t.useState(null),y=t.useRef(null),u=t.useRef(!1),i=t.useRef(0),m=t.useRef(0),P=t.useRef(e),M=t.useRef(o),L=t.useRef(0),_=t.useRef(1);(P.current!==e||M.current!==o)&&(P.current=e,M.current=o,i.current++,Q({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),u.current=!0,L.current=0,_.current=1,f([]),g(!1),d(!1),S(!1),N(null),y.current&&(y.current(),y.current=null)),t.useEffect(()=>{if(!o){y.current&&(y.current(),y.current=null);return}const l=i.current,D=++m.current;u.current=!1,g(!0);const U=(k,w)=>{const n=$e(k);f(n),N(w),S(w!==null?w>n.length:!1);const a=n.length>0?n[n.length-1].id:0;L.current=a,_.current=a+1},F=k=>{if(u.current||i.current!==l||!k||typeof k!="object")return;const w=k.lines;if(!Array.isArray(w))return;if(w.length>0&&typeof w[0]=="string"){const a=w.filter(v=>typeof v=="string").map((v,c)=>Er(v,c+1));U(a,a.length);return}const n=w.filter(a=>!!a&&typeof a=="object").map((a,v)=>te(a,v+1));U(n,n.length)},O=k=>{if(u.current||i.current!==l)return;const w=typeof k.text=="string"?k.text:typeof k.line=="string"?k.line:null;if(!w)return;const n=_.current,a=typeof k.id=="number"&&Number.isFinite(k.id)?k.id:n,v={id:a,text:w,stream:Be(k.stream),timestamp:typeof k.timestamp=="string"?k.timestamp:""};L.current=Math.max(L.current,a),_.current=Math.max(_.current,a+1),f(c=>me(c,[v])),N(c=>c===null?c:Math.max(c+1,v.id))};async function $(){try{const w=await de({maxLines:_e},e);if(u.current||i.current!==l||m.current!==D)return;const n=w.lines.map((a,v)=>te(a,v+1));U(n,w.totalLines)}catch{if(u.current||i.current!==l||m.current!==D)return;U([],null)}finally{!u.current&&i.current===l&&m.current===D&&g(!1)}const k=he(e);y.current=Te(k,{events:{"dev-server:log":w=>{const n=re(w);n&&O(n)},log:w=>{const n=re(w);n&&O(n)},history:w=>{const n=re(w);F(n)},"dev-server:history":w=>{const n=re(w);F(n)}},onReconnect:()=>{Q({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:L.current??null,sseChannel:k,reason:"history-replay"}),!(u.current||i.current!==l)&&de({lastEventId:L.current,maxLines:50},e).then(w=>{if(u.current||i.current!==l)return;const n=w.lines.map((a,v)=>te(a,_.current+v));if(n.length>0){const a=n[n.length-1].id;L.current=Math.max(L.current,a),_.current=Math.max(_.current,a+1)}f(a=>me(a,n)),N(w.totalLines)}).catch(()=>{})}}),Q({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:k})}return $(),()=>{u.current=!0,y.current&&(y.current(),y.current=null)}},[o,e]);const B=t.useCallback(async()=>{if(!o||x)return;const l=i.current,D=s.length;d(!0);try{const U=await de({maxLines:_e,offset:D},e);if(u.current||i.current!==l)return;const F=U.lines.map((O,$)=>te(O,$+1));f(O=>me(F,O)),S(U.totalLines>D+F.length),N(U.totalLines)}catch{}finally{d(!1)}},[o,s.length,x,e]),A=t.useCallback(()=>{f([])},[]),V=y.current!==null&&!b&&!u.current;return{entries:s,loading:b,loadingMore:x,hasMore:E,total:z,loadMore:B,clear:A,logs:s,isStreaming:V,clearLogs:A}}const Rr="This preview appears to block iframe embedding. Open it in a new tab instead.",Dr="The preview URL could not be loaded. Verify the server is running and the URL is correct.",_r="Preview is taking longer than expected and may block iframe embedding.";function Ur(e){return e==="blocked"?Rr:e==="error"?Dr:null}function Mr(e,o={}){const{loadTimeoutMs:s=1e4,detectionMethod:f=null}=o,b=t.useRef(null),g=t.useRef(null),[x,d]=t.useState("unknown"),[E,S]=t.useState(null),[z]=t.useState(f),N=t.useCallback(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null)},[]),y=t.useCallback(j=>{d(j),S(Ur(j))},[]),u=t.useCallback(()=>{d("blocked"),S(_r)},[]);t.useEffect(()=>{if(N(),!e){d("unknown"),S(null);return}d("unknown"),S(null);let j=!1;return queueMicrotask(()=>{j||(d("loading"),S(null))}),()=>{j=!0,N()}},[N,e]),t.useEffect(()=>{if(x!=="loading"){N();return}const j=setTimeout(()=>{g.current=null,u()},s);return g.current=j,()=>{clearTimeout(j),g.current===j&&(g.current=null)}},[N,x,s,u]);const i=t.useCallback(()=>{const j=b.current;if(!j){y("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){y("blocked");return}}catch{}y("embedded")},[y]),m=t.useCallback(()=>{y("error")},[y]);t.useEffect(()=>{if(N(),!e){d("unknown"),S(null);return}d("unknown"),S(null)},[N]);const P=t.useCallback(()=>{N(),d("unknown"),S(null)},[N]),M=P,L=t.useMemo(()=>x==="embedded",[x]),_=t.useMemo(()=>x==="blocked"||x==="error",[x]);return{embedStatus:x,isEmbedded:L,isBlocked:_,blockReason:E,detectionMethod:z,iframeRef:b,resetEmbedStatus:P,setEmbedStatus:y,retry:M,embedContext:E,handleIframeLoad:i,handleIframeError:m}}const Pr=/\x1b\[[0-9;]*m/g;function be(e){return e.replace(Pr,"")}function Ar(e){if(!e)return"";const o=new Date(e);return Number.isNaN(o.getTime())?"":o.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Tr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function zr(e){if(e.stream==="stderr")return"error";const o=be(e.text).toLowerCase();return/\b(warn|warning)\b/.test(o)?"warn":/\b(error|fatal)\b/.test(o)?"error":"info"}function Fr(e,o){if(!o)return e;const s=new RegExp(`(${Tr(o)})`,"ig"),f=e.split(s),b=o.toLowerCase();return r.jsx(r.Fragment,{children:f.map((g,x)=>g.toLowerCase()===b?r.jsx("mark",{children:g},`${g}-${x}`):r.jsx("span",{children:g},`${g}-${x}`))})}function Or({entries:e,loading:o,loadingMore:s,hasMore:f,total:b,onLoadMore:g,isRunning:x}){const{t:d}=ne("app"),E=t.useRef(null),S=t.useRef(e.length),z=t.useRef(x),[N,y]=t.useState(!1),[u,i]=t.useState(!1),[m,P]=t.useState(""),[M,L]=t.useState("all"),_=t.useMemo(()=>M==="all"?e:e.filter(l=>zr(l)===M),[e,M]),j=t.useMemo(()=>{const l=m.trim().toLowerCase();return l?_.filter(D=>be(D.text).toLowerCase().includes(l)):_},[_,m]),B=j.length,A=t.useCallback(()=>{const l=E.current;l&&(l.scrollTop=l.scrollHeight,i(!1))},[]);t.useEffect(()=>{const l=z.current,D=S.current,U=e.length>D;x&&(!l||!u&&U)&&A(),z.current=x,S.current=e.length},[e.length,x,u,A]);const V=t.useCallback(()=>{const l=E.current;if(!l)return;const U=l.scrollTop+l.clientHeight>=l.scrollHeight-50;i(!U)},[]);return t.useEffect(()=>{o||e.length===0||!u&&x&&A()},[e,x,u,o,A]),o&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(se,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:d("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${N?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:d("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[b!==null?`${e.length}/${b}`:`${e.length}`," ",d("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:d("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:M,onChange:l=>L(l.target.value),"data-testid":"devserver-log-severity-filter","aria-label":d("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:d("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:d("devserver.info","Info")}),r.jsx("option",{value:"warn",children:d("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:d("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:d("devserver.searchLogs","Search logs")}),r.jsx(dr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:m,onChange:l=>P(l.target.value),placeholder:d("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":d("devserver.searchLogs","Search logs")})]}),m.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:d("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>y(l=>!l),"data-testid":"devserver-log-fullscreen-toggle","aria-label":N?d("devserver.exitFullscreen","Exit fullscreen logs"):d("devserver.enterFullscreen","Enter fullscreen logs"),children:N?r.jsx(vr,{size:14}):r.jsx(ur,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[f&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:g,disabled:s,"data-testid":"devserver-log-load-more-button",children:s?r.jsxs(r.Fragment,{children:[r.jsx(se,{size:14,className:"devserver-log-viewer__spinner"}),d("devserver.loadingOlderLogs","Loading older logs…")]}):d("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:E,className:"devserver-log-viewer__content",onScroll:V,"data-testid":"devserver-log-content",children:[!o&&j.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?d("devserver.noLogsYet","No logs yet. Start the dev server to see output."):_.length===0?d("devserver.noMatchesSeverity","No log lines match the selected severity."):d("devserver.noMatchesSearch","No log lines match your search.")}),j.map(l=>{const D=be(l.text),U=Ar(l.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[U&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:U}),l.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:d("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:mr(Fr(D,m.trim()))})]},l.id)})]}),u&&x&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:A,"data-testid":"devserver-log-jump-button",children:[r.jsx(fr,{size:14}),d("devserver.newLogs","New logs")]})]})]})}const $r="devserver-preview-iframe";function Br({url:e,embedStatus:o,onEmbedStatusChange:s,iframeRef:f,blockReason:b,onRetry:g,className:x=$r,embedContext:d}){const{t:E}=ne("app"),S=b??d??null,[z,N]=t.useState(0);t.useEffect(()=>{!e||o!=="unknown"||(N(m=>m+1),s("loading"))},[o,s,e]);const y=t.useCallback(()=>{const m=f.current;if(!m){s("embedded");return}try{if(m.contentWindow?.location?.href==="about:blank"&&m.src!=="about:blank"){s("blocked");return}}catch{}s("embedded")},[f,s]),u=t.useCallback(m=>{m.stopPropagation(),s("error")},[s]),i=t.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:f,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:x,title:"Dev server preview",onLoad:y,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),o==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(se,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:E("preview.loading","Loading preview...")})]}),o==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ze,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:E("preview.blockedTitle","Preview cannot be embedded")}),S&&r.jsx("p",{className:"devserver-preview-blocked-context",children:S})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:E("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:i,children:E("preview.openInNewTab","Open in new tab")}),g&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:g,children:E("actions.retry","Retry")})]})]}),o==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(Fe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:E("preview.errorTitle","Unable to load preview")}),S&&r.jsx("p",{className:"devserver-preview-blocked-context",children:S})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:E("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:i,children:E("preview.openInNewTab","Open in new tab")}),g&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:g,children:E("actions.retry","Retry")})]})]})]}):null}function Hr(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}let fe=!1;function Ue(e){return e instanceof Error?e.message:String(e)}function He(e){return e==="."?"root":e}function Me(e){return e?e==="root"?".":e:null}function Pe(e,o,s){return!o||e.scriptName!==o?!1:s?He(e.cwd)===s:!0}function Vr(e){return e.cwd==="."?"root":e.cwd}function Wr(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Yr({addToast:e,projectId:o}){const{t:s}=ne("app");t.useEffect(()=>(Q({view:"DevServerView",trigger:fe?"route-active":"remount",projectId:o,replayAttempted:!1}),fe=!1,()=>{fe=!0,Q({view:"DevServerView",trigger:"route-inactive",projectId:o,replayAttempted:!1})}),[o]);const{session:f,detectedCommands:b,previewUrl:g,isLoading:x,error:d,startServer:E,stopServer:S,restartServer:z,setPreviewUrl:N,detectCommands:y,refresh:u}=jr(o),i=f?.status??"stopped",m=i==="running"||i==="starting",P=Hr(s),M=P[i]??P.stopped,{entries:L,loading:_,loadingMore:j,hasMore:B,total:A,loadMore:V}=Lr(o,!!o),l=g,D=f?.config?.cwd??null,[U,F]=t.useState(!0),[O,$]=t.useState(""),[k,w]=t.useState(""),[n,a]=t.useState(null),[v,c]=t.useState(null),[h,C]=t.useState("embedded"),R=h==="embedded"?l:null,{embedStatus:H,setEmbedStatus:Ve,resetEmbedStatus:Y,iframeRef:G,isEmbedded:We,isBlocked:ae,blockReason:ie,retry:we}=Mr(R),[xe,X]=t.useState(!1),ye=t.useRef(H);t.useEffect(()=>{const p=ye.current!==H;ae&&p&&X(!0),H==="embedded"&&X(!1),ye.current=H},[H,ae]),t.useEffect(()=>{X(!1)},[l]);const K=t.useMemo(()=>{if(!n)return null;const p=Me(D);return b.find(T=>!(T.scriptName!==n||p&&T.cwd!==p||f?.config?.command&&T.command!==f.config.command))??b.find(T=>Pe(T,n,D))??null},[b,f?.config?.command,n,D]);t.useEffect(()=>{typeof y=="function"&&y().catch(p=>{e(Ue(p),"error")})},[e,y]),t.useEffect(()=>{if(n){F(!1);return}F(!0)},[n]),t.useEffect(()=>{if(f?.status==="running"||f?.status==="starting"){f.config?.command?.trim().length>0&&$(f.config.command);return}if(K){$(K.command);return}b.length>0&&$(p=>p.trim().length>0?p:b[0]?.command??"")},[b,K,f?.config?.command,f?.status]),t.useEffect(()=>{w(l??"")},[l]);const le=t.useCallback(()=>{l&&window.open(l,"_blank","noopener,noreferrer")},[l]),Se=t.useCallback(()=>{X(!1),we()},[we]),qe=t.useCallback(()=>{try{const p=G.current;if(p?.contentWindow){p.contentWindow.location.reload(),X(!1),Y();return}}catch{}if(!(!l||!G.current))try{const p=new URL(l);p.searchParams.set("_t",Date.now().toString()),G.current.src=p.toString(),X(!1),Y()}catch{G.current.src=l,X(!1),Y()}},[l,G,Y]),Z=t.useCallback(async(p,T,oe)=>{c(p);try{await T(),e(oe,"success")}catch(tr){e(Ue(tr),"error")}finally{c(null)}},[e]),Xe=t.useCallback(p=>{a(p.scriptName),F(!1),$(p.command),e(s("devserver.toast.selectedScript","Selected {{name}} script.",{name:p.scriptName}),"success")},[e]),Ie=t.useCallback(()=>{a(null),F(!0),e(s("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Ge=()=>{const p=O.trim();if(p.length===0){e(s("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const T=Me(D)??".",oe=K?.cwd??T;Z("start",()=>E(p,oe),s("devserver.toast.started","Dev server started."))},Je=()=>{Z("stop",S,s("devserver.toast.stopped","Dev server stopped."))},Qe=()=>{Z("restart",z,s("devserver.toast.restarted","Dev server restarted."))},Ye=()=>{const p=k.trim(),T=p.length>0?p:null;Z("preview",()=>N(T),T?s("devserver.toast.previewUpdated","Preview URL updated."):s("devserver.toast.previewCleared","Preview URL override cleared."))},Ke=t.useCallback(()=>{d&&u()},[d,u]),Ze=i==="starting"||i==="running"||v!==null,er=i==="stopped"||v!==null,rr=i==="stopped"||i==="starting"||v!==null;return r.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[r.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[r.jsxs("div",{className:"dev-server-header-title",children:[r.jsx(pr,{size:16}),r.jsx("h2",{children:s("devserver.title","Dev Server")}),r.jsx("span",{className:`dev-server-status-badge ${M.className}`,"data-testid":"dev-server-status-badge",children:M.label})]}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ge,disabled:Ze,"data-testid":"dev-server-start-button",children:[r.jsx(hr,{size:14}),r.jsx("span",{children:v==="start"?s("devserver.starting","Starting..."):s("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Je,disabled:er,"data-testid":"dev-server-stop-button",children:[r.jsx(gr,{size:14}),r.jsx("span",{children:v==="stop"?s("devserver.stopping","Stopping..."):s("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Qe,disabled:rr,"data-testid":"dev-server-restart-button",children:[r.jsx(br,{size:14}),r.jsx("span",{children:v==="restart"?s("devserver.restarting","Restarting..."):s("devserver.restart","Restart")})]})]})]}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.configuration","Configuration")}),x&&r.jsx("span",{className:"dev-server-muted",children:s("devserver.loading","Loading...")})]}),x&&!f&&b.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(se,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:s("devserver.loadingConfig","Loading dev server configuration...")})]}),d&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:d}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ke,children:s("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:s("devserver.scriptSelection","Script Selection")}),n&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:n}),r.jsx("span",{className:"dev-server-candidate-source",children:D??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>F(!0),"data-testid":"dev-server-change-selection",children:s("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ie,"data-testid":"dev-server-clear-selection",children:s("devserver.clear","Clear")})]}),U&&b.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:s("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),U&&b.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:b.map(p=>{const T=Pe(p,n,D);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${T?"dev-server-candidate--selected":""}`,onClick:()=>Xe(p),"data-testid":`dev-server-candidate-${p.scriptName}-${He(p.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:p.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Wr(p.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:Vr(p)})]},`${p.cwd}::${p.scriptName}::${p.command}`)})})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:s("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:O,onChange:p=>$(p.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:i==="running"||i==="starting"})]}),(i==="running"||i==="starting")&&f&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:s("devserver.runningCommand","Running command")}),r.jsx("code",{children:f.config?.command??O})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:s("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:k,onChange:p=>w(p.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ye,disabled:v==="preview","data-testid":"dev-server-set-preview",children:s("devserver.save","Save")})]}),l&&r.jsx("p",{className:"dev-server-preview-hint",children:s("devserver.autoDetected","Auto-detected: {{url}}",{url:l})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:s("devserver.lines","{{count}} lines",{count:A??L.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(Or,{entries:L,loading:_,loadingMore:j,hasMore:B,total:A,onLoadMore:V,isRunning:m})})]})}),r.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(wr,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:l??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[s("devserver.auto","Auto"),l?` · ${l}`:s("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>C(p=>p==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:h==="embedded"?s("devserver.externalOnly","External only"):s("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.openInNewTab","Open in new tab"),onClick:le,disabled:!l,"data-testid":"devserver-preview-open-tab",children:r.jsx(xr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.refreshPreview","Refresh preview"),onClick:qe,disabled:!l,"data-testid":"devserver-preview-refresh",children:r.jsx(yr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":H,"data-embedded":We?"true":"false",children:[!l&&!m&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.startDevServer","Start a dev server to see a live preview here.")}),!l&&m&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),l&&h==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:s("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:le,"data-testid":"devserver-preview-external-open-tab",children:s("devserver.openInNewTab","Open in new tab")})]}),l&&h==="embedded"&&xe&&ae&&r.jsxs("div",{className:H==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[H==="error"?r.jsx(Fe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ze,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:H==="error"?s("devserver.previewFailed","Preview failed"):s("devserver.previewBlocked","Preview blocked")}),ie&&r.jsx("p",{className:"devserver-preview-blocked-context",children:ie})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:s("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:le,"data-testid":"devserver-preview-fallback-open-tab",children:s("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Se,"data-testid":"devserver-preview-fallback-retry",children:s("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),l&&h==="embedded"&&!xe&&r.jsx(Br,{url:l,embedStatus:H,onEmbedStatusChange:Ve,iframeRef:G,blockReason:ie,onRetry:Se})]})]})]})}export{Yr as DevServerView};
@@ -1 +1 @@
1
- import{r as c,j as r}from"./vendor-react-D37HfzIf.js";import{cX as v,cY as z,cZ as D,c_ as x,b as j,aj as S,ae as T,af as B,J as A,L,ay as w}from"./index-CW4OzecJ.js";import{u as K}from"./vendor-i18n-CV0mwX_-.js";import{F as R}from"./folder-open-BtEAEp7E.js";function X({value:p,onChange:u,placeholder:f,onInputKeyDown:N,nodeId:b,localNodeId:k}){const{t:i}=K("app"),[e,s]=c.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1,createFolderOpen:!1,createFolderError:null}),[l,h]=c.useState(""),d=c.useCallback(async(t,n=!1)=>{s(o=>({...o,loading:!0,error:null}));try{const o=await v(t,n,b,k);s(a=>({...a,loading:!1,currentPath:o.currentPath,parentPath:o.parentPath,entries:o.entries}))}catch(o){s(a=>({...a,loading:!1,error:o instanceof Error?o.message:"Failed to browse directory"}))}},[b,k]),F=c.useCallback(()=>{s(t=>t.isOpen?{...t,isOpen:!1}:{...t,isOpen:!0})},[]);c.useEffect(()=>{e.isOpen&&!e.loading&&!e.currentPath&&!e.error&&d(p||void 0,e.showHidden)},[e.isOpen,e.loading,e.currentPath,e.error,p,e.showHidden,d,b,k]);const m=c.useCallback(t=>{d(t,e.showHidden)},[d,e.showHidden]),g=c.useCallback(()=>{u(e.currentPath),s(t=>({...t,isOpen:!1}))},[e.currentPath,u]),C=c.useCallback(()=>{s(t=>{const n=!t.showHidden;return{...t,showHidden:n}})},[]);c.useEffect(()=>{e.isOpen&&e.currentPath&&d(e.currentPath,e.showHidden)},[e.showHidden,d]);const P=c.useCallback(()=>{s(t=>({...t,createFolderOpen:!t.createFolderOpen,createFolderError:null})),h("")},[]),y=c.useCallback(async()=>{if(!l.trim()||!e.currentPath)return;const t=l.trim();if(t.includes("/")||t.includes("\\")||t.includes("..")){s(a=>({...a,createFolderError:i("dirPicker.createFolderError","Folder name cannot contain path separators or '..'")}));return}const n=e.currentPath.includes("\\")?"\\":"/",o=e.currentPath.endsWith(n)?e.currentPath+t:e.currentPath+n+t;s(a=>({...a,loading:!0,createFolderError:null}));try{await z(o),h(""),s(a=>({...a,createFolderOpen:!1})),await d(e.currentPath,e.showHidden)}catch(a){s(O=>({...O,loading:!1,createFolderError:a instanceof Error?a.message:"Failed to create folder"}))}},[l,e.currentPath,e.showHidden,d]),H=c.useCallback(t=>{t.key==="Enter"?(t.preventDefault(),y()):t.key==="Escape"&&(s(n=>({...n,createFolderOpen:!1,createFolderError:null})),h(""))},[y]),E=e.currentPath?D(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:p,onChange:t=>u(t.target.value),onKeyDown:N,placeholder:f||i("dirPicker.defaultPlaceholder","/path/to/your/project")}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:F,"aria-label":e.isOpen?i("dirPicker.closeBrowser","Close directory browser"):i("dirPicker.openBrowser","Browse directories"),children:[e.isOpen?r.jsx(R,{size:16}):r.jsx(x,{size:16}),r.jsx("span",{children:i("dirPicker.browse","Browse")})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":i("dirPicker.ariaLabel","Directory browser"),children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:E.map((t,n)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[n>0&&r.jsx(j,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>m(t.path),title:t.path,children:t.label})]},t.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:()=>m(e.parentPath),"aria-label":i("dirPicker.parentDir","Go to parent directory"),title:i("dirPicker.parentDirTitle","Parent directory"),children:[r.jsx(S,{size:14}),r.jsx("span",{children:i("dirPicker.up","Up")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:C,"aria-label":e.showHidden?i("dirPicker.hideHiddenAria","Hide hidden directories"):i("dirPicker.showHiddenAria","Show hidden directories"),title:e.showHidden?i("dirPicker.hideHiddenTitle","Hide hidden"):i("dirPicker.showHiddenTitle","Show hidden"),children:[e.showHidden?r.jsx(T,{size:14}):r.jsx(B,{size:14}),r.jsx("span",{children:e.showHidden?i("dirPicker.hideHidden","Hide hidden"):i("dirPicker.showHidden","Show hidden")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-create-folder-toggle",onClick:P,"aria-label":i("dirPicker.createFolderAria","Create new folder"),title:i("dirPicker.createFolderTitle","Create folder"),children:[r.jsx(A,{size:14}),r.jsx("span",{children:i("dirPicker.createFolder","New folder")})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(L,{size:20,className:"animate-spin"}),r.jsx("span",{children:i("dirPicker.loading","Loading…")})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(w,{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:i("dirPicker.noSubdirs","No subdirectories")}):e.entries.map(t=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>m(t.path),role:"treeitem",title:t.path,children:[r.jsx(x,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:t.name}),t.hasChildren&&r.jsx(j,{size:14,className:"directory-picker-entry-arrow"})]},t.path))}),e.createFolderOpen&&r.jsxs("div",{className:"directory-picker-create-folder",children:[r.jsx("input",{type:"text",className:"input directory-picker-create-folder-input",value:l,onChange:t=>h(t.target.value),onKeyDown:H,placeholder:i("dirPicker.newFolderPlaceholder","Folder name"),autoFocus:!0}),r.jsxs("div",{className:"directory-picker-create-folder-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm btn-primary",onClick:y,disabled:!l.trim()||e.loading||!e.currentPath,children:i("dirPicker.createFolderConfirm","Create")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-secondary",onClick:P,children:i("dirPicker.cancel","Cancel")})]}),e.createFolderError&&r.jsxs("div",{className:"directory-picker-create-folder-error",children:[r.jsx(w,{size:14}),r.jsx("span",{children:e.createFolderError})]})]}),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:g,children:i("dirPicker.select","Select")})]})]})]})}export{X as D};
1
+ import{r as n,j as r}from"./vendor-react-D37HfzIf.js";import{c_ as v,c$ as z,d0 as D,d1 as x,b as j,aj as S,ae as T,af as B,J as A,L,ay as w}from"./index-2kYpdJrx.js";import{u as K}from"./vendor-i18n-CV0mwX_-.js";import{F as R}from"./folder-open-CREXTATY.js";function _({value:p,onChange:u,placeholder:f,onInputKeyDown:N,nodeId:b,localNodeId:k}){const{t:i}=K("app"),[e,s]=n.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1,createFolderOpen:!1,createFolderError:null}),[l,h]=n.useState(""),d=n.useCallback(async(t,c=!1)=>{s(o=>({...o,loading:!0,error:null}));try{const o=await v(t,c,b,k);s(a=>({...a,loading:!1,currentPath:o.currentPath,parentPath:o.parentPath,entries:o.entries}))}catch(o){s(a=>({...a,loading:!1,error:o instanceof Error?o.message:"Failed to browse directory"}))}},[b,k]),F=n.useCallback(()=>{s(t=>t.isOpen?{...t,isOpen:!1}:{...t,isOpen:!0})},[]);n.useEffect(()=>{e.isOpen&&!e.loading&&!e.currentPath&&!e.error&&d(p||void 0,e.showHidden)},[e.isOpen,e.loading,e.currentPath,e.error,p,e.showHidden,d,b,k]);const m=n.useCallback(t=>{d(t,e.showHidden)},[d,e.showHidden]),g=n.useCallback(()=>{u(e.currentPath),s(t=>({...t,isOpen:!1}))},[e.currentPath,u]),C=n.useCallback(()=>{s(t=>{const c=!t.showHidden;return{...t,showHidden:c}})},[]);n.useEffect(()=>{e.isOpen&&e.currentPath&&d(e.currentPath,e.showHidden)},[e.showHidden,d]);const P=n.useCallback(()=>{s(t=>({...t,createFolderOpen:!t.createFolderOpen,createFolderError:null})),h("")},[]),y=n.useCallback(async()=>{if(!l.trim()||!e.currentPath)return;const t=l.trim();if(t.includes("/")||t.includes("\\")||t.includes("..")){s(a=>({...a,createFolderError:i("dirPicker.createFolderError","Folder name cannot contain path separators or '..'")}));return}const c=e.currentPath.includes("\\")?"\\":"/",o=e.currentPath.endsWith(c)?e.currentPath+t:e.currentPath+c+t;s(a=>({...a,loading:!0,createFolderError:null}));try{await z(o),h(""),s(a=>({...a,createFolderOpen:!1})),await d(e.currentPath,e.showHidden)}catch(a){s(O=>({...O,loading:!1,createFolderError:a instanceof Error?a.message:"Failed to create folder"}))}},[l,e.currentPath,e.showHidden,d]),H=n.useCallback(t=>{t.key==="Enter"?(t.preventDefault(),y()):t.key==="Escape"&&(s(c=>({...c,createFolderOpen:!1,createFolderError:null})),h(""))},[y]),E=e.currentPath?D(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:p,onChange:t=>u(t.target.value),onKeyDown:N,placeholder:f||i("dirPicker.defaultPlaceholder","/path/to/your/project")}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:F,"aria-label":e.isOpen?i("dirPicker.closeBrowser","Close directory browser"):i("dirPicker.openBrowser","Browse directories"),children:[e.isOpen?r.jsx(R,{size:16}):r.jsx(x,{size:16}),r.jsx("span",{children:i("dirPicker.browse","Browse")})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":i("dirPicker.ariaLabel","Directory browser"),children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:E.map((t,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(j,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>m(t.path),title:t.path,children:t.label})]},t.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:()=>m(e.parentPath),"aria-label":i("dirPicker.parentDir","Go to parent directory"),title:i("dirPicker.parentDirTitle","Parent directory"),children:[r.jsx(S,{size:14}),r.jsx("span",{children:i("dirPicker.up","Up")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:C,"aria-label":e.showHidden?i("dirPicker.hideHiddenAria","Hide hidden directories"):i("dirPicker.showHiddenAria","Show hidden directories"),title:e.showHidden?i("dirPicker.hideHiddenTitle","Hide hidden"):i("dirPicker.showHiddenTitle","Show hidden"),children:[e.showHidden?r.jsx(T,{size:14}):r.jsx(B,{size:14}),r.jsx("span",{children:e.showHidden?i("dirPicker.hideHidden","Hide hidden"):i("dirPicker.showHidden","Show hidden")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-create-folder-toggle",onClick:P,"aria-label":i("dirPicker.createFolderAria","Create new folder"),title:i("dirPicker.createFolderTitle","Create folder"),children:[r.jsx(A,{size:14}),r.jsx("span",{children:i("dirPicker.createFolder","New folder")})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(L,{size:20,className:"animate-spin"}),r.jsx("span",{children:i("dirPicker.loading","Loading…")})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(w,{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:i("dirPicker.noSubdirs","No subdirectories")}):e.entries.map(t=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>m(t.path),role:"treeitem",title:t.path,children:[r.jsx(x,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:t.name}),t.hasChildren&&r.jsx(j,{size:14,className:"directory-picker-entry-arrow"})]},t.path))}),e.createFolderOpen&&r.jsxs("div",{className:"directory-picker-create-folder",children:[r.jsx("input",{type:"text",className:"input directory-picker-create-folder-input",value:l,onChange:t=>h(t.target.value),onKeyDown:H,placeholder:i("dirPicker.newFolderPlaceholder","Folder name"),autoFocus:!0}),r.jsxs("div",{className:"directory-picker-create-folder-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm btn-primary",onClick:y,disabled:!l.trim()||e.loading||!e.currentPath,children:i("dirPicker.createFolderConfirm","Create")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-secondary",onClick:P,children:i("dirPicker.cancel","Cancel")})]}),e.createFolderError&&r.jsxs("div",{className:"directory-picker-create-folder-error",children:[r.jsx(w,{size:14}),r.jsx("span",{children:e.createFolderError})]})]}),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:g,children:i("dirPicker.select","Select")})]})]})]})}export{_ as D};
@@ -1 +1 @@
1
- import{r as s,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as G,a8 as X,a9 as ue,aa as me,ab as V,ac as he,f as pe,ad as fe,F as L,ae as je,af as xe,S as we,X as ke,R as ge,ag as be,ah as Y,ai as J,a as Z,b as ve,aj as Ne}from"./index-CW4OzecJ.js";import{u as B}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";function Ce(a){const{projectId:l,searchQuery:f,includeProjectFiles:t=!0}=a??{},c=l?`${ue.DOCUMENTS_PREFIX}${l}`:null,[j,o]=s.useState(()=>{if(!c)return[];const w=G(c,{maxAgeMs:X});return Array.isArray(w)?w:[]}),[x,i]=s.useState([]),[u,m]=s.useState(()=>j.length===0),[C,F]=s.useState(null),p=s.useRef(null),g=s.useRef(j.length>0),h=s.useRef(null),y=s.useCallback(async()=>{p.current&&p.current.abort();const w=new AbortController;p.current=w;const T=!g.current;T&&m(!0),F(null);const D=me(f?{q:f}:void 0,l),E=t?V(l):Promise.resolve({files:[]}),[k,S]=await Promise.allSettled([D,E]);if(w.signal.aborted)return;let R=null;if(k.status==="fulfilled"){if(o(k.value),c){const P=k.value.length>500?k.value.slice(0,500):k.value;he(c,P,{maxBytes:5e5})}g.current=!0}else R=k.reason instanceof Error?k.reason.message:String(k.reason);if(S.status==="fulfilled"){const P=S.value.files,M=f?.trim().toLowerCase(),z=M?P.filter(v=>v.name.toLowerCase().includes(M)||v.path.toLowerCase().includes(M)):P;i(z)}F(R),T&&m(!1)},[c,t,l,f]);return s.useEffect(()=>{if(!c){g.current=!1,o([]),m(!0);return}const w=G(c,{maxAgeMs:X});Array.isArray(w)?(o(w),g.current=!0,m(!1)):(g.current=!1,o([]),m(!0))},[c]),s.useEffect(()=>(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{y()},300),()=>{h.current&&clearTimeout(h.current)}),[y]),s.useEffect(()=>(y(),()=>{p.current&&p.current.abort()}),[]),{documents:j,projectFiles:x,loading:u,error:C,refresh:y}}function Se(a,l){const[f,t]=s.useState([]),[c,j]=s.useState(!0),[o,x]=s.useState(null),i=s.useRef(null),u=s.useRef(!1),m=l?.showHidden??!1,C=s.useCallback(async F=>{i.current&&i.current.abort();const p=new AbortController;i.current=p;const g=!u.current;g&&j(!0),x(null);try{const h=await V(a,{showHidden:F?.showHidden??m});if(p.signal.aborted)return;t(h.files),u.current=!0}catch(h){if(p.signal.aborted)return;x(h instanceof Error?h.message:String(h))}finally{!p.signal.aborted&&g&&j(!1)}},[a,m]);return s.useEffect(()=>(u.current=!1,C({showHidden:m}),()=>{i.current&&i.current.abort()}),[C,m]),{files:f,loading:c,error:o,refresh:C}}const Fe=768;function I(a){return a?new Date(a).toLocaleString():""}function ye(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function Te(a,l=200){return a.length<=l?a:`${a.substring(0,l)}…`}function Ee({document:a,renderMarkdown:l,onToggleMarkdown:f}){const{t}=B("app"),[c,j]=s.useState(!1),o=Te(a.content),x=a.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(L,{size:14}),e.jsx("span",{className:"document-card-key-text",children:a.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",a.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>j(i=>!i),title:c?t("documents.collapse","Collapse"):t("documents.expand","Expand"),"aria-label":c?t("documents.collapseContent","Collapse content"):t("documents.expandContent","Expand content"),children:c?e.jsx(Ne,{size:14}):e.jsx(Z,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:a.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:I(a.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${c?" document-card-content--expanded":""}`,children:[c?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:f,"aria-label":l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":l,title:l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:l?t("documents.markdown","Markdown"):t("documents.plain","Plain")})}),l?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:a.content})})}):e.jsx("pre",{className:"document-card-content-text",children:a.content})]}):e.jsx("p",{className:"document-card-preview",children:o}),x&&!c&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function Pe({taskId:a,taskTitle:l,documents:f,onOpenTask:t,renderMarkdownStates:c,onToggleMarkdown:j}){const{t:o}=B("app"),[x,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(u=>!u),"aria-expanded":x,"aria-label":`${x?o("documents.collapse","Collapse"):o("documents.expand","Expand")} documents for task ${a}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:x?e.jsx(Z,{size:16}):e.jsx(ve,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:a}),e.jsx("span",{className:"documents-group-task-title",children:l||o("documents.untitled","Untitled")})]}),e.jsx("span",{className:"documents-group-count",children:o("documents.docCount","{{count}} doc{{plural}}",{count:f.length,plural:f.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>t(a),"aria-label":`Open task ${a}: ${l||o("documents.untitled","Untitled")}`,children:o("documents.openTask","Open task")})]}),x&&e.jsx("div",{className:"documents-group-content",children:f.map(u=>e.jsx(Ee,{document:u,renderMarkdown:c.get(u.id)??!1,onToggleMarkdown:()=>j(u.id)},u.id))})]})}function He({projectId:a,addToast:l,onOpenDetail:f}){const{t}=B("app"),[c,j]=s.useState("project"),[o,x]=s.useState(""),[i,u]=s.useState(null),[m,C]=s.useState(!1),[F,p]=s.useState(null),[g,h]=s.useState(!1),[y,w]=s.useState(null),[T,D]=s.useState(!1),E=s.useRef(0),k=s.useRef(!1),[S,R]=s.useState(!1),[P,M]=s.useState(new Map),z=c==="tasks"?o.trim():"",{documents:v,loading:A,error:ee,refresh:O}=Ce({projectId:a,searchQuery:z||void 0,includeProjectFiles:!1}),{files:N,loading:H,error:te,refresh:U}=Se(a,{showHidden:m});s.useEffect(()=>{const n=()=>{D(window.innerWidth<=Fe)};return n(),window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)}},[]),s.useEffect(()=>{k.current=!1,j("project"),u(null),C(!1),p(null),w(null),h(!1),R(!1),M(new Map)},[a]),s.useEffect(()=>{k.current||A||H||(N.length>0?j("project"):v.length>0&&j("tasks"),k.current=!0)},[v.length,A,N.length,H]);const $=s.useMemo(()=>{const n=new Map;for(const r of v){const d=n.get(r.taskId)||[];n.set(r.taskId,[...d,r])}return Array.from(n.entries()).map(([r,d])=>{const b=[...d].sort((ie,de)=>de.updatedAt.localeCompare(ie.updatedAt));return{taskId:r,taskTitle:b[0]?.taskTitle,documents:b,latestUpdated:b[0]?.updatedAt??""}}).sort((r,d)=>d.latestUpdated.localeCompare(r.latestUpdated))},[v]),q=s.useMemo(()=>{const n=o.trim().toLowerCase();return n?N.filter(r=>{const d=r.path.toLowerCase(),b=r.name.toLowerCase();return d.includes(n)||b.includes(n)}):N},[N,o]);s.useEffect(()=>{if(!i)return;N.some(r=>r.path===i.path)||(u(null),p(null),w(null),h(!1))},[N,i]);const se=s.useCallback(n=>{x(n.target.value)},[]),ne=s.useCallback(()=>{x("")},[]),_=s.useCallback(n=>{j(n)},[]),ae=s.useCallback(async n=>{try{const r=await pe(n,a);f(r)}catch{l(`Failed to open task ${n}`,"error")}},[a,f,l]),ce=s.useCallback(async n=>{u(n),h(!0),w(null),p(null);const r=E.current+1;E.current=r;try{const d=await fe("project",n.path,a);if(E.current!==r)return;p(d.content)}catch(d){if(E.current!==r)return;const b=d instanceof Error?d.message:`Failed to open ${n.path}`;w(b),l(b,"error")}finally{E.current===r&&h(!1)}},[a,l]),re=s.useCallback(()=>{u(null),p(null),w(null),h(!1)},[]),oe=s.useCallback(n=>{M(r=>{const d=new Map(r),b=d.get(n)??!1;return d.set(n,!b),d})},[]),Q=c==="project"?te:ee,le=s.useCallback(async()=>{if(c==="project"){await U();return}await O()},[c,U,O]),K=c==="project"?q.length:v.length,W=c==="project"?t("documents.searchProjectFiles","Search project markdown files…"):t("documents.searchTaskDocuments","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(L,{size:20}),t("documents.title","Documents")]}),e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:K,plural:K!==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${c==="project"?" active":""}`,role:"tab","aria-selected":c==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>_("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:N.length})]}),e.jsxs("button",{className:`btn documents-tab${c==="tasks"?" active":""}`,role:"tab","aria-selected":c==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>_("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:$.length})]})]}),c==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>C(n=>!n),"aria-pressed":m,"aria-label":m?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:m?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[m?e.jsx(je,{size:14}):e.jsx(xe,{size:14}),m?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(we,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:W,value:o,onChange:se,"aria-label":W}),o&&e.jsx("button",{className:"documents-search-clear",onClick:ne,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(ke,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:Q?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:c==="project"?t("documents.projectFiles","project files"):t("documents.taskDocuments","task documents"),error:Q})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void le(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(ge,{size:16}),t("documents.retry","Retry")]})]}):c==="project"?H&&N.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingProjectFiles","Loading project markdown files…")})}):q.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${T?" documents-project-layout--mobile":""}`,children:[(!T||!i)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:q.map(n=>{const r=i?.path===n.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 ce(n),"aria-label":`Open ${n.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:n.name}),e.jsx("span",{className:"markdown-file-item-path",children:n.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[ye(n.size)," · ",I(n.mtime)]})]})},n.path)})})}),(!T||i)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[T&&i&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:re,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(be,{size:14}),t("documents.backToFiles","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(n=>!n),"aria-label":S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":S,title:S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:S?t("documents.markdown","Markdown"):t("documents.plain","Plain")})]}),g?e.jsx("p",{className:"documents-content-state",children:t("documents.loadingFileContent","Loading file content…")}):y?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:y}):S?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:F??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:F??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):A&&v.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingTaskDocuments","Loading task documents…")})}):$.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:$.map(({taskId:n,taskTitle:r,documents:d})=>e.jsx(Pe,{taskId:n,taskTitle:r,documents:d,onOpenTask:ae,renderMarkdownStates:P,onToggleMarkdown:oe},n))})})})]})}export{He as DocumentsView};
1
+ import{r as s,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as G,a8 as X,a9 as ue,aa as me,ab as V,ac as he,f as pe,ad as fe,F as L,ae as je,af as xe,S as we,X as ke,R as ge,ag as be,ah as Y,ai as J,a as Z,b as ve,aj as Ne}from"./index-2kYpdJrx.js";import{u as B}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";function Ce(a){const{projectId:l,searchQuery:f,includeProjectFiles:t=!0}=a??{},c=l?`${ue.DOCUMENTS_PREFIX}${l}`:null,[j,o]=s.useState(()=>{if(!c)return[];const w=G(c,{maxAgeMs:X});return Array.isArray(w)?w:[]}),[x,i]=s.useState([]),[u,m]=s.useState(()=>j.length===0),[C,F]=s.useState(null),p=s.useRef(null),g=s.useRef(j.length>0),h=s.useRef(null),y=s.useCallback(async()=>{p.current&&p.current.abort();const w=new AbortController;p.current=w;const T=!g.current;T&&m(!0),F(null);const D=me(f?{q:f}:void 0,l),E=t?V(l):Promise.resolve({files:[]}),[k,S]=await Promise.allSettled([D,E]);if(w.signal.aborted)return;let R=null;if(k.status==="fulfilled"){if(o(k.value),c){const P=k.value.length>500?k.value.slice(0,500):k.value;he(c,P,{maxBytes:5e5})}g.current=!0}else R=k.reason instanceof Error?k.reason.message:String(k.reason);if(S.status==="fulfilled"){const P=S.value.files,M=f?.trim().toLowerCase(),z=M?P.filter(v=>v.name.toLowerCase().includes(M)||v.path.toLowerCase().includes(M)):P;i(z)}F(R),T&&m(!1)},[c,t,l,f]);return s.useEffect(()=>{if(!c){g.current=!1,o([]),m(!0);return}const w=G(c,{maxAgeMs:X});Array.isArray(w)?(o(w),g.current=!0,m(!1)):(g.current=!1,o([]),m(!0))},[c]),s.useEffect(()=>(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{y()},300),()=>{h.current&&clearTimeout(h.current)}),[y]),s.useEffect(()=>(y(),()=>{p.current&&p.current.abort()}),[]),{documents:j,projectFiles:x,loading:u,error:C,refresh:y}}function Se(a,l){const[f,t]=s.useState([]),[c,j]=s.useState(!0),[o,x]=s.useState(null),i=s.useRef(null),u=s.useRef(!1),m=l?.showHidden??!1,C=s.useCallback(async F=>{i.current&&i.current.abort();const p=new AbortController;i.current=p;const g=!u.current;g&&j(!0),x(null);try{const h=await V(a,{showHidden:F?.showHidden??m});if(p.signal.aborted)return;t(h.files),u.current=!0}catch(h){if(p.signal.aborted)return;x(h instanceof Error?h.message:String(h))}finally{!p.signal.aborted&&g&&j(!1)}},[a,m]);return s.useEffect(()=>(u.current=!1,C({showHidden:m}),()=>{i.current&&i.current.abort()}),[C,m]),{files:f,loading:c,error:o,refresh:C}}const Fe=768;function I(a){return a?new Date(a).toLocaleString():""}function ye(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function Te(a,l=200){return a.length<=l?a:`${a.substring(0,l)}…`}function Ee({document:a,renderMarkdown:l,onToggleMarkdown:f}){const{t}=B("app"),[c,j]=s.useState(!1),o=Te(a.content),x=a.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(L,{size:14}),e.jsx("span",{className:"document-card-key-text",children:a.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",a.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>j(i=>!i),title:c?t("documents.collapse","Collapse"):t("documents.expand","Expand"),"aria-label":c?t("documents.collapseContent","Collapse content"):t("documents.expandContent","Expand content"),children:c?e.jsx(Ne,{size:14}):e.jsx(Z,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:a.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:I(a.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${c?" document-card-content--expanded":""}`,children:[c?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:f,"aria-label":l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":l,title:l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:l?t("documents.markdown","Markdown"):t("documents.plain","Plain")})}),l?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:a.content})})}):e.jsx("pre",{className:"document-card-content-text",children:a.content})]}):e.jsx("p",{className:"document-card-preview",children:o}),x&&!c&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function Pe({taskId:a,taskTitle:l,documents:f,onOpenTask:t,renderMarkdownStates:c,onToggleMarkdown:j}){const{t:o}=B("app"),[x,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(u=>!u),"aria-expanded":x,"aria-label":`${x?o("documents.collapse","Collapse"):o("documents.expand","Expand")} documents for task ${a}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:x?e.jsx(Z,{size:16}):e.jsx(ve,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:a}),e.jsx("span",{className:"documents-group-task-title",children:l||o("documents.untitled","Untitled")})]}),e.jsx("span",{className:"documents-group-count",children:o("documents.docCount","{{count}} doc{{plural}}",{count:f.length,plural:f.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>t(a),"aria-label":`Open task ${a}: ${l||o("documents.untitled","Untitled")}`,children:o("documents.openTask","Open task")})]}),x&&e.jsx("div",{className:"documents-group-content",children:f.map(u=>e.jsx(Ee,{document:u,renderMarkdown:c.get(u.id)??!1,onToggleMarkdown:()=>j(u.id)},u.id))})]})}function He({projectId:a,addToast:l,onOpenDetail:f}){const{t}=B("app"),[c,j]=s.useState("project"),[o,x]=s.useState(""),[i,u]=s.useState(null),[m,C]=s.useState(!1),[F,p]=s.useState(null),[g,h]=s.useState(!1),[y,w]=s.useState(null),[T,D]=s.useState(!1),E=s.useRef(0),k=s.useRef(!1),[S,R]=s.useState(!1),[P,M]=s.useState(new Map),z=c==="tasks"?o.trim():"",{documents:v,loading:A,error:ee,refresh:O}=Ce({projectId:a,searchQuery:z||void 0,includeProjectFiles:!1}),{files:N,loading:H,error:te,refresh:U}=Se(a,{showHidden:m});s.useEffect(()=>{const n=()=>{D(window.innerWidth<=Fe)};return n(),window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)}},[]),s.useEffect(()=>{k.current=!1,j("project"),u(null),C(!1),p(null),w(null),h(!1),R(!1),M(new Map)},[a]),s.useEffect(()=>{k.current||A||H||(N.length>0?j("project"):v.length>0&&j("tasks"),k.current=!0)},[v.length,A,N.length,H]);const $=s.useMemo(()=>{const n=new Map;for(const r of v){const d=n.get(r.taskId)||[];n.set(r.taskId,[...d,r])}return Array.from(n.entries()).map(([r,d])=>{const b=[...d].sort((ie,de)=>de.updatedAt.localeCompare(ie.updatedAt));return{taskId:r,taskTitle:b[0]?.taskTitle,documents:b,latestUpdated:b[0]?.updatedAt??""}}).sort((r,d)=>d.latestUpdated.localeCompare(r.latestUpdated))},[v]),q=s.useMemo(()=>{const n=o.trim().toLowerCase();return n?N.filter(r=>{const d=r.path.toLowerCase(),b=r.name.toLowerCase();return d.includes(n)||b.includes(n)}):N},[N,o]);s.useEffect(()=>{if(!i)return;N.some(r=>r.path===i.path)||(u(null),p(null),w(null),h(!1))},[N,i]);const se=s.useCallback(n=>{x(n.target.value)},[]),ne=s.useCallback(()=>{x("")},[]),_=s.useCallback(n=>{j(n)},[]),ae=s.useCallback(async n=>{try{const r=await pe(n,a);f(r)}catch{l(`Failed to open task ${n}`,"error")}},[a,f,l]),ce=s.useCallback(async n=>{u(n),h(!0),w(null),p(null);const r=E.current+1;E.current=r;try{const d=await fe("project",n.path,a);if(E.current!==r)return;p(d.content)}catch(d){if(E.current!==r)return;const b=d instanceof Error?d.message:`Failed to open ${n.path}`;w(b),l(b,"error")}finally{E.current===r&&h(!1)}},[a,l]),re=s.useCallback(()=>{u(null),p(null),w(null),h(!1)},[]),oe=s.useCallback(n=>{M(r=>{const d=new Map(r),b=d.get(n)??!1;return d.set(n,!b),d})},[]),Q=c==="project"?te:ee,le=s.useCallback(async()=>{if(c==="project"){await U();return}await O()},[c,U,O]),K=c==="project"?q.length:v.length,W=c==="project"?t("documents.searchProjectFiles","Search project markdown files…"):t("documents.searchTaskDocuments","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(L,{size:20}),t("documents.title","Documents")]}),e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:K,plural:K!==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${c==="project"?" active":""}`,role:"tab","aria-selected":c==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>_("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:N.length})]}),e.jsxs("button",{className:`btn documents-tab${c==="tasks"?" active":""}`,role:"tab","aria-selected":c==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>_("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:$.length})]})]}),c==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>C(n=>!n),"aria-pressed":m,"aria-label":m?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:m?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[m?e.jsx(je,{size:14}):e.jsx(xe,{size:14}),m?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(we,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:W,value:o,onChange:se,"aria-label":W}),o&&e.jsx("button",{className:"documents-search-clear",onClick:ne,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(ke,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:Q?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:c==="project"?t("documents.projectFiles","project files"):t("documents.taskDocuments","task documents"),error:Q})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void le(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(ge,{size:16}),t("documents.retry","Retry")]})]}):c==="project"?H&&N.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingProjectFiles","Loading project markdown files…")})}):q.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${T?" documents-project-layout--mobile":""}`,children:[(!T||!i)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:q.map(n=>{const r=i?.path===n.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 ce(n),"aria-label":`Open ${n.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:n.name}),e.jsx("span",{className:"markdown-file-item-path",children:n.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[ye(n.size)," · ",I(n.mtime)]})]})},n.path)})})}),(!T||i)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[T&&i&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:re,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(be,{size:14}),t("documents.backToFiles","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(n=>!n),"aria-label":S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":S,title:S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:S?t("documents.markdown","Markdown"):t("documents.plain","Plain")})]}),g?e.jsx("p",{className:"documents-content-state",children:t("documents.loadingFileContent","Loading file content…")}):y?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:y}):S?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:F??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:F??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):A&&v.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingTaskDocuments","Loading task documents…")})}):$.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:$.map(({taskId:n,taskTitle:r,documents:d})=>e.jsx(Pe,{taskId:n,taskTitle:r,documents:d,onOpenTask:ae,renderMarkdownStates:P,onToggleMarkdown:oe},n))})})})]})}export{He as DocumentsView};
@@ -1 +1 @@
1
- import{r as l,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as P,a8 as F,a9 as D,aP as W,aQ as G,ac as V,aR as Q,x as Y,ax as J,R as Z,aB as ee}from"./index-CW4OzecJ.js";import{u as se}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const ae=300,te=15e3;function B(r){if(!r.trim())return;const s=Number(r);return Number.isFinite(s)?s:void 0}function k(...r){for(const s of r)if(Array.isArray(s))return s;return[]}function p(r){return typeof r=="object"&&r!==null?r:{}}function H(r){const s=p(r),m=p(s.taskSnapshot);return{id:String(s.id??s.evalId??""),runId:String(s.runId??s.batchId??""),taskId:String(s.taskId??m.taskId??""),taskTitle:String(m.title??s.taskTitle??s.title??"Untitled task"),createdAt:String(s.createdAt??s.timestamp??s.updatedAt??new Date(0).toISOString()),overallScore:typeof s.overallScore=="number"?s.overallScore:null,maxScore:typeof s.maxScore=="number"?s.maxScore:null,categoryScores:k(s.categoryScores,p(s.scores).categories)}}function le(r){const s=p(r);return{...H(s),rationale:String(s.rationale??s.summary??""),evidence:k(s.evidence,p(s.details).evidence),followUps:k(s.followUps,p(s.recommendations).followUps)}}function re(r){const s=r?.projectId,m=s??"",t=`${D.EVALS_RUNS_PREFIX}${m}`,h=`${D.EVALS_RESULTS_PREFIX}${m}`,f=P(t,{maxAgeMs:F}),v=P(h,{maxAgeMs:F}),S=l.useRef(Array.isArray(f)&&f.length>0||Array.isArray(v)&&v.length>0),[o,g]=l.useState({q:"",runId:"",scoreMin:"",scoreMax:""}),[A,w]=l.useState(()=>Array.isArray(f)?f:[]),[i,M]=l.useState(()=>Array.isArray(v)?v:[]),[u,N]=l.useState(null),[L,b]=l.useState(null),[a,d]=l.useState(0),[y,j]=l.useState(!S.current),[K,q]=l.useState(null),C=l.useRef(0),z=l.useRef(s),T=l.useRef(u);T.current=u;const I=l.useCallback(async()=>{const n=++C.current;S.current||j(!0),q(null);try{const[c,x]=await Promise.all([W({q:o.q||void 0,runId:o.runId||void 0,scoreMin:B(o.scoreMin),scoreMax:B(o.scoreMax),limit:100,offset:0},s),G(s)]);if(n!==C.current)return;const E=k(c.results,c.evals,c.items).map(H);M(E),V(h,E.length>500?E.slice(0,500):E,{maxBytes:5e5}),d(typeof c.count=="number"?c.count:E.length);const $=k(x.runs,x.items).map(U=>{const R=p(U),O=p(R.counts);return{id:String(R.id??""),createdAt:String(R.createdAt??""),completedAt:typeof R.completedAt=="string"?R.completedAt:void 0,status:String(R.status??"pending"),evaluatedTaskCount:typeof O.totalTasks=="number"?O.totalTasks:0}});w($),V(t,$,{maxBytes:5e5}),S.current=!0,T.current&&!E.some(U=>U.id===T.current)&&(N(null),b(null))}catch(c){if(n!==C.current)return;q(c instanceof Error?c.message:"Failed to load evals")}finally{n===C.current&&j(!1)}},[o.q,o.runId,o.scoreMax,o.scoreMin,s,h,t]),_=l.useCallback(async n=>{const c=await Q(n,s),x=c.result??c;b(le(x))},[s]);l.useEffect(()=>{if(z.current===s)return;z.current=s;const n=P(t,{maxAgeMs:F}),c=P(h,{maxAgeMs:F}),x=Array.isArray(n)&&n.length>0||Array.isArray(c)&&c.length>0;w(Array.isArray(n)?n:[]),M(Array.isArray(c)?c:[]),j(!x),S.current=x},[s,h,t]),l.useEffect(()=>{const n=window.setTimeout(()=>{I()},ae);return()=>window.clearTimeout(n)},[I]),l.useEffect(()=>{if(!u){b(null);return}_(u)},[_,u]),l.useEffect(()=>{const n=window.setInterval(()=>{I(),u&&_(u)},te);return()=>window.clearInterval(n)},[_,I,u]);const X=l.useCallback(n=>{T.current=n,N(n)},[]);return{loading:y,error:K,results:i,count:a,runs:A,filters:o,setFilters:g,refresh:I,selectedEvalId:u,setSelectedEvalId:X,selectedEval:L}}function he({projectId:r,onOpenSettings:s,onOpenTaskDetail:m}){const{t}=se("app"),{loading:h,error:f,results:v,runs:S,filters:o,setFilters:g,selectedEvalId:A,setSelectedEvalId:w,selectedEval:i,refresh:M}=re({projectId:r}),[u,N]=l.useState(!0);l.useEffect(()=>{let a=!1;return Y(r).then(d=>{if(a)return;const y=d.evalSettings?.enabled;N(y??!1)}).catch(()=>{a||N(!1)}),()=>{a=!0}},[r]);const L=v.length>0,b=l.useMemo(()=>v.find(a=>a.id===A)??null,[v,A]);return u?e.jsxs("section",{className:"evals-view","data-testid":"evals-view",children:[e.jsxs("div",{className:"evals-list card",children:[e.jsxs("div",{className:"evals-toolbar",children:[e.jsx("input",{className:"input",placeholder:t("evals.searchPlaceholder","Search task or rationale"),value:o.q,onChange:a=>g(d=>({...d,q:a.target.value}))}),e.jsxs("select",{className:"select",value:o.runId,onChange:a=>g(d=>({...d,runId:a.target.value})),children:[e.jsx("option",{value:"",children:t("evals.allRuns","All runs")}),S.map(a=>e.jsx("option",{value:a.id,children:a.id},a.id))]}),e.jsx("input",{className:"input",placeholder:t("evals.minScorePlaceholder","Min score"),value:o.scoreMin,onChange:a=>g(d=>({...d,scoreMin:a.target.value}))}),e.jsx("input",{className:"input",placeholder:t("evals.maxScorePlaceholder","Max score"),value:o.scoreMax,onChange:a=>g(d=>({...d,scoreMax:a.target.value}))}),e.jsx("button",{className:"btn btn-icon",type:"button",onClick:()=>void M(),"aria-label":t("evals.refreshAria","Refresh evals"),children:e.jsx(Z,{size:16})})]}),h&&e.jsx("p",{className:"evals-state","data-testid":"evals-loading",children:t("evals.loading","Loading evals…")}),f&&e.jsx("p",{className:"evals-state evals-state--error",children:f}),!h&&!f&&!L&&e.jsx("p",{className:"evals-state",children:t("evals.empty","No evals yet. Scheduled evals review tasks completed since the last run.")}),e.jsx("ul",{className:"evals-results","data-testid":"evals-results",children:v.map(a=>e.jsx("li",{children:e.jsxs("button",{className:`evals-result ${a.id===A?"evals-result--active":""}`,type:"button",onClick:()=>w(a.id),children:[e.jsx("span",{className:"evals-result-title",children:a.taskTitle}),e.jsxs("span",{className:"evals-result-meta",children:[a.taskId," · ",a.runId," · ",a.overallScore??t("evals.naPlaceholder","n/a")]})]})},a.id))})]}),e.jsxs("div",{className:"evals-detail card","data-testid":"evals-detail",children:[!i&&e.jsx("p",{className:"evals-state",children:t("evals.selectPrompt","Select an evaluation to inspect scores, rationale, and evidence.")}),i&&e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"evals-detail-title",children:b?.taskTitle??i.taskTitle}),e.jsxs("p",{className:"evals-result-meta",children:[i.taskId," · ",i.runId]}),e.jsx("p",{className:"evals-score",children:t("evals.overallScore","Overall score: {{score}}",{score:i.overallScore??t("evals.naPlaceholder","n/a")})}),e.jsx("ul",{className:"evals-categories",children:i.categoryScores.map(a=>e.jsxs("li",{children:[a.category,": ",a.finalScore]},a.category))}),e.jsx("p",{className:"evals-rationale",children:i.rationale||t("evals.noRationale","No rationale recorded.")}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.evidenceHeading","Evidence")}),e.jsx("ul",{className:"evals-links",children:i.evidence.map((a,d)=>{const y=typeof a.metadata?.taskId=="string"?a.metadata.taskId:void 0,j=typeof a.metadata?.url=="string"?a.metadata.url:void 0;return e.jsx("li",{children:y?e.jsx("button",{type:"button",className:"btn",onClick:()=>m?.(y),children:a.ref}):j?e.jsxs("a",{href:j,target:"_blank",rel:"noreferrer",className:"evals-external-link",children:[a.ref,e.jsx(ee,{size:14})]}):e.jsx("span",{children:a.ref})},`${a.ref}-${d}`)})})]}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.suggestedFollowupsHeading","Suggested follow-up tasks")}),e.jsxs("ul",{className:"evals-follow-ups",children:[i.followUps.length===0&&e.jsx("li",{children:t("evals.noFollowups","None")}),i.followUps.map(a=>e.jsxs("li",{children:[e.jsx("strong",{children:a.title}),e.jsx("p",{children:a.rationale})]},a.suggestionId))]})]})]})]})]}):e.jsxs("section",{className:"evals-view card","data-testid":"evals-disabled",children:[e.jsx("h2",{className:"evals-title",children:t("evals.disabledTitle","Scheduled evals are disabled")}),e.jsx("p",{className:"evals-empty-copy",children:t("evals.enablePrompt","Enable Scheduled Evals to review scored tasks, evidence, and follow-up recommendations.")}),e.jsxs("button",{className:"btn btn-primary",type:"button",onClick:()=>s?.("scheduled-evals"),children:[e.jsx(J,{size:16}),t("evals.openSettings","Open Scheduled Evals Settings")]})]})}export{he as EvalsView};
1
+ import{r as l,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as P,a8 as F,a9 as D,aP as W,aQ as G,ac as V,aR as Q,x as Y,ax as J,R as Z,aB as ee}from"./index-2kYpdJrx.js";import{u as se}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const ae=300,te=15e3;function B(r){if(!r.trim())return;const s=Number(r);return Number.isFinite(s)?s:void 0}function k(...r){for(const s of r)if(Array.isArray(s))return s;return[]}function p(r){return typeof r=="object"&&r!==null?r:{}}function H(r){const s=p(r),m=p(s.taskSnapshot);return{id:String(s.id??s.evalId??""),runId:String(s.runId??s.batchId??""),taskId:String(s.taskId??m.taskId??""),taskTitle:String(m.title??s.taskTitle??s.title??"Untitled task"),createdAt:String(s.createdAt??s.timestamp??s.updatedAt??new Date(0).toISOString()),overallScore:typeof s.overallScore=="number"?s.overallScore:null,maxScore:typeof s.maxScore=="number"?s.maxScore:null,categoryScores:k(s.categoryScores,p(s.scores).categories)}}function le(r){const s=p(r);return{...H(s),rationale:String(s.rationale??s.summary??""),evidence:k(s.evidence,p(s.details).evidence),followUps:k(s.followUps,p(s.recommendations).followUps)}}function re(r){const s=r?.projectId,m=s??"",t=`${D.EVALS_RUNS_PREFIX}${m}`,h=`${D.EVALS_RESULTS_PREFIX}${m}`,f=P(t,{maxAgeMs:F}),v=P(h,{maxAgeMs:F}),S=l.useRef(Array.isArray(f)&&f.length>0||Array.isArray(v)&&v.length>0),[o,g]=l.useState({q:"",runId:"",scoreMin:"",scoreMax:""}),[A,w]=l.useState(()=>Array.isArray(f)?f:[]),[i,M]=l.useState(()=>Array.isArray(v)?v:[]),[u,N]=l.useState(null),[L,b]=l.useState(null),[a,d]=l.useState(0),[y,j]=l.useState(!S.current),[K,q]=l.useState(null),C=l.useRef(0),z=l.useRef(s),T=l.useRef(u);T.current=u;const I=l.useCallback(async()=>{const n=++C.current;S.current||j(!0),q(null);try{const[c,x]=await Promise.all([W({q:o.q||void 0,runId:o.runId||void 0,scoreMin:B(o.scoreMin),scoreMax:B(o.scoreMax),limit:100,offset:0},s),G(s)]);if(n!==C.current)return;const E=k(c.results,c.evals,c.items).map(H);M(E),V(h,E.length>500?E.slice(0,500):E,{maxBytes:5e5}),d(typeof c.count=="number"?c.count:E.length);const $=k(x.runs,x.items).map(U=>{const R=p(U),O=p(R.counts);return{id:String(R.id??""),createdAt:String(R.createdAt??""),completedAt:typeof R.completedAt=="string"?R.completedAt:void 0,status:String(R.status??"pending"),evaluatedTaskCount:typeof O.totalTasks=="number"?O.totalTasks:0}});w($),V(t,$,{maxBytes:5e5}),S.current=!0,T.current&&!E.some(U=>U.id===T.current)&&(N(null),b(null))}catch(c){if(n!==C.current)return;q(c instanceof Error?c.message:"Failed to load evals")}finally{n===C.current&&j(!1)}},[o.q,o.runId,o.scoreMax,o.scoreMin,s,h,t]),_=l.useCallback(async n=>{const c=await Q(n,s),x=c.result??c;b(le(x))},[s]);l.useEffect(()=>{if(z.current===s)return;z.current=s;const n=P(t,{maxAgeMs:F}),c=P(h,{maxAgeMs:F}),x=Array.isArray(n)&&n.length>0||Array.isArray(c)&&c.length>0;w(Array.isArray(n)?n:[]),M(Array.isArray(c)?c:[]),j(!x),S.current=x},[s,h,t]),l.useEffect(()=>{const n=window.setTimeout(()=>{I()},ae);return()=>window.clearTimeout(n)},[I]),l.useEffect(()=>{if(!u){b(null);return}_(u)},[_,u]),l.useEffect(()=>{const n=window.setInterval(()=>{I(),u&&_(u)},te);return()=>window.clearInterval(n)},[_,I,u]);const X=l.useCallback(n=>{T.current=n,N(n)},[]);return{loading:y,error:K,results:i,count:a,runs:A,filters:o,setFilters:g,refresh:I,selectedEvalId:u,setSelectedEvalId:X,selectedEval:L}}function he({projectId:r,onOpenSettings:s,onOpenTaskDetail:m}){const{t}=se("app"),{loading:h,error:f,results:v,runs:S,filters:o,setFilters:g,selectedEvalId:A,setSelectedEvalId:w,selectedEval:i,refresh:M}=re({projectId:r}),[u,N]=l.useState(!0);l.useEffect(()=>{let a=!1;return Y(r).then(d=>{if(a)return;const y=d.evalSettings?.enabled;N(y??!1)}).catch(()=>{a||N(!1)}),()=>{a=!0}},[r]);const L=v.length>0,b=l.useMemo(()=>v.find(a=>a.id===A)??null,[v,A]);return u?e.jsxs("section",{className:"evals-view","data-testid":"evals-view",children:[e.jsxs("div",{className:"evals-list card",children:[e.jsxs("div",{className:"evals-toolbar",children:[e.jsx("input",{className:"input",placeholder:t("evals.searchPlaceholder","Search task or rationale"),value:o.q,onChange:a=>g(d=>({...d,q:a.target.value}))}),e.jsxs("select",{className:"select",value:o.runId,onChange:a=>g(d=>({...d,runId:a.target.value})),children:[e.jsx("option",{value:"",children:t("evals.allRuns","All runs")}),S.map(a=>e.jsx("option",{value:a.id,children:a.id},a.id))]}),e.jsx("input",{className:"input",placeholder:t("evals.minScorePlaceholder","Min score"),value:o.scoreMin,onChange:a=>g(d=>({...d,scoreMin:a.target.value}))}),e.jsx("input",{className:"input",placeholder:t("evals.maxScorePlaceholder","Max score"),value:o.scoreMax,onChange:a=>g(d=>({...d,scoreMax:a.target.value}))}),e.jsx("button",{className:"btn btn-icon",type:"button",onClick:()=>void M(),"aria-label":t("evals.refreshAria","Refresh evals"),children:e.jsx(Z,{size:16})})]}),h&&e.jsx("p",{className:"evals-state","data-testid":"evals-loading",children:t("evals.loading","Loading evals…")}),f&&e.jsx("p",{className:"evals-state evals-state--error",children:f}),!h&&!f&&!L&&e.jsx("p",{className:"evals-state",children:t("evals.empty","No evals yet. Scheduled evals review tasks completed since the last run.")}),e.jsx("ul",{className:"evals-results","data-testid":"evals-results",children:v.map(a=>e.jsx("li",{children:e.jsxs("button",{className:`evals-result ${a.id===A?"evals-result--active":""}`,type:"button",onClick:()=>w(a.id),children:[e.jsx("span",{className:"evals-result-title",children:a.taskTitle}),e.jsxs("span",{className:"evals-result-meta",children:[a.taskId," · ",a.runId," · ",a.overallScore??t("evals.naPlaceholder","n/a")]})]})},a.id))})]}),e.jsxs("div",{className:"evals-detail card","data-testid":"evals-detail",children:[!i&&e.jsx("p",{className:"evals-state",children:t("evals.selectPrompt","Select an evaluation to inspect scores, rationale, and evidence.")}),i&&e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"evals-detail-title",children:b?.taskTitle??i.taskTitle}),e.jsxs("p",{className:"evals-result-meta",children:[i.taskId," · ",i.runId]}),e.jsx("p",{className:"evals-score",children:t("evals.overallScore","Overall score: {{score}}",{score:i.overallScore??t("evals.naPlaceholder","n/a")})}),e.jsx("ul",{className:"evals-categories",children:i.categoryScores.map(a=>e.jsxs("li",{children:[a.category,": ",a.finalScore]},a.category))}),e.jsx("p",{className:"evals-rationale",children:i.rationale||t("evals.noRationale","No rationale recorded.")}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.evidenceHeading","Evidence")}),e.jsx("ul",{className:"evals-links",children:i.evidence.map((a,d)=>{const y=typeof a.metadata?.taskId=="string"?a.metadata.taskId:void 0,j=typeof a.metadata?.url=="string"?a.metadata.url:void 0;return e.jsx("li",{children:y?e.jsx("button",{type:"button",className:"btn",onClick:()=>m?.(y),children:a.ref}):j?e.jsxs("a",{href:j,target:"_blank",rel:"noreferrer",className:"evals-external-link",children:[a.ref,e.jsx(ee,{size:14})]}):e.jsx("span",{children:a.ref})},`${a.ref}-${d}`)})})]}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.suggestedFollowupsHeading","Suggested follow-up tasks")}),e.jsxs("ul",{className:"evals-follow-ups",children:[i.followUps.length===0&&e.jsx("li",{children:t("evals.noFollowups","None")}),i.followUps.map(a=>e.jsxs("li",{children:[e.jsx("strong",{children:a.title}),e.jsx("p",{children:a.rationale})]},a.suggestionId))]})]})]})]})]}):e.jsxs("section",{className:"evals-view card","data-testid":"evals-disabled",children:[e.jsx("h2",{className:"evals-title",children:t("evals.disabledTitle","Scheduled evals are disabled")}),e.jsx("p",{className:"evals-empty-copy",children:t("evals.enablePrompt","Enable Scheduled Evals to review scored tasks, evidence, and follow-up recommendations.")}),e.jsxs("button",{className:"btn btn-primary",type:"button",onClick:()=>s?.("scheduled-evals"),children:[e.jsx(J,{size:16}),t("evals.openSettings","Open Scheduled Evals Settings")]})]})}export{he as EvalsView};
@@ -1,4 +1,4 @@
1
- import{r,j as e}from"./vendor-react-D37HfzIf.js";import{bT as F,cM as V,cN as U,cO as K,cP as B,cQ as Q}from"./index-CW4OzecJ.js";import{u as R}from"./vendor-i18n-CV0mwX_-.js";function ve({value:c,onChange:m,projectId:p,disabled:h=!1,id:y,label:x="Skills"}){const{t:g}=R("app"),[n,d]=r.useState([]),[l,b]=r.useState(!0);r.useEffect(()=>{let t=!1;return b(!0),F(p).then(f=>{t||d(f)}).catch(()=>{t||d([])}).finally(()=>{t||b(!1)}),()=>{t=!0}},[p]);const S=t=>{c.includes(t)||m([...c,t])},u=t=>{m(c.filter(f=>f!==t))},k=t=>n.find(E=>E.id===t)?.name??t,j=n.filter(t=>!c.includes(t.id));return e.jsxs("div",{className:"skill-multiselect","data-testid":"skill-multiselect",children:[x&&e.jsx("label",{htmlFor:y?`${y}-select`:void 0,className:"skill-multiselect-label",children:x}),c.length>0&&e.jsx("div",{className:"skill-multiselect-chips","data-testid":"skill-chips",children:c.map(t=>e.jsxs("span",{className:"skill-chip","data-testid":`skill-chip-${t}`,children:[e.jsx("span",{className:"skill-chip-name",children:k(t)}),e.jsx("button",{type:"button",className:"skill-chip-remove",onClick:()=>u(t),disabled:h,"aria-label":g("skills.removeSkill","Remove {{name}}",{name:k(t)}),"data-testid":`remove-skill-${t}`,children:"×"})]},t))}),e.jsx("div",{className:"skill-multiselect-add",children:l?e.jsx("span",{className:"skill-multiselect-loading","data-testid":"skills-loading",children:g("skills.loading","Loading skills…")}):j.length===0?e.jsx("span",{className:"skill-multiselect-empty","data-testid":"skills-empty",children:c.length===0?g("skills.noSkillsDiscovered","No skills discovered"):g("skills.allSkillsSelected","All skills selected")}):e.jsxs("select",{id:y?`${y}-select`:void 0,className:"select skill-multiselect-dropdown",value:"",onChange:t=>{t.target.value&&(S(t.target.value),t.target.value="")},disabled:h,"data-testid":"skill-dropdown",children:[e.jsx("option",{value:"",children:g("skills.addSkill","Add a skill…")}),j.map(t=>e.jsx("option",{value:t.id,children:t.name},t.id))]})})]})}const $=/(?:^|\/)skills\/([^/]+)\/SKILL\.md$/i;function we(c){const m=c.trim();if(!m)return c;const p=m.match($);return p?.[1]?p[1]:m}const G=`# Soul: Chief Executive Officer
1
+ import{r,j as e}from"./vendor-react-D37HfzIf.js";import{bU as F,cN as V,cO as U,cP as K,cQ as B,cR as Q}from"./index-2kYpdJrx.js";import{u as R}from"./vendor-i18n-CV0mwX_-.js";function ve({value:c,onChange:m,projectId:p,disabled:h=!1,id:y,label:x="Skills"}){const{t:g}=R("app"),[n,d]=r.useState([]),[l,b]=r.useState(!0);r.useEffect(()=>{let t=!1;return b(!0),F(p).then(f=>{t||d(f)}).catch(()=>{t||d([])}).finally(()=>{t||b(!1)}),()=>{t=!0}},[p]);const S=t=>{c.includes(t)||m([...c,t])},u=t=>{m(c.filter(f=>f!==t))},k=t=>n.find(E=>E.id===t)?.name??t,j=n.filter(t=>!c.includes(t.id));return e.jsxs("div",{className:"skill-multiselect","data-testid":"skill-multiselect",children:[x&&e.jsx("label",{htmlFor:y?`${y}-select`:void 0,className:"skill-multiselect-label",children:x}),c.length>0&&e.jsx("div",{className:"skill-multiselect-chips","data-testid":"skill-chips",children:c.map(t=>e.jsxs("span",{className:"skill-chip","data-testid":`skill-chip-${t}`,children:[e.jsx("span",{className:"skill-chip-name",children:k(t)}),e.jsx("button",{type:"button",className:"skill-chip-remove",onClick:()=>u(t),disabled:h,"aria-label":g("skills.removeSkill","Remove {{name}}",{name:k(t)}),"data-testid":`remove-skill-${t}`,children:"×"})]},t))}),e.jsx("div",{className:"skill-multiselect-add",children:l?e.jsx("span",{className:"skill-multiselect-loading","data-testid":"skills-loading",children:g("skills.loading","Loading skills…")}):j.length===0?e.jsx("span",{className:"skill-multiselect-empty","data-testid":"skills-empty",children:c.length===0?g("skills.noSkillsDiscovered","No skills discovered"):g("skills.allSkillsSelected","All skills selected")}):e.jsxs("select",{id:y?`${y}-select`:void 0,className:"select skill-multiselect-dropdown",value:"",onChange:t=>{t.target.value&&(S(t.target.value),t.target.value="")},disabled:h,"data-testid":"skill-dropdown",children:[e.jsx("option",{value:"",children:g("skills.addSkill","Add a skill…")}),j.map(t=>e.jsx("option",{value:t.id,children:t.name},t.id))]})})]})}const $=/(?:^|\/)skills\/([^/]+)\/SKILL\.md$/i;function we(c){const m=c.trim();if(!m)return c;const p=m.match($);return p?.[1]?p[1]:m}const G=`# Soul: Chief Executive Officer
2
2
 
3
3
  I am a strategic leader who connects every decision to business outcomes.
4
4
 
@@ -1,2 +1,2 @@
1
- import{r as o,j as e}from"./vendor-react-D37HfzIf.js";import{J as it,av as ot,ah as lt,ai as nt,cE as rt,cF as ct}from"./index-CW4OzecJ.js";import{u as dt}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const ut=5,gt=3,mt=280;function H(n){return!!(n&&typeof n=="object"&&"code"in n&&n.code==="ACTIVE_GOAL_LIMIT_EXCEEDED")}function jt({initialGoals:n,anchorGoalId:m}){const{t:a}=dt("app"),[g,h]=o.useState(()=>n??[]),[W,v]=o.useState(null),d=o.useRef(null),[x,C]=o.useState(n===void 0),[T,r]=o.useState(null),[J,A]=o.useState(!1),[f,D]=o.useState(""),[G,j]=o.useState(""),[$,c]=o.useState(null),[k,L]=o.useState(!1),[b,y]=o.useState(!1),[N,F]=o.useState(null),[I,E]=o.useState(""),[O,w]=o.useState(""),[P,p]=o.useState(null),[R,_]=o.useState(!1),[B,X]=o.useState(()=>new Set);o.useEffect(()=>{if(n!==void 0)return;let t=!0;return(async()=>{try{C(!0),r(null);const i=await fetch("/api/goals");if(!i.ok)throw new Error(`Failed to load goals (${i.status})`);const l=await i.json();if(!t)return;h(Array.isArray(l.goals)?l.goals:[])}catch{if(!t)return;r(a("goals.loadError","Unable to load goals right now. Please try again."))}finally{t&&C(!1)}})(),()=>{t=!1}},[n]);const S=o.useMemo(()=>g.filter(t=>t.status==="active").length,[g]),K=S>=gt&&S<=ut;o.useEffect(()=>{if(!m){v(null);return}const t=document.getElementById(`goal-card-${m}`);if(t)return v(m),typeof t.scrollIntoView=="function"&&t.scrollIntoView({behavior:"smooth",block:"center"}),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{v(s=>s===m?null:s),d.current=null},1600),()=>{d.current&&(clearTimeout(d.current),d.current=null)}},[m,g]);function z(){r(null),c(null),A(!0)}function Q(t){F(t.id),E(t.title),w(t.description??""),p(null)}function M(){F(null),E(""),w(""),p(null)}function U(){A(!1),D(""),j(""),c(null),y(!1)}async function Y(){const t=f.trim();if(!t){c(a("goals.titleRequired","Title is required."));return}try{y(!0),c(null);const s=await rt(t);j(s)}catch(s){c(ct(s))}finally{y(!1)}}async function Z(){const t=f.trim();if(!t){c(a("goals.titleRequired","Title is required."));return}try{L(!0),c(null),r(null);const s=await fetch("/api/goals",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:t,description:G})});if(s.ok){const l=await s.json();h(u=>[...u,l]),U();return}let i=null;try{i=await s.json()}catch{i=null}if(s.status===409&&H(i)){r(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}c(a("goals.createError","Unable to create goal right now. Please try again."))}catch{c(a("goals.createError","Unable to create goal right now. Please try again."))}finally{L(!1)}}async function tt(){if(!N)return;const t=I.trim();if(!t){p(a("goals.titleRequired","Title is required."));return}try{_(!0),p(null);const s=await fetch(`/api/goals/${N}`,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({title:t,description:O})});if(!s.ok)throw new Error(`Failed to update goal (${s.status})`);const i=await s.json();h(l=>l.map(u=>u.id===i.id?i:u)),M()}catch{p(a("goals.saveError","Unable to save goal right now. Please try again."))}finally{_(!1)}}function et(t){return t.length>mt||t.includes(`
1
+ import{r as o,j as e}from"./vendor-react-D37HfzIf.js";import{J as it,av as ot,ah as lt,ai as nt,cF as rt,cG as ct}from"./index-2kYpdJrx.js";import{u as dt}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const ut=5,gt=3,mt=280;function H(n){return!!(n&&typeof n=="object"&&"code"in n&&n.code==="ACTIVE_GOAL_LIMIT_EXCEEDED")}function jt({initialGoals:n,anchorGoalId:m}){const{t:a}=dt("app"),[g,h]=o.useState(()=>n??[]),[W,v]=o.useState(null),d=o.useRef(null),[x,C]=o.useState(n===void 0),[T,r]=o.useState(null),[J,A]=o.useState(!1),[f,D]=o.useState(""),[G,j]=o.useState(""),[$,c]=o.useState(null),[k,L]=o.useState(!1),[b,y]=o.useState(!1),[N,F]=o.useState(null),[I,E]=o.useState(""),[O,w]=o.useState(""),[P,p]=o.useState(null),[R,_]=o.useState(!1),[B,X]=o.useState(()=>new Set);o.useEffect(()=>{if(n!==void 0)return;let t=!0;return(async()=>{try{C(!0),r(null);const i=await fetch("/api/goals");if(!i.ok)throw new Error(`Failed to load goals (${i.status})`);const l=await i.json();if(!t)return;h(Array.isArray(l.goals)?l.goals:[])}catch{if(!t)return;r(a("goals.loadError","Unable to load goals right now. Please try again."))}finally{t&&C(!1)}})(),()=>{t=!1}},[n]);const S=o.useMemo(()=>g.filter(t=>t.status==="active").length,[g]),K=S>=gt&&S<=ut;o.useEffect(()=>{if(!m){v(null);return}const t=document.getElementById(`goal-card-${m}`);if(t)return v(m),typeof t.scrollIntoView=="function"&&t.scrollIntoView({behavior:"smooth",block:"center"}),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{v(s=>s===m?null:s),d.current=null},1600),()=>{d.current&&(clearTimeout(d.current),d.current=null)}},[m,g]);function z(){r(null),c(null),A(!0)}function Q(t){F(t.id),E(t.title),w(t.description??""),p(null)}function M(){F(null),E(""),w(""),p(null)}function U(){A(!1),D(""),j(""),c(null),y(!1)}async function Y(){const t=f.trim();if(!t){c(a("goals.titleRequired","Title is required."));return}try{y(!0),c(null);const s=await rt(t);j(s)}catch(s){c(ct(s))}finally{y(!1)}}async function Z(){const t=f.trim();if(!t){c(a("goals.titleRequired","Title is required."));return}try{L(!0),c(null),r(null);const s=await fetch("/api/goals",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:t,description:G})});if(s.ok){const l=await s.json();h(u=>[...u,l]),U();return}let i=null;try{i=await s.json()}catch{i=null}if(s.status===409&&H(i)){r(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}c(a("goals.createError","Unable to create goal right now. Please try again."))}catch{c(a("goals.createError","Unable to create goal right now. Please try again."))}finally{L(!1)}}async function tt(){if(!N)return;const t=I.trim();if(!t){p(a("goals.titleRequired","Title is required."));return}try{_(!0),p(null);const s=await fetch(`/api/goals/${N}`,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({title:t,description:O})});if(!s.ok)throw new Error(`Failed to update goal (${s.status})`);const i=await s.json();h(l=>l.map(u=>u.id===i.id?i:u)),M()}catch{p(a("goals.saveError","Unable to save goal right now. Please try again."))}finally{_(!1)}}function et(t){return t.length>mt||t.includes(`
2
2
  `)}function at(t){X(s=>{const i=new Set(s);return i.has(t)?i.delete(t):i.add(t),i})}async function q(t){const s=t.status==="active"?`/api/goals/${t.id}/archive`:`/api/goals/${t.id}/unarchive`;try{r(null);const i=await fetch(s,{method:"POST"});if(i.ok){const u=await i.json();h(st=>st.map(V=>V.id===u.id?u:V));return}let l=null;try{l=await i.json()}catch{l=null}if(i.status===409&&H(l)){r(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}r(a("goals.updateError","Unable to update goal status right now. Please try again."))}catch{r(a("goals.updateError","Unable to update goal status right now. Please try again."))}}return e.jsxs("section",{className:"goals-view","data-testid":"goals-view",children:[e.jsxs("header",{className:"goals-header",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"goals-title",children:a("goals.title","Goals")}),e.jsx("p",{className:"goals-count","data-testid":"goals-active-count",children:a("goals.activeCount","{{count}} active goals",{count:S})})]}),e.jsxs("button",{type:"button",className:"btn btn-primary goals-add-button",onClick:z,"data-testid":"goals-add-button",children:[e.jsx(it,{"aria-hidden":"true"}),a("goals.addGoal","Add Goal")]})]}),J?e.jsxs("div",{className:"card goals-form","data-testid":"goals-form",children:[e.jsx("label",{className:"goals-form-label",htmlFor:"goals-form-title",children:a("goals.labelTitle","Title")}),e.jsx("input",{id:"goals-form-title",className:"input",type:"text",value:f,maxLength:200,onChange:t=>D(t.target.value),"data-testid":"goals-form-title"}),e.jsxs("div",{className:"goals-form-label-row",children:[e.jsx("label",{className:"goals-form-label",htmlFor:"goals-form-description",children:a("goals.labelDescription","Description")}),e.jsxs("button",{type:"button",className:"btn goals-form-draft-button",onClick:()=>void Y(),disabled:!f.trim()||b,"data-testid":"goals-form-draft-ai",children:[e.jsx(ot,{"aria-hidden":"true"}),b?a("goals.drafting","Drafting…"):a("goals.draftWithAi","Draft with AI")]})]}),e.jsx("textarea",{id:"goals-form-description",className:"input",value:G,maxLength:5e3,onChange:t=>j(t.target.value),"data-testid":"goals-form-description"}),$?e.jsx("p",{className:"form-error goals-error",role:"alert",children:$}):null,e.jsxs("div",{className:"goals-form-actions",children:[e.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void Z(),disabled:k||b,"data-testid":"goals-form-submit",children:a("actions.save","Save")}),e.jsx("button",{type:"button",className:"btn",onClick:U,disabled:k||b,"data-testid":"goals-form-cancel",children:a("actions.cancel","Cancel")})]})]}):null,K?e.jsx("p",{className:"goals-warning",role:"status",children:a("goals.capWarning","Approaching the 5-active goal cap. Keep active goals focused.")}):null,T?e.jsx("p",{className:"form-error goals-error",role:"alert","data-testid":"goals-error",children:T}):null,x?e.jsx("p",{className:"goals-loading",role:"status","data-testid":"goals-loading",children:a("goals.loading","Loading goals…")}):null,!x&&g.length===0?e.jsx("div",{className:"goals-empty card","data-testid":"goals-empty-state",children:a("goals.emptyState","No goals yet. Add one to begin tracking strategic outcomes.")}):null,!x&&g.length>0?e.jsx("div",{className:"goals-list","data-testid":"goals-list",children:g.map(t=>e.jsx("article",{id:`goal-card-${t.id}`,className:`card goals-card ${t.status==="archived"?"goals-card-archived":""} ${W===t.id?"goals-card--anchored":""}`.trim(),"data-testid":`goal-card-${t.id}`,children:N===t.id?e.jsxs("div",{className:"goals-card-main goals-card-edit",children:[e.jsx("label",{className:"goals-form-label",htmlFor:`goal-edit-title-${t.id}`,children:a("goals.labelTitle","Title")}),e.jsx("input",{id:`goal-edit-title-${t.id}`,className:"input",type:"text",value:I,maxLength:200,onChange:s=>E(s.target.value),"data-testid":`goal-edit-title-${t.id}`}),e.jsx("label",{className:"goals-form-label",htmlFor:`goal-edit-description-${t.id}`,children:a("goals.labelDescription","Description")}),e.jsx("textarea",{id:`goal-edit-description-${t.id}`,className:"input",value:O,maxLength:5e3,onChange:s=>w(s.target.value),"data-testid":`goal-edit-description-${t.id}`}),P?e.jsx("p",{className:"form-error goals-error",role:"alert",children:P}):null,e.jsxs("div",{className:"goals-card-actions",children:[e.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void tt(),disabled:R,"data-testid":`goal-edit-save-${t.id}`,children:a("actions.save","Save")}),e.jsx("button",{type:"button",className:"btn",onClick:M,disabled:R,"data-testid":`goal-edit-cancel-${t.id}`,children:a("actions.cancel","Cancel")})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"goals-card-main",children:[e.jsx("h3",{className:"goals-card-title",children:t.title}),t.description?(()=>{const s=et(t.description),i=B.has(t.id);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:`markdown-body goals-card-description ${s&&!i?"goals-card-description-collapsed":""}`.trim(),children:e.jsx(lt,{remarkPlugins:[nt],children:t.description})}),s?e.jsx("button",{type:"button",className:"btn goals-card-description-toggle","aria-expanded":i,"data-testid":`goal-description-toggle-${t.id}`,onClick:()=>at(t.id),children:i?a("actions.showLess","Show less"):a("actions.showMore","Show more")}):null]})})():null,e.jsxs("p",{className:"goals-card-status",children:[a("goals.status","Status"),": ",t.status]})]}),e.jsxs("div",{className:"goals-card-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>Q(t),"data-testid":`goal-edit-${t.id}`,children:a("actions.edit","Edit")}),t.status==="active"?e.jsx("button",{type:"button",className:"btn goals-activate-button",onClick:()=>void q(t),"data-testid":`goal-archive-${t.id}`,children:a("goals.archive","Archive")}):e.jsx("button",{type:"button",className:"btn goals-activate-button",onClick:()=>void q(t),"data-testid":`goal-unarchive-${t.id}`,children:a("goals.unarchive","Unarchive")})]})]})},t.id))}):null]})}export{jt as GoalsView};
@@ -1,4 +1,4 @@
1
- import{r as c,j as e}from"./vendor-react-D37HfzIf.js";import{c as ze,a7 as ce,a8 as Se,a9 as ke,ak as Ce,al as We,ac as je,am as Ke,an as Ye,ao as Ve,ap as Je,aq as Qe,ar as Ze,as as Me,at as es,i as ss,au as Ae,av as I,A as ts,X as Ie,aw as me,R as N,ax as is,m as ns,C as _e,ay as le,az as Ne,aA as as,J as Le,aB as rs,aC as De,aD as cs}from"./index-CW4OzecJ.js";import{u as Pe}from"./vendor-i18n-CV0mwX_-.js";import{U as Ee}from"./users-B13HD4Tp.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";/**
1
+ import{r as c,j as e}from"./vendor-react-D37HfzIf.js";import{c as ze,a7 as ce,a8 as Se,a9 as ke,ak as Ce,al as We,ac as je,am as Ke,an as Ye,ao as Ve,ap as Je,aq as Qe,ar as Ze,as as Me,at as es,i as ss,au as Ae,av as I,A as ts,X as Ie,aw as me,R as N,ax as is,m as ns,C as _e,ay as le,az as Ne,aA as as,J as Le,aB as rs,aC as De,aD as cs}from"./index-2kYpdJrx.js";import{u as Pe}from"./vendor-i18n-CV0mwX_-.js";import{U as Ee}from"./users-CjhbU-sF.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.