@runfusion/fusion 0.74.0-beta.0 → 0.74.0-beta.2
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 +9855 -8554
- package/dist/child-process-worker.js +619 -47
- package/dist/client/.vite/manifest.json +265 -265
- package/dist/client/assets/{AgentDetailView-CUXS0Odh.js → AgentDetailView-DH4Cn5iG.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-CzjHjB5r.js → AgentPermissionPolicyEditor-BycC7HhP.js} +1 -1
- package/dist/client/assets/{AgentsView-B5stgI5m.js → AgentsView-Dkij8Sm8.js} +3 -3
- package/dist/client/assets/ChatView-DAsZY1We.js +13 -0
- package/dist/client/assets/{CommandCenter-BdEQ_ZOX.js → CommandCenter-jTzBo-pg.js} +1 -1
- package/dist/client/assets/{DevServerView-BHgAmF3y.js → DevServerView-CxlacYJp.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-BQXVc5YW.js → DirectoryPicker-DsCk3Nsw.js} +1 -1
- package/dist/client/assets/{DocumentsView-CxN0Ptrj.js → DocumentsView-8EI6KNBY.js} +1 -1
- package/dist/client/assets/{EvalsView-DAgJtpO5.js → EvalsView-kYnaIk11.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-NZcXkGrN.js → ExperimentalAgentOnboardingModal-ce6DROKD.js} +1 -1
- package/dist/client/assets/{GoalsView-Dwq7NW4j.js → GoalsView-BVlTtw-u.js} +1 -1
- package/dist/client/assets/{InsightsView-CUlL5NSC.js → InsightsView-BKQeROkb.js} +1 -1
- package/dist/client/assets/{MemoryView-WfHzJflp.js → MemoryView-DCzTnxsV.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-BS1dkauB.js → PiExtensionsManager-C94HwDz5.js} +1 -1
- package/dist/client/assets/{PluginManager-B1oLb0pn.js → PluginManager-C3DegklW.js} +1 -1
- package/dist/client/assets/{PullRequestView-Cdp662lx.js → PullRequestView-CrE89UL7.js} +1 -1
- package/dist/client/assets/{ReportModal-C92wQO-k.js → ReportModal-BD1ZUDdV.js} +1 -1
- package/dist/client/assets/{ResearchView-4-SoxmQv.js → ResearchView-eMiRw1EM.js} +1 -1
- package/dist/client/assets/{SecretsView-C5UQ1Mms.js → SecretsView-6qK8Idb7.js} +1 -1
- package/dist/client/assets/{SessionTerminal-BTjX9p3a.js → SessionTerminal-DtFLyUaK.js} +1 -1
- package/dist/client/assets/{SettingsModal-B37HBcKT.css → SettingsModal-BF1KzZ0q.css} +1 -1
- package/dist/client/assets/SettingsModal-BTfZlghk.css +1 -0
- package/dist/client/assets/{SettingsModal-BfHAE14s.js → SettingsModal-BkOSlfyr.js} +1 -1
- package/dist/client/assets/SettingsModal-DSq-_qwo.js +21 -0
- package/dist/client/assets/{SettingsTextareaRow-C2JqzQdD.js → SettingsTextareaRow-Btyx5kaR.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-C1KmMVfU.js → SetupWizardModal-Blhx-dRt.js} +2 -2
- package/dist/client/assets/{SkillsView-DyLNdfDy.js → SkillsView-DGE5kYc3.js} +1 -1
- package/dist/client/assets/{TodoView-DyrniX19.js → TodoView-YSGI7ATd.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-Bh-Hn1Kx.js → WorkflowNodeEditor-CZiEThu2.js} +1 -1
- package/dist/client/assets/{agent-import-generation-C5pyefIj.js → agent-import-generation-DQeNZMAm.js} +1 -1
- package/dist/client/assets/{app-YM47G7Ks.js → app-DJIiVHdA.js} +1 -1
- package/dist/client/assets/{app-DNrauoYS.js → app-DMZ_RusZ.js} +3 -3
- package/dist/client/assets/{app-Bl764LdY.js → app-DaikOPcV.js} +3 -3
- package/dist/client/assets/{app-QmIotwFZ.js → app-Dn1u7zJ9.js} +3 -3
- package/dist/client/assets/{app-DdCnRHSe.js → app-DxTbBEMH.js} +3 -3
- package/dist/client/assets/{app-oUEtzFOj.js → app-hQw_x2KJ.js} +3 -3
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-B6axGlaS.js → architectureDiagram-3BPJPVTR-DhaJNKa4.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-BENjJaZD.js → blockDiagram-GPEHLZMM-pKpg7gJU.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-Cl2qKhuO.js → c4Diagram-AAUBKEIU-DVPXKJnr.js} +1 -1
- package/dist/client/assets/channel-xFBfK0sX.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BWo7R8T7.js → chunk-2J33WTMH-CHt90T5z.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-DiRoI7pq.js → chunk-4BX2VUAB-DsWFYy0a.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-DPtv1GVO.js → chunk-55IACEB6-D8XiXEo8.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-BVcm5ITs.js → chunk-727SXJPM-DlUYBn_Y.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CFT4bmXK.js → chunk-AQP2D5EJ-BSdPOr9q.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BDcEHQ0o.js → chunk-FMBD7UC4-B9IAeBld.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-CYlDBFdI.js → chunk-ND2GUHAM-CmxnYQrR.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-3Wv3WxYt.js → chunk-QZHKN3VN-Dxp6Po_j.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BFBVD968.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BFBVD968.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-BuMkKBMC.js → cose-bilkent-S5V4N54A-BNl3bhpS.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-D1P4z_OM.js → dagre-BM42HDAG-DFs7WCcz.js} +1 -1
- package/dist/client/assets/{dashboard-view-BgQBLynI.js → dashboard-view-DnoTcnIo.js} +1 -1
- package/dist/client/assets/{dashboard-view-DaRKU5oU.js → dashboard-view-ZGxLEL9r.js} +1 -1
- package/dist/client/assets/{dashboard-view-CcK2sH0v.js → dashboard-view-vc8kgLMs.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-hmY-reWF.js → diagram-2AECGRRQ-C2PVozvu.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-CGfRqm_0.js → diagram-5GNKFQAL-DFJ5b9H8.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-BfKo4Jd4.js → diagram-KO2AKTUF-D335CW-c.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-BZqpNemd.js → diagram-LMA3HP47-DSfhroAW.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-CxLTV4DH.js → diagram-OG6HWLK6-8iGveM-Z.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-vw3tx2tK.js → erDiagram-TEJ5UH35-Xc56MEEi.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-OEm-Us2U.js → flowDiagram-I6XJVG4X-DjCU9WbD.js} +1 -1
- package/dist/client/assets/{folder-open-D_zgZHWi.js → folder-open-BRrB44UX.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-C5bc1DG1.js → ganttDiagram-6RSMTGT7-CXQE1bea.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DEvcWRBq.js → gitGraphDiagram-PVQCEYII--mrSABLC.js} +1 -1
- package/dist/client/assets/index-C2xsZoNG.js +2671 -0
- package/dist/client/assets/index-Dv-95s50.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-kFOE9wxd.js → infoDiagram-5YYISTIA-CTS_nljP.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DvLbzHmR.js → ishikawaDiagram-YF4QCWOH-CpV5x3gk.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-ov6Tbcuz.js → journeyDiagram-JHISSGLW-BK2QCMnt.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-Dr0foW2M.js → kanban-definition-UN3LZRKU-B4srpspY.js} +1 -1
- package/dist/client/assets/{mermaid.core-CM55309V.js → mermaid.core-B8DVAt21.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-xNyB6Z6o.js → mindmap-definition-RKZ34NQL-CsmmiPpA.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-DlS5Kpga.js → pieDiagram-4H26LBE5-BahLDqf4.js} +1 -1
- package/dist/client/assets/{puzzle-BrEvi5DH.js → puzzle-BFPQsuIa.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-D4z2CHAA.js → quadrantDiagram-W4KKPZXB-Bo3u0wTU.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-Bcwt6-p9.js → requirementDiagram-4Y6WPE33-DYkYsz7d.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C54N76yk.js → sankeyDiagram-5OEKKPKP-BCbh0BSY.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DtqryztE.js → sequenceDiagram-3UESZ5HK-C2AP9GlE.js} +1 -1
- package/dist/client/assets/{shield-alert-DhxKVKek.js → shield-alert-tlZOi02c.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-CdHJwmLI.js → standing-instructions-template-C0Rzv9Mr.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-DQAvSrHw.js → stateDiagram-AJRCARHV-CARkH0ug.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BzIGKq7y.js → stateDiagram-v2-BHNVJYJU-C2He043y.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-GDj_48Um.js → timeline-definition-PNZ67QCA-MvbYneEM.js} +1 -1
- package/dist/client/assets/{upload-B7GKZiF1.js → upload-DWK0F17Z.js} +1 -1
- package/dist/client/assets/{users-CBtvFVLM.js → users-1AkDfM14.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-PQDmLFbj.js → vennDiagram-CIIHVFJN-DOjzzLqc.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-GmGtXctI.js → wardley-L42UT6IY-Di70vhu2.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Bv6slmsW.js → wardleyDiagram-YWT4CUSO-nK6ARhDv.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-CK1RJHwB.js → xychartDiagram-2RQKCTM6-C7_y76B7.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/extension.js +6835 -5653
- package/package.json +1 -1
- package/dist/client/assets/ChatView-CpoOgZ4X.js +0 -13
- package/dist/client/assets/SettingsModal-BcnOOo9g.js +0 -21
- package/dist/client/assets/SettingsModal-CMLHZBhX.css +0 -1
- package/dist/client/assets/channel-CktWdAhK.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CrUS4gHO.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CrUS4gHO.js +0 -1
- package/dist/client/assets/index-BinRUCFV.js +0 -2661
- package/dist/client/assets/index-DGmuyTtv.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as a,j as r}from"./vendor-react-SZ_qB27O.js";import{a as $,w as O,cX as tr,bc as sr,cN as ie,L as pe,aH as _r,cY as Ar,cZ as Tr,c_ as Or,C as Fr,aZ as nr,c$ as $r,V as zr,d0 as Hr,c2 as Ir,c4 as Br,d1 as Vr,p as He,X as Wr,aQ as qr,R as Xr}from"./index-BinRUCFV.js";import{u as fe}from"./vendor-i18n-GF3RlKbq.js";import{S as ar}from"./shield-alert-DhxKVKek.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const s=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",n=s==="root"?".":s,t=e.name,v=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():n,d=typeof e.confidence=="number"?e.confidence:1,b=s==="root"?"root":s,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:t,packagePath:v,confidence:d,cwd:n,source:s,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${t} (${b})`}}function te(e){const s=e.status,n=s==="starting"||s==="running"||s==="failed"||s==="stopped"?s:"stopped",t=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,v=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:n,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:t,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:t,detectedPort:e.detectedPort,manualPreviewUrl:v,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:v,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function Jr(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Kr(e){const n=(Array.isArray(e.lines)?e.lines:[]).map((t,v)=>Jr(t,v+1));return{lines:n,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:n.length}}function Yr(e,s){const n=typeof s.maxLines=="number"&&Number.isFinite(s.maxLines)?Math.max(1,Math.floor(s.maxLines)):100,t=typeof s.offset=="number"&&Number.isFinite(s.offset)?Math.max(0,Math.floor(s.offset)):0,v=typeof s.lastEventId=="number"&&Number.isFinite(s.lastEventId)?Math.max(0,Math.floor(s.lastEventId)):null,d=e.length,b=e.map((N,z)=>({id:z+1,text:N,stream:"stdout",timestamp:""}));if(v!==null)return{lines:b.filter(N=>N.id>v).slice(0,n),totalLines:d};const m=Math.max(d-t,0),k=Math.max(m-n,0);return{lines:b.slice(k,m),totalLines:d}}function Be(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function ir(e){try{const s=await $(O("/dev-server/candidates",e));return Be(s)}catch(s){if(s instanceof Error&&/\/dev-server\/candidates/.test(s.message)){const n=await $(O("/dev-server/detect",e));return Be(n)}throw s}}function he(e){return $(O("/dev-server/status",e)).then(te)}async function Ne(e={},s){const n=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&n.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&n.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&n.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const t=n.size>0?`?${n.toString()}`:"";try{const v=await $(O(`/dev-server/logs/history${t}`,s));return Kr(v)}catch(v){if(v instanceof Error&&/\/dev-server\/logs\/history/.test(v.message)){const d=await he(s);return Yr(d.logs,e)}throw v}}function or(e,s){const n=e.cwd??e.packagePath??".",t=e.scriptName;return $(O("/dev-server/start",s),{method:"POST",body:JSON.stringify({command:e.command,scriptName:t,scriptId:t,cwd:n,packagePath:e.packagePath})}).then(te)}function lr(e){return $(O("/dev-server/stop",e),{method:"POST"}).then(te)}function cr(e){return $(O("/dev-server/restart",e),{method:"POST"}).then(te)}async function dr(e,s){const n=typeof e=="string"?{url:e}:e;try{const t=await $(O("/dev-server/preview-url",s),{method:"POST",body:JSON.stringify(n)});return te(t)}catch(t){if(t instanceof Error&&/\/dev-server\/preview-url/.test(t.message)){const v=await $(O("/dev-server/preview-url",s),{method:"PUT",body:JSON.stringify(n)});return te(v)}throw t}}function Re(e){return tr(O("/dev-server/logs/stream",e))}async function Ue(e){try{return(await $(O("/devserver",e))).sessions??[]}catch{try{const s=await he(e);return[{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function vr(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}`,s))}catch{try{const n=await he(s);return!e||e==="default"||e===n.id?{config:{id:n.id??"default",name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Ve(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/start`,s),{method:"POST"})}catch{const n=await or({command:""},s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function We(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/stop`,s),{method:"POST"})}catch{const n=await lr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function qe(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/restart`,s),{method:"POST"})}catch{const n=await cr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,s,n){try{const t=await $(O(`/devserver/${encodeURIComponent(e)}/preview`,n),{method:"POST",body:JSON.stringify({url:s})});return{url:t.url??null,source:t.source??null}}catch{const t=await dr({url:s},n);return{url:t.previewUrl??t.manualUrl??null,source:"manual"}}}async function ke(e){try{return(await $(O("/devserver/detect",e))).candidates??[]}catch{try{return(await ir(e)).map(n=>({name:n.name,command:n.command,cwd:n.cwd,scriptName:n.scriptName,packagePath:n.packagePath}))}catch{return[]}}}function Gr(e,s){return tr(O(`/devserver/${encodeURIComponent(e)}/logs/stream`,s))}const De=500,Qr=3e3;function q(e){return e instanceof Error?e.message:String(e)}function ur(e){return e.length<=De?e:e.slice(-De)}function Ce(e,s){return ur([...e,s])}function re(e){try{return JSON.parse(e)}catch{return null}}function ve(e){const s=e.text??"";return e.stream==="stderr"?`[stderr] ${s}`:s}function Zr(e){return e?.previewUrl??null}async function Je(e){return he(e)}async function Ke(e,s){return or(e,s)}async function et(e){return lr(e)}async function rt(e){return cr(e)}async function Ye(e){return ir(e)}function K(e){try{return e()}catch{return null}}function je(){return typeof K(()=>Ue)=="function"&&typeof K(()=>vr)=="function"}function Z(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(s=>({timestamp:new Date().toISOString(),stream:s.startsWith("[stderr]")?"stderr":"stdout",text:s.replace(/^\[stderr\]\s*/,"")}))}}function tt(e){const{t:s}=fe("app"),[n,t]=a.useState(null),[v,d]=a.useState([]),[b,m]=a.useState([]),[k,N]=a.useState([]),[z,E]=a.useState(!0),[j,h]=a.useState(null),c=a.useRef(0),[p,D]=a.useState(null),F=a.useCallback(o=>{if(t(o),o?.logHistory){const i=o.logHistory.slice(-De).map(ve);m(i)}},[]),L=a.useCallback(async()=>{const o=c.current;try{if(je())if(p){const i=await vr(p,e);if(c.current!==o)return;F(i)}else{const i=await Ue(e);if(c.current!==o)return;d(i),i.length>0&&(D(i[0].config.id),F(i[0]))}else{const i=await Je(e);if(c.current!==o)return;const g=Z(i);d([g]),F(g)}h(null)}catch(i){if(c.current!==o)return;h(q(i))}},[F,e,p]);a.useEffect(()=>{c.current+=1;const o=c.current;t(null),d([]),m([]),N([]),E(!0),h(null),D(null),(async()=>{try{const[g,u]=await Promise.allSettled([je()?Ue(e):Je(e).then(y=>[Z(y)]),typeof K(()=>ke)=="function"?ke(e):Ye(e).then(y=>y.map(U=>({name:U.name,command:U.command,cwd:U.cwd,scriptName:U.scriptName,packagePath:U.packagePath})))]);if(c.current!==o)return;let w=null;if(g.status==="fulfilled"){const y=g.value;if(d(y),y.length>0){const U=y[0];je()&&D(U.config.id),F(U)}}else w=q(g.reason);u.status==="fulfilled"&&N(u.value),w&&h(w)}catch(g){if(c.current!==o)return;h(q(g))}finally{c.current===o&&E(!1)}})()},[F,e]),a.useEffect(()=>{const o=p?Gr(p,e):typeof K(()=>Re)=="function"?Re(e):null;if(!o)return;const i=c.current,g=sr(o,{events:{history:u=>{if(c.current!==i)return;const w=re(u.data);if(w?.lines){const y=w.lines.map(ve);m(ur(y))}},log:u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:log":u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:output":u=>{if(c.current!==i)return;const w=re(u.data);w?.line&&m(y=>Ce(y,w.line))},status:u=>{if(c.current!==i)return;const w=re(u.data),y=w?.status;y&&t(U=>U&&{...U,status:y,runtime:w.pid?{...U.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:U.runtime})},"dev-server:status":u=>{if(c.current!==i)return;const w=re(u.data);if(w?.status){const y=Z(w);t(y),d([y])}},stopped:()=>{c.current},failed:()=>{c.current}},onReconnect:()=>{c.current===i&&L()},onError:()=>{c.current===i&&h(u=>u??s("devserver.lostConnection","Lost log stream connection."))}});return()=>{g()}},[e,L,p]),a.useEffect(()=>{if(n?.status!=="running"&&n?.status!=="starting")return;const o=setInterval(()=>{L()},Qr);return()=>{clearInterval(o)}},[L,n?.status]);const _=a.useCallback(async(o,i)=>{c.current+=1;const g=c.current;try{let u;const w=typeof i=="string"&&i.length>0,y=n?.config?.cwd??".";if(!(w&&i!==y)&&p&&typeof K(()=>Ve)=="function")u=await Ve(p,e);else{const W=await Ke({command:o,cwd:i},e);u=Z(W)}if(c.current!==g)return;t(u),h(null)}catch(u){if(c.current!==g)return;throw h(q(u)),u}},[e,n?.config?.cwd,p]),R=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>We)=="function")i=await We(p,e);else{const g=await et(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),I=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>qe)=="function")i=await qe(p,e);else{const g=await rt(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),B=a.useCallback(async o=>{c.current+=1;const i=c.current;try{let g;if(p&&typeof K(()=>Xe)=="function")g=await Xe(p,o,e);else{const u=await dr({url:o},e);g={url:u.manualUrl??u.previewUrl??u.detectedUrl??null,source:u.manualUrl?"manual":"auto"}}if(c.current!==i)return;t(u=>u?{...u,previewUrl:g.url??void 0}:null),h(null)}catch(g){if(c.current!==i)return;throw h(q(g)),g}},[e,p]),H=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;try{i=await ke(e)}catch{i=(await Ye(e)).map(u=>({name:u.name,command:u.command,cwd:u.cwd,scriptName:u.scriptName,packagePath:u.packagePath}))}if(c.current!==o)return;N(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e]),P=a.useCallback(async(o,i)=>{if(typeof o!="string"&&!p)try{const w=o,y=await Ke({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),U=Z(y);t(U),d([U]),h(null);return}catch(w){throw h(q(w)),w}const g=typeof o=="string"?o:o.command,u=typeof o=="string"?i:o.cwd;await _(g,u)},[e,_,p]),x=a.useCallback(async()=>{await R()},[R]),f=a.useCallback(async()=>{await I()},[I]),A=a.useCallback(async o=>{await B(o)},[B]),T=a.useCallback(async()=>{await H()},[H]),X=a.useCallback(async()=>{await L()},[L]),C=Zr(n),S=n?{...n,pid:n.runtime?.pid}:null;return{session:n,sessions:v,logs:b,detectedCommands:k,previewUrl:C,isLoading:z,error:j,startServer:_,stopServer:R,restartServer:I,setPreviewUrl:B,detectCommands:H,refresh:L,candidates:k,serverState:S,loading:z,start:P,stop:x,restart:f,setManualUrl:A,detect:T,refreshStatus:X}}const Ge=500,Qe=100;function mr(e){return e.length>Ge?e.slice(-Ge):e}function pr(e){return e==="stderr"?"stderr":"stdout"}function ue(e){try{return JSON.parse(e.data)}catch{return null}}function me(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:"",stream:pr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function st(e,s){return{id:s,text:e,stream:"stdout",timestamp:""}}function Ee(e,s){if(s.length===0)return e;const n=[...e],t=new Set(e.map(v=>v.id));for(const v of s)t.has(v.id)||(t.add(v.id),n.push(v));return n.sort((v,d)=>v.id-d.id),mr(n)}function nt(e,s){const[n,t]=a.useState([]),[v,d]=a.useState(!1),[b,m]=a.useState(!1),[k,N]=a.useState(!1),[z,E]=a.useState(null),j=a.useRef(null),h=a.useRef(!1),c=a.useRef(0),p=a.useRef(0),D=a.useRef(e),F=a.useRef(s),L=a.useRef(0),_=a.useRef(1);(D.current!==e||F.current!==s)&&(D.current=e,F.current=s,c.current++,ie({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,L.current=0,_.current=1,t([]),d(!1),m(!1),N(!1),E(null),j.current&&(j.current(),j.current=null)),a.useEffect(()=>{if(!s){j.current&&(j.current(),j.current=null);return}const P=c.current,x=++p.current;h.current=!1,d(!0);const f=(C,S)=>{const o=mr(C);t(o),E(S),N(S!==null?S>o.length:!1);const i=o.length>0?o[o.length-1].id:0;L.current=i,_.current=i+1},A=C=>{if(h.current||c.current!==P||!C||typeof C!="object")return;const S=C.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const i=S.filter(g=>typeof g=="string").map((g,u)=>st(g,u+1));f(i,i.length);return}const o=S.filter(i=>!!i&&typeof i=="object").map((i,g)=>me(i,g+1));f(o,o.length)},T=C=>{if(h.current||c.current!==P)return;const S=typeof C.text=="string"?C.text:typeof C.line=="string"?C.line:null;if(!S)return;const o=_.current,i=typeof C.id=="number"&&Number.isFinite(C.id)?C.id:o,g={id:i,text:S,stream:pr(C.stream),timestamp:typeof C.timestamp=="string"?C.timestamp:""};L.current=Math.max(L.current,i),_.current=Math.max(_.current,i+1),t(u=>Ee(u,[g])),E(u=>u===null?u:Math.max(u+1,g.id))};async function X(){try{const S=await Ne({maxLines:Qe},e);if(h.current||c.current!==P||p.current!==x)return;const o=S.lines.map((i,g)=>me(i,g+1));f(o,S.totalLines)}catch{if(h.current||c.current!==P||p.current!==x)return;f([],null)}finally{!h.current&&c.current===P&&p.current===x&&d(!1)}const C=Re(e);j.current=sr(C,{events:{"dev-server:log":S=>{const o=ue(S);o&&T(o)},log:S=>{const o=ue(S);o&&T(o)},history:S=>{const o=ue(S);A(o)},"dev-server:history":S=>{const o=ue(S);A(o)}},onReconnect:()=>{ie({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:L.current??null,sseChannel:C,reason:"history-replay"}),!(h.current||c.current!==P)&&Ne({lastEventId:L.current,maxLines:50},e).then(S=>{if(h.current||c.current!==P)return;const o=S.lines.map((i,g)=>me(i,_.current+g));if(o.length>0){const i=o[o.length-1].id;L.current=Math.max(L.current,i),_.current=Math.max(_.current,i+1)}t(i=>Ee(i,o)),E(S.totalLines)}).catch(()=>{})}}),ie({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:C})}return X(),()=>{h.current=!0,j.current&&(j.current(),j.current=null)}},[s,e]);const I=a.useCallback(async()=>{if(!s||b)return;const P=c.current,x=n.length;m(!0);try{const f=await Ne({maxLines:Qe,offset:x},e);if(h.current||c.current!==P)return;const A=f.lines.map((T,X)=>me(T,X+1));t(T=>Ee(A,T)),N(f.totalLines>x+A.length),E(f.totalLines)}catch{}finally{m(!1)}},[s,n.length,b,e]),B=a.useCallback(()=>{t([])},[]),H=j.current!==null&&!v&&!h.current;return{entries:n,loading:v,loadingMore:b,hasMore:k,total:z,loadMore:I,clear:B,logs:n,isStreaming:H,clearLogs:B}}const at="This preview appears to block iframe embedding. Open it in a new tab instead.",it="The preview URL could not be loaded. Verify the server is running and the URL is correct.",ot="Preview is taking longer than expected and may block iframe embedding.";function lt(e){return e==="blocked"?at:e==="error"?it:null}function ct(e,s={}){const{loadTimeoutMs:n=1e4,detectionMethod:t=null}=s,v=a.useRef(null),d=a.useRef(null),[b,m]=a.useState("unknown"),[k,N]=a.useState(null),[z]=a.useState(t),E=a.useCallback(()=>{d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),j=a.useCallback(R=>{m(R),N(lt(R))},[]),h=a.useCallback(()=>{m("blocked"),N(ot)},[]);a.useEffect(()=>{if(E(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let R=!1;return queueMicrotask(()=>{R||(m("loading"),N(null))}),()=>{R=!0,E()}},[E,e]),a.useEffect(()=>{if(b!=="loading"){E();return}const R=setTimeout(()=>{d.current=null,h()},n);return d.current=R,()=>{clearTimeout(R),d.current===R&&(d.current=null)}},[E,b,n,h]);const c=a.useCallback(()=>{const R=v.current;if(!R){j("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){j("blocked");return}}catch{}j("embedded")},[j]),p=a.useCallback(()=>{j("error")},[j]);a.useEffect(()=>{if(E(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[E]);const D=a.useCallback(()=>{E(),m("unknown"),N(null)},[E]),F=D,L=a.useMemo(()=>b==="embedded",[b]),_=a.useMemo(()=>b==="blocked"||b==="error",[b]);return{embedStatus:b,isEmbedded:L,isBlocked:_,blockReason:k,detectionMethod:z,iframeRef:v,resetEmbedStatus:D,setEmbedStatus:j,retry:F,embedContext:k,handleIframeLoad:c,handleIframeError:p}}const dt=/\x1b\[[0-9;]*m/g,vt=50;function ut(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=vt}function Pe(e){return e.replace(dt,"")}function mt(e){if(!e)return"";const s=new Date(e);return Number.isNaN(s.getTime())?"":s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function pt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ft(e){if(e.stream==="stderr")return"error";const s=Pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(s)?"warn":/\b(error|fatal)\b/.test(s)?"error":"info"}function ht(e,s){if(!s)return e;const n=new RegExp(`(${pt(s)})`,"ig"),t=e.split(n),v=s.toLowerCase();return r.jsx(r.Fragment,{children:t.map((d,b)=>d.toLowerCase()===v?r.jsx("mark",{children:d},`${d}-${b}`):r.jsx("span",{children:d},`${d}-${b}`))})}function gt({entries:e,loading:s,loadingMore:n,hasMore:t,total:v,onLoadMore:d,isRunning:b}){const{t:m}=fe("app"),k=a.useRef(null),N=a.useRef(e.length),z=a.useRef(b),[E,j]=a.useState(!1),[h,c]=a.useState(!1),p=a.useRef(!1),[D,F]=a.useState(""),[L,_]=a.useState("all"),R=a.useMemo(()=>L==="all"?e:e.filter(f=>ft(f)===L),[e,L]),I=a.useMemo(()=>{const f=D.trim().toLowerCase();return f?R.filter(A=>Pe(A.text).toLowerCase().includes(f)):R},[R,D]),B=I.length,H=a.useCallback(f=>{p.current=f,c(f)},[]),P=a.useCallback(()=>{const f=k.current;f&&(f.scrollTop=f.scrollHeight,H(!1))},[H]);a.useEffect(()=>{const f=z.current,A=N.current,T=e.length>A;b&&(!f||!h&&T)&&P(),z.current=b,N.current=e.length},[e.length,b,h,P]);const x=a.useCallback(()=>{const f=k.current;f&&H(!ut(f))},[H]);return a.useEffect(()=>{s||e.length===0||!h&&b&&P()},[e,b,h,s,P]),a.useEffect(()=>{const f=k.current;if(!f||!b||typeof MutationObserver>"u")return;const A=new MutationObserver(()=>{p.current||P()});return A.observe(f,{childList:!0,characterData:!0,subtree:!0}),()=>A.disconnect()},[b,P]),s&&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(pe,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("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:m("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[v!==null?`${e.length}/${v}`:`${e.length}`," ",m("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:m("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:L,onChange:f=>_(f.target.value),"data-testid":"devserver-log-severity-filter","aria-label":m("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:m("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:m("devserver.info","Info")}),r.jsx("option",{value:"warn",children:m("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:m("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.searchLogs","Search logs")}),r.jsx(_r,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:D,onChange:f=>F(f.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),D.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>j(f=>!f),"data-testid":"devserver-log-fullscreen-toggle","aria-label":E?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:E?r.jsx(Ar,{size:14}):r.jsx(Tr,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[t&&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:d,disabled:n,"data-testid":"devserver-log-load-more-button",children:n?r.jsxs(r.Fragment,{children:[r.jsx(pe,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:x,"data-testid":"devserver-log-content",children:[!s&&I.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?m("devserver.noLogsYet","No logs yet. Start the dev server to see output."):R.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),I.map(f=>{const A=Pe(f.text),T=mt(f.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[T&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:T}),f.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:m("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Or(ht(A,D.trim()))})]},f.id)})]}),h&&b&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx(Fr,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const wt="devserver-preview-iframe";function bt({url:e,embedStatus:s,onEmbedStatusChange:n,iframeRef:t,blockReason:v,onRetry:d,className:b=wt,embedContext:m}){const{t:k}=fe("app"),N=v??m??null,[z,E]=a.useState(0);a.useEffect(()=>{!e||s!=="unknown"||(E(p=>p+1),n("loading"))},[s,n,e]);const j=a.useCallback(()=>{const p=t.current;if(!p){n("embedded");return}try{if(p.contentWindow?.location?.href==="about:blank"&&p.src!=="about:blank"){n("blocked");return}}catch{}n("embedded")},[t,n]),h=a.useCallback(p=>{p.stopPropagation(),n("error")},[n]),c=a.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:t,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:b,title:"Dev server preview",onLoad:j,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),s==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:k("preview.loading","Loading preview...")})]}),s==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.blockedTitle","Preview cannot be embedded")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("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:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]}),s==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.errorTitle","Unable to load preview")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("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:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]})]}):null}function xt(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 yt=480;function St(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function fr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const s=e.parentElement;return s?.classList.contains("right-dock__body")?s:null}function Nt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function kt(e){if(!e||St())return!1;const s=fr(e);return s?Nt(s)<=yt:!1}function Ct(e){const[s,n]=a.useState(!1);return a.useEffect(()=>{const t=e.current;if(!t){n(!1);return}const v=fr(t),d=()=>n(kt(t));if(d(),!v||typeof ResizeObserver>"u")return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d);const b=new ResizeObserver(d);return b.observe(v),window.addEventListener("resize",d),()=>{b.disconnect(),window.removeEventListener("resize",d)}},[e]),s}let Le=!1;function Ze(e){return e instanceof Error?e.message:String(e)}function hr(e){return e==="."?"root":e}function er(e){return e?e==="root"?".":e:null}function rr(e,s,n){return!s||e.scriptName!==s?!1:n?hr(e.cwd)===n:!0}function jt(e){return e.cwd==="."?"root":e.cwd}function Et(e){return e.length<=60?e:`${e.slice(0,60)}…`}function At({addToast:e,projectId:s,tasks:n}){const{t}=fe("app");a.useEffect(()=>(ie({view:"DevServerView",trigger:Le?"route-active":"remount",projectId:s,replayAttempted:!1}),Le=!1,()=>{Le=!0,ie({view:"DevServerView",trigger:"route-inactive",projectId:s,replayAttempted:!1})}),[s]);const{session:v,detectedCommands:d,previewUrl:b,isLoading:m,error:k,startServer:N,stopServer:z,restartServer:E,setPreviewUrl:j,detectCommands:h,refresh:c}=tt(s),p=v?.status??"stopped",D=p==="running"||p==="starting",F=xt(t),L=F[p]??F.stopped,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,loadMore:P}=nt(s,!!s),x=b,f=v?.config?.cwd??null,A=a.useRef(null),T=Ct(A),[X,C]=a.useState(!0),[S,o]=a.useState(""),[i,g]=a.useState(""),[u,w]=a.useState(null),[y,U]=a.useState(null),[W,Me]=a.useState(null),Y=a.useMemo(()=>(n??[]).filter(l=>l.column==="in-progress"&&typeof l.worktree=="string"&&l.worktree.length>0),[n]),J=a.useMemo(()=>Y.find(l=>l.id===y)??null,[Y,y]);a.useEffect(()=>{y&&!Y.some(l=>l.id===y)&&U(null)},[Y,y]);const[se,gr]=a.useState("embedded"),[ne,ge]=a.useState(!1),_e=a.useRef(null),we=a.useRef(null),wr=se==="embedded"?x:null,{embedStatus:V,setEmbedStatus:br,resetEmbedStatus:oe,iframeRef:ee,isEmbedded:xr,isBlocked:be,blockReason:xe,retry:Ae}=ct(wr),[Te,G]=a.useState(!1),Oe=a.useRef(V);a.useEffect(()=>{const l=Oe.current!==V;be&&l&&G(!0),V==="embedded"&&G(!1),Oe.current=V},[V,be]),a.useEffect(()=>{G(!1)},[x]);const le=a.useMemo(()=>{if(!u)return null;const l=er(f);return d.find(M=>!(M.scriptName!==u||l&&M.cwd!==l||v?.config?.command&&M.command!==v.config.command))??d.find(M=>rr(M,u,f))??null},[d,v?.config?.command,u,f]);a.useEffect(()=>{typeof h=="function"&&h().catch(l=>{e(Ze(l),"error")})},[e,h]),a.useEffect(()=>{if(u){C(!1);return}C(!0)},[u]),a.useEffect(()=>{if(v?.status==="running"||v?.status==="starting"){v.config?.command?.trim().length>0&&o(v.config.command);return}if(le){o(le.command);return}d.length>0&&o(l=>l.trim().length>0?l:d[0]?.command??"")},[d,le,v?.config?.command,v?.status]),a.useEffect(()=>{g(x??"")},[x]);const ce=a.useCallback(()=>{ge(!1),window.requestAnimationFrame(()=>_e.current?.focus())},[]),yr=$r(ce);a.useEffect(()=>{if(!ne)return;we.current?.focus();const l=M=>{if(M.key==="Escape"){ce();return}if(M.key!=="Tab")return;const ae=Array.from(we.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(ze=>!ze.hasAttribute("disabled")&&ze.getAttribute("aria-hidden")!=="true"),Q=ae[0],Se=ae.at(-1);!Q||!Se||(M.shiftKey&&document.activeElement===Q?(M.preventDefault(),Se.focus()):!M.shiftKey&&document.activeElement===Se&&(M.preventDefault(),Q.focus()))};return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[ce,ne]),a.useEffect(()=>{!T&&ne&&ge(!1)},[T,ne]);const ye=a.useCallback(()=>{x&&window.open(x,"_blank","noopener,noreferrer")},[x]),Fe=a.useCallback(()=>{G(!1),Ae()},[Ae]),Sr=a.useCallback(()=>{try{const l=ee.current;if(l?.contentWindow){l.contentWindow.location.reload(),G(!1),oe();return}}catch{}if(!(!x||!ee.current))try{const l=new URL(x);l.searchParams.set("_t",Date.now().toString()),ee.current.src=l.toString(),G(!1),oe()}catch{ee.current.src=x,G(!1),oe()}},[x,ee,oe]),de=a.useCallback(async(l,M,ae)=>{Me(l);try{await M(),e(ae,"success")}catch(Q){e(Ze(Q),"error")}finally{Me(null)}},[e]),Nr=a.useCallback(l=>{w(l.scriptName),C(!1),o(l.command),e(t("devserver.toast.selectedScript","Selected {{name}} script.",{name:l.scriptName}),"success")},[e]),kr=a.useCallback(()=>{w(null),C(!0),e(t("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Cr=a.useCallback(l=>{D&&l&&l!==y&&e(t("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),U(l)},[e,D,y,t]),jr=()=>{const l=S.trim();if(l.length===0){e(t("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const M=er(f)??".",Q=J?.worktree??null??le?.cwd??M;de("start",()=>N(l,Q),t("devserver.toast.started","Dev server started."))},Er=()=>{de("stop",z,t("devserver.toast.stopped","Dev server stopped."))},Lr=()=>{de("restart",E,t("devserver.toast.restarted","Dev server restarted."))},Rr=()=>{const l=i.trim(),M=l.length>0?l:null;de("preview",()=>j(M),M?t("devserver.toast.previewUpdated","Preview URL updated."):t("devserver.toast.previewCleared","Preview URL override cleared."))},Ur=a.useCallback(()=>{k&&c()},[k,c]),Dr=p==="starting"||p==="running"||W!==null,Pr=p==="stopped"||W!==null,Mr=p==="stopped"||p==="starting"||W!==null,$e=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[t("devserver.auto","Auto"),x?` · ${x}`:t("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>gr(l=>l==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:se==="embedded"?t("devserver.externalOnly","External only"):t("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.openInNewTab","Open in new tab"),onClick:ye,disabled:!x,"data-testid":"devserver-preview-open-tab",children:r.jsx(qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.refreshPreview","Refresh preview"),onClick:Sr,disabled:!x,"data-testid":"devserver-preview-refresh",children:r.jsx(Xr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":V,"data-embedded":xr?"true":"false",children:[!x&&!D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.startDevServer","Start a dev server to see a live preview here.")}),!x&&D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),x&&se==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:t("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:ye,"data-testid":"devserver-preview-external-open-tab",children:t("devserver.openInNewTab","Open in new tab")})]}),x&&se==="embedded"&&Te&&be&&r.jsxs("div",{className:V==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[V==="error"?r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:V==="error"?t("devserver.previewFailed","Preview failed"):t("devserver.previewBlocked","Preview blocked")}),xe&&r.jsx("p",{className:"devserver-preview-blocked-context",children:xe})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:t("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:ye,"data-testid":"devserver-preview-fallback-open-tab",children:t("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Fe,"data-testid":"devserver-preview-fallback-retry",children:t("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),x&&se==="embedded"&&!Te&&r.jsx(bt,{url:x,embedStatus:V,onEmbedStatusChange:br,iframeRef:ee,blockReason:xe,onRetry:Fe})]})]});return r.jsxs("div",{ref:A,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":T?"true":"false",children:[r.jsx(zr,{icon:Hr,title:t("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 ${L.className}`,"data-testid":"dev-server-status-badge",children:L.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:jr,disabled:Dr,"data-testid":"dev-server-start-button",children:[r.jsx(Ir,{size:14}),r.jsx("span",{children:W==="start"?t("devserver.starting","Starting..."):t("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Er,disabled:Pr,"data-testid":"dev-server-stop-button",children:[r.jsx(Br,{size:14}),r.jsx("span",{children:W==="stop"?t("devserver.stopping","Stopping..."):t("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Lr,disabled:Mr,"data-testid":"dev-server-restart-button",children:[r.jsx(Vr,{size:14}),r.jsx("span",{children:W==="restart"?t("devserver.restarting","Restarting..."):t("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":t("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.configuration","Configuration")}),m&&r.jsx("span",{className:"dev-server-muted",children:t("devserver.loading","Loading...")})]}),m&&!v&&d.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:t("devserver.loadingConfig","Loading dev server configuration...")})]}),k&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:k}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ur,children:t("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:t("devserver.scriptSelection","Script Selection")}),u&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:u}),r.jsx("span",{className:"dev-server-candidate-source",children:f??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>C(!0),"data-testid":"dev-server-change-selection",children:t("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:kr,"data-testid":"dev-server-clear-selection",children:t("devserver.clear","Clear")})]}),X&&d.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:t("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),X&&d.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:d.map(l=>{const M=rr(l,u,f);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${M?"dev-server-candidate--selected":""}`,onClick:()=>Nr(l),"data-testid":`dev-server-candidate-${l.scriptName}-${hr(l.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:l.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Et(l.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:jt(l)})]},`${l.cwd}::${l.scriptName}::${l.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:t("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:t("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:y??"",onChange:l=>Cr(l.target.value.length>0?l.target.value:null),disabled:Y.length===0,"aria-label":t("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:t("devserver.projectRootNoTask","Project root (no task)")}),Y.map(l=>r.jsx("option",{value:l.id,children:l.title?`${l.id} — ${l.title}`:l.id},l.id))]}),Y.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:t("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),J&&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:J.title?`${J.id} — ${J.title}`:J.id})}),r.jsx("p",{className:"dev-server-task-description",children:J.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:J.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:t("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:S,onChange:l=>o(l.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:p==="running"||p==="starting"})]}),(p==="running"||p==="starting")&&v&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.runningCommand","Running command")}),r.jsx("code",{children:v.config?.command??S})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:t("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:i,onChange:l=>g(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:Rr,disabled:W==="preview","data-testid":"dev-server-set-preview",children:t("devserver.save","Save")})]}),x&&r.jsx("p",{className:"dev-server-preview-hint",children:t("devserver.autoDetected","Auto-detected: {{url}}",{url:x})})]}),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":t("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:t("devserver.lines","{{count}} lines",{count:H??_.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(gt,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,onLoadMore:P,isRunning:D})})]})}),T?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":t("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(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:x||t("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:x?t("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):t("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:_e,onClick:()=>ge(!0),"data-testid":"devserver-preview-modal-open",children:t("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":t("devserver.previewLabel","Dev server preview"),children:$e()}),T&&ne&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...yr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:we,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:t("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ce,"aria-label":t("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Wr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:$e()})]})})]})}export{At as DevServerView};
|
|
1
|
+
import{r as a,j as r}from"./vendor-react-SZ_qB27O.js";import{a as $,w as O,cX as tr,bc as sr,cN as ie,L as pe,aH as _r,cY as Ar,cZ as Tr,c_ as Or,C as Fr,aZ as nr,c$ as $r,V as zr,d0 as Hr,c2 as Ir,c4 as Br,d1 as Vr,p as He,X as Wr,aQ as qr,R as Xr}from"./index-C2xsZoNG.js";import{u as fe}from"./vendor-i18n-GF3RlKbq.js";import{S as ar}from"./shield-alert-tlZOi02c.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const s=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",n=s==="root"?".":s,t=e.name,v=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():n,d=typeof e.confidence=="number"?e.confidence:1,b=s==="root"?"root":s,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:t,packagePath:v,confidence:d,cwd:n,source:s,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${t} (${b})`}}function te(e){const s=e.status,n=s==="starting"||s==="running"||s==="failed"||s==="stopped"?s:"stopped",t=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,v=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:n,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:t,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:t,detectedPort:e.detectedPort,manualPreviewUrl:v,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:v,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function Jr(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Kr(e){const n=(Array.isArray(e.lines)?e.lines:[]).map((t,v)=>Jr(t,v+1));return{lines:n,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:n.length}}function Yr(e,s){const n=typeof s.maxLines=="number"&&Number.isFinite(s.maxLines)?Math.max(1,Math.floor(s.maxLines)):100,t=typeof s.offset=="number"&&Number.isFinite(s.offset)?Math.max(0,Math.floor(s.offset)):0,v=typeof s.lastEventId=="number"&&Number.isFinite(s.lastEventId)?Math.max(0,Math.floor(s.lastEventId)):null,d=e.length,b=e.map((N,z)=>({id:z+1,text:N,stream:"stdout",timestamp:""}));if(v!==null)return{lines:b.filter(N=>N.id>v).slice(0,n),totalLines:d};const m=Math.max(d-t,0),k=Math.max(m-n,0);return{lines:b.slice(k,m),totalLines:d}}function Be(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function ir(e){try{const s=await $(O("/dev-server/candidates",e));return Be(s)}catch(s){if(s instanceof Error&&/\/dev-server\/candidates/.test(s.message)){const n=await $(O("/dev-server/detect",e));return Be(n)}throw s}}function he(e){return $(O("/dev-server/status",e)).then(te)}async function Ne(e={},s){const n=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&n.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&n.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&n.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const t=n.size>0?`?${n.toString()}`:"";try{const v=await $(O(`/dev-server/logs/history${t}`,s));return Kr(v)}catch(v){if(v instanceof Error&&/\/dev-server\/logs\/history/.test(v.message)){const d=await he(s);return Yr(d.logs,e)}throw v}}function or(e,s){const n=e.cwd??e.packagePath??".",t=e.scriptName;return $(O("/dev-server/start",s),{method:"POST",body:JSON.stringify({command:e.command,scriptName:t,scriptId:t,cwd:n,packagePath:e.packagePath})}).then(te)}function lr(e){return $(O("/dev-server/stop",e),{method:"POST"}).then(te)}function cr(e){return $(O("/dev-server/restart",e),{method:"POST"}).then(te)}async function dr(e,s){const n=typeof e=="string"?{url:e}:e;try{const t=await $(O("/dev-server/preview-url",s),{method:"POST",body:JSON.stringify(n)});return te(t)}catch(t){if(t instanceof Error&&/\/dev-server\/preview-url/.test(t.message)){const v=await $(O("/dev-server/preview-url",s),{method:"PUT",body:JSON.stringify(n)});return te(v)}throw t}}function Re(e){return tr(O("/dev-server/logs/stream",e))}async function Ue(e){try{return(await $(O("/devserver",e))).sessions??[]}catch{try{const s=await he(e);return[{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function vr(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}`,s))}catch{try{const n=await he(s);return!e||e==="default"||e===n.id?{config:{id:n.id??"default",name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Ve(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/start`,s),{method:"POST"})}catch{const n=await or({command:""},s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function We(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/stop`,s),{method:"POST"})}catch{const n=await lr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function qe(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/restart`,s),{method:"POST"})}catch{const n=await cr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,s,n){try{const t=await $(O(`/devserver/${encodeURIComponent(e)}/preview`,n),{method:"POST",body:JSON.stringify({url:s})});return{url:t.url??null,source:t.source??null}}catch{const t=await dr({url:s},n);return{url:t.previewUrl??t.manualUrl??null,source:"manual"}}}async function ke(e){try{return(await $(O("/devserver/detect",e))).candidates??[]}catch{try{return(await ir(e)).map(n=>({name:n.name,command:n.command,cwd:n.cwd,scriptName:n.scriptName,packagePath:n.packagePath}))}catch{return[]}}}function Gr(e,s){return tr(O(`/devserver/${encodeURIComponent(e)}/logs/stream`,s))}const De=500,Qr=3e3;function q(e){return e instanceof Error?e.message:String(e)}function ur(e){return e.length<=De?e:e.slice(-De)}function Ce(e,s){return ur([...e,s])}function re(e){try{return JSON.parse(e)}catch{return null}}function ve(e){const s=e.text??"";return e.stream==="stderr"?`[stderr] ${s}`:s}function Zr(e){return e?.previewUrl??null}async function Je(e){return he(e)}async function Ke(e,s){return or(e,s)}async function et(e){return lr(e)}async function rt(e){return cr(e)}async function Ye(e){return ir(e)}function K(e){try{return e()}catch{return null}}function je(){return typeof K(()=>Ue)=="function"&&typeof K(()=>vr)=="function"}function Z(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(s=>({timestamp:new Date().toISOString(),stream:s.startsWith("[stderr]")?"stderr":"stdout",text:s.replace(/^\[stderr\]\s*/,"")}))}}function tt(e){const{t:s}=fe("app"),[n,t]=a.useState(null),[v,d]=a.useState([]),[b,m]=a.useState([]),[k,N]=a.useState([]),[z,E]=a.useState(!0),[j,h]=a.useState(null),c=a.useRef(0),[p,D]=a.useState(null),F=a.useCallback(o=>{if(t(o),o?.logHistory){const i=o.logHistory.slice(-De).map(ve);m(i)}},[]),L=a.useCallback(async()=>{const o=c.current;try{if(je())if(p){const i=await vr(p,e);if(c.current!==o)return;F(i)}else{const i=await Ue(e);if(c.current!==o)return;d(i),i.length>0&&(D(i[0].config.id),F(i[0]))}else{const i=await Je(e);if(c.current!==o)return;const g=Z(i);d([g]),F(g)}h(null)}catch(i){if(c.current!==o)return;h(q(i))}},[F,e,p]);a.useEffect(()=>{c.current+=1;const o=c.current;t(null),d([]),m([]),N([]),E(!0),h(null),D(null),(async()=>{try{const[g,u]=await Promise.allSettled([je()?Ue(e):Je(e).then(y=>[Z(y)]),typeof K(()=>ke)=="function"?ke(e):Ye(e).then(y=>y.map(U=>({name:U.name,command:U.command,cwd:U.cwd,scriptName:U.scriptName,packagePath:U.packagePath})))]);if(c.current!==o)return;let w=null;if(g.status==="fulfilled"){const y=g.value;if(d(y),y.length>0){const U=y[0];je()&&D(U.config.id),F(U)}}else w=q(g.reason);u.status==="fulfilled"&&N(u.value),w&&h(w)}catch(g){if(c.current!==o)return;h(q(g))}finally{c.current===o&&E(!1)}})()},[F,e]),a.useEffect(()=>{const o=p?Gr(p,e):typeof K(()=>Re)=="function"?Re(e):null;if(!o)return;const i=c.current,g=sr(o,{events:{history:u=>{if(c.current!==i)return;const w=re(u.data);if(w?.lines){const y=w.lines.map(ve);m(ur(y))}},log:u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:log":u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:output":u=>{if(c.current!==i)return;const w=re(u.data);w?.line&&m(y=>Ce(y,w.line))},status:u=>{if(c.current!==i)return;const w=re(u.data),y=w?.status;y&&t(U=>U&&{...U,status:y,runtime:w.pid?{...U.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:U.runtime})},"dev-server:status":u=>{if(c.current!==i)return;const w=re(u.data);if(w?.status){const y=Z(w);t(y),d([y])}},stopped:()=>{c.current},failed:()=>{c.current}},onReconnect:()=>{c.current===i&&L()},onError:()=>{c.current===i&&h(u=>u??s("devserver.lostConnection","Lost log stream connection."))}});return()=>{g()}},[e,L,p]),a.useEffect(()=>{if(n?.status!=="running"&&n?.status!=="starting")return;const o=setInterval(()=>{L()},Qr);return()=>{clearInterval(o)}},[L,n?.status]);const _=a.useCallback(async(o,i)=>{c.current+=1;const g=c.current;try{let u;const w=typeof i=="string"&&i.length>0,y=n?.config?.cwd??".";if(!(w&&i!==y)&&p&&typeof K(()=>Ve)=="function")u=await Ve(p,e);else{const W=await Ke({command:o,cwd:i},e);u=Z(W)}if(c.current!==g)return;t(u),h(null)}catch(u){if(c.current!==g)return;throw h(q(u)),u}},[e,n?.config?.cwd,p]),R=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>We)=="function")i=await We(p,e);else{const g=await et(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),I=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>qe)=="function")i=await qe(p,e);else{const g=await rt(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),B=a.useCallback(async o=>{c.current+=1;const i=c.current;try{let g;if(p&&typeof K(()=>Xe)=="function")g=await Xe(p,o,e);else{const u=await dr({url:o},e);g={url:u.manualUrl??u.previewUrl??u.detectedUrl??null,source:u.manualUrl?"manual":"auto"}}if(c.current!==i)return;t(u=>u?{...u,previewUrl:g.url??void 0}:null),h(null)}catch(g){if(c.current!==i)return;throw h(q(g)),g}},[e,p]),H=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;try{i=await ke(e)}catch{i=(await Ye(e)).map(u=>({name:u.name,command:u.command,cwd:u.cwd,scriptName:u.scriptName,packagePath:u.packagePath}))}if(c.current!==o)return;N(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e]),P=a.useCallback(async(o,i)=>{if(typeof o!="string"&&!p)try{const w=o,y=await Ke({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),U=Z(y);t(U),d([U]),h(null);return}catch(w){throw h(q(w)),w}const g=typeof o=="string"?o:o.command,u=typeof o=="string"?i:o.cwd;await _(g,u)},[e,_,p]),x=a.useCallback(async()=>{await R()},[R]),f=a.useCallback(async()=>{await I()},[I]),A=a.useCallback(async o=>{await B(o)},[B]),T=a.useCallback(async()=>{await H()},[H]),X=a.useCallback(async()=>{await L()},[L]),C=Zr(n),S=n?{...n,pid:n.runtime?.pid}:null;return{session:n,sessions:v,logs:b,detectedCommands:k,previewUrl:C,isLoading:z,error:j,startServer:_,stopServer:R,restartServer:I,setPreviewUrl:B,detectCommands:H,refresh:L,candidates:k,serverState:S,loading:z,start:P,stop:x,restart:f,setManualUrl:A,detect:T,refreshStatus:X}}const Ge=500,Qe=100;function mr(e){return e.length>Ge?e.slice(-Ge):e}function pr(e){return e==="stderr"?"stderr":"stdout"}function ue(e){try{return JSON.parse(e.data)}catch{return null}}function me(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:"",stream:pr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function st(e,s){return{id:s,text:e,stream:"stdout",timestamp:""}}function Ee(e,s){if(s.length===0)return e;const n=[...e],t=new Set(e.map(v=>v.id));for(const v of s)t.has(v.id)||(t.add(v.id),n.push(v));return n.sort((v,d)=>v.id-d.id),mr(n)}function nt(e,s){const[n,t]=a.useState([]),[v,d]=a.useState(!1),[b,m]=a.useState(!1),[k,N]=a.useState(!1),[z,E]=a.useState(null),j=a.useRef(null),h=a.useRef(!1),c=a.useRef(0),p=a.useRef(0),D=a.useRef(e),F=a.useRef(s),L=a.useRef(0),_=a.useRef(1);(D.current!==e||F.current!==s)&&(D.current=e,F.current=s,c.current++,ie({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,L.current=0,_.current=1,t([]),d(!1),m(!1),N(!1),E(null),j.current&&(j.current(),j.current=null)),a.useEffect(()=>{if(!s){j.current&&(j.current(),j.current=null);return}const P=c.current,x=++p.current;h.current=!1,d(!0);const f=(C,S)=>{const o=mr(C);t(o),E(S),N(S!==null?S>o.length:!1);const i=o.length>0?o[o.length-1].id:0;L.current=i,_.current=i+1},A=C=>{if(h.current||c.current!==P||!C||typeof C!="object")return;const S=C.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const i=S.filter(g=>typeof g=="string").map((g,u)=>st(g,u+1));f(i,i.length);return}const o=S.filter(i=>!!i&&typeof i=="object").map((i,g)=>me(i,g+1));f(o,o.length)},T=C=>{if(h.current||c.current!==P)return;const S=typeof C.text=="string"?C.text:typeof C.line=="string"?C.line:null;if(!S)return;const o=_.current,i=typeof C.id=="number"&&Number.isFinite(C.id)?C.id:o,g={id:i,text:S,stream:pr(C.stream),timestamp:typeof C.timestamp=="string"?C.timestamp:""};L.current=Math.max(L.current,i),_.current=Math.max(_.current,i+1),t(u=>Ee(u,[g])),E(u=>u===null?u:Math.max(u+1,g.id))};async function X(){try{const S=await Ne({maxLines:Qe},e);if(h.current||c.current!==P||p.current!==x)return;const o=S.lines.map((i,g)=>me(i,g+1));f(o,S.totalLines)}catch{if(h.current||c.current!==P||p.current!==x)return;f([],null)}finally{!h.current&&c.current===P&&p.current===x&&d(!1)}const C=Re(e);j.current=sr(C,{events:{"dev-server:log":S=>{const o=ue(S);o&&T(o)},log:S=>{const o=ue(S);o&&T(o)},history:S=>{const o=ue(S);A(o)},"dev-server:history":S=>{const o=ue(S);A(o)}},onReconnect:()=>{ie({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:L.current??null,sseChannel:C,reason:"history-replay"}),!(h.current||c.current!==P)&&Ne({lastEventId:L.current,maxLines:50},e).then(S=>{if(h.current||c.current!==P)return;const o=S.lines.map((i,g)=>me(i,_.current+g));if(o.length>0){const i=o[o.length-1].id;L.current=Math.max(L.current,i),_.current=Math.max(_.current,i+1)}t(i=>Ee(i,o)),E(S.totalLines)}).catch(()=>{})}}),ie({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:C})}return X(),()=>{h.current=!0,j.current&&(j.current(),j.current=null)}},[s,e]);const I=a.useCallback(async()=>{if(!s||b)return;const P=c.current,x=n.length;m(!0);try{const f=await Ne({maxLines:Qe,offset:x},e);if(h.current||c.current!==P)return;const A=f.lines.map((T,X)=>me(T,X+1));t(T=>Ee(A,T)),N(f.totalLines>x+A.length),E(f.totalLines)}catch{}finally{m(!1)}},[s,n.length,b,e]),B=a.useCallback(()=>{t([])},[]),H=j.current!==null&&!v&&!h.current;return{entries:n,loading:v,loadingMore:b,hasMore:k,total:z,loadMore:I,clear:B,logs:n,isStreaming:H,clearLogs:B}}const at="This preview appears to block iframe embedding. Open it in a new tab instead.",it="The preview URL could not be loaded. Verify the server is running and the URL is correct.",ot="Preview is taking longer than expected and may block iframe embedding.";function lt(e){return e==="blocked"?at:e==="error"?it:null}function ct(e,s={}){const{loadTimeoutMs:n=1e4,detectionMethod:t=null}=s,v=a.useRef(null),d=a.useRef(null),[b,m]=a.useState("unknown"),[k,N]=a.useState(null),[z]=a.useState(t),E=a.useCallback(()=>{d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),j=a.useCallback(R=>{m(R),N(lt(R))},[]),h=a.useCallback(()=>{m("blocked"),N(ot)},[]);a.useEffect(()=>{if(E(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let R=!1;return queueMicrotask(()=>{R||(m("loading"),N(null))}),()=>{R=!0,E()}},[E,e]),a.useEffect(()=>{if(b!=="loading"){E();return}const R=setTimeout(()=>{d.current=null,h()},n);return d.current=R,()=>{clearTimeout(R),d.current===R&&(d.current=null)}},[E,b,n,h]);const c=a.useCallback(()=>{const R=v.current;if(!R){j("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){j("blocked");return}}catch{}j("embedded")},[j]),p=a.useCallback(()=>{j("error")},[j]);a.useEffect(()=>{if(E(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[E]);const D=a.useCallback(()=>{E(),m("unknown"),N(null)},[E]),F=D,L=a.useMemo(()=>b==="embedded",[b]),_=a.useMemo(()=>b==="blocked"||b==="error",[b]);return{embedStatus:b,isEmbedded:L,isBlocked:_,blockReason:k,detectionMethod:z,iframeRef:v,resetEmbedStatus:D,setEmbedStatus:j,retry:F,embedContext:k,handleIframeLoad:c,handleIframeError:p}}const dt=/\x1b\[[0-9;]*m/g,vt=50;function ut(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=vt}function Pe(e){return e.replace(dt,"")}function mt(e){if(!e)return"";const s=new Date(e);return Number.isNaN(s.getTime())?"":s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function pt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ft(e){if(e.stream==="stderr")return"error";const s=Pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(s)?"warn":/\b(error|fatal)\b/.test(s)?"error":"info"}function ht(e,s){if(!s)return e;const n=new RegExp(`(${pt(s)})`,"ig"),t=e.split(n),v=s.toLowerCase();return r.jsx(r.Fragment,{children:t.map((d,b)=>d.toLowerCase()===v?r.jsx("mark",{children:d},`${d}-${b}`):r.jsx("span",{children:d},`${d}-${b}`))})}function gt({entries:e,loading:s,loadingMore:n,hasMore:t,total:v,onLoadMore:d,isRunning:b}){const{t:m}=fe("app"),k=a.useRef(null),N=a.useRef(e.length),z=a.useRef(b),[E,j]=a.useState(!1),[h,c]=a.useState(!1),p=a.useRef(!1),[D,F]=a.useState(""),[L,_]=a.useState("all"),R=a.useMemo(()=>L==="all"?e:e.filter(f=>ft(f)===L),[e,L]),I=a.useMemo(()=>{const f=D.trim().toLowerCase();return f?R.filter(A=>Pe(A.text).toLowerCase().includes(f)):R},[R,D]),B=I.length,H=a.useCallback(f=>{p.current=f,c(f)},[]),P=a.useCallback(()=>{const f=k.current;f&&(f.scrollTop=f.scrollHeight,H(!1))},[H]);a.useEffect(()=>{const f=z.current,A=N.current,T=e.length>A;b&&(!f||!h&&T)&&P(),z.current=b,N.current=e.length},[e.length,b,h,P]);const x=a.useCallback(()=>{const f=k.current;f&&H(!ut(f))},[H]);return a.useEffect(()=>{s||e.length===0||!h&&b&&P()},[e,b,h,s,P]),a.useEffect(()=>{const f=k.current;if(!f||!b||typeof MutationObserver>"u")return;const A=new MutationObserver(()=>{p.current||P()});return A.observe(f,{childList:!0,characterData:!0,subtree:!0}),()=>A.disconnect()},[b,P]),s&&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(pe,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("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:m("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[v!==null?`${e.length}/${v}`:`${e.length}`," ",m("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:m("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:L,onChange:f=>_(f.target.value),"data-testid":"devserver-log-severity-filter","aria-label":m("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:m("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:m("devserver.info","Info")}),r.jsx("option",{value:"warn",children:m("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:m("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.searchLogs","Search logs")}),r.jsx(_r,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:D,onChange:f=>F(f.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),D.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>j(f=>!f),"data-testid":"devserver-log-fullscreen-toggle","aria-label":E?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:E?r.jsx(Ar,{size:14}):r.jsx(Tr,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[t&&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:d,disabled:n,"data-testid":"devserver-log-load-more-button",children:n?r.jsxs(r.Fragment,{children:[r.jsx(pe,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:x,"data-testid":"devserver-log-content",children:[!s&&I.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?m("devserver.noLogsYet","No logs yet. Start the dev server to see output."):R.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),I.map(f=>{const A=Pe(f.text),T=mt(f.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[T&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:T}),f.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:m("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Or(ht(A,D.trim()))})]},f.id)})]}),h&&b&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx(Fr,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const wt="devserver-preview-iframe";function bt({url:e,embedStatus:s,onEmbedStatusChange:n,iframeRef:t,blockReason:v,onRetry:d,className:b=wt,embedContext:m}){const{t:k}=fe("app"),N=v??m??null,[z,E]=a.useState(0);a.useEffect(()=>{!e||s!=="unknown"||(E(p=>p+1),n("loading"))},[s,n,e]);const j=a.useCallback(()=>{const p=t.current;if(!p){n("embedded");return}try{if(p.contentWindow?.location?.href==="about:blank"&&p.src!=="about:blank"){n("blocked");return}}catch{}n("embedded")},[t,n]),h=a.useCallback(p=>{p.stopPropagation(),n("error")},[n]),c=a.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:t,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:b,title:"Dev server preview",onLoad:j,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),s==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:k("preview.loading","Loading preview...")})]}),s==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.blockedTitle","Preview cannot be embedded")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("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:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]}),s==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.errorTitle","Unable to load preview")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("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:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]})]}):null}function xt(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 yt=480;function St(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function fr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const s=e.parentElement;return s?.classList.contains("right-dock__body")?s:null}function Nt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function kt(e){if(!e||St())return!1;const s=fr(e);return s?Nt(s)<=yt:!1}function Ct(e){const[s,n]=a.useState(!1);return a.useEffect(()=>{const t=e.current;if(!t){n(!1);return}const v=fr(t),d=()=>n(kt(t));if(d(),!v||typeof ResizeObserver>"u")return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d);const b=new ResizeObserver(d);return b.observe(v),window.addEventListener("resize",d),()=>{b.disconnect(),window.removeEventListener("resize",d)}},[e]),s}let Le=!1;function Ze(e){return e instanceof Error?e.message:String(e)}function hr(e){return e==="."?"root":e}function er(e){return e?e==="root"?".":e:null}function rr(e,s,n){return!s||e.scriptName!==s?!1:n?hr(e.cwd)===n:!0}function jt(e){return e.cwd==="."?"root":e.cwd}function Et(e){return e.length<=60?e:`${e.slice(0,60)}…`}function At({addToast:e,projectId:s,tasks:n}){const{t}=fe("app");a.useEffect(()=>(ie({view:"DevServerView",trigger:Le?"route-active":"remount",projectId:s,replayAttempted:!1}),Le=!1,()=>{Le=!0,ie({view:"DevServerView",trigger:"route-inactive",projectId:s,replayAttempted:!1})}),[s]);const{session:v,detectedCommands:d,previewUrl:b,isLoading:m,error:k,startServer:N,stopServer:z,restartServer:E,setPreviewUrl:j,detectCommands:h,refresh:c}=tt(s),p=v?.status??"stopped",D=p==="running"||p==="starting",F=xt(t),L=F[p]??F.stopped,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,loadMore:P}=nt(s,!!s),x=b,f=v?.config?.cwd??null,A=a.useRef(null),T=Ct(A),[X,C]=a.useState(!0),[S,o]=a.useState(""),[i,g]=a.useState(""),[u,w]=a.useState(null),[y,U]=a.useState(null),[W,Me]=a.useState(null),Y=a.useMemo(()=>(n??[]).filter(l=>l.column==="in-progress"&&typeof l.worktree=="string"&&l.worktree.length>0),[n]),J=a.useMemo(()=>Y.find(l=>l.id===y)??null,[Y,y]);a.useEffect(()=>{y&&!Y.some(l=>l.id===y)&&U(null)},[Y,y]);const[se,gr]=a.useState("embedded"),[ne,ge]=a.useState(!1),_e=a.useRef(null),we=a.useRef(null),wr=se==="embedded"?x:null,{embedStatus:V,setEmbedStatus:br,resetEmbedStatus:oe,iframeRef:ee,isEmbedded:xr,isBlocked:be,blockReason:xe,retry:Ae}=ct(wr),[Te,G]=a.useState(!1),Oe=a.useRef(V);a.useEffect(()=>{const l=Oe.current!==V;be&&l&&G(!0),V==="embedded"&&G(!1),Oe.current=V},[V,be]),a.useEffect(()=>{G(!1)},[x]);const le=a.useMemo(()=>{if(!u)return null;const l=er(f);return d.find(M=>!(M.scriptName!==u||l&&M.cwd!==l||v?.config?.command&&M.command!==v.config.command))??d.find(M=>rr(M,u,f))??null},[d,v?.config?.command,u,f]);a.useEffect(()=>{typeof h=="function"&&h().catch(l=>{e(Ze(l),"error")})},[e,h]),a.useEffect(()=>{if(u){C(!1);return}C(!0)},[u]),a.useEffect(()=>{if(v?.status==="running"||v?.status==="starting"){v.config?.command?.trim().length>0&&o(v.config.command);return}if(le){o(le.command);return}d.length>0&&o(l=>l.trim().length>0?l:d[0]?.command??"")},[d,le,v?.config?.command,v?.status]),a.useEffect(()=>{g(x??"")},[x]);const ce=a.useCallback(()=>{ge(!1),window.requestAnimationFrame(()=>_e.current?.focus())},[]),yr=$r(ce);a.useEffect(()=>{if(!ne)return;we.current?.focus();const l=M=>{if(M.key==="Escape"){ce();return}if(M.key!=="Tab")return;const ae=Array.from(we.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(ze=>!ze.hasAttribute("disabled")&&ze.getAttribute("aria-hidden")!=="true"),Q=ae[0],Se=ae.at(-1);!Q||!Se||(M.shiftKey&&document.activeElement===Q?(M.preventDefault(),Se.focus()):!M.shiftKey&&document.activeElement===Se&&(M.preventDefault(),Q.focus()))};return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[ce,ne]),a.useEffect(()=>{!T&&ne&&ge(!1)},[T,ne]);const ye=a.useCallback(()=>{x&&window.open(x,"_blank","noopener,noreferrer")},[x]),Fe=a.useCallback(()=>{G(!1),Ae()},[Ae]),Sr=a.useCallback(()=>{try{const l=ee.current;if(l?.contentWindow){l.contentWindow.location.reload(),G(!1),oe();return}}catch{}if(!(!x||!ee.current))try{const l=new URL(x);l.searchParams.set("_t",Date.now().toString()),ee.current.src=l.toString(),G(!1),oe()}catch{ee.current.src=x,G(!1),oe()}},[x,ee,oe]),de=a.useCallback(async(l,M,ae)=>{Me(l);try{await M(),e(ae,"success")}catch(Q){e(Ze(Q),"error")}finally{Me(null)}},[e]),Nr=a.useCallback(l=>{w(l.scriptName),C(!1),o(l.command),e(t("devserver.toast.selectedScript","Selected {{name}} script.",{name:l.scriptName}),"success")},[e]),kr=a.useCallback(()=>{w(null),C(!0),e(t("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Cr=a.useCallback(l=>{D&&l&&l!==y&&e(t("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),U(l)},[e,D,y,t]),jr=()=>{const l=S.trim();if(l.length===0){e(t("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const M=er(f)??".",Q=J?.worktree??null??le?.cwd??M;de("start",()=>N(l,Q),t("devserver.toast.started","Dev server started."))},Er=()=>{de("stop",z,t("devserver.toast.stopped","Dev server stopped."))},Lr=()=>{de("restart",E,t("devserver.toast.restarted","Dev server restarted."))},Rr=()=>{const l=i.trim(),M=l.length>0?l:null;de("preview",()=>j(M),M?t("devserver.toast.previewUpdated","Preview URL updated."):t("devserver.toast.previewCleared","Preview URL override cleared."))},Ur=a.useCallback(()=>{k&&c()},[k,c]),Dr=p==="starting"||p==="running"||W!==null,Pr=p==="stopped"||W!==null,Mr=p==="stopped"||p==="starting"||W!==null,$e=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[t("devserver.auto","Auto"),x?` · ${x}`:t("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>gr(l=>l==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:se==="embedded"?t("devserver.externalOnly","External only"):t("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.openInNewTab","Open in new tab"),onClick:ye,disabled:!x,"data-testid":"devserver-preview-open-tab",children:r.jsx(qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.refreshPreview","Refresh preview"),onClick:Sr,disabled:!x,"data-testid":"devserver-preview-refresh",children:r.jsx(Xr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":V,"data-embedded":xr?"true":"false",children:[!x&&!D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.startDevServer","Start a dev server to see a live preview here.")}),!x&&D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),x&&se==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:t("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:ye,"data-testid":"devserver-preview-external-open-tab",children:t("devserver.openInNewTab","Open in new tab")})]}),x&&se==="embedded"&&Te&&be&&r.jsxs("div",{className:V==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[V==="error"?r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:V==="error"?t("devserver.previewFailed","Preview failed"):t("devserver.previewBlocked","Preview blocked")}),xe&&r.jsx("p",{className:"devserver-preview-blocked-context",children:xe})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:t("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:ye,"data-testid":"devserver-preview-fallback-open-tab",children:t("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Fe,"data-testid":"devserver-preview-fallback-retry",children:t("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),x&&se==="embedded"&&!Te&&r.jsx(bt,{url:x,embedStatus:V,onEmbedStatusChange:br,iframeRef:ee,blockReason:xe,onRetry:Fe})]})]});return r.jsxs("div",{ref:A,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":T?"true":"false",children:[r.jsx(zr,{icon:Hr,title:t("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 ${L.className}`,"data-testid":"dev-server-status-badge",children:L.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:jr,disabled:Dr,"data-testid":"dev-server-start-button",children:[r.jsx(Ir,{size:14}),r.jsx("span",{children:W==="start"?t("devserver.starting","Starting..."):t("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Er,disabled:Pr,"data-testid":"dev-server-stop-button",children:[r.jsx(Br,{size:14}),r.jsx("span",{children:W==="stop"?t("devserver.stopping","Stopping..."):t("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Lr,disabled:Mr,"data-testid":"dev-server-restart-button",children:[r.jsx(Vr,{size:14}),r.jsx("span",{children:W==="restart"?t("devserver.restarting","Restarting..."):t("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":t("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.configuration","Configuration")}),m&&r.jsx("span",{className:"dev-server-muted",children:t("devserver.loading","Loading...")})]}),m&&!v&&d.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:t("devserver.loadingConfig","Loading dev server configuration...")})]}),k&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:k}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ur,children:t("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:t("devserver.scriptSelection","Script Selection")}),u&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:u}),r.jsx("span",{className:"dev-server-candidate-source",children:f??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>C(!0),"data-testid":"dev-server-change-selection",children:t("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:kr,"data-testid":"dev-server-clear-selection",children:t("devserver.clear","Clear")})]}),X&&d.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:t("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),X&&d.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:d.map(l=>{const M=rr(l,u,f);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${M?"dev-server-candidate--selected":""}`,onClick:()=>Nr(l),"data-testid":`dev-server-candidate-${l.scriptName}-${hr(l.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:l.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Et(l.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:jt(l)})]},`${l.cwd}::${l.scriptName}::${l.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:t("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:t("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:y??"",onChange:l=>Cr(l.target.value.length>0?l.target.value:null),disabled:Y.length===0,"aria-label":t("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:t("devserver.projectRootNoTask","Project root (no task)")}),Y.map(l=>r.jsx("option",{value:l.id,children:l.title?`${l.id} — ${l.title}`:l.id},l.id))]}),Y.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:t("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),J&&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:J.title?`${J.id} — ${J.title}`:J.id})}),r.jsx("p",{className:"dev-server-task-description",children:J.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:J.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:t("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:S,onChange:l=>o(l.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:p==="running"||p==="starting"})]}),(p==="running"||p==="starting")&&v&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.runningCommand","Running command")}),r.jsx("code",{children:v.config?.command??S})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:t("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:i,onChange:l=>g(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:Rr,disabled:W==="preview","data-testid":"dev-server-set-preview",children:t("devserver.save","Save")})]}),x&&r.jsx("p",{className:"dev-server-preview-hint",children:t("devserver.autoDetected","Auto-detected: {{url}}",{url:x})})]}),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":t("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:t("devserver.lines","{{count}} lines",{count:H??_.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(gt,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,onLoadMore:P,isRunning:D})})]})}),T?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":t("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(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:x||t("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:x?t("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):t("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:_e,onClick:()=>ge(!0),"data-testid":"devserver-preview-modal-open",children:t("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":t("devserver.previewLabel","Dev server preview"),children:$e()}),T&&ne&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...yr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:we,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:t("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ce,"aria-label":t("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Wr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:$e()})]})})]})}export{At as DevServerView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a5 as z,a6 as D,a7 as S,a8 as f,g as j,a9 as T,E as B,p as A,P as L,L as K,h as N}from"./index-
|
|
1
|
+
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a5 as z,a6 as D,a7 as S,a8 as f,g as j,a9 as T,E as B,p as A,P as L,L as K,h as N}from"./index-C2xsZoNG.js";import{u as R}from"./vendor-i18n-GF3RlKbq.js";import{F as U}from"./folder-open-BRrB44UX.js";function M({value:b,onChange:h,placeholder:F,onInputKeyDown:g,nodeId:k,localNodeId:m,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,k,m);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"}))}},[k,m]),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,k,m]);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 +1 @@
|
|
|
1
|
-
import{r as n,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as qe,ap as Ue,aq as Rt,ar as Ht,as as zt,at as Ke,au as $t,av as Ot,aw as fe,ax as It,ay as _e,az as Bt,aA as qt,aB as Ut,aC as _t,aD as Ae,aE as Vt,aF as Ve,V as Qt,aG as ce,E as Wt,p as Gt,aH as Kt,X as Xt,R as Yt,aI as ke,A as Qe,v as We,aJ as Ge,j as De,r as Ee,aK as Jt,aL as Xe,aM as Zt,aN as es,aO as ts,aP as ss,z as ns,aQ as as,aR as cs}from"./index-BinRUCFV.js";import{u as os}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function rs(a){const{projectId:r,searchQuery:g,includeProjectFiles:P=!0}=a??{},x=r?`${Rt.DOCUMENTS_PREFIX}${r}`:null,[t,i]=n.useState(()=>{if(!x)return[];const N=qe(x,{maxAgeMs:Ue});return Array.isArray(N)?N:[]}),[A,d]=n.useState([]),[k,b]=n.useState(()=>t.length===0),[u,C]=n.useState(null),m=n.useRef(null),f=n.useRef(t.length>0),p=n.useRef(null),{capture:D}=Ht(r,"useDocuments"),S=n.useCallback(async()=>{const N=D();m.current&&m.current.abort();const J=new AbortController;m.current=J;const $=!f.current;$&&b(!0),C(null);const Z=zt(g?{q:g}:void 0,r),U=P?Ke(r):Promise.resolve({files:[]}),[w,re]=await Promise.allSettled([Z,U]);if(J.signal.aborted||N.isStale())return;let O=null;if(w.status==="fulfilled"){if(i(w.value),x){const _=w.value.length>500?w.value.slice(0,500):w.value;$t(x,_,{maxBytes:5e5})}f.current=!0}else O=w.reason instanceof Error?w.reason.message:String(w.reason);if(re.status==="fulfilled"){const _=re.value.files,G=g?.trim().toLowerCase(),ie=G?_.filter(ee=>ee.name.toLowerCase().includes(G)||ee.path.toLowerCase().includes(G)):_;d(ie)}C(O),$&&b(!1)},[x,D,P,r,g]);return n.useEffect(()=>{if(d([]),!x){f.current=!1,i([]),b(!0);return}const N=qe(x,{maxAgeMs:Ue});Array.isArray(N)?(i(N),f.current=!0,b(!1)):(f.current=!1,i([]),b(!0))},[x]),n.useEffect(()=>(p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{S()},300),()=>{p.current&&clearTimeout(p.current)}),[S]),n.useEffect(()=>(S(),()=>{m.current&&m.current.abort()}),[]),{documents:t,projectFiles:A,loading:k,error:u,refresh:S}}function is(a,r){const[g,P]=n.useState([]),[x,t]=n.useState(!0),[i,A]=n.useState(null),d=n.useRef(null),k=n.useRef(!1),b=r?.showHidden??!1,u=n.useCallback(async C=>{d.current&&d.current.abort();const m=new AbortController;d.current=m;const f=!k.current;f&&t(!0),A(null);try{const p=await Ke(a,{showHidden:C?.showHidden??b});if(m.signal.aborted)return;P(p.files),k.current=!0}catch(p){if(m.signal.aborted)return;A(p instanceof Error?p.message:String(p))}finally{!m.signal.aborted&&f&&t(!1)}},[a,b]);return n.useEffect(()=>(k.current=!1,u({showHidden:b}),()=>{d.current&&d.current.abort()}),[u,b]),{files:g,loading:x,error:i,refresh:u}}const ls=768,ds={image:ss,doc:ce,pdf:ts,video:es,audio:Zt,other:Xe};function oe(a){return a?new Date(a).toLocaleString():""}function us(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function ms(a){return a==="done"?"status-dot status-dot--online":a==="archived"?"status-dot status-dot--offline":a==="todo"||a==="triage"?"status-dot status-dot--pending":"status-dot status-dot--connecting"}function Ye(a,r){switch(r){case"image":return a("documents.artifactCategoryImage","Image");case"doc":return a("documents.artifactCategoryDoc","Document");case"pdf":return a("documents.artifactCategoryPdf","PDF");case"video":return a("documents.artifactCategoryVideo","Video");case"audio":return a("documents.artifactCategoryAudioSingle","Audio");case"other":return a("documents.artifactCategoryOtherSingle","Other")}}function hs(a,r){return r?[a.title,a.description,a.taskId,a.taskTitle,a.mimeType,a.authorId].some(g=>g?.toLowerCase().includes(r)):!0}function fs(a){const r=a.mimeType?.toLowerCase().split(";",1)[0]??"";return!!a.content||a.type==="document"||r.startsWith("text/")||r==="application/json"||r==="application/xml"}function ks({artifact:a,projectId:r,content:g,loading:P,error:x,renderMarkdown:t,onToggleMarkdown:i,onOpenTask:A,t:d}){const[k,b]=n.useState(null),u=Ae(a),C=Ye(d,u),m=a.title||d("documents.untitledArtifact","Untitled artifact"),f=ns(a.id,r),p=u==="doc"&&fs(a);n.useEffect(()=>{b(null)},[a.id]);const D=k?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:k}):null,S=u==="image"?e.jsxs(e.Fragment,{children:[D,e.jsx("img",{className:"documents-task-artifact-media",src:f,alt:m,onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="video"?e.jsxs(e.Fragment,{children:[D,e.jsx("video",{className:"documents-task-artifact-media",controls:!0,src:f,"aria-label":d("documents.videoArtifactLabel","Video artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="audio"?e.jsxs(e.Fragment,{children:[D,e.jsx("audio",{className:"documents-task-artifact-audio",controls:!0,src:f,"aria-label":d("documents.audioArtifactLabel","Audio artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="pdf"?e.jsxs("div",{className:"documents-task-artifact-pdf",children:[e.jsx("iframe",{title:d("documents.pdfArtifactTitle","PDF artifact: {{title}}",{title:m}),src:f}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer",children:[e.jsx(as,{size:14,"aria-hidden":"true"}),d("documents.openInNewTab","Open in new tab")]})]}):u==="doc"&&p?P?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:d("documents.loadingArtifactContent","Loading artifact content…")})}):x?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:x}):t?e.jsx("div",{className:"documents-content-markdown documents-task-artifact-doc-content",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:g??a.content??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text documents-task-artifact-doc-content",children:g??a.content??""}):e.jsxs("div",{className:"documents-task-artifact-download",children:[e.jsx(Xe,{size:24,"aria-hidden":"true"}),e.jsx("p",{children:a.description||d("documents.binaryArtifactFallback","This artifact cannot be previewed inline.")}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer","data-testid":"task-artifact-open-link",children:[e.jsx(cs,{size:14,"aria-hidden":"true"}),d("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:[a.taskId," / ",m]}),u==="doc"&&p?e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:i,"aria-label":t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":t,title:t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),children:t?d("documents.markdown","Markdown"):d("documents.plain","Plain")}):null]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta documents-task-artifact-meta",children:[e.jsx("span",{children:C}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:a.authorId||d("documents.unknownAuthor","unknown")}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:oe(a.updatedAt)}),a.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 A(a.taskId),children:d("documents.openTask","Open task")})]}):null]}),a.description?e.jsx("p",{className:"documents-task-artifact-description",children:a.description}):null,e.jsx("div",{className:`documents-task-artifact-preview documents-task-artifact-preview--${u}`,children:S})]})}function gs({projectId:a,addToast:r,onOpenDetail:g,onOpenArtifactTaskDetail:P,onSendSelectionToTask:x}){const{t}=os("app"),[i,A]=n.useState("artifacts"),d=Ot(),[k,b]=n.useState(""),[u,C]=n.useState(null),[m,f]=n.useState(null),[p,D]=n.useState(!1),[S,N]=n.useState(null),[J,$]=n.useState(!1),[Z,U]=n.useState(null),[w,re]=n.useState(!1),O=n.useRef(0),_=n.useRef(null),G=n.useRef(null),ie=n.useRef(null),ee=n.useRef(null),[K,Le]=n.useState(!1),[Je,Me]=n.useState(new Map),[Ze,E]=n.useState(null),[pe,T]=n.useState(""),[le,F]=n.useState(null),[V,y]=n.useState(null),[de,je]=n.useState(!1),[et,L]=n.useState(null),[tt,I]=n.useState(!1),[st,M]=n.useState(null),[nt,xe]=n.useState(!0),te=n.useRef(0),[be,Q]=n.useState(!1),[ue,B]=n.useState(""),[we,ve]=n.useState(!1),[me,Re]=n.useState(!1),at=fe(_,{locked:me}),ct=fe(G,{locked:me}),ot=fe(ie,{locked:me}),rt=fe(ee,{locked:me}),ge=K?at:ct,Ne=i==="tasks"?k.trim():"",it=i==="artifacts"?k.trim():"",{documents:se,loading:lt,error:dt,refresh:ne}=rs({projectId:a,searchQuery:Ne||void 0,includeProjectFiles:!1}),{files:W,loading:ut,error:mt,refresh:He}=is(a,{showHidden:p}),{artifacts:R,loading:ht,error:ft,refresh:Se}=It({projectId:a,searchQuery:it||void 0});n.useEffect(()=>{const s=()=>{re(window.innerWidth<=ls)};return s(),window.addEventListener("resize",s),()=>{window.removeEventListener("resize",s)}},[]),n.useEffect(()=>{A("artifacts"),C(null),f(null),D(!1),N(null),U(null),$(!1),Le(!1),Me(new Map),E(null),T(""),F(null),y(null),je(!1),L(null),I(!1),M(null),xe(!0),Q(!1),B(""),ve(!1)},[a]);const X=n.useMemo(()=>{const s=Ne.toLowerCase(),c=new Map;for(const o of se){const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.documents.push(o),c.set(o.taskId,j)}for(const o of R){if(!o.taskId||!hs(o,s))continue;const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.artifacts.push(o),c.set(o.taskId,j)}return Array.from(c.entries()).map(([o,j])=>{const z=[...j.documents].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),q=[...j.artifacts].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),Pe=[z[0]?.updatedAt,q[0]?.updatedAt].filter(Boolean).sort().at(-1)??"",h=z.find(v=>v.taskTitle)?.taskTitle??q.find(v=>v.taskTitle)?.taskTitle;return{taskId:o,taskTitle:h,taskColumn:z.find(v=>v.taskColumn)?.taskColumn??q.find(v=>v.taskColumn)?.taskColumn,documents:z,artifacts:q,latestUpdated:Pe}}).filter(o=>o.documents.length>0||o.artifacts.length>0).sort((o,j)=>j.latestUpdated.localeCompare(o.latestUpdated))},[R,se,Ne]),l=n.useMemo(()=>m?.kind!=="document"?null:se.find(s=>s.id===m.id)??null,[se,m]),H=n.useMemo(()=>m?.kind!=="artifact"?null:R.find(s=>s.id===m.id)??null,[R,m]),he=l??H;n.useEffect(()=>{if(!m)return;X.some(c=>m.kind==="document"?c.documents.some(o=>o.id===m.id):c.artifacts.some(o=>o.id===m.id))||(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null))},[X,m]);const Ce=n.useMemo(()=>{const s=k.trim().toLowerCase();return s?W.filter(c=>{const o=c.path.toLowerCase(),j=c.name.toLowerCase();return o.includes(s)||j.includes(s)}):W},[W,k]);n.useEffect(()=>{if(!u)return;W.some(c=>c.path===u.path)||(C(null),N(null),U(null),$(!1))},[W,u]);const kt=n.useCallback(s=>{b(s.target.value)},[]),pt=n.useCallback(()=>{b("")},[]),ye=n.useCallback(s=>{A(s),s!=="tasks"&&(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)),s!=="project"&&(Q(!1),B(""))},[]),jt=n.useCallback(async s=>{try{const c=await _e(s,a);g(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,g,r]),ze=n.useCallback(async s=>{try{const c=await _e(s,a);(P??g)(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,P,g,r]),xt=n.useCallback(async s=>{C(s),$(!0),U(null),N(null),Q(!1),B("");const c=O.current+1;O.current=c;try{const o=await Bt("project",s.path,a);if(O.current!==c)return;N(o.content)}catch(o){if(O.current!==c)return;const j=o instanceof Error?o.message:`Failed to open ${s.path}`;U(j),r(j,"error")}finally{O.current===c&&$(!1)}},[a,r]),bt=n.useCallback(()=>{C(null),N(null),U(null),$(!1),Q(!1),B("")},[]),wt=n.useCallback(()=>{S!==null&&(B(S),Q(!0))},[S]),vt=n.useCallback(()=>{Q(!1),B("")},[]),gt=n.useCallback(async()=>{if(u){ve(!0);try{await qt("project",u.path,ue,a),N(ue),Q(!1),B(""),r(t("documents.projectFileSaved","File saved"),"success")}catch(s){r(s instanceof Error?s.message:String(s),"error")}finally{ve(!1)}}},[u,ue,a,r,t]),Nt=n.useCallback(s=>{f({kind:"document",id:s}),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),St=n.useCallback(s=>{f({kind:"artifact",id:s}),E(null),T(""),F(null),y(null),L(null),M(null),xe(!0)},[]),Ct=n.useCallback(()=>{f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),yt=n.useCallback(s=>{Me(c=>{const o=new Map(c),j=o.get(s)??!0;return o.set(s,!j),o})},[]),Tt=n.useCallback(()=>{l&&(T(l.content),E(l.id),F({revision:l.revision,contentHash:l.contentHash}),y(null))},[l]),Ft=n.useCallback(()=>{E(null),T(""),F(null),y(null)},[]),Pt=n.useCallback(()=>{V&&(F(V),y(null))},[V]),At=n.useCallback(async()=>{if(!(!l||!le||V)){je(!0);try{await Ut(l.taskId,l.key,pe,{expectedRevision:le.revision,expectedContentHash:le.contentHash},a),await ne(),E(null),T(""),F(null),y(null),r(t("documents.taskDocumentSaved","Document saved"),"success")}catch(s){if(typeof s=="object"&&s!==null&&"status"in s&&s.status===409)try{const c=await _t(l.taskId,l.key,a);await ne(),y({revision:c.revision,contentHash:c.contentHash}),r(t("documents.taskDocumentStale","This document changed since you opened it. Your draft is preserved; review the latest revision, then choose Rebase draft before saving."),"error")}catch(c){r(c instanceof Error?c.message:String(c),"error")}else r(s instanceof Error?s.message:String(s),"error")}finally{je(!1)}}},[l,pe,le,V,a,ne,r,t]);n.useEffect(()=>{if(!H||Ae(H)!=="doc"){L(null),I(!1),M(null);return}const s=te.current+1;te.current=s,I(!0),M(null),L(null),Vt(H.id,a).then(c=>{te.current===s&&L(c.content??H.content??"")}).catch(c=>{te.current===s&&M(c instanceof Error?c.message:String(c))}).finally(()=>{te.current===s&&I(!1)})},[a,H]);const $e=i==="project"?mt:i==="tasks"?dt:ft,Dt=n.useCallback(async()=>{if(i==="project"){await He();return}if(i==="tasks"){await ne();return}await Se()},[i,Se,He,ne]),Oe=i==="project"?Ce.length:i==="tasks"?X.length:R.length,Y=l?Je.get(l.id)??!0:!1,Te=Y?ot:rt,Fe=l!==null&&Ze===l.id,Et=i==="project"&&u&&!be&&x&&ge?e.jsx(Ve,{selectedText:ge.selectedText,anchorRect:ge.anchorRect,filePath:u.path,onSubmit:x,onOpenChange:Re}):null,Lt=i==="tasks"&&l&&!Fe&&x&&Te?e.jsx(Ve,{selectedText:Te.selectedText,anchorRect:Te.anchorRect,filePath:`${l.taskId}/${l.key}`,onSubmit:x,onOpenChange:Re}):null,Ie=i==="project"?t("documents.searchProjectFiles","Search project markdown files…"):i==="tasks"?t("documents.searchTaskDocuments","Search task documents…"):t("documents.searchArtifacts","Search artifacts…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsx(Qt,{icon:ce,title:t("documents.title","Artifacts"),actions:e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:Oe,plural:Oe!==1?"s":""})})}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":t("documents.sectionsLabel","Documents sections"),children:[e.jsxs("button",{className:`btn documents-tab${i==="artifacts"?" active":""}`,role:"tab","aria-selected":i==="artifacts","aria-label":t("documents.showArtifacts","Show artifacts"),onClick:()=>ye("artifacts"),children:[t("documents.artifactsTab","Artifacts"),e.jsx("span",{className:"documents-tab-count",children:R.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="project"?" active":""}`,role:"tab","aria-selected":i==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>ye("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:W.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="tasks"?" active":""}`,role:"tab","aria-selected":i==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>ye("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:X.length})]})]}),i==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>D(s=>!s),"aria-pressed":p,"aria-label":p?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:p?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[p?e.jsx(Wt,{size:14}):e.jsx(Gt,{size:14}),p?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(Kt,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:Ie,value:k,onChange:kt,"aria-label":Ie}),k&&e.jsx("button",{className:"documents-search-clear",onClick:pt,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(Xt,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:$e?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:i==="project"?t("documents.projectFiles","project files"):i==="tasks"?t("documents.taskDocuments","task documents"):t("documents.artifacts","artifacts"),error:$e})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void Dt(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(Yt,{size:16}),t("documents.retry","Retry")]})]}):i==="project"?ut&&W.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingProjectFiles","Loading project markdown files…")})})}):Ce.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!u)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":t("documents.projectMarkdownFilesLabel","Project markdown files"),children:e.jsx("ul",{className:"markdown-file-list",children:Ce.map(s=>{const c=u?.path===s.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${c?" markdown-file-item--selected":""}`,onClick:()=>void xt(s),"aria-label":`Open ${s.path}`,"aria-current":c?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:s.name}),e.jsx("span",{className:"markdown-file-item-path",children:s.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[us(s.size)," · ",oe(s.mtime)]})]})},s.path)})})}),(!w||u)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.projectFilePreviewLabel","Project file content preview"),children:[w&&u&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:bt,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(Qe,{size:14}),t("documents.backToFiles","Back to files")]}),u?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:u.path}),e.jsx("div",{className:"documents-task-document-actions",children:be?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:vt,disabled:we,children:t("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void gt(),disabled:we,children:we?t("documents.saving","Saving…"):t("documents.saveProjectFile","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>Le(s=>!s),"aria-label":K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":K,title:K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:K?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:wt,disabled:J||Z!==null||S===null,"aria-label":t("documents.editProjectFile","Edit project file"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),J?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:t("documents.loadingFileContent","Loading file content…")})}):Z?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:Z}):be?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.projectFileContentEditor","Project file content editor"),children:e.jsx(Ge,{content:ue,onChange:B,filePath:u.path,forceToolbarActionsVisible:!0})}):K?e.jsx("div",{ref:_,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:S??""})})}):e.jsx("pre",{ref:G,className:"document-card-content-text documents-content-viewer-text",children:S??""}),Et]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):i==="artifacts"?ht&&R.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingArtifacts","Loading artifacts…")})}):R.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchArtifacts",'No artifacts match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noArtifacts","No artifacts yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.artifactsCreatedBy","Agents register screenshots, wireframes, mockups, recordings, and documents here as they work on tasks.")})]})}):e.jsx(Jt,{artifacts:R,projectId:a,isMobile:w,addToast:r,onOpenTask:ze,onArtifactUpdated:()=>void Se()}):lt&&se.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingTaskDocuments","Loading task documents…")})})}):X.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsxs("div",{className:`documents-project-layout documents-task-documents-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!he)&&e.jsx("aside",{className:"documents-view-sidebar documents-task-documents-sidebar","aria-label":t("documents.taskDocumentsListLabel","Task documents"),children:X.map(({taskId:s,taskTitle:c,taskColumn:o,documents:j,artifacts:z})=>{const q=o?d(o):null,Pe=o?ms(o):"status-dot";return e.jsxs("section",{className:"documents-task-sidebar-group","aria-labelledby":`documents-task-group-${s}`,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-${s}`,className:"documents-task-sidebar-title",children:[e.jsx("span",{className:"documents-group-task-id",children:s}),e.jsx("span",{className:"documents-group-task-title",children:c||t("documents.untitled","Untitled")})]}),q?e.jsxs("span",{className:"documents-group-status badge","aria-label":t("documents.taskStatusAria","Task status: {{status}}",{status:q}),children:[e.jsx("span",{className:Pe,"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:t("documents.taskOutputCount","{{docCount}} doc{{docPlural}} · {{artifactCount}} artifact{{artifactPlural}}",{docCount:j.length,docPlural:j.length!==1?"s":"",artifactCount:z.length,artifactPlural:z.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>void jt(s),"aria-label":t("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:s,title:c||t("documents.untitled","Untitled")}),children:t("documents.openTask","Open task")})]})]}),e.jsxs("ul",{className:"markdown-file-list documents-task-document-list",children:[j.map(h=>{const v=l?.id===h.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item${v?" markdown-file-item--selected":""}`,onClick:()=>Nt(h.id),"aria-label":t("documents.openTaskDocument","Open {{taskId}} {{key}}",{taskId:h.taskId,key:h.key}),"aria-current":v?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:h.key}),e.jsxs("span",{className:"markdown-file-item-path",children:[h.taskId," · ",h.taskTitle||t("documents.untitled","Untitled")]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[t("documents.revisionShort","v{{revision}}",{revision:h.revision})," · ",h.author," · ",oe(h.updatedAt)]})]})},`document-${h.id}`)}),z.length>0?e.jsxs("li",{className:"documents-task-artifacts-subsection","aria-label":t("documents.taskArtifactsSubsection","Task artifacts"),children:[e.jsx("div",{className:"documents-task-artifacts-label",children:t("documents.taskArtifactsLabel","Artifacts")}),e.jsx("ul",{className:"markdown-file-list documents-task-artifact-list",children:z.map(h=>{const v=Ae(h),ae=ds[v],Mt=Ye(t,v),Be=H?.id===h.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${Be?" markdown-file-item--selected":""}`,onClick:()=>St(h.id),"aria-label":t("documents.openTaskArtifact","Open {{taskId}} artifact {{title}}",{taskId:s,title:h.title||t("documents.untitledArtifact","Untitled artifact")}),"aria-current":Be?"true":void 0,children:[e.jsxs("span",{className:"documents-task-artifact-title-row",children:[e.jsx(ae,{size:14,"aria-hidden":"true"}),e.jsx("span",{className:"markdown-file-item-name",children:h.title||t("documents.untitledArtifact","Untitled artifact")})]}),e.jsxs("span",{className:"markdown-file-item-path",children:[Mt," · ",h.mimeType||h.type]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[h.authorId||t("documents.unknownAuthor","unknown")," · ",oe(h.updatedAt)]})]})},`artifact-${h.id}`)})})]}):null]})]},s)})}),(!w||he)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.taskDocumentPreviewLabel","Task document content preview"),children:[w&&he&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Ct,"aria-label":t("documents.backToTaskDocumentsList","Back to task documents list"),children:[e.jsx(Qe,{size:14}),t("documents.backToTaskDocuments","Back to documents")]}),he?H?e.jsx(ks,{artifact:H,projectId:a,content:et,loading:tt,error:st,renderMarkdown:nt,onToggleMarkdown:()=>xe(s=>!s),onOpenTask:ze,t}):l?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:[l.taskId," / ",l.key]}),e.jsx("div",{className:"documents-task-document-actions",children:Fe?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:Ft,disabled:de,children:t("documents.cancelEdit","Cancel")}),V&&e.jsx("button",{className:"btn btn-sm",onClick:Pt,disabled:de,children:t("documents.rebaseTaskDocument","Rebase draft")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void At(),disabled:de||V!==null,children:de?t("documents.saving","Saving…"):t("documents.saveTaskDocument","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>yt(l.id),"aria-label":Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":Y,title:Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:Y?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Tt,"aria-label":t("documents.editTaskDocument","Edit task document"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta",children:[e.jsx("span",{className:"document-card-author",children:l.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:t("documents.revisionShort","v{{revision}}",{revision:l.revision})}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:oe(l.updatedAt)})]}),Fe?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.taskDocumentContentEditor","Task document content editor"),children:e.jsx(Ge,{content:pe,onChange:T,filePath:l.key.includes(".")?l.key:`${l.key}.md`,forceToolbarActionsVisible:!0})}):Y?e.jsx("div",{ref:ie,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:l.content})})}):e.jsx("pre",{ref:ee,className:"document-card-content-text documents-content-viewer-text",children:l.content}),Lt]}):null:e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectTaskDocument","Select a task document or artifact to view its content.")})})]})]})})]})}export{gs as DocumentsView};
|
|
1
|
+
import{r as n,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as qe,ap as Ue,aq as Rt,ar as Ht,as as zt,at as Ke,au as $t,av as Ot,aw as fe,ax as It,ay as _e,az as Bt,aA as qt,aB as Ut,aC as _t,aD as Ae,aE as Vt,aF as Ve,V as Qt,aG as ce,E as Wt,p as Gt,aH as Kt,X as Xt,R as Yt,aI as ke,A as Qe,v as We,aJ as Ge,j as De,r as Ee,aK as Jt,aL as Xe,aM as Zt,aN as es,aO as ts,aP as ss,z as ns,aQ as as,aR as cs}from"./index-C2xsZoNG.js";import{u as os}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function rs(a){const{projectId:r,searchQuery:g,includeProjectFiles:P=!0}=a??{},x=r?`${Rt.DOCUMENTS_PREFIX}${r}`:null,[t,i]=n.useState(()=>{if(!x)return[];const N=qe(x,{maxAgeMs:Ue});return Array.isArray(N)?N:[]}),[A,d]=n.useState([]),[k,b]=n.useState(()=>t.length===0),[u,C]=n.useState(null),m=n.useRef(null),f=n.useRef(t.length>0),p=n.useRef(null),{capture:D}=Ht(r,"useDocuments"),S=n.useCallback(async()=>{const N=D();m.current&&m.current.abort();const J=new AbortController;m.current=J;const $=!f.current;$&&b(!0),C(null);const Z=zt(g?{q:g}:void 0,r),U=P?Ke(r):Promise.resolve({files:[]}),[w,re]=await Promise.allSettled([Z,U]);if(J.signal.aborted||N.isStale())return;let O=null;if(w.status==="fulfilled"){if(i(w.value),x){const _=w.value.length>500?w.value.slice(0,500):w.value;$t(x,_,{maxBytes:5e5})}f.current=!0}else O=w.reason instanceof Error?w.reason.message:String(w.reason);if(re.status==="fulfilled"){const _=re.value.files,G=g?.trim().toLowerCase(),ie=G?_.filter(ee=>ee.name.toLowerCase().includes(G)||ee.path.toLowerCase().includes(G)):_;d(ie)}C(O),$&&b(!1)},[x,D,P,r,g]);return n.useEffect(()=>{if(d([]),!x){f.current=!1,i([]),b(!0);return}const N=qe(x,{maxAgeMs:Ue});Array.isArray(N)?(i(N),f.current=!0,b(!1)):(f.current=!1,i([]),b(!0))},[x]),n.useEffect(()=>(p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{S()},300),()=>{p.current&&clearTimeout(p.current)}),[S]),n.useEffect(()=>(S(),()=>{m.current&&m.current.abort()}),[]),{documents:t,projectFiles:A,loading:k,error:u,refresh:S}}function is(a,r){const[g,P]=n.useState([]),[x,t]=n.useState(!0),[i,A]=n.useState(null),d=n.useRef(null),k=n.useRef(!1),b=r?.showHidden??!1,u=n.useCallback(async C=>{d.current&&d.current.abort();const m=new AbortController;d.current=m;const f=!k.current;f&&t(!0),A(null);try{const p=await Ke(a,{showHidden:C?.showHidden??b});if(m.signal.aborted)return;P(p.files),k.current=!0}catch(p){if(m.signal.aborted)return;A(p instanceof Error?p.message:String(p))}finally{!m.signal.aborted&&f&&t(!1)}},[a,b]);return n.useEffect(()=>(k.current=!1,u({showHidden:b}),()=>{d.current&&d.current.abort()}),[u,b]),{files:g,loading:x,error:i,refresh:u}}const ls=768,ds={image:ss,doc:ce,pdf:ts,video:es,audio:Zt,other:Xe};function oe(a){return a?new Date(a).toLocaleString():""}function us(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function ms(a){return a==="done"?"status-dot status-dot--online":a==="archived"?"status-dot status-dot--offline":a==="todo"||a==="triage"?"status-dot status-dot--pending":"status-dot status-dot--connecting"}function Ye(a,r){switch(r){case"image":return a("documents.artifactCategoryImage","Image");case"doc":return a("documents.artifactCategoryDoc","Document");case"pdf":return a("documents.artifactCategoryPdf","PDF");case"video":return a("documents.artifactCategoryVideo","Video");case"audio":return a("documents.artifactCategoryAudioSingle","Audio");case"other":return a("documents.artifactCategoryOtherSingle","Other")}}function hs(a,r){return r?[a.title,a.description,a.taskId,a.taskTitle,a.mimeType,a.authorId].some(g=>g?.toLowerCase().includes(r)):!0}function fs(a){const r=a.mimeType?.toLowerCase().split(";",1)[0]??"";return!!a.content||a.type==="document"||r.startsWith("text/")||r==="application/json"||r==="application/xml"}function ks({artifact:a,projectId:r,content:g,loading:P,error:x,renderMarkdown:t,onToggleMarkdown:i,onOpenTask:A,t:d}){const[k,b]=n.useState(null),u=Ae(a),C=Ye(d,u),m=a.title||d("documents.untitledArtifact","Untitled artifact"),f=ns(a.id,r),p=u==="doc"&&fs(a);n.useEffect(()=>{b(null)},[a.id]);const D=k?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:k}):null,S=u==="image"?e.jsxs(e.Fragment,{children:[D,e.jsx("img",{className:"documents-task-artifact-media",src:f,alt:m,onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="video"?e.jsxs(e.Fragment,{children:[D,e.jsx("video",{className:"documents-task-artifact-media",controls:!0,src:f,"aria-label":d("documents.videoArtifactLabel","Video artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="audio"?e.jsxs(e.Fragment,{children:[D,e.jsx("audio",{className:"documents-task-artifact-audio",controls:!0,src:f,"aria-label":d("documents.audioArtifactLabel","Audio artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="pdf"?e.jsxs("div",{className:"documents-task-artifact-pdf",children:[e.jsx("iframe",{title:d("documents.pdfArtifactTitle","PDF artifact: {{title}}",{title:m}),src:f}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer",children:[e.jsx(as,{size:14,"aria-hidden":"true"}),d("documents.openInNewTab","Open in new tab")]})]}):u==="doc"&&p?P?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:d("documents.loadingArtifactContent","Loading artifact content…")})}):x?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:x}):t?e.jsx("div",{className:"documents-content-markdown documents-task-artifact-doc-content",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:g??a.content??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text documents-task-artifact-doc-content",children:g??a.content??""}):e.jsxs("div",{className:"documents-task-artifact-download",children:[e.jsx(Xe,{size:24,"aria-hidden":"true"}),e.jsx("p",{children:a.description||d("documents.binaryArtifactFallback","This artifact cannot be previewed inline.")}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer","data-testid":"task-artifact-open-link",children:[e.jsx(cs,{size:14,"aria-hidden":"true"}),d("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:[a.taskId," / ",m]}),u==="doc"&&p?e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:i,"aria-label":t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":t,title:t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),children:t?d("documents.markdown","Markdown"):d("documents.plain","Plain")}):null]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta documents-task-artifact-meta",children:[e.jsx("span",{children:C}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:a.authorId||d("documents.unknownAuthor","unknown")}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:oe(a.updatedAt)}),a.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 A(a.taskId),children:d("documents.openTask","Open task")})]}):null]}),a.description?e.jsx("p",{className:"documents-task-artifact-description",children:a.description}):null,e.jsx("div",{className:`documents-task-artifact-preview documents-task-artifact-preview--${u}`,children:S})]})}function gs({projectId:a,addToast:r,onOpenDetail:g,onOpenArtifactTaskDetail:P,onSendSelectionToTask:x}){const{t}=os("app"),[i,A]=n.useState("artifacts"),d=Ot(),[k,b]=n.useState(""),[u,C]=n.useState(null),[m,f]=n.useState(null),[p,D]=n.useState(!1),[S,N]=n.useState(null),[J,$]=n.useState(!1),[Z,U]=n.useState(null),[w,re]=n.useState(!1),O=n.useRef(0),_=n.useRef(null),G=n.useRef(null),ie=n.useRef(null),ee=n.useRef(null),[K,Le]=n.useState(!1),[Je,Me]=n.useState(new Map),[Ze,E]=n.useState(null),[pe,T]=n.useState(""),[le,F]=n.useState(null),[V,y]=n.useState(null),[de,je]=n.useState(!1),[et,L]=n.useState(null),[tt,I]=n.useState(!1),[st,M]=n.useState(null),[nt,xe]=n.useState(!0),te=n.useRef(0),[be,Q]=n.useState(!1),[ue,B]=n.useState(""),[we,ve]=n.useState(!1),[me,Re]=n.useState(!1),at=fe(_,{locked:me}),ct=fe(G,{locked:me}),ot=fe(ie,{locked:me}),rt=fe(ee,{locked:me}),ge=K?at:ct,Ne=i==="tasks"?k.trim():"",it=i==="artifacts"?k.trim():"",{documents:se,loading:lt,error:dt,refresh:ne}=rs({projectId:a,searchQuery:Ne||void 0,includeProjectFiles:!1}),{files:W,loading:ut,error:mt,refresh:He}=is(a,{showHidden:p}),{artifacts:R,loading:ht,error:ft,refresh:Se}=It({projectId:a,searchQuery:it||void 0});n.useEffect(()=>{const s=()=>{re(window.innerWidth<=ls)};return s(),window.addEventListener("resize",s),()=>{window.removeEventListener("resize",s)}},[]),n.useEffect(()=>{A("artifacts"),C(null),f(null),D(!1),N(null),U(null),$(!1),Le(!1),Me(new Map),E(null),T(""),F(null),y(null),je(!1),L(null),I(!1),M(null),xe(!0),Q(!1),B(""),ve(!1)},[a]);const X=n.useMemo(()=>{const s=Ne.toLowerCase(),c=new Map;for(const o of se){const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.documents.push(o),c.set(o.taskId,j)}for(const o of R){if(!o.taskId||!hs(o,s))continue;const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.artifacts.push(o),c.set(o.taskId,j)}return Array.from(c.entries()).map(([o,j])=>{const z=[...j.documents].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),q=[...j.artifacts].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),Pe=[z[0]?.updatedAt,q[0]?.updatedAt].filter(Boolean).sort().at(-1)??"",h=z.find(v=>v.taskTitle)?.taskTitle??q.find(v=>v.taskTitle)?.taskTitle;return{taskId:o,taskTitle:h,taskColumn:z.find(v=>v.taskColumn)?.taskColumn??q.find(v=>v.taskColumn)?.taskColumn,documents:z,artifacts:q,latestUpdated:Pe}}).filter(o=>o.documents.length>0||o.artifacts.length>0).sort((o,j)=>j.latestUpdated.localeCompare(o.latestUpdated))},[R,se,Ne]),l=n.useMemo(()=>m?.kind!=="document"?null:se.find(s=>s.id===m.id)??null,[se,m]),H=n.useMemo(()=>m?.kind!=="artifact"?null:R.find(s=>s.id===m.id)??null,[R,m]),he=l??H;n.useEffect(()=>{if(!m)return;X.some(c=>m.kind==="document"?c.documents.some(o=>o.id===m.id):c.artifacts.some(o=>o.id===m.id))||(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null))},[X,m]);const Ce=n.useMemo(()=>{const s=k.trim().toLowerCase();return s?W.filter(c=>{const o=c.path.toLowerCase(),j=c.name.toLowerCase();return o.includes(s)||j.includes(s)}):W},[W,k]);n.useEffect(()=>{if(!u)return;W.some(c=>c.path===u.path)||(C(null),N(null),U(null),$(!1))},[W,u]);const kt=n.useCallback(s=>{b(s.target.value)},[]),pt=n.useCallback(()=>{b("")},[]),ye=n.useCallback(s=>{A(s),s!=="tasks"&&(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)),s!=="project"&&(Q(!1),B(""))},[]),jt=n.useCallback(async s=>{try{const c=await _e(s,a);g(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,g,r]),ze=n.useCallback(async s=>{try{const c=await _e(s,a);(P??g)(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,P,g,r]),xt=n.useCallback(async s=>{C(s),$(!0),U(null),N(null),Q(!1),B("");const c=O.current+1;O.current=c;try{const o=await Bt("project",s.path,a);if(O.current!==c)return;N(o.content)}catch(o){if(O.current!==c)return;const j=o instanceof Error?o.message:`Failed to open ${s.path}`;U(j),r(j,"error")}finally{O.current===c&&$(!1)}},[a,r]),bt=n.useCallback(()=>{C(null),N(null),U(null),$(!1),Q(!1),B("")},[]),wt=n.useCallback(()=>{S!==null&&(B(S),Q(!0))},[S]),vt=n.useCallback(()=>{Q(!1),B("")},[]),gt=n.useCallback(async()=>{if(u){ve(!0);try{await qt("project",u.path,ue,a),N(ue),Q(!1),B(""),r(t("documents.projectFileSaved","File saved"),"success")}catch(s){r(s instanceof Error?s.message:String(s),"error")}finally{ve(!1)}}},[u,ue,a,r,t]),Nt=n.useCallback(s=>{f({kind:"document",id:s}),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),St=n.useCallback(s=>{f({kind:"artifact",id:s}),E(null),T(""),F(null),y(null),L(null),M(null),xe(!0)},[]),Ct=n.useCallback(()=>{f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),yt=n.useCallback(s=>{Me(c=>{const o=new Map(c),j=o.get(s)??!0;return o.set(s,!j),o})},[]),Tt=n.useCallback(()=>{l&&(T(l.content),E(l.id),F({revision:l.revision,contentHash:l.contentHash}),y(null))},[l]),Ft=n.useCallback(()=>{E(null),T(""),F(null),y(null)},[]),Pt=n.useCallback(()=>{V&&(F(V),y(null))},[V]),At=n.useCallback(async()=>{if(!(!l||!le||V)){je(!0);try{await Ut(l.taskId,l.key,pe,{expectedRevision:le.revision,expectedContentHash:le.contentHash},a),await ne(),E(null),T(""),F(null),y(null),r(t("documents.taskDocumentSaved","Document saved"),"success")}catch(s){if(typeof s=="object"&&s!==null&&"status"in s&&s.status===409)try{const c=await _t(l.taskId,l.key,a);await ne(),y({revision:c.revision,contentHash:c.contentHash}),r(t("documents.taskDocumentStale","This document changed since you opened it. Your draft is preserved; review the latest revision, then choose Rebase draft before saving."),"error")}catch(c){r(c instanceof Error?c.message:String(c),"error")}else r(s instanceof Error?s.message:String(s),"error")}finally{je(!1)}}},[l,pe,le,V,a,ne,r,t]);n.useEffect(()=>{if(!H||Ae(H)!=="doc"){L(null),I(!1),M(null);return}const s=te.current+1;te.current=s,I(!0),M(null),L(null),Vt(H.id,a).then(c=>{te.current===s&&L(c.content??H.content??"")}).catch(c=>{te.current===s&&M(c instanceof Error?c.message:String(c))}).finally(()=>{te.current===s&&I(!1)})},[a,H]);const $e=i==="project"?mt:i==="tasks"?dt:ft,Dt=n.useCallback(async()=>{if(i==="project"){await He();return}if(i==="tasks"){await ne();return}await Se()},[i,Se,He,ne]),Oe=i==="project"?Ce.length:i==="tasks"?X.length:R.length,Y=l?Je.get(l.id)??!0:!1,Te=Y?ot:rt,Fe=l!==null&&Ze===l.id,Et=i==="project"&&u&&!be&&x&&ge?e.jsx(Ve,{selectedText:ge.selectedText,anchorRect:ge.anchorRect,filePath:u.path,onSubmit:x,onOpenChange:Re}):null,Lt=i==="tasks"&&l&&!Fe&&x&&Te?e.jsx(Ve,{selectedText:Te.selectedText,anchorRect:Te.anchorRect,filePath:`${l.taskId}/${l.key}`,onSubmit:x,onOpenChange:Re}):null,Ie=i==="project"?t("documents.searchProjectFiles","Search project markdown files…"):i==="tasks"?t("documents.searchTaskDocuments","Search task documents…"):t("documents.searchArtifacts","Search artifacts…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsx(Qt,{icon:ce,title:t("documents.title","Artifacts"),actions:e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:Oe,plural:Oe!==1?"s":""})})}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":t("documents.sectionsLabel","Documents sections"),children:[e.jsxs("button",{className:`btn documents-tab${i==="artifacts"?" active":""}`,role:"tab","aria-selected":i==="artifacts","aria-label":t("documents.showArtifacts","Show artifacts"),onClick:()=>ye("artifacts"),children:[t("documents.artifactsTab","Artifacts"),e.jsx("span",{className:"documents-tab-count",children:R.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="project"?" active":""}`,role:"tab","aria-selected":i==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>ye("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:W.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="tasks"?" active":""}`,role:"tab","aria-selected":i==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>ye("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:X.length})]})]}),i==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>D(s=>!s),"aria-pressed":p,"aria-label":p?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:p?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[p?e.jsx(Wt,{size:14}):e.jsx(Gt,{size:14}),p?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(Kt,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:Ie,value:k,onChange:kt,"aria-label":Ie}),k&&e.jsx("button",{className:"documents-search-clear",onClick:pt,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(Xt,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:$e?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:i==="project"?t("documents.projectFiles","project files"):i==="tasks"?t("documents.taskDocuments","task documents"):t("documents.artifacts","artifacts"),error:$e})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void Dt(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(Yt,{size:16}),t("documents.retry","Retry")]})]}):i==="project"?ut&&W.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingProjectFiles","Loading project markdown files…")})})}):Ce.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!u)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":t("documents.projectMarkdownFilesLabel","Project markdown files"),children:e.jsx("ul",{className:"markdown-file-list",children:Ce.map(s=>{const c=u?.path===s.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${c?" markdown-file-item--selected":""}`,onClick:()=>void xt(s),"aria-label":`Open ${s.path}`,"aria-current":c?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:s.name}),e.jsx("span",{className:"markdown-file-item-path",children:s.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[us(s.size)," · ",oe(s.mtime)]})]})},s.path)})})}),(!w||u)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.projectFilePreviewLabel","Project file content preview"),children:[w&&u&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:bt,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(Qe,{size:14}),t("documents.backToFiles","Back to files")]}),u?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:u.path}),e.jsx("div",{className:"documents-task-document-actions",children:be?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:vt,disabled:we,children:t("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void gt(),disabled:we,children:we?t("documents.saving","Saving…"):t("documents.saveProjectFile","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>Le(s=>!s),"aria-label":K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":K,title:K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:K?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:wt,disabled:J||Z!==null||S===null,"aria-label":t("documents.editProjectFile","Edit project file"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),J?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:t("documents.loadingFileContent","Loading file content…")})}):Z?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:Z}):be?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.projectFileContentEditor","Project file content editor"),children:e.jsx(Ge,{content:ue,onChange:B,filePath:u.path,forceToolbarActionsVisible:!0})}):K?e.jsx("div",{ref:_,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:S??""})})}):e.jsx("pre",{ref:G,className:"document-card-content-text documents-content-viewer-text",children:S??""}),Et]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):i==="artifacts"?ht&&R.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingArtifacts","Loading artifacts…")})}):R.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchArtifacts",'No artifacts match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noArtifacts","No artifacts yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.artifactsCreatedBy","Agents register screenshots, wireframes, mockups, recordings, and documents here as they work on tasks.")})]})}):e.jsx(Jt,{artifacts:R,projectId:a,isMobile:w,addToast:r,onOpenTask:ze,onArtifactUpdated:()=>void Se()}):lt&&se.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingTaskDocuments","Loading task documents…")})})}):X.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsxs("div",{className:`documents-project-layout documents-task-documents-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!he)&&e.jsx("aside",{className:"documents-view-sidebar documents-task-documents-sidebar","aria-label":t("documents.taskDocumentsListLabel","Task documents"),children:X.map(({taskId:s,taskTitle:c,taskColumn:o,documents:j,artifacts:z})=>{const q=o?d(o):null,Pe=o?ms(o):"status-dot";return e.jsxs("section",{className:"documents-task-sidebar-group","aria-labelledby":`documents-task-group-${s}`,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-${s}`,className:"documents-task-sidebar-title",children:[e.jsx("span",{className:"documents-group-task-id",children:s}),e.jsx("span",{className:"documents-group-task-title",children:c||t("documents.untitled","Untitled")})]}),q?e.jsxs("span",{className:"documents-group-status badge","aria-label":t("documents.taskStatusAria","Task status: {{status}}",{status:q}),children:[e.jsx("span",{className:Pe,"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:t("documents.taskOutputCount","{{docCount}} doc{{docPlural}} · {{artifactCount}} artifact{{artifactPlural}}",{docCount:j.length,docPlural:j.length!==1?"s":"",artifactCount:z.length,artifactPlural:z.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>void jt(s),"aria-label":t("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:s,title:c||t("documents.untitled","Untitled")}),children:t("documents.openTask","Open task")})]})]}),e.jsxs("ul",{className:"markdown-file-list documents-task-document-list",children:[j.map(h=>{const v=l?.id===h.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item${v?" markdown-file-item--selected":""}`,onClick:()=>Nt(h.id),"aria-label":t("documents.openTaskDocument","Open {{taskId}} {{key}}",{taskId:h.taskId,key:h.key}),"aria-current":v?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:h.key}),e.jsxs("span",{className:"markdown-file-item-path",children:[h.taskId," · ",h.taskTitle||t("documents.untitled","Untitled")]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[t("documents.revisionShort","v{{revision}}",{revision:h.revision})," · ",h.author," · ",oe(h.updatedAt)]})]})},`document-${h.id}`)}),z.length>0?e.jsxs("li",{className:"documents-task-artifacts-subsection","aria-label":t("documents.taskArtifactsSubsection","Task artifacts"),children:[e.jsx("div",{className:"documents-task-artifacts-label",children:t("documents.taskArtifactsLabel","Artifacts")}),e.jsx("ul",{className:"markdown-file-list documents-task-artifact-list",children:z.map(h=>{const v=Ae(h),ae=ds[v],Mt=Ye(t,v),Be=H?.id===h.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${Be?" markdown-file-item--selected":""}`,onClick:()=>St(h.id),"aria-label":t("documents.openTaskArtifact","Open {{taskId}} artifact {{title}}",{taskId:s,title:h.title||t("documents.untitledArtifact","Untitled artifact")}),"aria-current":Be?"true":void 0,children:[e.jsxs("span",{className:"documents-task-artifact-title-row",children:[e.jsx(ae,{size:14,"aria-hidden":"true"}),e.jsx("span",{className:"markdown-file-item-name",children:h.title||t("documents.untitledArtifact","Untitled artifact")})]}),e.jsxs("span",{className:"markdown-file-item-path",children:[Mt," · ",h.mimeType||h.type]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[h.authorId||t("documents.unknownAuthor","unknown")," · ",oe(h.updatedAt)]})]})},`artifact-${h.id}`)})})]}):null]})]},s)})}),(!w||he)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.taskDocumentPreviewLabel","Task document content preview"),children:[w&&he&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Ct,"aria-label":t("documents.backToTaskDocumentsList","Back to task documents list"),children:[e.jsx(Qe,{size:14}),t("documents.backToTaskDocuments","Back to documents")]}),he?H?e.jsx(ks,{artifact:H,projectId:a,content:et,loading:tt,error:st,renderMarkdown:nt,onToggleMarkdown:()=>xe(s=>!s),onOpenTask:ze,t}):l?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:[l.taskId," / ",l.key]}),e.jsx("div",{className:"documents-task-document-actions",children:Fe?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:Ft,disabled:de,children:t("documents.cancelEdit","Cancel")}),V&&e.jsx("button",{className:"btn btn-sm",onClick:Pt,disabled:de,children:t("documents.rebaseTaskDocument","Rebase draft")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void At(),disabled:de||V!==null,children:de?t("documents.saving","Saving…"):t("documents.saveTaskDocument","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>yt(l.id),"aria-label":Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":Y,title:Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:Y?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Tt,"aria-label":t("documents.editTaskDocument","Edit task document"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta",children:[e.jsx("span",{className:"document-card-author",children:l.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:t("documents.revisionShort","v{{revision}}",{revision:l.revision})}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:oe(l.updatedAt)})]}),Fe?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.taskDocumentContentEditor","Task document content editor"),children:e.jsx(Ge,{content:pe,onChange:T,filePath:l.key.includes(".")?l.key:`${l.key}.md`,forceToolbarActionsVisible:!0})}):Y?e.jsx("div",{ref:ie,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:l.content})})}):e.jsx("pre",{ref:ee,className:"document-card-content-text documents-content-viewer-text",children:l.content}),Lt]}):null:e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectTaskDocument","Select a task document or artifact to view its content.")})})]})]})})]})}export{gs as DocumentsView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as L,ap as P,aq as $,aS as G,aT as Q,au as O,aU as J,aV as Z,V as H,T as B,Y as ee,R as se,aI as ae,s as te,l as le,aQ as re}from"./index-
|
|
1
|
+
import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as L,ap as P,aq as $,aS as G,aT as Q,au as O,aU as J,aV as Z,V as H,T as B,Y as ee,R as se,aI as ae,s as te,l as le,aQ as re}from"./index-C2xsZoNG.js";import{u as ne}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";const ie=300,ce=15e3;function K(r){if(!r.trim())return;const a=Number(r);return Number.isFinite(a)?a:void 0}function k(...r){for(const a of r)if(Array.isArray(a))return a;return[]}function p(r){return typeof r=="object"&&r!==null?r:{}}function X(r){const a=p(r),m=p(a.taskSnapshot);return{id:String(a.id??a.evalId??""),runId:String(a.runId??a.batchId??""),taskId:String(a.taskId??m.taskId??""),taskTitle:String(m.title??a.taskTitle??a.title??"Untitled task"),createdAt:String(a.createdAt??a.timestamp??a.updatedAt??new Date(0).toISOString()),overallScore:typeof a.overallScore=="number"?a.overallScore:null,maxScore:typeof a.maxScore=="number"?a.maxScore:null,categoryScores:k(a.categoryScores,p(a.scores).categories)}}function oe(r){const a=p(r);return{...X(a),rationale:String(a.rationale??a.summary??""),evidence:k(a.evidence,p(a.details).evidence),followUps:k(a.followUps,p(a.recommendations).followUps)}}function de(r){const a=r?.projectId,m=a??"",t=`${$.EVALS_RUNS_PREFIX}${m}`,h=`${$.EVALS_RESULTS_PREFIX}${m}`,f=L(t,{maxAgeMs:P}),v=L(h,{maxAgeMs:P}),S=l.useRef(Array.isArray(f)&&f.length>0||Array.isArray(v)&&v.length>0),[o,g]=l.useState({q:"",runId:"",scoreMin:"",scoreMax:""}),[b,w]=l.useState(()=>Array.isArray(f)?f:[]),[d,M]=l.useState(()=>Array.isArray(v)?v:[]),[u,R]=l.useState(null),[F,A]=l.useState(null),[s,c]=l.useState(0),[y,j]=l.useState(!S.current),[W,q]=l.useState(null),C=l.useRef(0),z=l.useRef(a),T=l.useRef(u);T.current=u;const I=l.useCallback(async()=>{const n=++C.current;S.current||j(!0),q(null);try{const[i,x]=await Promise.all([G({q:o.q||void 0,runId:o.runId||void 0,scoreMin:K(o.scoreMin),scoreMax:K(o.scoreMax),limit:100,offset:0},a),Q(a)]);if(n!==C.current)return;const E=k(i.results,i.evals,i.items).map(X);M(E),O(h,E.length>500?E.slice(0,500):E,{maxBytes:5e5}),c(typeof i.count=="number"?i.count:E.length);const V=k(x.runs,x.items).map(U=>{const N=p(U),D=p(N.counts);return{id:String(N.id??""),createdAt:String(N.createdAt??""),completedAt:typeof N.completedAt=="string"?N.completedAt:void 0,status:String(N.status??"pending"),evaluatedTaskCount:typeof D.totalTasks=="number"?D.totalTasks:0}});w(V),O(t,V,{maxBytes:5e5}),S.current=!0,T.current&&!E.some(U=>U.id===T.current)&&(R(null),A(null))}catch(i){if(n!==C.current)return;q(i instanceof Error?i.message:"Failed to load evals")}finally{n===C.current&&j(!1)}},[o.q,o.runId,o.scoreMax,o.scoreMin,a,h,t]),_=l.useCallback(async n=>{const i=await J(n,a),x=i.result??i;A(oe(x))},[a]);l.useEffect(()=>{if(z.current===a)return;z.current=a;const n=L(t,{maxAgeMs:P}),i=L(h,{maxAgeMs:P}),x=Array.isArray(n)&&n.length>0||Array.isArray(i)&&i.length>0;w(Array.isArray(n)?n:[]),M(Array.isArray(i)?i:[]),j(!x),S.current=x},[a,h,t]),l.useEffect(()=>{const n=window.setTimeout(()=>{I()},ie);return()=>window.clearTimeout(n)},[I]),l.useEffect(()=>{if(!u){A(null);return}_(u)},[_,u]),l.useEffect(()=>{const n=window.setInterval(()=>{I(),u&&_(u)},ce);return()=>window.clearInterval(n)},[_,I,u]);const Y=l.useCallback(n=>{T.current=n,R(n)},[]);return{loading:y,error:W,results:d,count:s,runs:b,filters:o,setFilters:g,refresh:I,selectedEvalId:u,setSelectedEvalId:Y,selectedEval:F}}function ge({projectId:r,onOpenSettings:a,onOpenTaskDetail:m}){const{t}=ne("app"),{loading:h,error:f,results:v,runs:S,filters:o,setFilters:g,selectedEvalId:b,setSelectedEvalId:w,selectedEval:d,refresh:M}=de({projectId:r}),[u,R]=l.useState(!0);l.useEffect(()=>{let s=!1;return Z(r).then(c=>{if(s)return;const y=c.evalSettings?.enabled;R(y??!1)}).catch(()=>{s||R(!1)}),()=>{s=!0}},[r]);const F=v.length>0,A=l.useMemo(()=>v.find(s=>s.id===b)??null,[v,b]);return u?e.jsxs("section",{className:"evals-view","data-testid":"evals-view",children:[e.jsx(H,{icon:B,title:t("evals.title","Evals")}),e.jsxs("div",{className:"evals-view__body",children:[e.jsxs("div",{className:"evals-list card",children:[e.jsxs("div",{className:"evals-toolbar",children:[e.jsx("input",{className:"input",placeholder:t("evals.searchPlaceholder","Search task or rationale"),value:o.q,onChange:s=>g(c=>({...c,q:s.target.value}))}),e.jsxs("select",{className:"select",value:o.runId,onChange:s=>g(c=>({...c,runId:s.target.value})),children:[e.jsx("option",{value:"",children:t("evals.allRuns","All runs")}),S.map(s=>e.jsx("option",{value:s.id,children:s.id},s.id))]}),e.jsx("input",{className:"input",placeholder:t("evals.minScorePlaceholder","Min score"),value:o.scoreMin,onChange:s=>g(c=>({...c,scoreMin:s.target.value}))}),e.jsx("input",{className:"input",placeholder:t("evals.maxScorePlaceholder","Max score"),value:o.scoreMax,onChange:s=>g(c=>({...c,scoreMax:s.target.value}))}),e.jsx("button",{className:"btn btn-icon",type:"button",onClick:()=>void M(),"aria-label":t("evals.refreshAria","Refresh evals"),children:e.jsx(se,{size:16})})]}),h&&e.jsx("p",{className:"evals-state","data-testid":"evals-loading",children:e.jsx(ae,{label:t("evals.loading","Loading evals…")})}),f&&e.jsx("p",{className:"evals-state evals-state--error",children:f}),!h&&!f&&!F&&e.jsx("p",{className:"evals-state",children:t("evals.empty","No evals yet. Scheduled evals review tasks completed since the last run.")}),e.jsx("ul",{className:"evals-results","data-testid":"evals-results",children:v.map(s=>e.jsx("li",{children:e.jsxs("button",{className:`evals-result ${s.id===b?"evals-result--active":""}`,type:"button",onClick:()=>w(s.id),draggable:le(),onDragStart:c=>{te(c.dataTransfer,{kind:"eval-result",id:s.id,projectId:r})},children:[e.jsx("span",{className:"evals-result-title",children:s.taskTitle}),e.jsxs("span",{className:"evals-result-meta",children:[s.taskId," · ",s.runId," · ",s.overallScore??t("evals.naPlaceholder","n/a")]})]})},s.id))})]}),e.jsxs("div",{className:"evals-detail card","data-testid":"evals-detail",children:[!d&&e.jsx("p",{className:"evals-state",children:t("evals.selectPrompt","Select an evaluation to inspect scores, rationale, and evidence.")}),d&&e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"evals-detail-title",children:A?.taskTitle??d.taskTitle}),e.jsxs("p",{className:"evals-result-meta",children:[d.taskId," · ",d.runId]}),e.jsx("p",{className:"evals-score",children:t("evals.overallScore","Overall score: {{score}}",{score:d.overallScore??t("evals.naPlaceholder","n/a")})}),e.jsx("ul",{className:"evals-categories",children:d.categoryScores.map(s=>e.jsxs("li",{children:[s.category,": ",s.finalScore]},s.category))}),e.jsx("p",{className:"evals-rationale",children:d.rationale||t("evals.noRationale","No rationale recorded.")}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.evidenceHeading","Evidence")}),e.jsx("ul",{className:"evals-links",children:d.evidence.map((s,c)=>{const y=typeof s.metadata?.taskId=="string"?s.metadata.taskId:void 0,j=typeof s.metadata?.url=="string"?s.metadata.url:void 0;return e.jsx("li",{children:y?e.jsx("button",{type:"button",className:"btn",onClick:()=>m?.(y),children:s.ref}):j?e.jsxs("a",{href:j,target:"_blank",rel:"noreferrer",className:"evals-external-link",children:[s.ref,e.jsx(re,{size:14})]}):e.jsx("span",{children:s.ref})},`${s.ref}-${c}`)})})]}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.suggestedFollowupsHeading","Suggested follow-up tasks")}),e.jsxs("ul",{className:"evals-follow-ups",children:[d.followUps.length===0&&e.jsx("li",{children:t("evals.noFollowups","None")}),d.followUps.map(s=>e.jsxs("li",{children:[e.jsx("strong",{children:s.title}),e.jsx("p",{children:s.rationale})]},s.suggestionId))]})]})]})]})]})]}):e.jsxs("section",{className:"evals-view","data-testid":"evals-disabled",children:[e.jsx(H,{icon:B,title:t("evals.title","Evals")}),e.jsxs("div",{className:"evals-view__empty",children:[e.jsx("h2",{className:"evals-title",children:t("evals.disabledTitle","Scheduled evals are disabled")}),e.jsx("p",{className:"evals-empty-copy",children:t("evals.enablePrompt","Enable Scheduled Evals to review scored tasks, evidence, and follow-up recommendations.")}),e.jsxs("button",{className:"btn btn-primary",type:"button",onClick:()=>a?.("scheduled-evals"),children:[e.jsx(ee,{size:16}),t("evals.openSettings","Open Scheduled Evals Settings")]})]})]})}export{ge as EvalsView};
|