@runfusion/fusion 0.71.0 → 0.72.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.
- package/dist/bin.js +2251 -2176
- package/dist/child-process-worker.js +1545 -1485
- package/dist/client/.vite/manifest.json +244 -244
- package/dist/client/assets/{AgentDetailView-BvY24zNh.js → AgentDetailView-Bq6qfKGR.js} +5 -5
- package/dist/client/assets/{AgentPermissionPolicyEditor-CYvJw48-.js → AgentPermissionPolicyEditor-Dah1P8IX.js} +2 -2
- package/dist/client/assets/{AgentsView-BWkWEfNs.js → AgentsView-Bu8h0vGY.js} +4 -4
- package/dist/client/assets/{ChatView-BhlVq9Re.js → ChatView-BTE8fIib.js} +1 -1
- package/dist/client/assets/{CommandCenter-DingokjC.js → CommandCenter-l4no66mI.js} +1 -1
- package/dist/client/assets/{DevServerView-kfNJk83M.js → DevServerView-Cuxhgjdv.js} +1 -1
- package/dist/client/assets/DirectoryPicker-tm1SS2jF.js +1 -0
- package/dist/client/assets/{DocumentsView-Bwc5HSg7.js → DocumentsView-Dg8lFF7X.js} +2 -2
- package/dist/client/assets/{EvalsView-BEr_MhJ4.js → EvalsView-TccfkTNy.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-CZK-KtFP.js → ExperimentalAgentOnboardingModal-2qAtocIG.js} +1 -1
- package/dist/client/assets/{GoalsView-B_Qrm8po.js → GoalsView-Du_jIEn2.js} +1 -1
- package/dist/client/assets/{InsightsView-BfbclBHM.js → InsightsView-BxJ327Tj.js} +2 -2
- package/dist/client/assets/{MemoryView-V9Y08BtR.js → MemoryView-Blv0YUWC.js} +2 -2
- package/dist/client/assets/{PiExtensionsManager-B7fl5l3O.js → PiExtensionsManager-BUS_ZKwO.js} +2 -2
- package/dist/client/assets/{PluginManager-H32X557C.js → PluginManager-DM5-rNen.js} +1 -1
- package/dist/client/assets/{PullRequestView-Dhz86tnJ.js → PullRequestView-D7ozwDrc.js} +2 -2
- package/dist/client/assets/{ResearchView-DEObk9J2.js → ResearchView-CRGaOkBH.js} +1 -1
- package/dist/client/assets/{SecretsView-DFEWUbXI.js → SecretsView-Nwc-7xGn.js} +1 -1
- package/dist/client/assets/{SessionTerminal-CwfTrmor.js → SessionTerminal-gC7X57E6.js} +1 -1
- package/dist/client/assets/{SettingsModal-H1TNebmF.js → SettingsModal-CuEXiFb_.js} +4 -4
- package/dist/client/assets/{SettingsModal-2mlwjfVZ.js → SettingsModal-q_D1o7T-.js} +1 -1
- package/dist/client/assets/{SettingsTextareaRow-ByeSU4Pi.js → SettingsTextareaRow-DnsWtbkh.js} +1 -1
- package/dist/client/assets/SetupWizardModal-3-mXX0VJ.js +2 -0
- package/dist/client/assets/{SkillsView-DScNdDRz.js → SkillsView-Dw8m0G-9.js} +1 -1
- package/dist/client/assets/{ThemeDropdown-BKl0kouU.js → ThemeDropdown-C7qybW7w.js} +1 -1
- package/dist/client/assets/{TodoView-_HojIE_Y.js → TodoView-r_qHhO28.js} +2 -2
- package/dist/client/assets/{WorkflowNodeEditor-CoQYdUYX.js → WorkflowNodeEditor-B0TGhu5B.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-vIoH_tGm.js → architectureDiagram-3BPJPVTR-9REjGWnr.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-BqjSE9AM.js → blockDiagram-GPEHLZMM-OATfTc06.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-TWEWVE4T.js → c4Diagram-AAUBKEIU-B-nq1avj.js} +1 -1
- package/dist/client/assets/channel-BW-0I-xJ.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CJM3p9Fh.js → chunk-2J33WTMH-Dds2A4Un.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-Bf_1wJ7O.js → chunk-4BX2VUAB-Dc-jRxxZ.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-CI4ThikJ.js → chunk-55IACEB6-CKtwSOvQ.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-C2TasaKk.js → chunk-727SXJPM-DbRZhQCr.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-BqKUxt3g.js → chunk-AQP2D5EJ-Dq_cSIeh.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-CdK77AxG.js → chunk-FMBD7UC4-BmnvYNOo.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-TE8zbIZ3.js → chunk-ND2GUHAM-D6nyZn0C.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-7lgttGIx.js → chunk-QZHKN3VN-FFojVCmd.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DfBIljo4.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DfBIljo4.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DsK8EBeo.js → cose-bilkent-S5V4N54A-DysS3-yZ.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-COza1ss6.js → dagre-BM42HDAG-DgL7uNq4.js} +1 -1
- package/dist/client/assets/{dashboard-view-ILJ_vnYK.js → dashboard-view-Bu_nB-cd.js} +1 -1
- package/dist/client/assets/{dashboard-view-D_etacMS.js → dashboard-view-DlxD_dta.js} +1 -1
- package/dist/client/assets/{dashboard-view-JEFD-Zgw.js → dashboard-view-ln6_a3ZY.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-Co_F0-vp.js → diagram-2AECGRRQ-DTACb17z.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-BD_n7vU0.js → diagram-5GNKFQAL-DqdKDR_d.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-SFnuzet_.js → diagram-KO2AKTUF-CCKa3iUW.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-CFYeR0mH.js → diagram-LMA3HP47-C2SLmXdM.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-DOVfqKgw.js → diagram-OG6HWLK6-Dz9wXgRN.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-DkeW3bDN.js → erDiagram-TEJ5UH35-GGHapzlB.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-CVaNMQl_.js → flowDiagram-I6XJVG4X-B3SLxAlP.js} +1 -1
- package/dist/client/assets/{folder-open-BY1Gp9Wf.js → folder-open-BWBZSyO2.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BQJ0x5Hq.js → ganttDiagram-6RSMTGT7-DYveq-32.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CIt0P2Lg.js → gitGraphDiagram-PVQCEYII-Bxh-7IFt.js} +1 -1
- package/dist/client/assets/{index-GJLKrqhe.css → index-CiqkhNwQ.css} +1 -1
- package/dist/client/assets/{index-ClPjlOHJ.js → index-D8sgsB8q.js} +268 -268
- package/dist/client/assets/{infoDiagram-5YYISTIA-B1KKCn80.js → infoDiagram-5YYISTIA-B3_g2TQW.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CzG1cEeg.js → ishikawaDiagram-YF4QCWOH-CExRn4qZ.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-CNB7oM4Q.js → journeyDiagram-JHISSGLW-Dgck68vd.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-D8vXTzfs.js → kanban-definition-UN3LZRKU-B258_39Z.js} +1 -1
- package/dist/client/assets/{mermaid.core-BUhJJv1M.js → mermaid.core-uCT9za93.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-y_XyU0Us.js → mindmap-definition-RKZ34NQL-DHevd0he.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-MB9aZtTc.js → pieDiagram-4H26LBE5-rTbXqg0x.js} +1 -1
- package/dist/client/assets/{puzzle-CE00Ce2g.js → puzzle-D7NHfczg.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-hF7q33gK.js → quadrantDiagram-W4KKPZXB-C-N3JbLv.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-BIOIzbEd.js → requirementDiagram-4Y6WPE33-DNINb6LP.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BpLzUxJ8.js → sankeyDiagram-5OEKKPKP-UI7SyvRN.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CLXamQhZ.js → sequenceDiagram-3UESZ5HK-pc1RDjwM.js} +1 -1
- package/dist/client/assets/{shield-alert-BhLVV0rp.js → shield-alert-c_--H0ce.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-96KSNan7.js → standing-instructions-template-aTeHy5lT.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CPRWhQtZ.js → stateDiagram-AJRCARHV-CEiZfKWc.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-8GvpOVMc.js → stateDiagram-v2-BHNVJYJU-B7aNz5OD.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-BAAldJMW.js → timeline-definition-PNZ67QCA-DyE71jn0.js} +1 -1
- package/dist/client/assets/{upload-DbKZcYCW.js → upload-YGrA50-5.js} +1 -1
- package/dist/client/assets/{users-ccVe3aKQ.js → users-fxiLvP6C.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-DGSAcrfx.js → vennDiagram-CIIHVFJN-DX-6Y82D.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-CLGvNiAx.js → wardley-L42UT6IY-ew7KQxeH.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BhU8FLGx.js → wardleyDiagram-YWT4CUSO-DqSCrJdO.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-BQ6AzTfE.js → xychartDiagram-2RQKCTM6-CEtZEj45.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/extension.js +1767 -1707
- package/package.json +1 -1
- package/dist/client/assets/DirectoryPicker-Cluyep4u.js +0 -1
- package/dist/client/assets/SetupWizardModal-BFZnVJX1.js +0 -2
- package/dist/client/assets/channel-hhQEu5zM.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-C2Thhy7D.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C2Thhy7D.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as s,j as t,b as Nr}from"./vendor-react-SZ_qB27O.js";import{c as Tr,
|
|
1
|
+
import{r as s,j as t,b as Nr}from"./vendor-react-SZ_qB27O.js";import{c as Tr,aF as vt,aD as it,dN as xa,dO as Ds,bD as Qt,dP as hs,aI as me,dQ as qt,bj as Pt,dR as Sa,dS as Gt,dT as Er,bd as Ln,dM as It,dU as jr,dV as Wt,dW as Dr,dX as Lr,dY as Ir,dZ as Pr,d_ as Fr,a5 as Za,d$ as _r,aE as Rs,bk as Ca,e0 as $r,e1 as Or,e2 as fs,e3 as Br,e4 as zr,e5 as Hr,e6 as Ur,e7 as Kr,e8 as Vr,e9 as Gr,aM as Wr,by as er,bi as In,ea as Xr,aA as Pn,eb as qr,ec as Qr,ed as Yr,bb as Jr,a8 as Zr,aS as jn,K as ei,bL as ti,ee as ni,f as si,aK as ai,ef as tr,eg as ri,dz as ii,D as oi,eh as ci,ei as li,ej as di,ek as ka,u as ui,o as mi,p as hi,dw as gs,C as Cn,el as kn,em as Ma,q as Aa,P as jt,V as fi,bg as Ra,df as Na,de as gi,X as pi,bM as vi,en as bi,s as Ta,bx as yi,eo as ps,ep as Ea,eq as vs,er as ja,es as Da,et as wi,eu as xi,bv as La}from"./index-D8sgsB8q.js";import{u as ot}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as Ia}from"./SessionTerminal-gC7X57E6.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";import"./shield-alert-c_--H0ce.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as f,j as s,g as nn,a as Kx,b as El,c as Ux}from"./vendor-react-SZ_qB27O.js";import{c as Lt,
|
|
1
|
+
import{r as f,j as s,g as nn,a as Kx,b as El,c as Ux}from"./vendor-react-SZ_qB27O.js";import{c as Lt,h9 as Vx,dw as ch,L as _l,g as bi,ha as xi,Y as An,aU as En,hb as Ml,a1 as uh,hc as pu,R as Kt,hd as dh,dB as qx,aK as fh,aL as mh,bc as Wx,a8 as Tl,c0 as Il,c1 as Hx,he as Gx,aA as Xx,fz as Yx,hf as Zx,as as vh,hg as Jx,hh as Qx,bv as yu,hi as gu,fM as ej,gM as bu,hj as tj,a5 as To,hk as rj,hl as nj,hm as aj,hn as ij,gN as sj,ho as oj,hp as lj,hq as cj,h1 as uj,gJ as xu,hr as dj,u as fj,aa as mj,cR as Dl,gO as hh,hs as vj,bi as hj,p as pj,ht as yj,hu as us,hv as gj,hw as bj,hx as xj,hy as jj,hz as wj,hA as Cj,dY as Rl,hB as Ll,hC as ju,bD as _a,hD as wu,hE as Io,hF as ph,hG as Do,a7 as yh,bw as gh,N as kj,c2 as bh,dj as Sj,s as Ro,bK as Pj,C as $l,P as Ma,hH as Nj,hI as Oj,q as Aj,f1 as Cu,X as ka,E as Ej,n as _j,a9 as ku,a$ as Mj,hJ as Su,hK as Tj,hL as Ij,hM as Dj,hN as Rj,dy as Lj,hO as $j}from"./index-D8sgsB8q.js";import{u as oe}from"./vendor-i18n-GF3RlKbq.js";import{a as xh,b as jh,p as Bj,w as Fj}from"./vendor-reactflow-9C3XTE7_.js";import{w as wh,n as Ch,a as Ae,A as Bl,G as zj,H as Kj,l as kh,t as ji,b as St,p as Lo,s as Ta,c as Sh,q as Uj,r as Vj,u as qj,v as Wj,x as Hj,y as Gj,z as Xj,C as Yj,D as Zj,k as Jj,E as Qj,F as e0}from"./step-yuy0qJer.js";import{b as t0,p as r0}from"./band-CquvqAHh.js";import{d as Ia,n as n0,e as a0,f as $o,g as Dr,h as Fl,a as zl,i as Pu,j as zt,c as i0,k as wi,l as s0,m as o0}from"./linear-BX4tvjNK.js";import{i as cr,a as Ht}from"./init-Dmth1JHB.js";import{m as Nu,a as Ou,p as l0,q as c0,u as u0,s as d0,r as f0,v as m0,w as v0,x as h0,y as p0,z as y0,A as g0,B as b0,t as x0}from"./time-DMMzMWYg.js";import{f as j0,b as w0}from"./defaultLocale-DX6XiGOO.js";import{i as C0,o as k0}from"./ordinal-DILIJJjt.js";import{r as S0}from"./agentsOrgChartLayout-BMvyuaLA.js";import{S as P0}from"./shield-alert-c_--H0ce.js";import{PluginManager as N0}from"./PluginManager-DM5-rNen.js";import{a as O0}from"./ThemeDropdown-C7qybW7w.js";import{v as A0}from"./projectDetection-G3XuxD2X.js";import{U as Ph}from"./upload-YGrA50-5.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";import"./DirectoryPicker-tm1SS2jF.js";import"./folder-open-BWBZSyO2.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as t,j as r}from"./vendor-react-SZ_qB27O.js";import{cZ as Je,c_ as je,c$ as Nr,d0 as Ce,a5 as Ye,d1 as Oe,d2 as ze,d3 as Fe,d4 as $e,d5 as Sr,d6 as be,d7 as kr,d8 as jr,d9 as Cr,da as Er,db as Lr,bB as se,dc as xe,L as ve,bL as Rr,dd as Dr,de as _r,df as Mr,C as Pr,aN as Qe,dg as Tr,V as Ur,dh as Ar,b$ as Or,c1 as zr,di as Fr,n as Be,X as $r,a6 as Br,R as Hr}from"./index-ClPjlOHJ.js";import{u as ue}from"./vendor-i18n-GF3RlKbq.js";import{S as Ze}from"./shield-alert-BhLVV0rp.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";const Ee=500,Vr=3e3;function W(e){return e instanceof Error?e.message:String(e)}function er(e){return e.length<=Ee?e:e.slice(-Ee)}function ye(e,i){return er([...e,i])}function Z(e){try{return JSON.parse(e)}catch{return null}}function oe(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function Wr(e){return e?.previewUrl??null}async function He(e){return kr(e)}async function Ve(e,i){return jr(e,i)}async function Ir(e){return Cr(e)}async function qr(e){return Er(e)}async function We(e){return Lr(e)}function X(e){try{return e()}catch{return null}}function Ne(){return typeof X(()=>je)=="function"&&typeof X(()=>Je)=="function"}function Y(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function Xr(e){const{t:i}=ue("app"),[p,s]=t.useState(null),[g,v]=t.useState([]),[y,u]=t.useState([]),[j,C]=t.useState([]),[z,E]=t.useState(!0),[k,m]=t.useState(null),o=t.useRef(0),[d,U]=t.useState(null),T=t.useCallback(a=>{if(s(a),a?.logHistory){const n=a.logHistory.slice(-Ee).map(oe);u(n)}},[]),_=t.useCallback(async()=>{const a=o.current;try{if(Ne())if(d){const n=await Je(d,e);if(o.current!==a)return;T(n)}else{const n=await je(e);if(o.current!==a)return;v(n),n.length>0&&(U(n[0].config.id),T(n[0]))}else{const n=await He(e);if(o.current!==a)return;const h=Y(n);v([h]),T(h)}m(null)}catch(n){if(o.current!==a)return;m(W(n))}},[T,e,d]);t.useEffect(()=>{o.current+=1;const a=o.current;s(null),v([]),u([]),C([]),E(!0),m(null),U(null),(async()=>{try{const[h,c]=await Promise.allSettled([Ne()?je(e):He(e).then(x=>[Y(x)]),typeof X(()=>be)=="function"?be(e):We(e).then(x=>x.map(L=>({name:L.name,command:L.command,cwd:L.cwd,scriptName:L.scriptName,packagePath:L.packagePath})))]);if(o.current!==a)return;let b=null;if(h.status==="fulfilled"){const x=h.value;if(v(x),x.length>0){const L=x[0];Ne()&&U(L.config.id),T(L)}}else b=W(h.reason);c.status==="fulfilled"&&C(c.value),b&&m(b)}catch(h){if(o.current!==a)return;m(W(h))}finally{o.current===a&&E(!1)}})()},[T,e]),t.useEffect(()=>{const a=d?Nr(d,e):typeof X(()=>Ce)=="function"?Ce(e):null;if(!a)return;const n=o.current,h=Ye(a,{events:{history:c=>{if(o.current!==n)return;const b=Z(c.data);if(b?.lines){const x=b.lines.map(oe);u(er(x))}},log:c=>{if(o.current!==n)return;const b=Z(c.data);if(b){const x=typeof b.line=="string"?b.line:oe(b);u(L=>ye(L,x))}},"dev-server:log":c=>{if(o.current!==n)return;const b=Z(c.data);if(b){const x=typeof b.line=="string"?b.line:oe(b);u(L=>ye(L,x))}},"dev-server:output":c=>{if(o.current!==n)return;const b=Z(c.data);b?.line&&u(x=>ye(x,b.line))},status:c=>{if(o.current!==n)return;const b=Z(c.data),x=b?.status;x&&s(L=>L&&{...L,status:x,runtime:b.pid?{...L.runtime??{startedAt:new Date().toISOString()},pid:b.pid}:L.runtime})},"dev-server:status":c=>{if(o.current!==n)return;const b=Z(c.data);if(b?.status){const x=Y(b);s(x),v([x])}},stopped:()=>{o.current},failed:()=>{o.current}},onReconnect:()=>{o.current===n&&_()},onError:()=>{o.current===n&&m(c=>c??i("devserver.lostConnection","Lost log stream connection."))}});return()=>{h()}},[e,_,d]),t.useEffect(()=>{if(p?.status!=="running"&&p?.status!=="starting")return;const a=setInterval(()=>{_()},Vr);return()=>{clearInterval(a)}},[_,p?.status]);const M=t.useCallback(async(a,n)=>{o.current+=1;const h=o.current;try{let c;const b=typeof n=="string"&&n.length>0,x=p?.config?.cwd??".";if(!(b&&n!==x)&&d&&typeof X(()=>Oe)=="function")c=await Oe(d,e);else{const V=await Ve({command:a,cwd:n},e);c=Y(V)}if(o.current!==h)return;s(c),m(null)}catch(c){if(o.current!==h)return;throw m(W(c)),c}},[e,p?.config?.cwd,d]),R=t.useCallback(async()=>{o.current+=1;const a=o.current;try{let n;if(d&&typeof X(()=>ze)=="function")n=await ze(d,e);else{const h=await Ir(e);n=Y(h)}if(o.current!==a)return;s(n),m(null)}catch(n){if(o.current!==a)return;throw m(W(n)),n}},[e,d]),F=t.useCallback(async()=>{o.current+=1;const a=o.current;try{let n;if(d&&typeof X(()=>Fe)=="function")n=await Fe(d,e);else{const h=await qr(e);n=Y(h)}if(o.current!==a)return;s(n),m(null)}catch(n){if(o.current!==a)return;throw m(W(n)),n}},[e,d]),A=t.useCallback(async a=>{o.current+=1;const n=o.current;try{let h;if(d&&typeof X(()=>$e)=="function")h=await $e(d,a,e);else{const c=await Sr({url:a},e);h={url:c.manualUrl??c.previewUrl??c.detectedUrl??null,source:c.manualUrl?"manual":"auto"}}if(o.current!==n)return;s(c=>c?{...c,previewUrl:h.url??void 0}:null),m(null)}catch(h){if(o.current!==n)return;throw m(W(h)),h}},[e,d]),$=t.useCallback(async()=>{o.current+=1;const a=o.current;try{let n;try{n=await be(e)}catch{n=(await We(e)).map(c=>({name:c.name,command:c.command,cwd:c.cwd,scriptName:c.scriptName,packagePath:c.packagePath}))}if(o.current!==a)return;C(n),m(null)}catch(n){if(o.current!==a)return;throw m(W(n)),n}},[e]),w=t.useCallback(async(a,n)=>{if(typeof a!="string"&&!d)try{const b=a,x=await Ve({command:b.command,cwd:b.cwd,scriptName:b.scriptName,packagePath:b.packagePath??b.cwd},e),L=Y(x);s(L),v([L]),m(null);return}catch(b){throw m(W(b)),b}const h=typeof a=="string"?a:a.command,c=typeof a=="string"?n:a.cwd;await M(h,c)},[e,M,d]),f=t.useCallback(async()=>{await R()},[R]),D=t.useCallback(async()=>{await F()},[F]),B=t.useCallback(async a=>{await A(a)},[A]),O=t.useCallback(async()=>{await $()},[$]),I=t.useCallback(async()=>{await _()},[_]),S=Wr(p),N=p?{...p,pid:p.runtime?.pid}:null;return{session:p,sessions:g,logs:y,detectedCommands:j,previewUrl:S,isLoading:z,error:k,startServer:M,stopServer:R,restartServer:F,setPreviewUrl:A,detectCommands:$,refresh:_,candidates:j,serverState:N,loading:z,start:w,stop:f,restart:D,setManualUrl:B,detect:O,refreshStatus:I}}const Ie=500,qe=100;function rr(e){return e.length>Ie?e.slice(-Ie):e}function tr(e){return e==="stderr"?"stderr":"stdout"}function ce(e){try{return JSON.parse(e.data)}catch{return null}}function de(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:tr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Kr(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function Se(e,i){if(i.length===0)return e;const p=[...e],s=new Set(e.map(g=>g.id));for(const g of i)s.has(g.id)||(s.add(g.id),p.push(g));return p.sort((g,v)=>g.id-v.id),rr(p)}function Gr(e,i){const[p,s]=t.useState([]),[g,v]=t.useState(!1),[y,u]=t.useState(!1),[j,C]=t.useState(!1),[z,E]=t.useState(null),k=t.useRef(null),m=t.useRef(!1),o=t.useRef(0),d=t.useRef(0),U=t.useRef(e),T=t.useRef(i),_=t.useRef(0),M=t.useRef(1);(U.current!==e||T.current!==i)&&(U.current=e,T.current=i,o.current++,se({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),m.current=!0,_.current=0,M.current=1,s([]),v(!1),u(!1),C(!1),E(null),k.current&&(k.current(),k.current=null)),t.useEffect(()=>{if(!i){k.current&&(k.current(),k.current=null);return}const w=o.current,f=++d.current;m.current=!1,v(!0);const D=(S,N)=>{const a=rr(S);s(a),E(N),C(N!==null?N>a.length:!1);const n=a.length>0?a[a.length-1].id:0;_.current=n,M.current=n+1},B=S=>{if(m.current||o.current!==w||!S||typeof S!="object")return;const N=S.lines;if(!Array.isArray(N))return;if(N.length>0&&typeof N[0]=="string"){const n=N.filter(h=>typeof h=="string").map((h,c)=>Kr(h,c+1));D(n,n.length);return}const a=N.filter(n=>!!n&&typeof n=="object").map((n,h)=>de(n,h+1));D(a,a.length)},O=S=>{if(m.current||o.current!==w)return;const N=typeof S.text=="string"?S.text:typeof S.line=="string"?S.line:null;if(!N)return;const a=M.current,n=typeof S.id=="number"&&Number.isFinite(S.id)?S.id:a,h={id:n,text:N,stream:tr(S.stream),timestamp:typeof S.timestamp=="string"?S.timestamp:""};_.current=Math.max(_.current,n),M.current=Math.max(M.current,n+1),s(c=>Se(c,[h])),E(c=>c===null?c:Math.max(c+1,h.id))};async function I(){try{const N=await xe({maxLines:qe},e);if(m.current||o.current!==w||d.current!==f)return;const a=N.lines.map((n,h)=>de(n,h+1));D(a,N.totalLines)}catch{if(m.current||o.current!==w||d.current!==f)return;D([],null)}finally{!m.current&&o.current===w&&d.current===f&&v(!1)}const S=Ce(e);k.current=Ye(S,{events:{"dev-server:log":N=>{const a=ce(N);a&&O(a)},log:N=>{const a=ce(N);a&&O(a)},history:N=>{const a=ce(N);B(a)},"dev-server:history":N=>{const a=ce(N);B(a)}},onReconnect:()=>{se({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:_.current??null,sseChannel:S,reason:"history-replay"}),!(m.current||o.current!==w)&&xe({lastEventId:_.current,maxLines:50},e).then(N=>{if(m.current||o.current!==w)return;const a=N.lines.map((n,h)=>de(n,M.current+h));if(a.length>0){const n=a[a.length-1].id;_.current=Math.max(_.current,n),M.current=Math.max(M.current,n+1)}s(n=>Se(n,a)),E(N.totalLines)}).catch(()=>{})}}),se({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:S})}return I(),()=>{m.current=!0,k.current&&(k.current(),k.current=null)}},[i,e]);const F=t.useCallback(async()=>{if(!i||y)return;const w=o.current,f=p.length;u(!0);try{const D=await xe({maxLines:qe,offset:f},e);if(m.current||o.current!==w)return;const B=D.lines.map((O,I)=>de(O,I+1));s(O=>Se(B,O)),C(D.totalLines>f+B.length),E(D.totalLines)}catch{}finally{u(!1)}},[i,p.length,y,e]),A=t.useCallback(()=>{s([])},[]),$=k.current!==null&&!g&&!m.current;return{entries:p,loading:g,loadingMore:y,hasMore:j,total:z,loadMore:F,clear:A,logs:p,isStreaming:$,clearLogs:A}}const Jr="This preview appears to block iframe embedding. Open it in a new tab instead.",Yr="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Qr="Preview is taking longer than expected and may block iframe embedding.";function Zr(e){return e==="blocked"?Jr:e==="error"?Yr:null}function et(e,i={}){const{loadTimeoutMs:p=1e4,detectionMethod:s=null}=i,g=t.useRef(null),v=t.useRef(null),[y,u]=t.useState("unknown"),[j,C]=t.useState(null),[z]=t.useState(s),E=t.useCallback(()=>{v.current!==null&&(window.clearTimeout(v.current),v.current=null)},[]),k=t.useCallback(R=>{u(R),C(Zr(R))},[]),m=t.useCallback(()=>{u("blocked"),C(Qr)},[]);t.useEffect(()=>{if(E(),!e){u("unknown"),C(null);return}u("unknown"),C(null);let R=!1;return queueMicrotask(()=>{R||(u("loading"),C(null))}),()=>{R=!0,E()}},[E,e]),t.useEffect(()=>{if(y!=="loading"){E();return}const R=setTimeout(()=>{v.current=null,m()},p);return v.current=R,()=>{clearTimeout(R),v.current===R&&(v.current=null)}},[E,y,p,m]);const o=t.useCallback(()=>{const R=g.current;if(!R){k("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){k("blocked");return}}catch{}k("embedded")},[k]),d=t.useCallback(()=>{k("error")},[k]);t.useEffect(()=>{if(E(),!e){u("unknown"),C(null);return}u("unknown"),C(null)},[E]);const U=t.useCallback(()=>{E(),u("unknown"),C(null)},[E]),T=U,_=t.useMemo(()=>y==="embedded",[y]),M=t.useMemo(()=>y==="blocked"||y==="error",[y]);return{embedStatus:y,isEmbedded:_,isBlocked:M,blockReason:j,detectionMethod:z,iframeRef:g,resetEmbedStatus:U,setEmbedStatus:k,retry:T,embedContext:j,handleIframeLoad:o,handleIframeError:d}}const rt=/\x1b\[[0-9;]*m/g;function Le(e){return e.replace(rt,"")}function tt(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function st(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function nt(e){if(e.stream==="stderr")return"error";const i=Le(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function at(e,i){if(!i)return e;const p=new RegExp(`(${st(i)})`,"ig"),s=e.split(p),g=i.toLowerCase();return r.jsx(r.Fragment,{children:s.map((v,y)=>v.toLowerCase()===g?r.jsx("mark",{children:v},`${v}-${y}`):r.jsx("span",{children:v},`${v}-${y}`))})}function it({entries:e,loading:i,loadingMore:p,hasMore:s,total:g,onLoadMore:v,isRunning:y}){const{t:u}=ue("app"),j=t.useRef(null),C=t.useRef(e.length),z=t.useRef(y),[E,k]=t.useState(!1),[m,o]=t.useState(!1),[d,U]=t.useState(""),[T,_]=t.useState("all"),M=t.useMemo(()=>T==="all"?e:e.filter(w=>nt(w)===T),[e,T]),R=t.useMemo(()=>{const w=d.trim().toLowerCase();return w?M.filter(f=>Le(f.text).toLowerCase().includes(w)):M},[M,d]),F=R.length,A=t.useCallback(()=>{const w=j.current;w&&(w.scrollTop=w.scrollHeight,o(!1))},[]);t.useEffect(()=>{const w=z.current,f=C.current,D=e.length>f;y&&(!w||!m&&D)&&A(),z.current=y,C.current=e.length},[e.length,y,m,A]);const $=t.useCallback(()=>{const w=j.current;if(!w)return;const D=w.scrollTop+w.clientHeight>=w.scrollHeight-50;o(!D)},[]);return t.useEffect(()=>{i||e.length===0||!m&&y&&A()},[e,y,m,i,A]),i&&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(ve,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:u("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${E?" 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:u("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[g!==null?`${e.length}/${g}`:`${e.length}`," ",u("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:u("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:T,onChange:w=>_(w.target.value),"data-testid":"devserver-log-severity-filter","aria-label":u("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:u("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:u("devserver.info","Info")}),r.jsx("option",{value:"warn",children:u("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:u("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:u("devserver.searchLogs","Search logs")}),r.jsx(Rr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:w=>U(w.target.value),placeholder:u("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":u("devserver.searchLogs","Search logs")})]}),d.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:u("devserver.matchCount",{count:F,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>k(w=>!w),"data-testid":"devserver-log-fullscreen-toggle","aria-label":E?u("devserver.exitFullscreen","Exit fullscreen logs"):u("devserver.enterFullscreen","Enter fullscreen logs"),children:E?r.jsx(Dr,{size:14}):r.jsx(_r,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[s&&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:v,disabled:p,"data-testid":"devserver-log-load-more-button",children:p?r.jsxs(r.Fragment,{children:[r.jsx(ve,{size:14,className:"devserver-log-viewer__spinner"}),u("devserver.loadingOlderLogs","Loading older logs…")]}):u("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:j,className:"devserver-log-viewer__content",onScroll:$,"data-testid":"devserver-log-content",children:[!i&&R.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?u("devserver.noLogsYet","No logs yet. Start the dev server to see output."):M.length===0?u("devserver.noMatchesSeverity","No log lines match the selected severity."):u("devserver.noMatchesSearch","No log lines match your search.")}),R.map(w=>{const f=Le(w.text),D=tt(w.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[D&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:D}),w.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:u("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Mr(at(f,d.trim()))})]},w.id)})]}),m&&y&&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(Pr,{size:14}),u("devserver.newLogs","New logs")]})]})]})}const lt="devserver-preview-iframe";function ot({url:e,embedStatus:i,onEmbedStatusChange:p,iframeRef:s,blockReason:g,onRetry:v,className:y=lt,embedContext:u}){const{t:j}=ue("app"),C=g??u??null,[z,E]=t.useState(0);t.useEffect(()=>{!e||i!=="unknown"||(E(d=>d+1),p("loading"))},[i,p,e]);const k=t.useCallback(()=>{const d=s.current;if(!d){p("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){p("blocked");return}}catch{}p("embedded")},[s,p]),m=t.useCallback(d=>{d.stopPropagation(),p("error")},[p]),o=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:s,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:y,title:"Dev server preview",onLoad:k,onError:m,onErrorCapture:m,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),i==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(ve,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:j("preview.loading","Loading preview...")})]}),i==="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:j("preview.blockedTitle","Preview cannot be embedded")}),C&&r.jsx("p",{className:"devserver-preview-blocked-context",children:C})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:j("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:o,children:j("preview.openInNewTab","Open in new tab")}),v&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:v,children:j("actions.retry","Retry")})]})]}),i==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(Qe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:j("preview.errorTitle","Unable to load preview")}),C&&r.jsx("p",{className:"devserver-preview-blocked-context",children:C})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:j("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:o,children:j("preview.openInNewTab","Open in new tab")}),v&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:v,children:j("actions.retry","Retry")})]})]})]}):null}function ct(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")}}}const dt=480;function vt(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function sr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const i=e.parentElement;return i?.classList.contains("right-dock__body")?i:null}function ut(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function mt(e){if(!e||vt())return!1;const i=sr(e);return i?ut(i)<=dt:!1}function pt(e){const[i,p]=t.useState(!1);return t.useEffect(()=>{const s=e.current;if(!s){p(!1);return}const g=sr(s),v=()=>p(mt(s));if(v(),!g||typeof ResizeObserver>"u")return window.addEventListener("resize",v),()=>window.removeEventListener("resize",v);const y=new ResizeObserver(v);return y.observe(g),window.addEventListener("resize",v),()=>{y.disconnect(),window.removeEventListener("resize",v)}},[e]),i}let ke=!1;function Xe(e){return e instanceof Error?e.message:String(e)}function nr(e){return e==="."?"root":e}function Ke(e){return e?e==="root"?".":e:null}function Ge(e,i,p){return!i||e.scriptName!==i?!1:p?nr(e.cwd)===p:!0}function ft(e){return e.cwd==="."?"root":e.cwd}function ht(e){return e.length<=60?e:`${e.slice(0,60)}…`}function kt({addToast:e,projectId:i,tasks:p}){const{t:s}=ue("app");t.useEffect(()=>(se({view:"DevServerView",trigger:ke?"route-active":"remount",projectId:i,replayAttempted:!1}),ke=!1,()=>{ke=!0,se({view:"DevServerView",trigger:"route-inactive",projectId:i,replayAttempted:!1})}),[i]);const{session:g,detectedCommands:v,previewUrl:y,isLoading:u,error:j,startServer:C,stopServer:z,restartServer:E,setPreviewUrl:k,detectCommands:m,refresh:o}=Xr(i),d=g?.status??"stopped",U=d==="running"||d==="starting",T=ct(s),_=T[d]??T.stopped,{entries:M,loading:R,loadingMore:F,hasMore:A,total:$,loadMore:w}=Gr(i,!!i),f=y,D=g?.config?.cwd??null,B=t.useRef(null),O=pt(B),[I,S]=t.useState(!0),[N,a]=t.useState(""),[n,h]=t.useState(""),[c,b]=t.useState(null),[x,L]=t.useState(null),[V,Re]=t.useState(null),K=t.useMemo(()=>(p??[]).filter(l=>l.column==="in-progress"&&typeof l.worktree=="string"&&l.worktree.length>0),[p]),q=t.useMemo(()=>K.find(l=>l.id===x)??null,[K,x]);t.useEffect(()=>{x&&!K.some(l=>l.id===x)&&L(null)},[K,x]);const[ee,ar]=t.useState("embedded"),[re,me]=t.useState(!1),De=t.useRef(null),pe=t.useRef(null),ir=ee==="embedded"?f:null,{embedStatus:H,setEmbedStatus:lr,resetEmbedStatus:ne,iframeRef:Q,isEmbedded:or,isBlocked:fe,blockReason:he,retry:_e}=et(ir),[Me,G]=t.useState(!1),Pe=t.useRef(H);t.useEffect(()=>{const l=Pe.current!==H;fe&&l&&G(!0),H==="embedded"&&G(!1),Pe.current=H},[H,fe]),t.useEffect(()=>{G(!1)},[f]);const ae=t.useMemo(()=>{if(!c)return null;const l=Ke(D);return v.find(P=>!(P.scriptName!==c||l&&P.cwd!==l||g?.config?.command&&P.command!==g.config.command))??v.find(P=>Ge(P,c,D))??null},[v,g?.config?.command,c,D]);t.useEffect(()=>{typeof m=="function"&&m().catch(l=>{e(Xe(l),"error")})},[e,m]),t.useEffect(()=>{if(c){S(!1);return}S(!0)},[c]),t.useEffect(()=>{if(g?.status==="running"||g?.status==="starting"){g.config?.command?.trim().length>0&&a(g.config.command);return}if(ae){a(ae.command);return}v.length>0&&a(l=>l.trim().length>0?l:v[0]?.command??"")},[v,ae,g?.config?.command,g?.status]),t.useEffect(()=>{h(f??"")},[f]);const ie=t.useCallback(()=>{me(!1),window.requestAnimationFrame(()=>De.current?.focus())},[]),cr=Tr(ie);t.useEffect(()=>{if(!re)return;pe.current?.focus();const l=P=>{if(P.key==="Escape"){ie();return}if(P.key!=="Tab")return;const te=Array.from(pe.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(Ae=>!Ae.hasAttribute("disabled")&&Ae.getAttribute("aria-hidden")!=="true"),J=te[0],we=te.at(-1);!J||!we||(P.shiftKey&&document.activeElement===J?(P.preventDefault(),we.focus()):!P.shiftKey&&document.activeElement===we&&(P.preventDefault(),J.focus()))};return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[ie,re]),t.useEffect(()=>{!O&&re&&me(!1)},[O,re]);const ge=t.useCallback(()=>{f&&window.open(f,"_blank","noopener,noreferrer")},[f]),Te=t.useCallback(()=>{G(!1),_e()},[_e]),dr=t.useCallback(()=>{try{const l=Q.current;if(l?.contentWindow){l.contentWindow.location.reload(),G(!1),ne();return}}catch{}if(!(!f||!Q.current))try{const l=new URL(f);l.searchParams.set("_t",Date.now().toString()),Q.current.src=l.toString(),G(!1),ne()}catch{Q.current.src=f,G(!1),ne()}},[f,Q,ne]),le=t.useCallback(async(l,P,te)=>{Re(l);try{await P(),e(te,"success")}catch(J){e(Xe(J),"error")}finally{Re(null)}},[e]),vr=t.useCallback(l=>{b(l.scriptName),S(!1),a(l.command),e(s("devserver.toast.selectedScript","Selected {{name}} script.",{name:l.scriptName}),"success")},[e]),ur=t.useCallback(()=>{b(null),S(!0),e(s("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),mr=t.useCallback(l=>{U&&l&&l!==x&&e(s("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),L(l)},[e,U,x,s]),pr=()=>{const l=N.trim();if(l.length===0){e(s("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const P=Ke(D)??".",J=q?.worktree??null??ae?.cwd??P;le("start",()=>C(l,J),s("devserver.toast.started","Dev server started."))},fr=()=>{le("stop",z,s("devserver.toast.stopped","Dev server stopped."))},hr=()=>{le("restart",E,s("devserver.toast.restarted","Dev server restarted."))},gr=()=>{const l=n.trim(),P=l.length>0?l:null;le("preview",()=>k(P),P?s("devserver.toast.previewUpdated","Preview URL updated."):s("devserver.toast.previewCleared","Preview URL override cleared."))},wr=t.useCallback(()=>{j&&o()},[j,o]),br=d==="starting"||d==="running"||V!==null,xr=d==="stopped"||V!==null,yr=d==="stopped"||d==="starting"||V!==null,Ue=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(Be,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:f??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[s("devserver.auto","Auto"),f?` · ${f}`:s("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ar(l=>l==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:ee==="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:ge,disabled:!f,"data-testid":"devserver-preview-open-tab",children:r.jsx(Br,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.refreshPreview","Refresh preview"),onClick:dr,disabled:!f,"data-testid":"devserver-preview-refresh",children:r.jsx(Hr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":H,"data-embedded":or?"true":"false",children:[!f&&!U&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.startDevServer","Start a dev server to see a live preview here.")}),!f&&U&&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.")}),f&&ee==="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:ge,"data-testid":"devserver-preview-external-open-tab",children:s("devserver.openInNewTab","Open in new tab")})]}),f&&ee==="embedded"&&Me&&fe&&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(Qe,{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")}),he&&r.jsx("p",{className:"devserver-preview-blocked-context",children:he})]}),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:ge,"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:Te,"data-testid":"devserver-preview-fallback-retry",children:s("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),f&&ee==="embedded"&&!Me&&r.jsx(ot,{url:f,embedStatus:H,onEmbedStatusChange:lr,iframeRef:Q,blockReason:he,onRetry:Te})]})]});return r.jsxs("div",{ref:B,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":O?"true":"false",children:[r.jsx(Ur,{icon:Ar,title:s("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${_.className}`,"data-testid":"dev-server-status-badge",children:_.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:pr,disabled:br,"data-testid":"dev-server-start-button",children:[r.jsx(Or,{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:fr,disabled:xr,"data-testid":"dev-server-stop-button",children:[r.jsx(zr,{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:hr,disabled:yr,"data-testid":"dev-server-restart-button",children:[r.jsx(Fr,{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":s("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.configuration","Configuration")}),u&&r.jsx("span",{className:"dev-server-muted",children:s("devserver.loading","Loading...")})]}),u&&!g&&v.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(ve,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:s("devserver.loadingConfig","Loading dev server configuration...")})]}),j&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:j}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:wr,children:s("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:s("devserver.scriptSelection","Script Selection")}),c&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:c}),r.jsx("span",{className:"dev-server-candidate-source",children:D??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>S(!0),"data-testid":"dev-server-change-selection",children:s("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:ur,"data-testid":"dev-server-clear-selection",children:s("devserver.clear","Clear")})]}),I&&v.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.")}),I&&v.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:v.map(l=>{const P=Ge(l,c,D);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${P?"dev-server-candidate--selected":""}`,onClick:()=>vr(l),"data-testid":`dev-server-candidate-${l.scriptName}-${nr(l.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:l.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:ht(l.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:ft(l)})]},`${l.cwd}::${l.scriptName}::${l.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:s("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:s("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:x??"",onChange:l=>mr(l.target.value.length>0?l.target.value:null),disabled:K.length===0,"aria-label":s("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:s("devserver.projectRootNoTask","Project root (no task)")}),K.map(l=>r.jsx("option",{value:l.id,children:l.title?`${l.id} — ${l.title}`:l.id},l.id))]}),K.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:s("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),q&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:q.title?`${q.id} — ${q.title}`:q.id})}),r.jsx("p",{className:"dev-server-task-description",children:q.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:s("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:q.worktree})]})]})]})]}),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:N,onChange:l=>a(l.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:d==="running"||d==="starting"})]}),(d==="running"||d==="starting")&&g&&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:g.config?.command??N})]}),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:n,onChange:l=>h(l.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:gr,disabled:V==="preview","data-testid":"dev-server-set-preview",children:s("devserver.save","Save")})]}),f&&r.jsx("p",{className:"dev-server-preview-hint",children:s("devserver.autoDetected","Auto-detected: {{url}}",{url:f})})]}),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":s("devserver.logsLabel","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:$??M.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(it,{entries:M,loading:R,loadingMore:F,hasMore:A,total:$,onLoadMore:w,isRunning:U})})]})}),O?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":s("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(Be,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:f??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:f||s("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:f?s("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):s("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:De,onClick:()=>me(!0),"data-testid":"devserver-preview-modal-open",children:s("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":s("devserver.previewLabel","Dev server preview"),children:Ue()}),O&&re&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...cr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:pe,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:s("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ie,"aria-label":s("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx($r,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:Ue()})]})})]})}export{kt as DevServerView};
|
|
1
|
+
import{r as t,j as r}from"./vendor-react-SZ_qB27O.js";import{c_ as Je,c$ as je,d0 as Nr,d1 as Ce,a5 as Ye,d2 as Oe,d3 as ze,d4 as Fe,d5 as $e,d6 as Sr,d7 as be,d8 as kr,d9 as jr,da as Cr,db as Er,dc as Lr,bD as se,dd as xe,L as ve,bM as Rr,de as Dr,df as _r,dg as Mr,C as Pr,aP as Qe,dh as Tr,V as Ur,di as Ar,c0 as Or,c2 as zr,dj as Fr,n as Be,X as $r,a6 as Br,R as Hr}from"./index-D8sgsB8q.js";import{u as ue}from"./vendor-i18n-GF3RlKbq.js";import{S as Ze}from"./shield-alert-c_--H0ce.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";const Ee=500,Vr=3e3;function W(e){return e instanceof Error?e.message:String(e)}function er(e){return e.length<=Ee?e:e.slice(-Ee)}function ye(e,i){return er([...e,i])}function Z(e){try{return JSON.parse(e)}catch{return null}}function oe(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function Wr(e){return e?.previewUrl??null}async function He(e){return kr(e)}async function Ve(e,i){return jr(e,i)}async function Ir(e){return Cr(e)}async function qr(e){return Er(e)}async function We(e){return Lr(e)}function X(e){try{return e()}catch{return null}}function Ne(){return typeof X(()=>je)=="function"&&typeof X(()=>Je)=="function"}function Y(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function Xr(e){const{t:i}=ue("app"),[p,s]=t.useState(null),[g,v]=t.useState([]),[y,u]=t.useState([]),[j,C]=t.useState([]),[z,E]=t.useState(!0),[k,m]=t.useState(null),o=t.useRef(0),[d,U]=t.useState(null),T=t.useCallback(a=>{if(s(a),a?.logHistory){const n=a.logHistory.slice(-Ee).map(oe);u(n)}},[]),_=t.useCallback(async()=>{const a=o.current;try{if(Ne())if(d){const n=await Je(d,e);if(o.current!==a)return;T(n)}else{const n=await je(e);if(o.current!==a)return;v(n),n.length>0&&(U(n[0].config.id),T(n[0]))}else{const n=await He(e);if(o.current!==a)return;const h=Y(n);v([h]),T(h)}m(null)}catch(n){if(o.current!==a)return;m(W(n))}},[T,e,d]);t.useEffect(()=>{o.current+=1;const a=o.current;s(null),v([]),u([]),C([]),E(!0),m(null),U(null),(async()=>{try{const[h,c]=await Promise.allSettled([Ne()?je(e):He(e).then(x=>[Y(x)]),typeof X(()=>be)=="function"?be(e):We(e).then(x=>x.map(L=>({name:L.name,command:L.command,cwd:L.cwd,scriptName:L.scriptName,packagePath:L.packagePath})))]);if(o.current!==a)return;let b=null;if(h.status==="fulfilled"){const x=h.value;if(v(x),x.length>0){const L=x[0];Ne()&&U(L.config.id),T(L)}}else b=W(h.reason);c.status==="fulfilled"&&C(c.value),b&&m(b)}catch(h){if(o.current!==a)return;m(W(h))}finally{o.current===a&&E(!1)}})()},[T,e]),t.useEffect(()=>{const a=d?Nr(d,e):typeof X(()=>Ce)=="function"?Ce(e):null;if(!a)return;const n=o.current,h=Ye(a,{events:{history:c=>{if(o.current!==n)return;const b=Z(c.data);if(b?.lines){const x=b.lines.map(oe);u(er(x))}},log:c=>{if(o.current!==n)return;const b=Z(c.data);if(b){const x=typeof b.line=="string"?b.line:oe(b);u(L=>ye(L,x))}},"dev-server:log":c=>{if(o.current!==n)return;const b=Z(c.data);if(b){const x=typeof b.line=="string"?b.line:oe(b);u(L=>ye(L,x))}},"dev-server:output":c=>{if(o.current!==n)return;const b=Z(c.data);b?.line&&u(x=>ye(x,b.line))},status:c=>{if(o.current!==n)return;const b=Z(c.data),x=b?.status;x&&s(L=>L&&{...L,status:x,runtime:b.pid?{...L.runtime??{startedAt:new Date().toISOString()},pid:b.pid}:L.runtime})},"dev-server:status":c=>{if(o.current!==n)return;const b=Z(c.data);if(b?.status){const x=Y(b);s(x),v([x])}},stopped:()=>{o.current},failed:()=>{o.current}},onReconnect:()=>{o.current===n&&_()},onError:()=>{o.current===n&&m(c=>c??i("devserver.lostConnection","Lost log stream connection."))}});return()=>{h()}},[e,_,d]),t.useEffect(()=>{if(p?.status!=="running"&&p?.status!=="starting")return;const a=setInterval(()=>{_()},Vr);return()=>{clearInterval(a)}},[_,p?.status]);const M=t.useCallback(async(a,n)=>{o.current+=1;const h=o.current;try{let c;const b=typeof n=="string"&&n.length>0,x=p?.config?.cwd??".";if(!(b&&n!==x)&&d&&typeof X(()=>Oe)=="function")c=await Oe(d,e);else{const V=await Ve({command:a,cwd:n},e);c=Y(V)}if(o.current!==h)return;s(c),m(null)}catch(c){if(o.current!==h)return;throw m(W(c)),c}},[e,p?.config?.cwd,d]),R=t.useCallback(async()=>{o.current+=1;const a=o.current;try{let n;if(d&&typeof X(()=>ze)=="function")n=await ze(d,e);else{const h=await Ir(e);n=Y(h)}if(o.current!==a)return;s(n),m(null)}catch(n){if(o.current!==a)return;throw m(W(n)),n}},[e,d]),F=t.useCallback(async()=>{o.current+=1;const a=o.current;try{let n;if(d&&typeof X(()=>Fe)=="function")n=await Fe(d,e);else{const h=await qr(e);n=Y(h)}if(o.current!==a)return;s(n),m(null)}catch(n){if(o.current!==a)return;throw m(W(n)),n}},[e,d]),A=t.useCallback(async a=>{o.current+=1;const n=o.current;try{let h;if(d&&typeof X(()=>$e)=="function")h=await $e(d,a,e);else{const c=await Sr({url:a},e);h={url:c.manualUrl??c.previewUrl??c.detectedUrl??null,source:c.manualUrl?"manual":"auto"}}if(o.current!==n)return;s(c=>c?{...c,previewUrl:h.url??void 0}:null),m(null)}catch(h){if(o.current!==n)return;throw m(W(h)),h}},[e,d]),$=t.useCallback(async()=>{o.current+=1;const a=o.current;try{let n;try{n=await be(e)}catch{n=(await We(e)).map(c=>({name:c.name,command:c.command,cwd:c.cwd,scriptName:c.scriptName,packagePath:c.packagePath}))}if(o.current!==a)return;C(n),m(null)}catch(n){if(o.current!==a)return;throw m(W(n)),n}},[e]),w=t.useCallback(async(a,n)=>{if(typeof a!="string"&&!d)try{const b=a,x=await Ve({command:b.command,cwd:b.cwd,scriptName:b.scriptName,packagePath:b.packagePath??b.cwd},e),L=Y(x);s(L),v([L]),m(null);return}catch(b){throw m(W(b)),b}const h=typeof a=="string"?a:a.command,c=typeof a=="string"?n:a.cwd;await M(h,c)},[e,M,d]),f=t.useCallback(async()=>{await R()},[R]),D=t.useCallback(async()=>{await F()},[F]),B=t.useCallback(async a=>{await A(a)},[A]),O=t.useCallback(async()=>{await $()},[$]),I=t.useCallback(async()=>{await _()},[_]),S=Wr(p),N=p?{...p,pid:p.runtime?.pid}:null;return{session:p,sessions:g,logs:y,detectedCommands:j,previewUrl:S,isLoading:z,error:k,startServer:M,stopServer:R,restartServer:F,setPreviewUrl:A,detectCommands:$,refresh:_,candidates:j,serverState:N,loading:z,start:w,stop:f,restart:D,setManualUrl:B,detect:O,refreshStatus:I}}const Ie=500,qe=100;function rr(e){return e.length>Ie?e.slice(-Ie):e}function tr(e){return e==="stderr"?"stderr":"stdout"}function ce(e){try{return JSON.parse(e.data)}catch{return null}}function de(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:tr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Kr(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function Se(e,i){if(i.length===0)return e;const p=[...e],s=new Set(e.map(g=>g.id));for(const g of i)s.has(g.id)||(s.add(g.id),p.push(g));return p.sort((g,v)=>g.id-v.id),rr(p)}function Gr(e,i){const[p,s]=t.useState([]),[g,v]=t.useState(!1),[y,u]=t.useState(!1),[j,C]=t.useState(!1),[z,E]=t.useState(null),k=t.useRef(null),m=t.useRef(!1),o=t.useRef(0),d=t.useRef(0),U=t.useRef(e),T=t.useRef(i),_=t.useRef(0),M=t.useRef(1);(U.current!==e||T.current!==i)&&(U.current=e,T.current=i,o.current++,se({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),m.current=!0,_.current=0,M.current=1,s([]),v(!1),u(!1),C(!1),E(null),k.current&&(k.current(),k.current=null)),t.useEffect(()=>{if(!i){k.current&&(k.current(),k.current=null);return}const w=o.current,f=++d.current;m.current=!1,v(!0);const D=(S,N)=>{const a=rr(S);s(a),E(N),C(N!==null?N>a.length:!1);const n=a.length>0?a[a.length-1].id:0;_.current=n,M.current=n+1},B=S=>{if(m.current||o.current!==w||!S||typeof S!="object")return;const N=S.lines;if(!Array.isArray(N))return;if(N.length>0&&typeof N[0]=="string"){const n=N.filter(h=>typeof h=="string").map((h,c)=>Kr(h,c+1));D(n,n.length);return}const a=N.filter(n=>!!n&&typeof n=="object").map((n,h)=>de(n,h+1));D(a,a.length)},O=S=>{if(m.current||o.current!==w)return;const N=typeof S.text=="string"?S.text:typeof S.line=="string"?S.line:null;if(!N)return;const a=M.current,n=typeof S.id=="number"&&Number.isFinite(S.id)?S.id:a,h={id:n,text:N,stream:tr(S.stream),timestamp:typeof S.timestamp=="string"?S.timestamp:""};_.current=Math.max(_.current,n),M.current=Math.max(M.current,n+1),s(c=>Se(c,[h])),E(c=>c===null?c:Math.max(c+1,h.id))};async function I(){try{const N=await xe({maxLines:qe},e);if(m.current||o.current!==w||d.current!==f)return;const a=N.lines.map((n,h)=>de(n,h+1));D(a,N.totalLines)}catch{if(m.current||o.current!==w||d.current!==f)return;D([],null)}finally{!m.current&&o.current===w&&d.current===f&&v(!1)}const S=Ce(e);k.current=Ye(S,{events:{"dev-server:log":N=>{const a=ce(N);a&&O(a)},log:N=>{const a=ce(N);a&&O(a)},history:N=>{const a=ce(N);B(a)},"dev-server:history":N=>{const a=ce(N);B(a)}},onReconnect:()=>{se({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:_.current??null,sseChannel:S,reason:"history-replay"}),!(m.current||o.current!==w)&&xe({lastEventId:_.current,maxLines:50},e).then(N=>{if(m.current||o.current!==w)return;const a=N.lines.map((n,h)=>de(n,M.current+h));if(a.length>0){const n=a[a.length-1].id;_.current=Math.max(_.current,n),M.current=Math.max(M.current,n+1)}s(n=>Se(n,a)),E(N.totalLines)}).catch(()=>{})}}),se({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:S})}return I(),()=>{m.current=!0,k.current&&(k.current(),k.current=null)}},[i,e]);const F=t.useCallback(async()=>{if(!i||y)return;const w=o.current,f=p.length;u(!0);try{const D=await xe({maxLines:qe,offset:f},e);if(m.current||o.current!==w)return;const B=D.lines.map((O,I)=>de(O,I+1));s(O=>Se(B,O)),C(D.totalLines>f+B.length),E(D.totalLines)}catch{}finally{u(!1)}},[i,p.length,y,e]),A=t.useCallback(()=>{s([])},[]),$=k.current!==null&&!g&&!m.current;return{entries:p,loading:g,loadingMore:y,hasMore:j,total:z,loadMore:F,clear:A,logs:p,isStreaming:$,clearLogs:A}}const Jr="This preview appears to block iframe embedding. Open it in a new tab instead.",Yr="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Qr="Preview is taking longer than expected and may block iframe embedding.";function Zr(e){return e==="blocked"?Jr:e==="error"?Yr:null}function et(e,i={}){const{loadTimeoutMs:p=1e4,detectionMethod:s=null}=i,g=t.useRef(null),v=t.useRef(null),[y,u]=t.useState("unknown"),[j,C]=t.useState(null),[z]=t.useState(s),E=t.useCallback(()=>{v.current!==null&&(window.clearTimeout(v.current),v.current=null)},[]),k=t.useCallback(R=>{u(R),C(Zr(R))},[]),m=t.useCallback(()=>{u("blocked"),C(Qr)},[]);t.useEffect(()=>{if(E(),!e){u("unknown"),C(null);return}u("unknown"),C(null);let R=!1;return queueMicrotask(()=>{R||(u("loading"),C(null))}),()=>{R=!0,E()}},[E,e]),t.useEffect(()=>{if(y!=="loading"){E();return}const R=setTimeout(()=>{v.current=null,m()},p);return v.current=R,()=>{clearTimeout(R),v.current===R&&(v.current=null)}},[E,y,p,m]);const o=t.useCallback(()=>{const R=g.current;if(!R){k("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){k("blocked");return}}catch{}k("embedded")},[k]),d=t.useCallback(()=>{k("error")},[k]);t.useEffect(()=>{if(E(),!e){u("unknown"),C(null);return}u("unknown"),C(null)},[E]);const U=t.useCallback(()=>{E(),u("unknown"),C(null)},[E]),T=U,_=t.useMemo(()=>y==="embedded",[y]),M=t.useMemo(()=>y==="blocked"||y==="error",[y]);return{embedStatus:y,isEmbedded:_,isBlocked:M,blockReason:j,detectionMethod:z,iframeRef:g,resetEmbedStatus:U,setEmbedStatus:k,retry:T,embedContext:j,handleIframeLoad:o,handleIframeError:d}}const rt=/\x1b\[[0-9;]*m/g;function Le(e){return e.replace(rt,"")}function tt(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function st(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function nt(e){if(e.stream==="stderr")return"error";const i=Le(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function at(e,i){if(!i)return e;const p=new RegExp(`(${st(i)})`,"ig"),s=e.split(p),g=i.toLowerCase();return r.jsx(r.Fragment,{children:s.map((v,y)=>v.toLowerCase()===g?r.jsx("mark",{children:v},`${v}-${y}`):r.jsx("span",{children:v},`${v}-${y}`))})}function it({entries:e,loading:i,loadingMore:p,hasMore:s,total:g,onLoadMore:v,isRunning:y}){const{t:u}=ue("app"),j=t.useRef(null),C=t.useRef(e.length),z=t.useRef(y),[E,k]=t.useState(!1),[m,o]=t.useState(!1),[d,U]=t.useState(""),[T,_]=t.useState("all"),M=t.useMemo(()=>T==="all"?e:e.filter(w=>nt(w)===T),[e,T]),R=t.useMemo(()=>{const w=d.trim().toLowerCase();return w?M.filter(f=>Le(f.text).toLowerCase().includes(w)):M},[M,d]),F=R.length,A=t.useCallback(()=>{const w=j.current;w&&(w.scrollTop=w.scrollHeight,o(!1))},[]);t.useEffect(()=>{const w=z.current,f=C.current,D=e.length>f;y&&(!w||!m&&D)&&A(),z.current=y,C.current=e.length},[e.length,y,m,A]);const $=t.useCallback(()=>{const w=j.current;if(!w)return;const D=w.scrollTop+w.clientHeight>=w.scrollHeight-50;o(!D)},[]);return t.useEffect(()=>{i||e.length===0||!m&&y&&A()},[e,y,m,i,A]),i&&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(ve,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:u("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${E?" 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:u("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[g!==null?`${e.length}/${g}`:`${e.length}`," ",u("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:u("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:T,onChange:w=>_(w.target.value),"data-testid":"devserver-log-severity-filter","aria-label":u("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:u("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:u("devserver.info","Info")}),r.jsx("option",{value:"warn",children:u("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:u("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:u("devserver.searchLogs","Search logs")}),r.jsx(Rr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:w=>U(w.target.value),placeholder:u("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":u("devserver.searchLogs","Search logs")})]}),d.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:u("devserver.matchCount",{count:F,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>k(w=>!w),"data-testid":"devserver-log-fullscreen-toggle","aria-label":E?u("devserver.exitFullscreen","Exit fullscreen logs"):u("devserver.enterFullscreen","Enter fullscreen logs"),children:E?r.jsx(Dr,{size:14}):r.jsx(_r,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[s&&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:v,disabled:p,"data-testid":"devserver-log-load-more-button",children:p?r.jsxs(r.Fragment,{children:[r.jsx(ve,{size:14,className:"devserver-log-viewer__spinner"}),u("devserver.loadingOlderLogs","Loading older logs…")]}):u("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:j,className:"devserver-log-viewer__content",onScroll:$,"data-testid":"devserver-log-content",children:[!i&&R.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?u("devserver.noLogsYet","No logs yet. Start the dev server to see output."):M.length===0?u("devserver.noMatchesSeverity","No log lines match the selected severity."):u("devserver.noMatchesSearch","No log lines match your search.")}),R.map(w=>{const f=Le(w.text),D=tt(w.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[D&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:D}),w.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:u("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Mr(at(f,d.trim()))})]},w.id)})]}),m&&y&&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(Pr,{size:14}),u("devserver.newLogs","New logs")]})]})]})}const lt="devserver-preview-iframe";function ot({url:e,embedStatus:i,onEmbedStatusChange:p,iframeRef:s,blockReason:g,onRetry:v,className:y=lt,embedContext:u}){const{t:j}=ue("app"),C=g??u??null,[z,E]=t.useState(0);t.useEffect(()=>{!e||i!=="unknown"||(E(d=>d+1),p("loading"))},[i,p,e]);const k=t.useCallback(()=>{const d=s.current;if(!d){p("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){p("blocked");return}}catch{}p("embedded")},[s,p]),m=t.useCallback(d=>{d.stopPropagation(),p("error")},[p]),o=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:s,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:y,title:"Dev server preview",onLoad:k,onError:m,onErrorCapture:m,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),i==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(ve,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:j("preview.loading","Loading preview...")})]}),i==="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:j("preview.blockedTitle","Preview cannot be embedded")}),C&&r.jsx("p",{className:"devserver-preview-blocked-context",children:C})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:j("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:o,children:j("preview.openInNewTab","Open in new tab")}),v&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:v,children:j("actions.retry","Retry")})]})]}),i==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(Qe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:j("preview.errorTitle","Unable to load preview")}),C&&r.jsx("p",{className:"devserver-preview-blocked-context",children:C})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:j("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:o,children:j("preview.openInNewTab","Open in new tab")}),v&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:v,children:j("actions.retry","Retry")})]})]})]}):null}function ct(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")}}}const dt=480;function vt(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function sr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const i=e.parentElement;return i?.classList.contains("right-dock__body")?i:null}function ut(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function mt(e){if(!e||vt())return!1;const i=sr(e);return i?ut(i)<=dt:!1}function pt(e){const[i,p]=t.useState(!1);return t.useEffect(()=>{const s=e.current;if(!s){p(!1);return}const g=sr(s),v=()=>p(mt(s));if(v(),!g||typeof ResizeObserver>"u")return window.addEventListener("resize",v),()=>window.removeEventListener("resize",v);const y=new ResizeObserver(v);return y.observe(g),window.addEventListener("resize",v),()=>{y.disconnect(),window.removeEventListener("resize",v)}},[e]),i}let ke=!1;function Xe(e){return e instanceof Error?e.message:String(e)}function nr(e){return e==="."?"root":e}function Ke(e){return e?e==="root"?".":e:null}function Ge(e,i,p){return!i||e.scriptName!==i?!1:p?nr(e.cwd)===p:!0}function ft(e){return e.cwd==="."?"root":e.cwd}function ht(e){return e.length<=60?e:`${e.slice(0,60)}…`}function kt({addToast:e,projectId:i,tasks:p}){const{t:s}=ue("app");t.useEffect(()=>(se({view:"DevServerView",trigger:ke?"route-active":"remount",projectId:i,replayAttempted:!1}),ke=!1,()=>{ke=!0,se({view:"DevServerView",trigger:"route-inactive",projectId:i,replayAttempted:!1})}),[i]);const{session:g,detectedCommands:v,previewUrl:y,isLoading:u,error:j,startServer:C,stopServer:z,restartServer:E,setPreviewUrl:k,detectCommands:m,refresh:o}=Xr(i),d=g?.status??"stopped",U=d==="running"||d==="starting",T=ct(s),_=T[d]??T.stopped,{entries:M,loading:R,loadingMore:F,hasMore:A,total:$,loadMore:w}=Gr(i,!!i),f=y,D=g?.config?.cwd??null,B=t.useRef(null),O=pt(B),[I,S]=t.useState(!0),[N,a]=t.useState(""),[n,h]=t.useState(""),[c,b]=t.useState(null),[x,L]=t.useState(null),[V,Re]=t.useState(null),K=t.useMemo(()=>(p??[]).filter(l=>l.column==="in-progress"&&typeof l.worktree=="string"&&l.worktree.length>0),[p]),q=t.useMemo(()=>K.find(l=>l.id===x)??null,[K,x]);t.useEffect(()=>{x&&!K.some(l=>l.id===x)&&L(null)},[K,x]);const[ee,ar]=t.useState("embedded"),[re,me]=t.useState(!1),De=t.useRef(null),pe=t.useRef(null),ir=ee==="embedded"?f:null,{embedStatus:H,setEmbedStatus:lr,resetEmbedStatus:ne,iframeRef:Q,isEmbedded:or,isBlocked:fe,blockReason:he,retry:_e}=et(ir),[Me,G]=t.useState(!1),Pe=t.useRef(H);t.useEffect(()=>{const l=Pe.current!==H;fe&&l&&G(!0),H==="embedded"&&G(!1),Pe.current=H},[H,fe]),t.useEffect(()=>{G(!1)},[f]);const ae=t.useMemo(()=>{if(!c)return null;const l=Ke(D);return v.find(P=>!(P.scriptName!==c||l&&P.cwd!==l||g?.config?.command&&P.command!==g.config.command))??v.find(P=>Ge(P,c,D))??null},[v,g?.config?.command,c,D]);t.useEffect(()=>{typeof m=="function"&&m().catch(l=>{e(Xe(l),"error")})},[e,m]),t.useEffect(()=>{if(c){S(!1);return}S(!0)},[c]),t.useEffect(()=>{if(g?.status==="running"||g?.status==="starting"){g.config?.command?.trim().length>0&&a(g.config.command);return}if(ae){a(ae.command);return}v.length>0&&a(l=>l.trim().length>0?l:v[0]?.command??"")},[v,ae,g?.config?.command,g?.status]),t.useEffect(()=>{h(f??"")},[f]);const ie=t.useCallback(()=>{me(!1),window.requestAnimationFrame(()=>De.current?.focus())},[]),cr=Tr(ie);t.useEffect(()=>{if(!re)return;pe.current?.focus();const l=P=>{if(P.key==="Escape"){ie();return}if(P.key!=="Tab")return;const te=Array.from(pe.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(Ae=>!Ae.hasAttribute("disabled")&&Ae.getAttribute("aria-hidden")!=="true"),J=te[0],we=te.at(-1);!J||!we||(P.shiftKey&&document.activeElement===J?(P.preventDefault(),we.focus()):!P.shiftKey&&document.activeElement===we&&(P.preventDefault(),J.focus()))};return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[ie,re]),t.useEffect(()=>{!O&&re&&me(!1)},[O,re]);const ge=t.useCallback(()=>{f&&window.open(f,"_blank","noopener,noreferrer")},[f]),Te=t.useCallback(()=>{G(!1),_e()},[_e]),dr=t.useCallback(()=>{try{const l=Q.current;if(l?.contentWindow){l.contentWindow.location.reload(),G(!1),ne();return}}catch{}if(!(!f||!Q.current))try{const l=new URL(f);l.searchParams.set("_t",Date.now().toString()),Q.current.src=l.toString(),G(!1),ne()}catch{Q.current.src=f,G(!1),ne()}},[f,Q,ne]),le=t.useCallback(async(l,P,te)=>{Re(l);try{await P(),e(te,"success")}catch(J){e(Xe(J),"error")}finally{Re(null)}},[e]),vr=t.useCallback(l=>{b(l.scriptName),S(!1),a(l.command),e(s("devserver.toast.selectedScript","Selected {{name}} script.",{name:l.scriptName}),"success")},[e]),ur=t.useCallback(()=>{b(null),S(!0),e(s("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),mr=t.useCallback(l=>{U&&l&&l!==x&&e(s("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),L(l)},[e,U,x,s]),pr=()=>{const l=N.trim();if(l.length===0){e(s("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const P=Ke(D)??".",J=q?.worktree??null??ae?.cwd??P;le("start",()=>C(l,J),s("devserver.toast.started","Dev server started."))},fr=()=>{le("stop",z,s("devserver.toast.stopped","Dev server stopped."))},hr=()=>{le("restart",E,s("devserver.toast.restarted","Dev server restarted."))},gr=()=>{const l=n.trim(),P=l.length>0?l:null;le("preview",()=>k(P),P?s("devserver.toast.previewUpdated","Preview URL updated."):s("devserver.toast.previewCleared","Preview URL override cleared."))},wr=t.useCallback(()=>{j&&o()},[j,o]),br=d==="starting"||d==="running"||V!==null,xr=d==="stopped"||V!==null,yr=d==="stopped"||d==="starting"||V!==null,Ue=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(Be,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:f??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[s("devserver.auto","Auto"),f?` · ${f}`:s("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ar(l=>l==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:ee==="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:ge,disabled:!f,"data-testid":"devserver-preview-open-tab",children:r.jsx(Br,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.refreshPreview","Refresh preview"),onClick:dr,disabled:!f,"data-testid":"devserver-preview-refresh",children:r.jsx(Hr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":H,"data-embedded":or?"true":"false",children:[!f&&!U&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.startDevServer","Start a dev server to see a live preview here.")}),!f&&U&&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.")}),f&&ee==="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:ge,"data-testid":"devserver-preview-external-open-tab",children:s("devserver.openInNewTab","Open in new tab")})]}),f&&ee==="embedded"&&Me&&fe&&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(Qe,{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")}),he&&r.jsx("p",{className:"devserver-preview-blocked-context",children:he})]}),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:ge,"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:Te,"data-testid":"devserver-preview-fallback-retry",children:s("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),f&&ee==="embedded"&&!Me&&r.jsx(ot,{url:f,embedStatus:H,onEmbedStatusChange:lr,iframeRef:Q,blockReason:he,onRetry:Te})]})]});return r.jsxs("div",{ref:B,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":O?"true":"false",children:[r.jsx(Ur,{icon:Ar,title:s("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${_.className}`,"data-testid":"dev-server-status-badge",children:_.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:pr,disabled:br,"data-testid":"dev-server-start-button",children:[r.jsx(Or,{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:fr,disabled:xr,"data-testid":"dev-server-stop-button",children:[r.jsx(zr,{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:hr,disabled:yr,"data-testid":"dev-server-restart-button",children:[r.jsx(Fr,{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":s("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.configuration","Configuration")}),u&&r.jsx("span",{className:"dev-server-muted",children:s("devserver.loading","Loading...")})]}),u&&!g&&v.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(ve,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:s("devserver.loadingConfig","Loading dev server configuration...")})]}),j&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:j}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:wr,children:s("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:s("devserver.scriptSelection","Script Selection")}),c&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:c}),r.jsx("span",{className:"dev-server-candidate-source",children:D??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>S(!0),"data-testid":"dev-server-change-selection",children:s("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:ur,"data-testid":"dev-server-clear-selection",children:s("devserver.clear","Clear")})]}),I&&v.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.")}),I&&v.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:v.map(l=>{const P=Ge(l,c,D);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${P?"dev-server-candidate--selected":""}`,onClick:()=>vr(l),"data-testid":`dev-server-candidate-${l.scriptName}-${nr(l.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:l.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:ht(l.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:ft(l)})]},`${l.cwd}::${l.scriptName}::${l.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:s("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:s("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:x??"",onChange:l=>mr(l.target.value.length>0?l.target.value:null),disabled:K.length===0,"aria-label":s("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:s("devserver.projectRootNoTask","Project root (no task)")}),K.map(l=>r.jsx("option",{value:l.id,children:l.title?`${l.id} — ${l.title}`:l.id},l.id))]}),K.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:s("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),q&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:q.title?`${q.id} — ${q.title}`:q.id})}),r.jsx("p",{className:"dev-server-task-description",children:q.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:s("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:q.worktree})]})]})]})]}),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:N,onChange:l=>a(l.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:d==="running"||d==="starting"})]}),(d==="running"||d==="starting")&&g&&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:g.config?.command??N})]}),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:n,onChange:l=>h(l.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:gr,disabled:V==="preview","data-testid":"dev-server-set-preview",children:s("devserver.save","Save")})]}),f&&r.jsx("p",{className:"dev-server-preview-hint",children:s("devserver.autoDetected","Auto-detected: {{url}}",{url:f})})]}),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":s("devserver.logsLabel","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:$??M.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(it,{entries:M,loading:R,loadingMore:F,hasMore:A,total:$,onLoadMore:w,isRunning:U})})]})}),O?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":s("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(Be,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:f??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:f||s("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:f?s("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):s("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:De,onClick:()=>me(!0),"data-testid":"devserver-preview-modal-open",children:s("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":s("devserver.previewLabel","Dev server preview"),children:Ue()}),O&&re&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...cr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:pe,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:s("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ie,"aria-label":s("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx($r,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:Ue()})]})})]})}export{kt as DevServerView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{al as z,am as D,an as S,ao as f,e as j,ap as T,E as B,n as A,P as L,L as K,g as N}from"./index-D8sgsB8q.js";import{u as R}from"./vendor-i18n-GF3RlKbq.js";import{F as U}from"./folder-open-BWBZSyO2.js";function M({value:b,onChange:h,placeholder:F,onInputKeyDown:g,nodeId:m,localNodeId:k,selectCreatedDirectory:x=!1}){const{t:i}=R("app"),[e,s]=n.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1,createFolderOpen:!1,createFolderError:null}),[p,u]=n.useState(""),d=n.useCallback(async(t,c=!1)=>{s(o=>({...o,loading:!0,error:null}));try{const o=await z(t,c,m,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"}))}},[m,k]),C=n.useCallback(()=>{s(t=>t.isOpen?{...t,isOpen:!1}:{...t,isOpen:!0})},[]);n.useEffect(()=>{e.isOpen&&!e.loading&&!e.currentPath&&!e.error&&d(b||void 0,e.showHidden)},[e.isOpen,e.loading,e.currentPath,e.error,b,e.showHidden,d,m,k]);const y=n.useCallback(t=>{d(t,e.showHidden)},[d,e.showHidden]),H=n.useCallback(()=>{h(e.currentPath),s(t=>({...t,isOpen:!1}))},[e.currentPath,h]),E=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 w=n.useCallback(()=>{s(t=>({...t,createFolderOpen:!t.createFolderOpen,createFolderError:null})),u("")},[]),P=n.useCallback(async()=>{if(!p.trim()||!e.currentPath)return;const t=p.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{const a=await D(o);u(""),s(l=>({...l,createFolderOpen:!1})),x?(h(a.path),await d(a.path,e.showHidden),s(l=>l.error?{...l,isOpen:!1,error:null}:l)):await d(e.currentPath,e.showHidden)}catch(a){s(l=>({...l,loading:!1,createFolderError:a instanceof Error?a.message:"Failed to create folder"}))}},[p,e.currentPath,e.showHidden,d,h,x]),O=n.useCallback(t=>{t.key==="Enter"?(t.preventDefault(),P()):t.key==="Escape"&&(s(c=>({...c,createFolderOpen:!1,createFolderError:null})),u(""))},[P]),v=e.currentPath?S(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:b,onChange:t=>h(t.target.value),onKeyDown:g,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:C,"aria-label":e.isOpen?i("dirPicker.closeBrowser","Close directory browser"):i("dirPicker.openBrowser","Browse directories"),children:[e.isOpen?r.jsx(U,{size:16}):r.jsx(f,{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:v.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:()=>y(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:()=>y(e.parentPath),"aria-label":i("dirPicker.parentDir","Go to parent directory"),title:i("dirPicker.parentDirTitle","Parent directory"),children:[r.jsx(T,{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:E,"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(B,{size:14}):r.jsx(A,{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:w,"aria-label":i("dirPicker.createFolderAria","Create new folder"),title:i("dirPicker.createFolderTitle","Create folder"),children:[r.jsx(L,{size:14}),r.jsx("span",{children:i("dirPicker.createFolder","New folder")})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(K,{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(N,{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:()=>y(t.path),role:"treeitem",title:t.path,children:[r.jsx(f,{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:p,onChange:t=>u(t.target.value),onKeyDown:O,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:P,disabled:!p.trim()||e.loading||!e.currentPath,children:i("dirPicker.createFolderConfirm","Create")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-secondary",onClick:w,children:i("dirPicker.cancel","Cancel")})]}),e.createFolderError&&r.jsxs("div",{className:"directory-picker-create-folder-error",children:[r.jsx(N,{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:H,children:i("dirPicker.select","Select")})]})]})]})}export{M as D};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as a,j as e}from"./vendor-react-SZ_qB27O.js";import{c as $e,
|
|
1
|
+
import{r as a,j as e}from"./vendor-react-SZ_qB27O.js";import{c as $e,aD as et,aE as tt,aF as Qt,cK as Yt,cL as ct,aI as Xt,aa as xe,cM as rt,a$ as te,cN as Z,a6 as Oe,cO as lt,cP as Zt,cQ as Jt,q as Re,aN as ze,h as ke,r as pe,cR as ot,cS as es,X as dt,cT as ts,cU as ss,cV as he,cW as as,cX as st,cp as ns,cE as is,cY as cs,cZ as at,V as rs,E as ls,n as os,bM as ds,R as us,a8 as fe,A as nt}from"./index-D8sgsB8q.js";import{u as ut}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -13,4 +13,4 @@ import{r as a,j as e}from"./vendor-react-SZ_qB27O.js";import{c as $e,aB as et,aC
|
|
|
13
13
|
*
|
|
14
14
|
* This source code is licensed under the ISC license.
|
|
15
15
|
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
-
*/const fs=[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]],Ve=$e("video",fs);function ks(t){const{projectId:i,searchQuery:n,includeProjectFiles:d=!0}=t??{},o=i?`${Qt.DOCUMENTS_PREFIX}${i}`:null,[s,l]=a.useState(()=>{if(!o)return[];const j=et(o,{maxAgeMs:tt});return Array.isArray(j)?j:[]}),[k,r]=a.useState([]),[p,v]=a.useState(()=>s.length===0),[m,N]=a.useState(null),x=a.useRef(null),g=a.useRef(s.length>0),b=a.useRef(null),u=a.useCallback(async()=>{x.current&&x.current.abort();const j=new AbortController;x.current=j;const T=!g.current;T&&v(!0),N(null);const z=Yt(n?{q:n}:void 0,i),D=d?ct(i):Promise.resolve({files:[]}),[E,A]=await Promise.allSettled([z,D]);if(j.signal.aborted)return;let L=null;if(E.status==="fulfilled"){if(l(E.value),o){const $=E.value.length>500?E.value.slice(0,500):E.value;Xt(o,$,{maxBytes:5e5})}g.current=!0}else L=E.reason instanceof Error?E.reason.message:String(E.reason);if(A.status==="fulfilled"){const $=A.value.files,M=n?.trim().toLowerCase(),O=M?$.filter(R=>R.name.toLowerCase().includes(M)||R.path.toLowerCase().includes(M)):$;r(O)}N(L),T&&v(!1)},[o,d,i,n]);return a.useEffect(()=>{if(!o){g.current=!1,l([]),v(!0);return}const j=et(o,{maxAgeMs:tt});Array.isArray(j)?(l(j),g.current=!0,v(!1)):(g.current=!1,l([]),v(!0))},[o]),a.useEffect(()=>(b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{u()},300),()=>{b.current&&clearTimeout(b.current)}),[u]),a.useEffect(()=>(u(),()=>{x.current&&x.current.abort()}),[]),{documents:s,projectFiles:k,loading:p,error:m,refresh:u}}function ps(t,i){const[n,d]=a.useState([]),[o,s]=a.useState(!0),[l,k]=a.useState(null),r=a.useRef(null),p=a.useRef(!1),v=i?.showHidden??!1,m=a.useCallback(async N=>{r.current&&r.current.abort();const x=new AbortController;r.current=x;const g=!p.current;g&&s(!0),k(null);try{const b=await ct(t,{showHidden:N?.showHidden??v});if(x.signal.aborted)return;d(b.files),p.current=!0}catch(b){if(x.signal.aborted)return;k(b instanceof Error?b.message:String(b))}finally{!x.signal.aborted&&g&&s(!1)}},[t,v]);return a.useEffect(()=>(p.current=!1,m({showHidden:v}),()=>{r.current&&r.current.abort()}),[m,v]),{files:n,loading:o,error:l,refresh:m}}const it=["image","doc","pdf","video","audio","other"];function ce(t){return(t.mimeType?.toLowerCase().split(";",1)[0]??"")==="application/pdf"||t.uri?.toLowerCase().endsWith(".pdf")?"pdf":t.type==="image"?"image":t.type==="video"?"video":t.type==="audio"?"audio":t.type==="document"?"doc":"other"}const Ie={image:mt,doc:te,pdf:rt,video:Ve,audio:Ue,other:xe};function Me(t,i){switch(i){case"image":return t("documents.artifactCategoryImages","Images");case"doc":return t("documents.artifactCategoryDocs","Docs");case"pdf":return t("documents.artifactCategoryPdfs","PDFs");case"video":return t("documents.artifactCategoryVideos","Videos");case"audio":return t("documents.artifactCategoryAudio","Audio");case"other":return t("documents.artifactCategoryOther","Other")}}function je(t){return t?new Date(t).toLocaleString():""}function He(t){return t===void 0?"":t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(t>=10*1024?0:1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function xs({artifacts:t,projectId:i,isMobile:n,addToast:d,onOpenTask:o,onArtifactUpdated:s}){const{t:l}=ut("app"),[k,r]=a.useState("all"),[p,v]=a.useState(null),m=a.useRef(null),N=a.useMemo(()=>{const u=new Map;for(const j of t){const T=ce(j),z=u.get(T);z?z.push(j):u.set(T,[j])}return u},[t]);a.useEffect(()=>{k!=="all"&&!N.has(k)&&r("all")},[k,N]);const x=a.useCallback(u=>{const j=ce(u),T=j==="doc"?"doc":j==="pdf"?"pdf":"media";m.current=document.activeElement instanceof HTMLElement?document.activeElement:null,v({artifact:u,kind:T})},[]),g=a.useCallback(()=>{v(null),m.current?.focus(),m.current=null},[]),b=it.filter(u=>N.has(u)&&(k==="all"||k===u));return e.jsxs("div",{className:"artifacts-gallery",children:[N.size>1&&e.jsxs("div",{className:"artifacts-gallery-filter",role:"group","aria-label":l("documents.artifactTypeFilterLabel","Filter artifacts by category"),children:[e.jsxs("button",{className:`btn btn-sm artifacts-gallery-chip${k==="all"?" active":""}`,"aria-pressed":k==="all",onClick:()=>r("all"),children:[l("documents.artifactFilterAll","All"),e.jsx("span",{className:"artifacts-gallery-chip-count",children:t.length})]}),it.filter(u=>N.has(u)).map(u=>{const j=Ie[u];return e.jsxs("button",{className:`btn btn-sm artifacts-gallery-chip${k===u?" active":""}`,"aria-pressed":k===u,onClick:()=>r(u),children:[e.jsx(j,{size:14,"aria-hidden":"true"}),Me(l,u),e.jsx("span",{className:"artifacts-gallery-chip-count",children:N.get(u)?.length})]},u)})]}),b.map(u=>{const j=N.get(u)??[],T=Ie[u];return e.jsxs("section",{className:"artifacts-gallery-section","aria-label":Me(l,u),children:[k==="all"&&N.size>1&&e.jsxs("header",{className:"artifacts-gallery-section-header",children:[e.jsx(T,{size:16,"aria-hidden":"true"}),e.jsx("h3",{children:Me(l,u)}),e.jsx("span",{className:"artifacts-gallery-section-count",children:j.length})]}),e.jsx(js,{category:u,items:j,projectId:i,isMobile:n,t:l,onOpen:x,onOpenTask:o})]},u)}),p&&p.kind==="media"&&e.jsx(Ns,{artifact:p.artifact,projectId:i,t:l,onClose:g,onOpenTask:o}),p&&p.kind==="pdf"&&e.jsx(Cs,{artifact:p.artifact,projectId:i,t:l,onClose:g,onOpenTask:o}),p&&p.kind==="doc"&&e.jsx(Ts,{artifact:p.artifact,projectId:i,t:l,addToast:d,onClose:g,onOpenTask:o,onArtifactUpdated:s})]})}function js({category:t,items:i,projectId:n,isMobile:d,t:o,onOpen:s,onOpenTask:l}){if(t==="audio")return e.jsx("div",{className:"artifacts-gallery-rows",children:i.map(r=>e.jsx(bs,{artifact:r,projectId:n,t:o,onOpenTask:l},r.id))});if(t==="other")return e.jsx("div",{className:"artifacts-gallery-rows",children:i.map(r=>e.jsx(vs,{artifact:r,projectId:n,t:o,onOpenTask:l},r.id))});const k=t==="image"||t==="video"?"artifacts-gallery-grid artifacts-gallery-grid--visual":"artifacts-gallery-grid artifacts-gallery-grid--cards";return e.jsx("div",{className:`${k}${d?" artifacts-gallery-grid--mobile":""}`,children:i.map(r=>t==="image"||t==="video"?e.jsx(ws,{artifact:r,category:t,projectId:n,t:o,onOpen:s},r.id):e.jsx(gs,{artifact:r,category:t,t:o,onOpen:s,onOpenTask:l},r.id))})}function ws({artifact:t,category:i,projectId:n,t:d,onOpen:o}){const s=t.title||d("documents.untitledArtifact","Untitled artifact"),l=J(t.id,n),k=r=>{(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),o(t))};return e.jsx("article",{className:"artifacts-gallery-tile","aria-label":d("documents.artifactCardLabel","Artifact {{title}}",{title:s}),children:e.jsxs("div",{className:"artifacts-gallery-tile-media",role:"button",tabIndex:0,"aria-label":d("documents.expandArtifact","Expand {{title}}",{title:s}),onClick:()=>o(t),onKeyDown:k,children:[i==="image"?e.jsx("img",{src:l,alt:s,loading:"lazy"}):e.jsx("video",{src:l,muted:!0,preload:"metadata","aria-label":d("documents.artifactVideoLabel","Video artifact: {{title}}",{title:s})}),i==="video"&&e.jsx("span",{className:"artifacts-gallery-tile-play","aria-hidden":"true",children:e.jsx(Ve,{size:22})}),e.jsxs("div",{className:"artifacts-gallery-tile-overlay",children:[e.jsx("span",{className:"artifacts-gallery-tile-title",children:s}),t.taskId&&e.jsx("span",{className:"artifacts-gallery-tile-task",children:t.taskId})]})]})})}function gs({artifact:t,category:i,t:n,onOpen:d,onOpenTask:o}){const s=t.title||n("documents.untitledArtifact","Untitled artifact"),l=Ie[i],k=r=>{(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),d(t))};return e.jsxs("article",{className:"artifacts-gallery-card","aria-label":n("documents.artifactCardLabel","Artifact {{title}}",{title:s}),children:[e.jsxs("div",{className:"artifacts-gallery-card-main",role:"button",tabIndex:0,"aria-label":n("documents.openArtifactViewer","Open {{title}}",{title:s}),onClick:()=>d(t),onKeyDown:k,children:[e.jsx("div",{className:`artifacts-gallery-card-icon artifacts-gallery-card-icon--${i}`,children:e.jsx(l,{size:22,"aria-hidden":"true"})}),e.jsxs("div",{className:"artifacts-gallery-card-body",children:[e.jsx("h4",{className:"artifacts-gallery-card-title",children:s}),t.description&&e.jsx("p",{className:"artifacts-gallery-card-description",children:t.description}),e.jsxs("div",{className:"artifacts-gallery-card-meta",children:[e.jsx("span",{children:t.authorId}),e.jsx("span",{children:"·"}),e.jsx("span",{children:je(t.createdAt)}),t.sizeBytes!==void 0&&e.jsxs("span",{children:["· ",He(t.sizeBytes)]})]})]})]}),t.taskId&&e.jsx("button",{className:"artifacts-gallery-task-link artifacts-gallery-card-task",onClick:()=>o(t.taskId),"aria-label":n("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:t.taskId,title:t.taskTitle||n("documents.untitled","Untitled")}),children:t.taskId})]})}function bs({artifact:t,projectId:i,t:n,onOpenTask:d}){const o=t.title||n("documents.untitledArtifact","Untitled artifact");return e.jsxs("article",{className:"artifacts-gallery-row","aria-label":n("documents.artifactCardLabel","Artifact {{title}}",{title:o}),children:[e.jsxs("div",{className:"artifacts-gallery-row-info",children:[e.jsx(Ue,{size:16,"aria-hidden":"true"}),e.jsx("span",{className:"artifacts-gallery-row-title",children:o}),t.taskId&&e.jsx("button",{className:"artifacts-gallery-task-link",onClick:()=>d(t.taskId),children:t.taskId}),e.jsx("span",{className:"artifacts-gallery-row-meta",children:je(t.createdAt)})]}),e.jsx("audio",{className:"artifacts-gallery-audio",controls:!0,src:J(t.id,i),"aria-label":n("documents.artifactAudioLabel","Audio artifact: {{title}}",{title:o})})]})}function vs({artifact:t,projectId:i,t:n,onOpenTask:d}){const o=t.title||n("documents.untitledArtifact","Untitled artifact");return e.jsxs("article",{className:"artifacts-gallery-row","aria-label":n("documents.artifactCardLabel","Artifact {{title}}",{title:o}),children:[e.jsxs("div",{className:"artifacts-gallery-row-info",children:[e.jsx(xe,{size:16,"aria-hidden":"true"}),e.jsx("span",{className:"artifacts-gallery-row-title",children:o}),t.mimeType&&e.jsx("span",{className:"artifacts-gallery-row-mime badge",children:t.mimeType}),t.taskId&&e.jsx("button",{className:"artifacts-gallery-task-link",onClick:()=>d(t.taskId),children:t.taskId}),e.jsxs("span",{className:"artifacts-gallery-row-meta",children:[He(t.sizeBytes),t.sizeBytes!==void 0?" · ":"",je(t.createdAt)]})]}),e.jsxs("a",{className:"btn btn-sm artifacts-gallery-row-download",href:J(t.id,i),target:"_blank",rel:"noreferrer","data-testid":"artifact-other-link","aria-label":n("documents.downloadArtifactAria","Download {{title}}",{title:o}),children:[e.jsx(ot,{size:14,"aria-hidden":"true"}),n("documents.downloadArtifact","Download")]})]})}function ys(t,i){a.useEffect(()=>{i.current?.focus();const n=d=>{d.key==="Escape"&&(d.preventDefault(),t())};return document.addEventListener("keydown",n),()=>{document.removeEventListener("keydown",n)}},[i,t])}function _e({label:t,onClose:i,children:n,wide:d,closeRef:o,windowKey:s,persistKey:l}){return ys(i,o),e.jsx(es,{windowKey:s,title:null,onClose:i,hideHeader:!0,dragHandleSelector:".artifacts-gallery-viewer-header",className:"artifacts-gallery-window",ariaLabel:t,suspendGeometryPersistenceOnMobile:!0,suspendGeometryPersistenceOnShortViewport:!0,persistGeometryKey:l,defaultSize:d?{width:1024,height:720}:{width:720,height:640},minSize:{width:320,height:280},children:e.jsx("div",{className:"artifacts-gallery-viewer",children:n})})}function Be({title:t,onClose:i,t:n,actions:d,closeRef:o}){return e.jsxs("div",{className:"artifacts-gallery-viewer-header",children:[e.jsx("h3",{className:"artifacts-gallery-viewer-title",children:t}),e.jsxs("div",{className:"artifacts-gallery-viewer-actions",children:[d,e.jsx("button",{ref:o,className:"modal-close",onClick:i,"aria-label":n("documents.closeLightbox","Close artifact preview"),children:e.jsx(dt,{size:20})})]})]})}function Ke({artifact:t,t:i,onOpenTask:n}){return e.jsxs("div",{className:"artifacts-gallery-viewer-meta",children:[t.description&&e.jsx("p",{className:"artifacts-gallery-viewer-description",children:t.description}),e.jsxs("div",{className:"artifacts-gallery-viewer-meta-row",children:[e.jsx("span",{children:t.authorId}),e.jsx("span",{children:"·"}),e.jsx("span",{children:je(t.createdAt)}),t.sizeBytes!==void 0&&e.jsxs("span",{children:["· ",He(t.sizeBytes)]}),t.taskId&&e.jsxs("button",{className:"artifacts-gallery-task-link",onClick:()=>n(t.taskId),children:[i("documents.openTask","Open task")," ",t.taskId]})]})]})}function Ns({artifact:t,projectId:i,t:n,onClose:d,onOpenTask:o}){const s=t.title||n("documents.untitledArtifact","Untitled artifact"),l=J(t.id,i),k=a.useRef(null);return e.jsxs(_e,{label:n("documents.lightboxLabel","Artifact media preview"),onClose:d,wide:!0,closeRef:k,windowKey:`artifact-media-${t.id}`,persistKey:"fn-artifact-viewer-media-geometry",children:[e.jsx(Be,{title:s,onClose:d,t:n,closeRef:k,actions:e.jsx("a",{className:"btn btn-sm",href:l,target:"_blank",rel:"noreferrer","aria-label":n("documents.openInNewTab","Open in new tab"),children:e.jsx(Oe,{size:14,"aria-hidden":"true"})})}),e.jsx("div",{className:"artifacts-gallery-viewer-media-frame",children:t.type==="image"?e.jsx("img",{className:"artifacts-gallery-viewer-media",src:l,alt:s}):e.jsx("video",{className:"artifacts-gallery-viewer-media",src:l,controls:!0,autoPlay:!0,"aria-label":n("documents.artifactVideoLabel","Video artifact: {{title}}",{title:s})})}),e.jsx(Ke,{artifact:t,t:n,onOpenTask:o})]})}function Cs({artifact:t,projectId:i,t:n,onClose:d,onOpenTask:o}){const s=t.title||n("documents.untitledArtifact","Untitled artifact"),l=J(t.id,i),k=a.useRef(null);return e.jsxs(_e,{label:n("documents.pdfViewerLabel","PDF artifact viewer"),onClose:d,wide:!0,closeRef:k,windowKey:`artifact-pdf-${t.id}`,persistKey:"fn-artifact-viewer-pdf-geometry",children:[e.jsx(Be,{title:s,onClose:d,t:n,closeRef:k,actions:e.jsxs("a",{className:"btn btn-sm",href:l,target:"_blank",rel:"noreferrer","aria-label":n("documents.openInNewTab","Open in new tab"),children:[e.jsx(Oe,{size:14,"aria-hidden":"true"}),n("documents.openInNewTab","Open in new tab")]})}),e.jsx("iframe",{className:"artifacts-gallery-viewer-pdf",src:l,title:s}),e.jsx(Ke,{artifact:t,t:n,onOpenTask:o})]})}function Ss(t){const i=t.mimeType?.toLowerCase().split(";",1)[0]??"",n=i==="text/html"?".html":i==="application/json"?".json":i==="text/plain"?".txt":".md";return`${(t.title||"artifact").replace(/[^\w.-]+/g,"-")}${n}`}function Ts({artifact:t,projectId:i,t:n,addToast:d,onClose:o,onOpenTask:s,onArtifactUpdated:l}){const k=t.title||n("documents.untitledArtifact","Untitled artifact"),[r,p]=a.useState(null),[v,m]=a.useState(null),[N,x]=a.useState(null),[g,b]=a.useState(null),[u,j]=a.useState(!1),[T,z]=a.useState(""),[D,E]=a.useState(!1),[A,L]=a.useState(!0),$=a.useRef(null);a.useEffect(()=>{let C=!1;return lt(t.id,i).then(P=>{C||p(P)}).catch(P=>{C||m(P instanceof Error?P.message:String(P))}),()=>{C=!0}},[t.id,i]);const M=r!==null&&!r.uri,O=r?.content??"",R=(r?.mimeType??t.mimeType)?.toLowerCase().split(";",1)[0]==="text/html";a.useEffect(()=>{if(!r?.uri||!R||!A){x(null),b(null);return}const C=new AbortController;let P;return x(null),b(null),fetch(Jt(t.id,i),{headers:Zt(),signal:C.signal}).then(async U=>{if(!U.ok)throw new Error(`Unable to load HTML preview (${U.status})`);P=URL.createObjectURL(await U.blob()),C.signal.aborted||x(P)}).catch(U=>{C.signal.aborted||b(U instanceof Error?U.message:String(U))}),()=>{C.abort(),P&&URL.revokeObjectURL(P)}},[t.id,r?.uri,R,i,A]);const re=()=>{z(O),j(!0)},le=async()=>{E(!0);try{const C=await ts(t.id,{content:T},i);p(C),j(!1),d(n("documents.artifactSaved","Artifact saved"),"success"),l?.()}catch(C){d(C instanceof Error?C.message:String(C),"error")}finally{E(!1)}};return e.jsxs(_e,{label:n("documents.docViewerLabel","Document artifact viewer"),onClose:o,wide:!0,closeRef:$,windowKey:`artifact-doc-${t.id}`,persistKey:"fn-artifact-viewer-doc-geometry",children:[e.jsx(Be,{title:k,onClose:o,t:n,closeRef:$,actions:u?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>j(!1),disabled:D,children:n("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void le(),disabled:D,children:D?n("documents.saving","Saving…"):n("documents.saveArtifact","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>L(C=>!C),"aria-pressed":A,title:R?A?n("documents.switchToSource","Switch to source view"):n("documents.switchToPreview","Switch to live preview"):A?n("documents.switchToPlainText","Switch to plain text"):n("documents.switchToMarkdown","Switch to markdown"),children:R?A?n("documents.htmlPreview","Preview"):n("documents.htmlSource","Source"):A?n("documents.markdown","Markdown"):n("documents.plain","Plain")}),M&&e.jsxs("button",{className:"btn btn-sm",onClick:re,"aria-label":n("documents.editArtifact","Edit document"),children:[e.jsx(Re,{size:14,"aria-hidden":"true"}),n("documents.edit","Edit")]})]})}),e.jsx("div",{className:"artifacts-gallery-viewer-doc",children:v?e.jsx("p",{className:"artifacts-gallery-viewer-error",children:v}):r===null?e.jsx("p",{className:"artifacts-gallery-viewer-loading",children:n("documents.loadingArtifact","Loading artifact…")}):u?e.jsx("div",{className:"artifacts-gallery-viewer-editor","aria-label":n("documents.artifactContentEditor","Artifact content editor"),children:e.jsx(ze,{content:T,onChange:z,filePath:Ss(r),forceToolbarActionsVisible:!0})}):R&&A?r.uri&&!N?e.jsx("p",{className:"artifacts-gallery-viewer-loading",children:g??n("documents.loadingArtifact","Loading artifact…")}):e.jsx("iframe",{className:"artifacts-gallery-viewer-html",sandbox:"allow-scripts",title:k,...r.uri?{src:N}:{srcDoc:O}}):r.uri?e.jsxs("p",{className:"artifacts-gallery-viewer-loading",children:[n("documents.binaryDocArtifact","This document is stored as a file.")," ",e.jsx("a",{href:J(t.id,i),target:"_blank",rel:"noreferrer",children:n("documents.openArtifactMedia","Open artifact media")})]}):A?e.jsx("div",{className:"markdown-body",children:e.jsx(ke,{remarkPlugins:[pe],children:O})}):e.jsx("pre",{className:"artifacts-gallery-viewer-plain",children:O})}),e.jsx(Ke,{artifact:t,t:n,onOpenTask:s})]})}const As=768,Fs={image:mt,doc:te,pdf:rt,video:Ve,audio:Ue,other:xe};function ie(t){return t?new Date(t).toLocaleString():""}function Es(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(t>=10*1024?0:1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Ls(t){return t==="done"?"status-dot status-dot--online":t==="archived"?"status-dot status-dot--offline":t==="todo"||t==="triage"?"status-dot status-dot--pending":"status-dot status-dot--connecting"}function ht(t,i){switch(i){case"image":return t("documents.artifactCategoryImage","Image");case"doc":return t("documents.artifactCategoryDoc","Document");case"pdf":return t("documents.artifactCategoryPdf","PDF");case"video":return t("documents.artifactCategoryVideo","Video");case"audio":return t("documents.artifactCategoryAudioSingle","Audio");case"other":return t("documents.artifactCategoryOtherSingle","Other")}}function Ps(t,i){return i?[t.title,t.description,t.taskId,t.taskTitle,t.mimeType,t.authorId].some(n=>n?.toLowerCase().includes(i)):!0}function Ds(t){const i=t.mimeType?.toLowerCase().split(";",1)[0]??"";return!!t.content||t.type==="document"||i.startsWith("text/")||i==="application/json"||i==="application/xml"}function Ms({artifact:t,projectId:i,content:n,loading:d,error:o,renderMarkdown:s,onToggleMarkdown:l,onOpenTask:k,t:r}){const[p,v]=a.useState(null),m=ce(t),N=ht(r,m),x=t.title||r("documents.untitledArtifact","Untitled artifact"),g=J(t.id,i),b=m==="doc"&&Ds(t);a.useEffect(()=>{v(null)},[t.id]);const u=p?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:p}):null,j=m==="image"?e.jsxs(e.Fragment,{children:[u,e.jsx("img",{className:"documents-task-artifact-media",src:g,alt:x,onError:()=>v(r("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):m==="video"?e.jsxs(e.Fragment,{children:[u,e.jsx("video",{className:"documents-task-artifact-media",controls:!0,src:g,"aria-label":r("documents.videoArtifactLabel","Video artifact: {{title}}",{title:x}),onError:()=>v(r("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):m==="audio"?e.jsxs(e.Fragment,{children:[u,e.jsx("audio",{className:"documents-task-artifact-audio",controls:!0,src:g,"aria-label":r("documents.audioArtifactLabel","Audio artifact: {{title}}",{title:x}),onError:()=>v(r("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):m==="pdf"?e.jsxs("div",{className:"documents-task-artifact-pdf",children:[e.jsx("iframe",{title:r("documents.pdfArtifactTitle","PDF artifact: {{title}}",{title:x}),src:g}),e.jsxs("a",{className:"btn btn-sm",href:g,target:"_blank",rel:"noreferrer",children:[e.jsx(Oe,{size:14,"aria-hidden":"true"}),r("documents.openInNewTab","Open in new tab")]})]}):m==="doc"&&b?d?e.jsx("p",{className:"documents-content-state",children:e.jsx(fe,{label:r("documents.loadingArtifactContent","Loading artifact content…")})}):o?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:o}):s?e.jsx("div",{className:"documents-content-markdown documents-task-artifact-doc-content",children:e.jsx("div",{className:"markdown-body",children:e.jsx(ke,{remarkPlugins:[pe],children:n??t.content??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text documents-task-artifact-doc-content",children:n??t.content??""}):e.jsxs("div",{className:"documents-task-artifact-download",children:[e.jsx(xe,{size:24,"aria-hidden":"true"}),e.jsx("p",{children:t.description||r("documents.binaryArtifactFallback","This artifact cannot be previewed inline.")}),e.jsxs("a",{className:"btn btn-sm",href:g,target:"_blank",rel:"noreferrer","data-testid":"task-artifact-open-link",children:[e.jsx(ot,{size:14,"aria-hidden":"true"}),r("documents.openArtifact","Open artifact")]})]});return e.jsxs("div",{className:"documents-content-viewer documents-task-artifact-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[t.taskId," / ",x]}),m==="doc"&&b?e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:l,"aria-label":s?r("documents.switchToPlainText","Switch to plain text"):r("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":s,title:s?r("documents.switchToPlainText","Switch to plain text"):r("documents.switchToMarkdown","Switch to markdown"),children:s?r("documents.markdown","Markdown"):r("documents.plain","Plain")}):null]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta documents-task-artifact-meta",children:[e.jsx("span",{children:N}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:t.authorId||r("documents.unknownAuthor","unknown")}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:ie(t.updatedAt)}),t.taskId?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("button",{className:"documents-task-artifact-open-task",onClick:()=>void k(t.taskId),children:r("documents.openTask","Open task")})]}):null]}),t.description?e.jsx("p",{className:"documents-task-artifact-description",children:t.description}):null,e.jsx("div",{className:`documents-task-artifact-preview documents-task-artifact-preview--${m}`,children:j})]})}function Vs({projectId:t,addToast:i,onOpenDetail:n,onOpenArtifactTaskDetail:d,onSendSelectionToTask:o}){const{t:s}=ut("app"),[l,k]=a.useState("artifacts"),r=ss(),[p,v]=a.useState(""),[m,N]=a.useState(null),[x,g]=a.useState(null),[b,u]=a.useState(!1),[j,T]=a.useState(null),[z,D]=a.useState(!1),[E,A]=a.useState(null),[L,$]=a.useState(!1),M=a.useRef(0),O=a.useRef(null),R=a.useRef(null),re=a.useRef(null),le=a.useRef(null),[C,P]=a.useState(!1),[U,qe]=a.useState(new Map),[ft,V]=a.useState(null),[we,I]=a.useState(""),[ge,be]=a.useState(!1),[kt,H]=a.useState(null),[pt,G]=a.useState(!1),[xt,_]=a.useState(null),[jt,ve]=a.useState(!0),se=a.useRef(0),[ye,Y]=a.useState(!1),[oe,W]=a.useState(""),[Ne,Ce]=a.useState(!1),[de,Ge]=a.useState(!1),wt=he(O,{locked:de}),gt=he(R,{locked:de}),bt=he(re,{locked:de}),vt=he(le,{locked:de}),Se=C?wt:gt,Te=l==="tasks"?p.trim():"",yt=l==="artifacts"?p.trim():"",{documents:ae,loading:Nt,error:Ct,refresh:ue}=ks({projectId:t,searchQuery:Te||void 0,includeProjectFiles:!1}),{files:X,loading:St,error:Tt,refresh:We}=ps(t,{showHidden:b}),{artifacts:B,loading:At,error:Ft,refresh:Ae}=as({projectId:t,searchQuery:yt||void 0});a.useEffect(()=>{const c=()=>{$(window.innerWidth<=As)};return c(),window.addEventListener("resize",c),()=>{window.removeEventListener("resize",c)}},[]),a.useEffect(()=>{k("artifacts"),N(null),g(null),u(!1),T(null),A(null),D(!1),P(!1),qe(new Map),V(null),I(""),be(!1),H(null),G(!1),_(null),ve(!0),Y(!1),W(""),Ce(!1)},[t]);const Z=a.useMemo(()=>{const c=Te.toLowerCase(),h=new Map;for(const f of ae){const S=h.get(f.taskId)??{documents:[],artifacts:[]};S.documents.push(f),h.set(f.taskId,S)}for(const f of B){if(!f.taskId||!Ps(f,c))continue;const S=h.get(f.taskId)??{documents:[],artifacts:[]};S.artifacts.push(f),h.set(f.taskId,S)}return Array.from(h.entries()).map(([f,S])=>{const q=[...S.documents].sort((F,ne)=>ne.updatedAt.localeCompare(F.updatedAt)),Q=[...S.artifacts].sort((F,ne)=>ne.updatedAt.localeCompare(F.updatedAt)),De=[q[0]?.updatedAt,Q[0]?.updatedAt].filter(Boolean).sort().at(-1)??"",y=q.find(F=>F.taskTitle)?.taskTitle??Q.find(F=>F.taskTitle)?.taskTitle;return{taskId:f,taskTitle:y,taskColumn:q.find(F=>F.taskColumn)?.taskColumn??Q.find(F=>F.taskColumn)?.taskColumn,documents:q,artifacts:Q,latestUpdated:De}}).filter(f=>f.documents.length>0||f.artifacts.length>0).sort((f,S)=>S.latestUpdated.localeCompare(f.latestUpdated))},[B,ae,Te]),w=a.useMemo(()=>x?.kind!=="document"?null:ae.find(c=>c.id===x.id)??null,[ae,x]),K=a.useMemo(()=>x?.kind!=="artifact"?null:B.find(c=>c.id===x.id)??null,[B,x]),me=w??K;a.useEffect(()=>{if(!x)return;Z.some(h=>x.kind==="document"?h.documents.some(f=>f.id===x.id):h.artifacts.some(f=>f.id===x.id))||(g(null),V(null),I(""),H(null),G(!1),_(null))},[Z,x]);const Fe=a.useMemo(()=>{const c=p.trim().toLowerCase();return c?X.filter(h=>{const f=h.path.toLowerCase(),S=h.name.toLowerCase();return f.includes(c)||S.includes(c)}):X},[X,p]);a.useEffect(()=>{if(!m)return;X.some(h=>h.path===m.path)||(N(null),T(null),A(null),D(!1))},[X,m]);const Et=a.useCallback(c=>{v(c.target.value)},[]),Lt=a.useCallback(()=>{v("")},[]),Ee=a.useCallback(c=>{k(c),c!=="tasks"&&(g(null),V(null),I(""),H(null),G(!1),_(null)),c!=="project"&&(Y(!1),W(""))},[]),Pt=a.useCallback(async c=>{try{const h=await st(c,t);n(h)}catch{i(`Failed to open task ${c}`,"error")}},[t,n,i]),Qe=a.useCallback(async c=>{try{const h=await st(c,t);(d??n)(h)}catch{i(`Failed to open task ${c}`,"error")}},[t,d,n,i]),Dt=a.useCallback(async c=>{N(c),D(!0),A(null),T(null),Y(!1),W("");const h=M.current+1;M.current=h;try{const f=await ns("project",c.path,t);if(M.current!==h)return;T(f.content)}catch(f){if(M.current!==h)return;const S=f instanceof Error?f.message:`Failed to open ${c.path}`;A(S),i(S,"error")}finally{M.current===h&&D(!1)}},[t,i]),Mt=a.useCallback(()=>{N(null),T(null),A(null),D(!1),Y(!1),W("")},[]),Rt=a.useCallback(()=>{j!==null&&(W(j),Y(!0))},[j]),zt=a.useCallback(()=>{Y(!1),W("")},[]),It=a.useCallback(async()=>{if(m){Ce(!0);try{await is("project",m.path,oe,t),T(oe),Y(!1),W(""),i(s("documents.projectFileSaved","File saved"),"success")}catch(c){i(c instanceof Error?c.message:String(c),"error")}finally{Ce(!1)}}},[m,oe,t,i,s]),$t=a.useCallback(c=>{g({kind:"document",id:c}),V(null),I(""),H(null),G(!1),_(null)},[]),Ot=a.useCallback(c=>{g({kind:"artifact",id:c}),V(null),I(""),H(null),_(null),ve(!0)},[]),Ut=a.useCallback(()=>{g(null),V(null),I(""),H(null),G(!1),_(null)},[]),Vt=a.useCallback(c=>{qe(h=>{const f=new Map(h),S=f.get(c)??!0;return f.set(c,!S),f})},[]),Ht=a.useCallback(()=>{w&&(I(w.content),V(w.id))},[w]),_t=a.useCallback(()=>{V(null),I("")},[]),Bt=a.useCallback(async()=>{if(w){be(!0);try{await cs(w.taskId,w.key,we,{},t),await ue(),V(null),I(""),i(s("documents.taskDocumentSaved","Document saved"),"success")}catch(c){i(c instanceof Error?c.message:String(c),"error")}finally{be(!1)}}},[w,we,t,ue,i,s]);a.useEffect(()=>{if(!K||ce(K)!=="doc"){H(null),G(!1),_(null);return}const c=se.current+1;se.current=c,G(!0),_(null),H(null),lt(K.id,t).then(h=>{se.current===c&&H(h.content??K.content??"")}).catch(h=>{se.current===c&&_(h instanceof Error?h.message:String(h))}).finally(()=>{se.current===c&&G(!1)})},[t,K]);const Ye=l==="project"?Tt:l==="tasks"?Ct:Ft,Kt=a.useCallback(async()=>{if(l==="project"){await We();return}if(l==="tasks"){await ue();return}await Ae()},[l,Ae,We,ue]),Xe=l==="project"?Fe.length:l==="tasks"?Z.length:B.length,ee=w?U.get(w.id)??!0:!1,Le=ee?bt:vt,Pe=w!==null&&ft===w.id,qt=l==="project"&&m&&!ye&&o&&Se?e.jsx(at,{selectedText:Se.selectedText,anchorRect:Se.anchorRect,filePath:m.path,onSubmit:o,onOpenChange:Ge}):null,Gt=l==="tasks"&&w&&!Pe&&o&&Le?e.jsx(at,{selectedText:Le.selectedText,anchorRect:Le.anchorRect,filePath:`${w.taskId}/${w.key}`,onSubmit:o,onOpenChange:Ge}):null,Je=l==="project"?s("documents.searchProjectFiles","Search project markdown files…"):l==="tasks"?s("documents.searchTaskDocuments","Search task documents…"):s("documents.searchArtifacts","Search artifacts…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsx(rs,{icon:te,title:s("documents.title","Artifacts"),actions:e.jsx("span",{className:"documents-view-count",children:s("documents.resultCount","{{count}} result{{plural}}",{count:Xe,plural:Xe!==1?"s":""})})}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":s("documents.sectionsLabel","Documents sections"),children:[e.jsxs("button",{className:`btn documents-tab${l==="artifacts"?" active":""}`,role:"tab","aria-selected":l==="artifacts","aria-label":s("documents.showArtifacts","Show artifacts"),onClick:()=>Ee("artifacts"),children:[s("documents.artifactsTab","Artifacts"),e.jsx("span",{className:"documents-tab-count",children:B.length})]}),e.jsxs("button",{className:`btn documents-tab${l==="project"?" active":""}`,role:"tab","aria-selected":l==="project","aria-label":s("documents.showProjectFiles","Show project markdown files"),onClick:()=>Ee("project"),children:[s("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:X.length})]}),e.jsxs("button",{className:`btn documents-tab${l==="tasks"?" active":""}`,role:"tab","aria-selected":l==="tasks","aria-label":s("documents.showTaskDocuments","Show task documents"),onClick:()=>Ee("tasks"),children:[s("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:Z.length})]})]}),l==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>u(c=>!c),"aria-pressed":b,"aria-label":b?s("documents.hideHidden","Hide hidden project files"):s("documents.showHidden","Show hidden project files"),title:b?s("documents.hideHiddenFiles","Hide hidden files"):s("documents.showHiddenFiles","Show hidden files"),children:[b?e.jsx(ls,{size:14}):e.jsx(os,{size:14}),b?s("documents.hideHiddenLabel","Hide Hidden"):s("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(ds,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:Je,value:p,onChange:Et,"aria-label":Je}),p&&e.jsx("button",{className:"documents-search-clear",onClick:Lt,"aria-label":s("documents.clearSearch","Clear search"),children:e.jsx(dt,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:Ye?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:s("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:l==="project"?s("documents.projectFiles","project files"):l==="tasks"?s("documents.taskDocuments","task documents"):s("documents.artifacts","artifacts"),error:Ye})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void Kt(),"aria-label":s("documents.retryLoading","Retry loading documents"),children:[e.jsx(us,{size:16}),s("documents.retry","Retry")]})]}):l==="project"?St&&X.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(fe,{label:s("documents.loadingProjectFiles","Loading project markdown files…")})})}):Fe.length===0?e.jsx("div",{className:"documents-view-empty",children:p.trim()?e.jsx("p",{children:s("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:p.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(te,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:s("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${L?" documents-project-layout--mobile":""}`,children:[(!L||!m)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":s("documents.projectMarkdownFilesLabel","Project markdown files"),children:e.jsx("ul",{className:"markdown-file-list",children:Fe.map(c=>{const h=m?.path===c.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${h?" markdown-file-item--selected":""}`,onClick:()=>void Dt(c),"aria-label":`Open ${c.path}`,"aria-current":h?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:c.name}),e.jsx("span",{className:"markdown-file-item-path",children:c.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[Es(c.size)," · ",ie(c.mtime)]})]})},c.path)})})}),(!L||m)&&e.jsxs("section",{className:"documents-view-main","aria-label":s("documents.projectFilePreviewLabel","Project file content preview"),children:[L&&m&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Mt,"aria-label":s("documents.backToFilesList","Back to project files list"),children:[e.jsx(nt,{size:14}),s("documents.backToFiles","Back to files")]}),m?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:m.path}),e.jsx("div",{className:"documents-task-document-actions",children:ye?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:zt,disabled:Ne,children:s("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void It(),disabled:Ne,children:Ne?s("documents.saving","Saving…"):s("documents.saveProjectFile","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>P(c=>!c),"aria-label":C?s("documents.switchToPlainText","Switch to plain text"):s("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":C,title:C?s("documents.switchToPlainText","Switch to plain text"):s("documents.switchToMarkdown","Switch to markdown"),children:C?s("documents.markdown","Markdown"):s("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Rt,disabled:z||E!==null||j===null,"aria-label":s("documents.editProjectFile","Edit project file"),children:[e.jsx(Re,{size:14,"aria-hidden":"true"}),s("documents.edit","Edit")]})]})})]}),z?e.jsx("p",{className:"documents-content-state",children:e.jsx(fe,{label:s("documents.loadingFileContent","Loading file content…")})}):E?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:E}):ye?e.jsx("div",{className:"documents-task-document-editor","aria-label":s("documents.projectFileContentEditor","Project file content editor"),children:e.jsx(ze,{content:oe,onChange:W,filePath:m.path,forceToolbarActionsVisible:!0})}):C?e.jsx("div",{ref:O,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(ke,{remarkPlugins:[pe],children:j??""})})}):e.jsx("pre",{ref:R,className:"document-card-content-text documents-content-viewer-text",children:j??""}),qt]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:s("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):l==="artifacts"?At&&B.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:s("documents.loadingArtifacts","Loading artifacts…")})}):B.length===0?e.jsx("div",{className:"documents-view-empty",children:p.trim()?e.jsx("p",{children:s("documents.noMatchArtifacts",'No artifacts match "{{query}}".',{query:p.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(te,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:s("documents.noArtifacts","No artifacts yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:s("documents.artifactsCreatedBy","Agents register screenshots, wireframes, mockups, recordings, and documents here as they work on tasks.")})]})}):e.jsx(xs,{artifacts:B,projectId:t,isMobile:L,addToast:i,onOpenTask:Qe,onArtifactUpdated:()=>void Ae()}):Nt&&ae.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(fe,{label:s("documents.loadingTaskDocuments","Loading task documents…")})})}):Z.length===0?e.jsx("div",{className:"documents-view-empty",children:p.trim()?e.jsx("p",{children:s("documents.noMatchTask",'No task documents match "{{query}}".',{query:p.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(te,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:s("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:s("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsxs("div",{className:`documents-project-layout documents-task-documents-layout${L?" documents-project-layout--mobile":""}`,children:[(!L||!me)&&e.jsx("aside",{className:"documents-view-sidebar documents-task-documents-sidebar","aria-label":s("documents.taskDocumentsListLabel","Task documents"),children:Z.map(({taskId:c,taskTitle:h,taskColumn:f,documents:S,artifacts:q})=>{const Q=f?r(f):null,De=f?Ls(f):"status-dot";return e.jsxs("section",{className:"documents-task-sidebar-group","aria-labelledby":`documents-task-group-${c}`,children:[e.jsxs("div",{className:"documents-task-sidebar-group-header",children:[e.jsxs("div",{className:"documents-task-sidebar-title-wrap",children:[e.jsxs("h3",{id:`documents-task-group-${c}`,className:"documents-task-sidebar-title",children:[e.jsx("span",{className:"documents-group-task-id",children:c}),e.jsx("span",{className:"documents-group-task-title",children:h||s("documents.untitled","Untitled")})]}),Q?e.jsxs("span",{className:"documents-group-status badge","aria-label":s("documents.taskStatusAria","Task status: {{status}}",{status:Q}),children:[e.jsx("span",{className:De,"aria-hidden":"true"}),e.jsx("span",{children:Q})]}):null]}),e.jsxs("div",{className:"documents-task-sidebar-actions",children:[e.jsx("span",{className:"documents-group-count",children:s("documents.taskOutputCount","{{docCount}} doc{{docPlural}} · {{artifactCount}} artifact{{artifactPlural}}",{docCount:S.length,docPlural:S.length!==1?"s":"",artifactCount:q.length,artifactPlural:q.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>void Pt(c),"aria-label":s("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:c,title:h||s("documents.untitled","Untitled")}),children:s("documents.openTask","Open task")})]})]}),e.jsxs("ul",{className:"markdown-file-list documents-task-document-list",children:[S.map(y=>{const F=w?.id===y.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item${F?" markdown-file-item--selected":""}`,onClick:()=>$t(y.id),"aria-label":s("documents.openTaskDocument","Open {{taskId}} {{key}}",{taskId:y.taskId,key:y.key}),"aria-current":F?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:y.key}),e.jsxs("span",{className:"markdown-file-item-path",children:[y.taskId," · ",y.taskTitle||s("documents.untitled","Untitled")]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[s("documents.revisionShort","v{{revision}}",{revision:y.revision})," · ",y.author," · ",ie(y.updatedAt)]})]})},`document-${y.id}`)}),q.length>0?e.jsxs("li",{className:"documents-task-artifacts-subsection","aria-label":s("documents.taskArtifactsSubsection","Task artifacts"),children:[e.jsx("div",{className:"documents-task-artifacts-label",children:s("documents.taskArtifactsLabel","Artifacts")}),e.jsx("ul",{className:"markdown-file-list documents-task-artifact-list",children:q.map(y=>{const F=ce(y),ne=Fs[F],Wt=ht(s,F),Ze=K?.id===y.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item documents-task-artifact-item${Ze?" markdown-file-item--selected":""}`,onClick:()=>Ot(y.id),"aria-label":s("documents.openTaskArtifact","Open {{taskId}} artifact {{title}}",{taskId:c,title:y.title||s("documents.untitledArtifact","Untitled artifact")}),"aria-current":Ze?"true":void 0,children:[e.jsxs("span",{className:"documents-task-artifact-title-row",children:[e.jsx(ne,{size:14,"aria-hidden":"true"}),e.jsx("span",{className:"markdown-file-item-name",children:y.title||s("documents.untitledArtifact","Untitled artifact")})]}),e.jsxs("span",{className:"markdown-file-item-path",children:[Wt," · ",y.mimeType||y.type]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[y.authorId||s("documents.unknownAuthor","unknown")," · ",ie(y.updatedAt)]})]})},`artifact-${y.id}`)})})]}):null]})]},c)})}),(!L||me)&&e.jsxs("section",{className:"documents-view-main","aria-label":s("documents.taskDocumentPreviewLabel","Task document content preview"),children:[L&&me&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Ut,"aria-label":s("documents.backToTaskDocumentsList","Back to task documents list"),children:[e.jsx(nt,{size:14}),s("documents.backToTaskDocuments","Back to documents")]}),me?K?e.jsx(Ms,{artifact:K,projectId:t,content:kt,loading:pt,error:xt,renderMarkdown:jt,onToggleMarkdown:()=>ve(c=>!c),onOpenTask:Qe,t:s}):w?e.jsxs("div",{className:"documents-content-viewer documents-task-document-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[w.taskId," / ",w.key]}),e.jsx("div",{className:"documents-task-document-actions",children:Pe?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:_t,disabled:ge,children:s("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Bt(),disabled:ge,children:ge?s("documents.saving","Saving…"):s("documents.saveTaskDocument","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>Vt(w.id),"aria-label":ee?s("documents.switchToPlainText","Switch to plain text"):s("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":ee,title:ee?s("documents.switchToPlainText","Switch to plain text"):s("documents.switchToMarkdown","Switch to markdown"),children:ee?s("documents.markdown","Markdown"):s("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Ht,"aria-label":s("documents.editTaskDocument","Edit task document"),children:[e.jsx(Re,{size:14,"aria-hidden":"true"}),s("documents.edit","Edit")]})]})})]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta",children:[e.jsx("span",{className:"document-card-author",children:w.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:s("documents.revisionShort","v{{revision}}",{revision:w.revision})}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:ie(w.updatedAt)})]}),Pe?e.jsx("div",{className:"documents-task-document-editor","aria-label":s("documents.taskDocumentContentEditor","Task document content editor"),children:e.jsx(ze,{content:we,onChange:I,filePath:w.key.includes(".")?w.key:`${w.key}.md`,forceToolbarActionsVisible:!0})}):ee?e.jsx("div",{ref:re,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(ke,{remarkPlugins:[pe],children:w.content})})}):e.jsx("pre",{ref:le,className:"document-card-content-text documents-content-viewer-text",children:w.content}),Gt]}):null:e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:s("documents.selectTaskDocument","Select a task document or artifact to view its content.")})})]})]})})]})}export{Vs as DocumentsView};
|
|
16
|
+
*/const fs=[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]],Ve=$e("video",fs);function ks(t){const{projectId:i,searchQuery:n,includeProjectFiles:d=!0}=t??{},o=i?`${Qt.DOCUMENTS_PREFIX}${i}`:null,[s,l]=a.useState(()=>{if(!o)return[];const j=et(o,{maxAgeMs:tt});return Array.isArray(j)?j:[]}),[k,r]=a.useState([]),[p,v]=a.useState(()=>s.length===0),[m,N]=a.useState(null),x=a.useRef(null),g=a.useRef(s.length>0),b=a.useRef(null),u=a.useCallback(async()=>{x.current&&x.current.abort();const j=new AbortController;x.current=j;const T=!g.current;T&&v(!0),N(null);const z=Yt(n?{q:n}:void 0,i),D=d?ct(i):Promise.resolve({files:[]}),[E,A]=await Promise.allSettled([z,D]);if(j.signal.aborted)return;let P=null;if(E.status==="fulfilled"){if(l(E.value),o){const $=E.value.length>500?E.value.slice(0,500):E.value;Xt(o,$,{maxBytes:5e5})}g.current=!0}else P=E.reason instanceof Error?E.reason.message:String(E.reason);if(A.status==="fulfilled"){const $=A.value.files,M=n?.trim().toLowerCase(),O=M?$.filter(R=>R.name.toLowerCase().includes(M)||R.path.toLowerCase().includes(M)):$;r(O)}N(P),T&&v(!1)},[o,d,i,n]);return a.useEffect(()=>{if(!o){g.current=!1,l([]),v(!0);return}const j=et(o,{maxAgeMs:tt});Array.isArray(j)?(l(j),g.current=!0,v(!1)):(g.current=!1,l([]),v(!0))},[o]),a.useEffect(()=>(b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{u()},300),()=>{b.current&&clearTimeout(b.current)}),[u]),a.useEffect(()=>(u(),()=>{x.current&&x.current.abort()}),[]),{documents:s,projectFiles:k,loading:p,error:m,refresh:u}}function ps(t,i){const[n,d]=a.useState([]),[o,s]=a.useState(!0),[l,k]=a.useState(null),r=a.useRef(null),p=a.useRef(!1),v=i?.showHidden??!1,m=a.useCallback(async N=>{r.current&&r.current.abort();const x=new AbortController;r.current=x;const g=!p.current;g&&s(!0),k(null);try{const b=await ct(t,{showHidden:N?.showHidden??v});if(x.signal.aborted)return;d(b.files),p.current=!0}catch(b){if(x.signal.aborted)return;k(b instanceof Error?b.message:String(b))}finally{!x.signal.aborted&&g&&s(!1)}},[t,v]);return a.useEffect(()=>(p.current=!1,m({showHidden:v}),()=>{r.current&&r.current.abort()}),[m,v]),{files:n,loading:o,error:l,refresh:m}}const it=["image","doc","pdf","video","audio","other"];function ce(t){return(t.mimeType?.toLowerCase().split(";",1)[0]??"")==="application/pdf"||t.uri?.toLowerCase().endsWith(".pdf")?"pdf":t.type==="image"?"image":t.type==="video"?"video":t.type==="audio"?"audio":t.type==="document"?"doc":"other"}const Ie={image:mt,doc:te,pdf:rt,video:Ve,audio:Ue,other:xe};function Me(t,i){switch(i){case"image":return t("documents.artifactCategoryImages","Images");case"doc":return t("documents.artifactCategoryDocs","Docs");case"pdf":return t("documents.artifactCategoryPdfs","PDFs");case"video":return t("documents.artifactCategoryVideos","Videos");case"audio":return t("documents.artifactCategoryAudio","Audio");case"other":return t("documents.artifactCategoryOther","Other")}}function je(t){return t?new Date(t).toLocaleString():""}function He(t){return t===void 0?"":t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(t>=10*1024?0:1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function xs({artifacts:t,projectId:i,isMobile:n,addToast:d,onOpenTask:o,onArtifactUpdated:s}){const{t:l}=ut("app"),[k,r]=a.useState("all"),[p,v]=a.useState(null),m=a.useRef(null),N=a.useMemo(()=>{const u=new Map;for(const j of t){const T=ce(j),z=u.get(T);z?z.push(j):u.set(T,[j])}return u},[t]);a.useEffect(()=>{k!=="all"&&!N.has(k)&&r("all")},[k,N]);const x=a.useCallback(u=>{const j=ce(u),T=j==="doc"?"doc":j==="pdf"?"pdf":"media";m.current=document.activeElement instanceof HTMLElement?document.activeElement:null,v({artifact:u,kind:T})},[]),g=a.useCallback(()=>{v(null),m.current?.focus(),m.current=null},[]),b=it.filter(u=>N.has(u)&&(k==="all"||k===u));return e.jsxs("div",{className:"artifacts-gallery",children:[N.size>1&&e.jsxs("div",{className:"artifacts-gallery-filter",role:"group","aria-label":l("documents.artifactTypeFilterLabel","Filter artifacts by category"),children:[e.jsxs("button",{className:`btn btn-sm artifacts-gallery-chip${k==="all"?" active":""}`,"aria-pressed":k==="all",onClick:()=>r("all"),children:[l("documents.artifactFilterAll","All"),e.jsx("span",{className:"artifacts-gallery-chip-count",children:t.length})]}),it.filter(u=>N.has(u)).map(u=>{const j=Ie[u];return e.jsxs("button",{className:`btn btn-sm artifacts-gallery-chip${k===u?" active":""}`,"aria-pressed":k===u,onClick:()=>r(u),children:[e.jsx(j,{size:14,"aria-hidden":"true"}),Me(l,u),e.jsx("span",{className:"artifacts-gallery-chip-count",children:N.get(u)?.length})]},u)})]}),b.map(u=>{const j=N.get(u)??[],T=Ie[u];return e.jsxs("section",{className:"artifacts-gallery-section","aria-label":Me(l,u),children:[k==="all"&&N.size>1&&e.jsxs("header",{className:"artifacts-gallery-section-header",children:[e.jsx(T,{size:16,"aria-hidden":"true"}),e.jsx("h3",{children:Me(l,u)}),e.jsx("span",{className:"artifacts-gallery-section-count",children:j.length})]}),e.jsx(js,{category:u,items:j,projectId:i,isMobile:n,t:l,onOpen:x,onOpenTask:o})]},u)}),p&&p.kind==="media"&&e.jsx(Ns,{artifact:p.artifact,projectId:i,t:l,onClose:g,onOpenTask:o}),p&&p.kind==="pdf"&&e.jsx(Ss,{artifact:p.artifact,projectId:i,t:l,onClose:g,onOpenTask:o}),p&&p.kind==="doc"&&e.jsx(Ts,{artifact:p.artifact,projectId:i,t:l,addToast:d,onClose:g,onOpenTask:o,onArtifactUpdated:s})]})}function js({category:t,items:i,projectId:n,isMobile:d,t:o,onOpen:s,onOpenTask:l}){if(t==="audio")return e.jsx("div",{className:"artifacts-gallery-rows",children:i.map(r=>e.jsx(bs,{artifact:r,projectId:n,t:o,onOpenTask:l},r.id))});if(t==="other")return e.jsx("div",{className:"artifacts-gallery-rows",children:i.map(r=>e.jsx(vs,{artifact:r,projectId:n,t:o,onOpenTask:l},r.id))});const k=t==="image"||t==="video"?"artifacts-gallery-grid artifacts-gallery-grid--visual":"artifacts-gallery-grid artifacts-gallery-grid--cards";return e.jsx("div",{className:`${k}${d?" artifacts-gallery-grid--mobile":""}`,children:i.map(r=>t==="image"||t==="video"?e.jsx(ws,{artifact:r,category:t,projectId:n,t:o,onOpen:s},r.id):e.jsx(gs,{artifact:r,category:t,t:o,onOpen:s,onOpenTask:l},r.id))})}function ws({artifact:t,category:i,projectId:n,t:d,onOpen:o}){const s=t.title||d("documents.untitledArtifact","Untitled artifact"),l=Z(t.id,n),k=r=>{(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),o(t))};return e.jsx("article",{className:"artifacts-gallery-tile","aria-label":d("documents.artifactCardLabel","Artifact {{title}}",{title:s}),children:e.jsxs("div",{className:"artifacts-gallery-tile-media",role:"button",tabIndex:0,"aria-label":d("documents.expandArtifact","Expand {{title}}",{title:s}),onClick:()=>o(t),onKeyDown:k,children:[i==="image"?e.jsx("img",{src:l,alt:s,loading:"lazy"}):e.jsx("video",{src:l,muted:!0,preload:"metadata","aria-label":d("documents.artifactVideoLabel","Video artifact: {{title}}",{title:s})}),i==="video"&&e.jsx("span",{className:"artifacts-gallery-tile-play","aria-hidden":"true",children:e.jsx(Ve,{size:22})}),e.jsxs("div",{className:"artifacts-gallery-tile-overlay",children:[e.jsx("span",{className:"artifacts-gallery-tile-title",children:s}),t.taskId&&e.jsx("span",{className:"artifacts-gallery-tile-task",children:t.taskId})]})]})})}function gs({artifact:t,category:i,t:n,onOpen:d,onOpenTask:o}){const s=t.title||n("documents.untitledArtifact","Untitled artifact"),l=Ie[i],k=r=>{(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),d(t))};return e.jsxs("article",{className:"artifacts-gallery-card","aria-label":n("documents.artifactCardLabel","Artifact {{title}}",{title:s}),children:[e.jsxs("div",{className:"artifacts-gallery-card-main",role:"button",tabIndex:0,"aria-label":n("documents.openArtifactViewer","Open {{title}}",{title:s}),onClick:()=>d(t),onKeyDown:k,children:[e.jsx("div",{className:`artifacts-gallery-card-icon artifacts-gallery-card-icon--${i}`,children:e.jsx(l,{size:22,"aria-hidden":"true"})}),e.jsxs("div",{className:"artifacts-gallery-card-body",children:[e.jsx("h4",{className:"artifacts-gallery-card-title",children:s}),t.description&&e.jsx("p",{className:"artifacts-gallery-card-description",children:t.description}),e.jsxs("div",{className:"artifacts-gallery-card-meta",children:[e.jsx("span",{children:t.authorId}),e.jsx("span",{children:"·"}),e.jsx("span",{children:je(t.createdAt)}),t.sizeBytes!==void 0&&e.jsxs("span",{children:["· ",He(t.sizeBytes)]})]})]})]}),t.taskId&&e.jsx("button",{className:"artifacts-gallery-task-link artifacts-gallery-card-task",onClick:()=>o(t.taskId),"aria-label":n("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:t.taskId,title:t.taskTitle||n("documents.untitled","Untitled")}),children:t.taskId})]})}function bs({artifact:t,projectId:i,t:n,onOpenTask:d}){const o=t.title||n("documents.untitledArtifact","Untitled artifact");return e.jsxs("article",{className:"artifacts-gallery-row","aria-label":n("documents.artifactCardLabel","Artifact {{title}}",{title:o}),children:[e.jsxs("div",{className:"artifacts-gallery-row-info",children:[e.jsx(Ue,{size:16,"aria-hidden":"true"}),e.jsx("span",{className:"artifacts-gallery-row-title",children:o}),t.taskId&&e.jsx("button",{className:"artifacts-gallery-task-link",onClick:()=>d(t.taskId),children:t.taskId}),e.jsx("span",{className:"artifacts-gallery-row-meta",children:je(t.createdAt)})]}),e.jsx("audio",{className:"artifacts-gallery-audio",controls:!0,src:Z(t.id,i),"aria-label":n("documents.artifactAudioLabel","Audio artifact: {{title}}",{title:o})})]})}function vs({artifact:t,projectId:i,t:n,onOpenTask:d}){const o=t.title||n("documents.untitledArtifact","Untitled artifact");return e.jsxs("article",{className:"artifacts-gallery-row","aria-label":n("documents.artifactCardLabel","Artifact {{title}}",{title:o}),children:[e.jsxs("div",{className:"artifacts-gallery-row-info",children:[e.jsx(xe,{size:16,"aria-hidden":"true"}),e.jsx("span",{className:"artifacts-gallery-row-title",children:o}),t.mimeType&&e.jsx("span",{className:"artifacts-gallery-row-mime badge",children:t.mimeType}),t.taskId&&e.jsx("button",{className:"artifacts-gallery-task-link",onClick:()=>d(t.taskId),children:t.taskId}),e.jsxs("span",{className:"artifacts-gallery-row-meta",children:[He(t.sizeBytes),t.sizeBytes!==void 0?" · ":"",je(t.createdAt)]})]}),e.jsxs("a",{className:"btn btn-sm artifacts-gallery-row-download",href:Z(t.id,i),target:"_blank",rel:"noreferrer","data-testid":"artifact-other-link","aria-label":n("documents.downloadArtifactAria","Download {{title}}",{title:o}),children:[e.jsx(ot,{size:14,"aria-hidden":"true"}),n("documents.downloadArtifact","Download")]})]})}function ys(t,i){a.useEffect(()=>{i.current?.focus();const n=d=>{d.key==="Escape"&&(d.preventDefault(),t())};return document.addEventListener("keydown",n),()=>{document.removeEventListener("keydown",n)}},[i,t])}function _e({label:t,onClose:i,children:n,wide:d,closeRef:o,windowKey:s,persistKey:l}){return ys(i,o),e.jsx(es,{windowKey:s,title:null,onClose:i,hideHeader:!0,dragHandleSelector:".artifacts-gallery-viewer-header",className:"artifacts-gallery-window",ariaLabel:t,suspendGeometryPersistenceOnMobile:!0,suspendGeometryPersistenceOnShortViewport:!0,persistGeometryKey:l,defaultSize:d?{width:1024,height:720}:{width:720,height:640},minSize:{width:320,height:280},children:e.jsx("div",{className:"artifacts-gallery-viewer",children:n})})}function Be({title:t,onClose:i,t:n,actions:d,closeRef:o}){return e.jsxs("div",{className:"artifacts-gallery-viewer-header",children:[e.jsx("h3",{className:"artifacts-gallery-viewer-title",children:t}),e.jsxs("div",{className:"artifacts-gallery-viewer-actions",children:[d,e.jsx("button",{ref:o,className:"modal-close",onClick:i,"aria-label":n("documents.closeLightbox","Close artifact preview"),children:e.jsx(dt,{size:20})})]})]})}function Ke({artifact:t,t:i,onOpenTask:n}){return e.jsxs("div",{className:"artifacts-gallery-viewer-meta",children:[t.description&&e.jsx("p",{className:"artifacts-gallery-viewer-description",children:t.description}),e.jsxs("div",{className:"artifacts-gallery-viewer-meta-row",children:[e.jsx("span",{children:t.authorId}),e.jsx("span",{children:"·"}),e.jsx("span",{children:je(t.createdAt)}),t.sizeBytes!==void 0&&e.jsxs("span",{children:["· ",He(t.sizeBytes)]}),t.taskId&&e.jsxs("button",{className:"artifacts-gallery-task-link",onClick:()=>n(t.taskId),children:[i("documents.openTask","Open task")," ",t.taskId]})]})]})}function Ns({artifact:t,projectId:i,t:n,onClose:d,onOpenTask:o}){const s=t.title||n("documents.untitledArtifact","Untitled artifact"),l=Z(t.id,i),k=a.useRef(null);return e.jsxs(_e,{label:n("documents.lightboxLabel","Artifact media preview"),onClose:d,wide:!0,closeRef:k,windowKey:`artifact-media-${t.id}`,persistKey:"fn-artifact-viewer-media-geometry",children:[e.jsx(Be,{title:s,onClose:d,t:n,closeRef:k,actions:e.jsx("a",{className:"btn btn-sm",href:l,target:"_blank",rel:"noreferrer","aria-label":n("documents.openInNewTab","Open in new tab"),children:e.jsx(Oe,{size:14,"aria-hidden":"true"})})}),e.jsx("div",{className:"artifacts-gallery-viewer-media-frame",children:t.type==="image"?e.jsx("img",{className:"artifacts-gallery-viewer-media",src:l,alt:s}):e.jsx("video",{className:"artifacts-gallery-viewer-media",src:l,controls:!0,autoPlay:!0,"aria-label":n("documents.artifactVideoLabel","Video artifact: {{title}}",{title:s})})}),e.jsx(Ke,{artifact:t,t:n,onOpenTask:o})]})}function Ss({artifact:t,projectId:i,t:n,onClose:d,onOpenTask:o}){const s=t.title||n("documents.untitledArtifact","Untitled artifact"),l=Z(t.id,i),k=a.useRef(null);return e.jsxs(_e,{label:n("documents.pdfViewerLabel","PDF artifact viewer"),onClose:d,wide:!0,closeRef:k,windowKey:`artifact-pdf-${t.id}`,persistKey:"fn-artifact-viewer-pdf-geometry",children:[e.jsx(Be,{title:s,onClose:d,t:n,closeRef:k,actions:e.jsxs("a",{className:"btn btn-sm",href:l,target:"_blank",rel:"noreferrer","aria-label":n("documents.openInNewTab","Open in new tab"),children:[e.jsx(Oe,{size:14,"aria-hidden":"true"}),n("documents.openInNewTab","Open in new tab")]})}),e.jsx("iframe",{className:"artifacts-gallery-viewer-pdf",src:l,title:s}),e.jsx(Ke,{artifact:t,t:n,onOpenTask:o})]})}function Cs(t){const i=t.mimeType?.toLowerCase().split(";",1)[0]??"",n=i==="text/html"?".html":i==="application/json"?".json":i==="text/plain"?".txt":".md";return`${(t.title||"artifact").replace(/[^\w.-]+/g,"-")}${n}`}function Ts({artifact:t,projectId:i,t:n,addToast:d,onClose:o,onOpenTask:s,onArtifactUpdated:l}){const k=t.title||n("documents.untitledArtifact","Untitled artifact"),[r,p]=a.useState(null),[v,m]=a.useState(null),[N,x]=a.useState(null),[g,b]=a.useState(null),[u,j]=a.useState(!1),[T,z]=a.useState(""),[D,E]=a.useState(!1),[A,P]=a.useState(!0),$=a.useRef(null);a.useEffect(()=>{let S=!1;return lt(t.id,i).then(L=>{S||p(L)}).catch(L=>{S||m(L instanceof Error?L.message:String(L))}),()=>{S=!0}},[t.id,i]);const M=r!==null&&!r.uri,O=r?.content??"",R=(r?.mimeType??t.mimeType)?.toLowerCase().split(";",1)[0]==="text/html";a.useEffect(()=>{if(!r?.uri||!R||!A){x(null),b(null);return}const S=new AbortController;let L;return x(null),b(null),fetch(Zt(t.id,i),{headers:Jt(),signal:S.signal}).then(async U=>{if(!U.ok)throw new Error(`Unable to load HTML preview (${U.status})`);L=URL.createObjectURL(await U.blob()),S.signal.aborted||x(L)}).catch(U=>{S.signal.aborted||b(U instanceof Error?U.message:String(U))}),()=>{S.abort(),L&&URL.revokeObjectURL(L)}},[t.id,r?.uri,R,i,A]);const re=()=>{z(O),j(!0)},le=async()=>{E(!0);try{const S=await ts(t.id,{content:T},i);p(S),j(!1),d(n("documents.artifactSaved","Artifact saved"),"success"),l?.()}catch(S){d(S instanceof Error?S.message:String(S),"error")}finally{E(!1)}};return e.jsxs(_e,{label:n("documents.docViewerLabel","Document artifact viewer"),onClose:o,wide:!0,closeRef:$,windowKey:`artifact-doc-${t.id}`,persistKey:"fn-artifact-viewer-doc-geometry",children:[e.jsx(Be,{title:k,onClose:o,t:n,closeRef:$,actions:u?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>j(!1),disabled:D,children:n("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void le(),disabled:D,children:D?n("documents.saving","Saving…"):n("documents.saveArtifact","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>P(S=>!S),"aria-pressed":A,title:R?A?n("documents.switchToSource","Switch to source view"):n("documents.switchToPreview","Switch to live preview"):A?n("documents.switchToPlainText","Switch to plain text"):n("documents.switchToMarkdown","Switch to markdown"),children:R?A?n("documents.htmlPreview","Preview"):n("documents.htmlSource","Source"):A?n("documents.markdown","Markdown"):n("documents.plain","Plain")}),M&&e.jsxs("button",{className:"btn btn-sm",onClick:re,"aria-label":n("documents.editArtifact","Edit document"),children:[e.jsx(Re,{size:14,"aria-hidden":"true"}),n("documents.edit","Edit")]})]})}),e.jsx("div",{className:"artifacts-gallery-viewer-doc",children:v?e.jsx("p",{className:"artifacts-gallery-viewer-error",children:v}):r===null?e.jsx("p",{className:"artifacts-gallery-viewer-loading",children:n("documents.loadingArtifact","Loading artifact…")}):u?e.jsx("div",{className:"artifacts-gallery-viewer-editor","aria-label":n("documents.artifactContentEditor","Artifact content editor"),children:e.jsx(ze,{content:T,onChange:z,filePath:Cs(r),forceToolbarActionsVisible:!0})}):R&&A?r.uri&&!N?e.jsx("p",{className:"artifacts-gallery-viewer-loading",children:g??n("documents.loadingArtifact","Loading artifact…")}):e.jsx("iframe",{className:"artifacts-gallery-viewer-html",sandbox:"allow-scripts",title:k,...r.uri?{src:N}:{srcDoc:O}}):r.uri?e.jsxs("p",{className:"artifacts-gallery-viewer-loading",children:[n("documents.binaryDocArtifact","This document is stored as a file.")," ",e.jsx("a",{href:Z(t.id,i),target:"_blank",rel:"noreferrer",children:n("documents.openArtifactMedia","Open artifact media")})]}):A?e.jsx("div",{className:"markdown-body",children:e.jsx(ke,{remarkPlugins:[pe],children:O})}):e.jsx("pre",{className:"artifacts-gallery-viewer-plain",children:O})}),e.jsx(Ke,{artifact:t,t:n,onOpenTask:s})]})}const As=768,Fs={image:mt,doc:te,pdf:rt,video:Ve,audio:Ue,other:xe};function ie(t){return t?new Date(t).toLocaleString():""}function Es(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(t>=10*1024?0:1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Ps(t){return t==="done"?"status-dot status-dot--online":t==="archived"?"status-dot status-dot--offline":t==="todo"||t==="triage"?"status-dot status-dot--pending":"status-dot status-dot--connecting"}function ht(t,i){switch(i){case"image":return t("documents.artifactCategoryImage","Image");case"doc":return t("documents.artifactCategoryDoc","Document");case"pdf":return t("documents.artifactCategoryPdf","PDF");case"video":return t("documents.artifactCategoryVideo","Video");case"audio":return t("documents.artifactCategoryAudioSingle","Audio");case"other":return t("documents.artifactCategoryOtherSingle","Other")}}function Ls(t,i){return i?[t.title,t.description,t.taskId,t.taskTitle,t.mimeType,t.authorId].some(n=>n?.toLowerCase().includes(i)):!0}function Ds(t){const i=t.mimeType?.toLowerCase().split(";",1)[0]??"";return!!t.content||t.type==="document"||i.startsWith("text/")||i==="application/json"||i==="application/xml"}function Ms({artifact:t,projectId:i,content:n,loading:d,error:o,renderMarkdown:s,onToggleMarkdown:l,onOpenTask:k,t:r}){const[p,v]=a.useState(null),m=ce(t),N=ht(r,m),x=t.title||r("documents.untitledArtifact","Untitled artifact"),g=Z(t.id,i),b=m==="doc"&&Ds(t);a.useEffect(()=>{v(null)},[t.id]);const u=p?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:p}):null,j=m==="image"?e.jsxs(e.Fragment,{children:[u,e.jsx("img",{className:"documents-task-artifact-media",src:g,alt:x,onError:()=>v(r("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):m==="video"?e.jsxs(e.Fragment,{children:[u,e.jsx("video",{className:"documents-task-artifact-media",controls:!0,src:g,"aria-label":r("documents.videoArtifactLabel","Video artifact: {{title}}",{title:x}),onError:()=>v(r("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):m==="audio"?e.jsxs(e.Fragment,{children:[u,e.jsx("audio",{className:"documents-task-artifact-audio",controls:!0,src:g,"aria-label":r("documents.audioArtifactLabel","Audio artifact: {{title}}",{title:x}),onError:()=>v(r("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):m==="pdf"?e.jsxs("div",{className:"documents-task-artifact-pdf",children:[e.jsx("iframe",{title:r("documents.pdfArtifactTitle","PDF artifact: {{title}}",{title:x}),src:g}),e.jsxs("a",{className:"btn btn-sm",href:g,target:"_blank",rel:"noreferrer",children:[e.jsx(Oe,{size:14,"aria-hidden":"true"}),r("documents.openInNewTab","Open in new tab")]})]}):m==="doc"&&b?d?e.jsx("p",{className:"documents-content-state",children:e.jsx(fe,{label:r("documents.loadingArtifactContent","Loading artifact content…")})}):o?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:o}):s?e.jsx("div",{className:"documents-content-markdown documents-task-artifact-doc-content",children:e.jsx("div",{className:"markdown-body",children:e.jsx(ke,{remarkPlugins:[pe],children:n??t.content??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text documents-task-artifact-doc-content",children:n??t.content??""}):e.jsxs("div",{className:"documents-task-artifact-download",children:[e.jsx(xe,{size:24,"aria-hidden":"true"}),e.jsx("p",{children:t.description||r("documents.binaryArtifactFallback","This artifact cannot be previewed inline.")}),e.jsxs("a",{className:"btn btn-sm",href:g,target:"_blank",rel:"noreferrer","data-testid":"task-artifact-open-link",children:[e.jsx(ot,{size:14,"aria-hidden":"true"}),r("documents.openArtifact","Open artifact")]})]});return e.jsxs("div",{className:"documents-content-viewer documents-task-artifact-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[t.taskId," / ",x]}),m==="doc"&&b?e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:l,"aria-label":s?r("documents.switchToPlainText","Switch to plain text"):r("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":s,title:s?r("documents.switchToPlainText","Switch to plain text"):r("documents.switchToMarkdown","Switch to markdown"),children:s?r("documents.markdown","Markdown"):r("documents.plain","Plain")}):null]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta documents-task-artifact-meta",children:[e.jsx("span",{children:N}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:t.authorId||r("documents.unknownAuthor","unknown")}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:ie(t.updatedAt)}),t.taskId?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("button",{className:"documents-task-artifact-open-task",onClick:()=>void k(t.taskId),children:r("documents.openTask","Open task")})]}):null]}),t.description?e.jsx("p",{className:"documents-task-artifact-description",children:t.description}):null,e.jsx("div",{className:`documents-task-artifact-preview documents-task-artifact-preview--${m}`,children:j})]})}function Vs({projectId:t,addToast:i,onOpenDetail:n,onOpenArtifactTaskDetail:d,onSendSelectionToTask:o}){const{t:s}=ut("app"),[l,k]=a.useState("artifacts"),r=ss(),[p,v]=a.useState(""),[m,N]=a.useState(null),[x,g]=a.useState(null),[b,u]=a.useState(!1),[j,T]=a.useState(null),[z,D]=a.useState(!1),[E,A]=a.useState(null),[P,$]=a.useState(!1),M=a.useRef(0),O=a.useRef(null),R=a.useRef(null),re=a.useRef(null),le=a.useRef(null),[S,L]=a.useState(!1),[U,qe]=a.useState(new Map),[ft,V]=a.useState(null),[we,I]=a.useState(""),[ge,be]=a.useState(!1),[kt,H]=a.useState(null),[pt,G]=a.useState(!1),[xt,_]=a.useState(null),[jt,ve]=a.useState(!0),se=a.useRef(0),[ye,Y]=a.useState(!1),[oe,W]=a.useState(""),[Ne,Se]=a.useState(!1),[de,Ge]=a.useState(!1),wt=he(O,{locked:de}),gt=he(R,{locked:de}),bt=he(re,{locked:de}),vt=he(le,{locked:de}),Ce=S?wt:gt,Te=l==="tasks"?p.trim():"",yt=l==="artifacts"?p.trim():"",{documents:ae,loading:Nt,error:St,refresh:ue}=ks({projectId:t,searchQuery:Te||void 0,includeProjectFiles:!1}),{files:X,loading:Ct,error:Tt,refresh:We}=ps(t,{showHidden:b}),{artifacts:B,loading:At,error:Ft,refresh:Ae}=as({projectId:t,searchQuery:yt||void 0});a.useEffect(()=>{const c=()=>{$(window.innerWidth<=As)};return c(),window.addEventListener("resize",c),()=>{window.removeEventListener("resize",c)}},[]),a.useEffect(()=>{k("artifacts"),N(null),g(null),u(!1),T(null),A(null),D(!1),L(!1),qe(new Map),V(null),I(""),be(!1),H(null),G(!1),_(null),ve(!0),Y(!1),W(""),Se(!1)},[t]);const J=a.useMemo(()=>{const c=Te.toLowerCase(),h=new Map;for(const f of ae){const C=h.get(f.taskId)??{documents:[],artifacts:[]};C.documents.push(f),h.set(f.taskId,C)}for(const f of B){if(!f.taskId||!Ls(f,c))continue;const C=h.get(f.taskId)??{documents:[],artifacts:[]};C.artifacts.push(f),h.set(f.taskId,C)}return Array.from(h.entries()).map(([f,C])=>{const q=[...C.documents].sort((F,ne)=>ne.updatedAt.localeCompare(F.updatedAt)),Q=[...C.artifacts].sort((F,ne)=>ne.updatedAt.localeCompare(F.updatedAt)),De=[q[0]?.updatedAt,Q[0]?.updatedAt].filter(Boolean).sort().at(-1)??"",y=q.find(F=>F.taskTitle)?.taskTitle??Q.find(F=>F.taskTitle)?.taskTitle;return{taskId:f,taskTitle:y,taskColumn:q.find(F=>F.taskColumn)?.taskColumn??Q.find(F=>F.taskColumn)?.taskColumn,documents:q,artifacts:Q,latestUpdated:De}}).filter(f=>f.documents.length>0||f.artifacts.length>0).sort((f,C)=>C.latestUpdated.localeCompare(f.latestUpdated))},[B,ae,Te]),w=a.useMemo(()=>x?.kind!=="document"?null:ae.find(c=>c.id===x.id)??null,[ae,x]),K=a.useMemo(()=>x?.kind!=="artifact"?null:B.find(c=>c.id===x.id)??null,[B,x]),me=w??K;a.useEffect(()=>{if(!x)return;J.some(h=>x.kind==="document"?h.documents.some(f=>f.id===x.id):h.artifacts.some(f=>f.id===x.id))||(g(null),V(null),I(""),H(null),G(!1),_(null))},[J,x]);const Fe=a.useMemo(()=>{const c=p.trim().toLowerCase();return c?X.filter(h=>{const f=h.path.toLowerCase(),C=h.name.toLowerCase();return f.includes(c)||C.includes(c)}):X},[X,p]);a.useEffect(()=>{if(!m)return;X.some(h=>h.path===m.path)||(N(null),T(null),A(null),D(!1))},[X,m]);const Et=a.useCallback(c=>{v(c.target.value)},[]),Pt=a.useCallback(()=>{v("")},[]),Ee=a.useCallback(c=>{k(c),c!=="tasks"&&(g(null),V(null),I(""),H(null),G(!1),_(null)),c!=="project"&&(Y(!1),W(""))},[]),Lt=a.useCallback(async c=>{try{const h=await st(c,t);n(h)}catch{i(`Failed to open task ${c}`,"error")}},[t,n,i]),Qe=a.useCallback(async c=>{try{const h=await st(c,t);(d??n)(h)}catch{i(`Failed to open task ${c}`,"error")}},[t,d,n,i]),Dt=a.useCallback(async c=>{N(c),D(!0),A(null),T(null),Y(!1),W("");const h=M.current+1;M.current=h;try{const f=await ns("project",c.path,t);if(M.current!==h)return;T(f.content)}catch(f){if(M.current!==h)return;const C=f instanceof Error?f.message:`Failed to open ${c.path}`;A(C),i(C,"error")}finally{M.current===h&&D(!1)}},[t,i]),Mt=a.useCallback(()=>{N(null),T(null),A(null),D(!1),Y(!1),W("")},[]),Rt=a.useCallback(()=>{j!==null&&(W(j),Y(!0))},[j]),zt=a.useCallback(()=>{Y(!1),W("")},[]),It=a.useCallback(async()=>{if(m){Se(!0);try{await is("project",m.path,oe,t),T(oe),Y(!1),W(""),i(s("documents.projectFileSaved","File saved"),"success")}catch(c){i(c instanceof Error?c.message:String(c),"error")}finally{Se(!1)}}},[m,oe,t,i,s]),$t=a.useCallback(c=>{g({kind:"document",id:c}),V(null),I(""),H(null),G(!1),_(null)},[]),Ot=a.useCallback(c=>{g({kind:"artifact",id:c}),V(null),I(""),H(null),_(null),ve(!0)},[]),Ut=a.useCallback(()=>{g(null),V(null),I(""),H(null),G(!1),_(null)},[]),Vt=a.useCallback(c=>{qe(h=>{const f=new Map(h),C=f.get(c)??!0;return f.set(c,!C),f})},[]),Ht=a.useCallback(()=>{w&&(I(w.content),V(w.id))},[w]),_t=a.useCallback(()=>{V(null),I("")},[]),Bt=a.useCallback(async()=>{if(w){be(!0);try{await cs(w.taskId,w.key,we,{},t),await ue(),V(null),I(""),i(s("documents.taskDocumentSaved","Document saved"),"success")}catch(c){i(c instanceof Error?c.message:String(c),"error")}finally{be(!1)}}},[w,we,t,ue,i,s]);a.useEffect(()=>{if(!K||ce(K)!=="doc"){H(null),G(!1),_(null);return}const c=se.current+1;se.current=c,G(!0),_(null),H(null),lt(K.id,t).then(h=>{se.current===c&&H(h.content??K.content??"")}).catch(h=>{se.current===c&&_(h instanceof Error?h.message:String(h))}).finally(()=>{se.current===c&&G(!1)})},[t,K]);const Ye=l==="project"?Tt:l==="tasks"?St:Ft,Kt=a.useCallback(async()=>{if(l==="project"){await We();return}if(l==="tasks"){await ue();return}await Ae()},[l,Ae,We,ue]),Xe=l==="project"?Fe.length:l==="tasks"?J.length:B.length,ee=w?U.get(w.id)??!0:!1,Pe=ee?bt:vt,Le=w!==null&&ft===w.id,qt=l==="project"&&m&&!ye&&o&&Ce?e.jsx(at,{selectedText:Ce.selectedText,anchorRect:Ce.anchorRect,filePath:m.path,onSubmit:o,onOpenChange:Ge}):null,Gt=l==="tasks"&&w&&!Le&&o&&Pe?e.jsx(at,{selectedText:Pe.selectedText,anchorRect:Pe.anchorRect,filePath:`${w.taskId}/${w.key}`,onSubmit:o,onOpenChange:Ge}):null,Ze=l==="project"?s("documents.searchProjectFiles","Search project markdown files…"):l==="tasks"?s("documents.searchTaskDocuments","Search task documents…"):s("documents.searchArtifacts","Search artifacts…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsx(rs,{icon:te,title:s("documents.title","Artifacts"),actions:e.jsx("span",{className:"documents-view-count",children:s("documents.resultCount","{{count}} result{{plural}}",{count:Xe,plural:Xe!==1?"s":""})})}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":s("documents.sectionsLabel","Documents sections"),children:[e.jsxs("button",{className:`btn documents-tab${l==="artifacts"?" active":""}`,role:"tab","aria-selected":l==="artifacts","aria-label":s("documents.showArtifacts","Show artifacts"),onClick:()=>Ee("artifacts"),children:[s("documents.artifactsTab","Artifacts"),e.jsx("span",{className:"documents-tab-count",children:B.length})]}),e.jsxs("button",{className:`btn documents-tab${l==="project"?" active":""}`,role:"tab","aria-selected":l==="project","aria-label":s("documents.showProjectFiles","Show project markdown files"),onClick:()=>Ee("project"),children:[s("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:X.length})]}),e.jsxs("button",{className:`btn documents-tab${l==="tasks"?" active":""}`,role:"tab","aria-selected":l==="tasks","aria-label":s("documents.showTaskDocuments","Show task documents"),onClick:()=>Ee("tasks"),children:[s("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:J.length})]})]}),l==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>u(c=>!c),"aria-pressed":b,"aria-label":b?s("documents.hideHidden","Hide hidden project files"):s("documents.showHidden","Show hidden project files"),title:b?s("documents.hideHiddenFiles","Hide hidden files"):s("documents.showHiddenFiles","Show hidden files"),children:[b?e.jsx(ls,{size:14}):e.jsx(os,{size:14}),b?s("documents.hideHiddenLabel","Hide Hidden"):s("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(ds,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:Ze,value:p,onChange:Et,"aria-label":Ze}),p&&e.jsx("button",{className:"documents-search-clear",onClick:Pt,"aria-label":s("documents.clearSearch","Clear search"),children:e.jsx(dt,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:Ye?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:s("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:l==="project"?s("documents.projectFiles","project files"):l==="tasks"?s("documents.taskDocuments","task documents"):s("documents.artifacts","artifacts"),error:Ye})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void Kt(),"aria-label":s("documents.retryLoading","Retry loading documents"),children:[e.jsx(us,{size:16}),s("documents.retry","Retry")]})]}):l==="project"?Ct&&X.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(fe,{label:s("documents.loadingProjectFiles","Loading project markdown files…")})})}):Fe.length===0?e.jsx("div",{className:"documents-view-empty",children:p.trim()?e.jsx("p",{children:s("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:p.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(te,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:s("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${P?" documents-project-layout--mobile":""}`,children:[(!P||!m)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":s("documents.projectMarkdownFilesLabel","Project markdown files"),children:e.jsx("ul",{className:"markdown-file-list",children:Fe.map(c=>{const h=m?.path===c.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${h?" markdown-file-item--selected":""}`,onClick:()=>void Dt(c),"aria-label":`Open ${c.path}`,"aria-current":h?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:c.name}),e.jsx("span",{className:"markdown-file-item-path",children:c.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[Es(c.size)," · ",ie(c.mtime)]})]})},c.path)})})}),(!P||m)&&e.jsxs("section",{className:"documents-view-main","aria-label":s("documents.projectFilePreviewLabel","Project file content preview"),children:[P&&m&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Mt,"aria-label":s("documents.backToFilesList","Back to project files list"),children:[e.jsx(nt,{size:14}),s("documents.backToFiles","Back to files")]}),m?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:m.path}),e.jsx("div",{className:"documents-task-document-actions",children:ye?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:zt,disabled:Ne,children:s("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void It(),disabled:Ne,children:Ne?s("documents.saving","Saving…"):s("documents.saveProjectFile","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>L(c=>!c),"aria-label":S?s("documents.switchToPlainText","Switch to plain text"):s("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":S,title:S?s("documents.switchToPlainText","Switch to plain text"):s("documents.switchToMarkdown","Switch to markdown"),children:S?s("documents.markdown","Markdown"):s("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Rt,disabled:z||E!==null||j===null,"aria-label":s("documents.editProjectFile","Edit project file"),children:[e.jsx(Re,{size:14,"aria-hidden":"true"}),s("documents.edit","Edit")]})]})})]}),z?e.jsx("p",{className:"documents-content-state",children:e.jsx(fe,{label:s("documents.loadingFileContent","Loading file content…")})}):E?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:E}):ye?e.jsx("div",{className:"documents-task-document-editor","aria-label":s("documents.projectFileContentEditor","Project file content editor"),children:e.jsx(ze,{content:oe,onChange:W,filePath:m.path,forceToolbarActionsVisible:!0})}):S?e.jsx("div",{ref:O,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(ke,{remarkPlugins:[pe],children:j??""})})}):e.jsx("pre",{ref:R,className:"document-card-content-text documents-content-viewer-text",children:j??""}),qt]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:s("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):l==="artifacts"?At&&B.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:s("documents.loadingArtifacts","Loading artifacts…")})}):B.length===0?e.jsx("div",{className:"documents-view-empty",children:p.trim()?e.jsx("p",{children:s("documents.noMatchArtifacts",'No artifacts match "{{query}}".',{query:p.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(te,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:s("documents.noArtifacts","No artifacts yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:s("documents.artifactsCreatedBy","Agents register screenshots, wireframes, mockups, recordings, and documents here as they work on tasks.")})]})}):e.jsx(xs,{artifacts:B,projectId:t,isMobile:P,addToast:i,onOpenTask:Qe,onArtifactUpdated:()=>void Ae()}):Nt&&ae.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(fe,{label:s("documents.loadingTaskDocuments","Loading task documents…")})})}):J.length===0?e.jsx("div",{className:"documents-view-empty",children:p.trim()?e.jsx("p",{children:s("documents.noMatchTask",'No task documents match "{{query}}".',{query:p.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(te,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:s("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:s("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsxs("div",{className:`documents-project-layout documents-task-documents-layout${P?" documents-project-layout--mobile":""}`,children:[(!P||!me)&&e.jsx("aside",{className:"documents-view-sidebar documents-task-documents-sidebar","aria-label":s("documents.taskDocumentsListLabel","Task documents"),children:J.map(({taskId:c,taskTitle:h,taskColumn:f,documents:C,artifacts:q})=>{const Q=f?r(f):null,De=f?Ps(f):"status-dot";return e.jsxs("section",{className:"documents-task-sidebar-group","aria-labelledby":`documents-task-group-${c}`,children:[e.jsxs("div",{className:"documents-task-sidebar-group-header",children:[e.jsxs("div",{className:"documents-task-sidebar-title-wrap",children:[e.jsxs("h3",{id:`documents-task-group-${c}`,className:"documents-task-sidebar-title",children:[e.jsx("span",{className:"documents-group-task-id",children:c}),e.jsx("span",{className:"documents-group-task-title",children:h||s("documents.untitled","Untitled")})]}),Q?e.jsxs("span",{className:"documents-group-status badge","aria-label":s("documents.taskStatusAria","Task status: {{status}}",{status:Q}),children:[e.jsx("span",{className:De,"aria-hidden":"true"}),e.jsx("span",{children:Q})]}):null]}),e.jsxs("div",{className:"documents-task-sidebar-actions",children:[e.jsx("span",{className:"documents-group-count",children:s("documents.taskOutputCount","{{docCount}} doc{{docPlural}} · {{artifactCount}} artifact{{artifactPlural}}",{docCount:C.length,docPlural:C.length!==1?"s":"",artifactCount:q.length,artifactPlural:q.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>void Lt(c),"aria-label":s("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:c,title:h||s("documents.untitled","Untitled")}),children:s("documents.openTask","Open task")})]})]}),e.jsxs("ul",{className:"markdown-file-list documents-task-document-list",children:[C.map(y=>{const F=w?.id===y.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item${F?" markdown-file-item--selected":""}`,onClick:()=>$t(y.id),"aria-label":s("documents.openTaskDocument","Open {{taskId}} {{key}}",{taskId:y.taskId,key:y.key}),"aria-current":F?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:y.key}),e.jsxs("span",{className:"markdown-file-item-path",children:[y.taskId," · ",y.taskTitle||s("documents.untitled","Untitled")]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[s("documents.revisionShort","v{{revision}}",{revision:y.revision})," · ",y.author," · ",ie(y.updatedAt)]})]})},`document-${y.id}`)}),q.length>0?e.jsxs("li",{className:"documents-task-artifacts-subsection","aria-label":s("documents.taskArtifactsSubsection","Task artifacts"),children:[e.jsx("div",{className:"documents-task-artifacts-label",children:s("documents.taskArtifactsLabel","Artifacts")}),e.jsx("ul",{className:"markdown-file-list documents-task-artifact-list",children:q.map(y=>{const F=ce(y),ne=Fs[F],Wt=ht(s,F),Je=K?.id===y.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item documents-task-artifact-item${Je?" markdown-file-item--selected":""}`,onClick:()=>Ot(y.id),"aria-label":s("documents.openTaskArtifact","Open {{taskId}} artifact {{title}}",{taskId:c,title:y.title||s("documents.untitledArtifact","Untitled artifact")}),"aria-current":Je?"true":void 0,children:[e.jsxs("span",{className:"documents-task-artifact-title-row",children:[e.jsx(ne,{size:14,"aria-hidden":"true"}),e.jsx("span",{className:"markdown-file-item-name",children:y.title||s("documents.untitledArtifact","Untitled artifact")})]}),e.jsxs("span",{className:"markdown-file-item-path",children:[Wt," · ",y.mimeType||y.type]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[y.authorId||s("documents.unknownAuthor","unknown")," · ",ie(y.updatedAt)]})]})},`artifact-${y.id}`)})})]}):null]})]},c)})}),(!P||me)&&e.jsxs("section",{className:"documents-view-main","aria-label":s("documents.taskDocumentPreviewLabel","Task document content preview"),children:[P&&me&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Ut,"aria-label":s("documents.backToTaskDocumentsList","Back to task documents list"),children:[e.jsx(nt,{size:14}),s("documents.backToTaskDocuments","Back to documents")]}),me?K?e.jsx(Ms,{artifact:K,projectId:t,content:kt,loading:pt,error:xt,renderMarkdown:jt,onToggleMarkdown:()=>ve(c=>!c),onOpenTask:Qe,t:s}):w?e.jsxs("div",{className:"documents-content-viewer documents-task-document-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[w.taskId," / ",w.key]}),e.jsx("div",{className:"documents-task-document-actions",children:Le?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:_t,disabled:ge,children:s("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Bt(),disabled:ge,children:ge?s("documents.saving","Saving…"):s("documents.saveTaskDocument","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>Vt(w.id),"aria-label":ee?s("documents.switchToPlainText","Switch to plain text"):s("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":ee,title:ee?s("documents.switchToPlainText","Switch to plain text"):s("documents.switchToMarkdown","Switch to markdown"),children:ee?s("documents.markdown","Markdown"):s("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Ht,"aria-label":s("documents.editTaskDocument","Edit task document"),children:[e.jsx(Re,{size:14,"aria-hidden":"true"}),s("documents.edit","Edit")]})]})})]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta",children:[e.jsx("span",{className:"document-card-author",children:w.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:s("documents.revisionShort","v{{revision}}",{revision:w.revision})}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:ie(w.updatedAt)})]}),Le?e.jsx("div",{className:"documents-task-document-editor","aria-label":s("documents.taskDocumentContentEditor","Task document content editor"),children:e.jsx(ze,{content:we,onChange:I,filePath:w.key.includes(".")?w.key:`${w.key}.md`,forceToolbarActionsVisible:!0})}):ee?e.jsx("div",{ref:re,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(ke,{remarkPlugins:[pe],children:w.content})})}):e.jsx("pre",{ref:le,className:"document-card-content-text documents-content-viewer-text",children:w.content}),Gt]}):null:e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:s("documents.selectTaskDocument","Select a task document or artifact to view its content.")})})]})]})})]})}export{Vs as DocumentsView};
|