@runfusion/fusion 0.78.0-beta.2 → 0.78.0-beta.4
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 +5142 -5151
- package/dist/child-process-worker.js +3720 -3649
- package/dist/client/.vite/manifest.json +262 -262
- package/dist/client/assets/{AgentDetailView-4tEdPTG2.js → AgentDetailView-BVDrAj1Y.js} +3 -3
- package/dist/client/assets/AgentDetailView-DaSEdzYy.css +1 -0
- package/dist/client/assets/{AgentPermissionPolicyEditor-DIGxjQFE.js → AgentPermissionPolicyEditor--11QLSt_.js} +1 -1
- package/dist/client/assets/{AgentsView-BXFYQAPe.js → AgentsView-D3mLjE0-.js} +4 -4
- package/dist/client/assets/{CommandCenter-vknNrxBN.js → CommandCenter-CPy2a26y.js} +1 -1
- package/dist/client/assets/{DevServerView-COFb49kW.js → DevServerView-CWHhisoR.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-C-wYRUc5.js → DirectoryPicker-DMd9MEtq.js} +1 -1
- package/dist/client/assets/DocumentsView-YeYy6DJV.js +1 -0
- package/dist/client/assets/{EvalsView-BcOgXvPe.js → EvalsView-DfvYGoX4.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-B0zF29ER.js → ExperimentalAgentOnboardingModal-CFjRfBUk.js} +1 -1
- package/dist/client/assets/{GoalsView--Cj2se_t.js → GoalsView-DdlI85_-.js} +1 -1
- package/dist/client/assets/InsightsView-Du2UKeQE.js +11 -0
- package/dist/client/assets/{MemoryView-Ca0Y2fYg.js → MemoryView-DeSuPKc7.js} +1 -1
- package/dist/client/assets/{PatchnodeView--E259o36.js → PatchnodeView-Ow5ErHE3.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-DKKLn5YE.js → PiExtensionsManager-D65p_Z4a.js} +1 -1
- package/dist/client/assets/{PluginManager-e0Rnv7RI.js → PluginManager-BruzVBGM.js} +1 -1
- package/dist/client/assets/{PullRequestView-BFe77u-d.js → PullRequestView-BTzsKxrq.js} +1 -1
- package/dist/client/assets/{ReportModal-DvyDEj8D.js → ReportModal-YpkrGp21.js} +2 -2
- package/dist/client/assets/ResearchView-D0oWTBMk.js +2 -0
- package/dist/client/assets/{SecretsView-DTrrJEt9.js → SecretsView-B6ZH6O1O.js} +1 -1
- package/dist/client/assets/{SettingsModal-DnTX4rMK.js → SettingsModal-CN4NVtbD.js} +1 -1
- package/dist/client/assets/SettingsModal-CmPRFol7.css +1 -0
- package/dist/client/assets/SettingsModal-CwUcFHcw.js +21 -0
- package/dist/client/assets/{SettingsTextareaRow-y3gQ4u_G.js → SettingsTextareaRow-B_iNwevV.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-ClAbtrU0.js → SetupWizardModal-BSAtv8xH.js} +2 -2
- package/dist/client/assets/{SkillsView-BpEJE16a.js → SkillsView-DhhiUAPO.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-CSbhpY5K.js → WorkflowNodeEditor-YeZ_DH3a.js} +1 -1
- package/dist/client/assets/{agent-import-generation-BT0ZBGQA.js → agent-import-generation-BPFU14s8.js} +1 -1
- package/dist/client/assets/{agentsOrgChartLayout-C_tkb_Pq.js → agentsOrgChartLayout-CWqQ9XMW.js} +1 -1
- package/dist/client/assets/app-BVuhE-pB.js +3 -0
- package/dist/client/assets/app-BVz53oEh.js +9 -0
- package/dist/client/assets/app-BfzM5z-d.js +9 -0
- package/dist/client/assets/app-BgtLSw3s.js +9 -0
- package/dist/client/assets/app-BpjF_vWi.js +9 -0
- package/dist/client/assets/app-Cjqb3Hrq.js +3 -0
- package/dist/client/assets/app-CoyPSunU.js +9 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-BfPYqDRS.js → architectureDiagram-3BPJPVTR-DX2xxWsB.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-BEcaGTmc.js → blockDiagram-GPEHLZMM-tVB-pLpH.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-BX1xrinF.js → c4Diagram-AAUBKEIU-BEV-l4nl.js} +1 -1
- package/dist/client/assets/channel-BoqUD_yo.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-OksyoE_c.js → chunk-2J33WTMH-DduonyQt.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-C5ivKrB5.js → chunk-4BX2VUAB-BPCXybBl.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-C7vkVq-W.js → chunk-55IACEB6-ByqbaUCB.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-c-khhz21.js → chunk-727SXJPM-DdtczHe_.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-DwxYJXXQ.js → chunk-AQP2D5EJ-V5pHkNOZ.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BKhdu4up.js → chunk-FMBD7UC4-i0P_U91V.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-okVZM2p2.js → chunk-ND2GUHAM-BWdXSws9.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-DDso7rM3.js → chunk-QZHKN3VN-C7vpw2O4.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-5Yk5cF5o.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-5Yk5cF5o.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-CNT9ltBk.js → cose-bilkent-S5V4N54A-C_OJmqvv.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-C5a30-g5.js → dagre-BM42HDAG-DlxhXtcR.js} +1 -1
- package/dist/client/assets/{dashboard-view-Brqe-SVE.js → dashboard-view-C_aj9Avl.js} +2 -2
- package/dist/client/assets/{dashboard-view-DyAQ_agZ.js → dashboard-view-CtFwciFc.js} +1 -1
- package/dist/client/assets/dashboard-view-Cy2aXOHq.js +1 -0
- package/dist/client/assets/{dashboard-view-WFOf0Kpl.js → dashboard-view-ZNgeI6tK.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-DG7EyUNe.js → diagram-2AECGRRQ-B5OQ5SjT.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-DE7lhEna.js → diagram-5GNKFQAL-OnHyeSDX.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DFtJNqNF.js → diagram-KO2AKTUF-BESRlk6K.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-DUAuxZQD.js → diagram-LMA3HP47-jc5KVOgo.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-DCKETcWy.js → diagram-OG6HWLK6-CbvV1B1C.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-pa0blyAD.js → erDiagram-TEJ5UH35-CU4gukmG.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-D7Veqs1W.js → flowDiagram-I6XJVG4X-Dq9UKge4.js} +1 -1
- package/dist/client/assets/{folder-open-CojKP0zy.js → folder-open-CF9O-sX4.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CsqBMy2D.js → ganttDiagram-6RSMTGT7-BWA_00UM.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BRrVKZJo.js → gitGraphDiagram-PVQCEYII-DKdPzNtQ.js} +1 -1
- package/dist/client/assets/index-CiVIbypZ.js +2949 -0
- package/dist/client/assets/index-Duxgoh_Y.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-o2GEmmb2.js → infoDiagram-5YYISTIA-BvusFnLt.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-k1p6nWtj.js → ishikawaDiagram-YF4QCWOH-NLucC59B.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-B43V37S0.js → journeyDiagram-JHISSGLW-OMF0ZqP2.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-HRMYyAQB.js → kanban-definition-UN3LZRKU-DcIw1Gei.js} +1 -1
- package/dist/client/assets/{mermaid.core-6vt3zKxL.js → mermaid.core-BXdGnca4.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-D3VJuvfj.js → mindmap-definition-RKZ34NQL-CJdZ2giE.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-D0RjFhk9.js → pieDiagram-4H26LBE5-CIS3IXyQ.js} +1 -1
- package/dist/client/assets/{puzzle-D3dJEsTf.js → puzzle-DLP4jrVO.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DHaEqU3Q.js → quadrantDiagram-W4KKPZXB-CyXg_FqY.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DnfFCRP0.js → requirementDiagram-4Y6WPE33-Cl5zZfEW.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-D6GCuiqV.js → sankeyDiagram-5OEKKPKP-RPvS_KDe.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DaGYYzxS.js → sequenceDiagram-3UESZ5HK-mqxbDVma.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-CN8Kp4Hq.js → standing-instructions-template-oByMjuf9.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-ek4Wb8ai.js → stateDiagram-AJRCARHV-BMThgwA0.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-EPn8Vq7v.js → stateDiagram-v2-BHNVJYJU-BQQVmi0s.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-CyAwCbnE.js → timeline-definition-PNZ67QCA-DxRT4zz3.js} +1 -1
- package/dist/client/assets/{upload-BhpNL3xI.js → upload-C1hBXwxT.js} +1 -1
- package/dist/client/assets/{users-Bka1cIkR.js → users-CUTsjdYo.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-Bd8-8r3a.js → vennDiagram-CIIHVFJN-CplrXnmO.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-nNvWflNF.js → wardley-L42UT6IY-DN3nUl9Y.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Dy7XrvPx.js → wardleyDiagram-YWT4CUSO-C0hUcS3e.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-38VTptR4.js → xychartDiagram-2RQKCTM6-CDB05pHe.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +4041 -4181
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +108 -101
- package/dist/plugin-sdk/index.js +37 -95
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +37 -95
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/SKILL.md +1 -1
- package/skill/fusion/references/best-practices.md +2 -2
- package/skill/fusion/references/cli-commands.md +0 -2
- package/skill/fusion/references/engine-tools.md +2 -2
- package/skill/fusion/references/extension-tools.md +1 -18
- package/skill/fusion/references/fusion-capabilities.md +1 -4
- package/skill/fusion/references/task-structure.md +1 -1
- package/skill/fusion/workflows/task-lifecycle.md +5 -9
- package/skill/fusion/workflows/task-management.md +1 -3
- package/dist/client/assets/AgentDetailView-DPoh46Ym.css +0 -1
- package/dist/client/assets/DocumentsView-B-uzhK3C.js +0 -1
- package/dist/client/assets/InsightsView-qMoM8oFe.js +0 -11
- package/dist/client/assets/ResearchView-DROedGZR.js +0 -2
- package/dist/client/assets/SettingsModal-CSbSmwxZ.js +0 -21
- package/dist/client/assets/SettingsModal-Crai1dEI.css +0 -1
- package/dist/client/assets/app-B0hINWeH.js +0 -5
- package/dist/client/assets/app-BSxI9vvS.js +0 -13
- package/dist/client/assets/app-BeDYumHl.js +0 -13
- package/dist/client/assets/app-C8jogXBu.js +0 -13
- package/dist/client/assets/app-C8kudFlj.js +0 -13
- package/dist/client/assets/app-DZ5j1n3j.js +0 -5
- package/dist/client/assets/app-hEhR2PdL.js +0 -13
- package/dist/client/assets/channel-BjDq20V4.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-B114c_Fi.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B114c_Fi.js +0 -1
- package/dist/client/assets/dashboard-view-DxpkE7dL.js +0 -1
- package/dist/client/assets/index-Cv_ouAgx.js +0 -2959
- package/dist/client/assets/index-Dliz9s5K.css +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as f,j as s,g as hn,a as ij,b as nc,c as sj}from"./vendor-react-SZ_qB27O.js";import{c as _t,
|
|
1
|
+
import{r as f,j as s,g as hn,a as ij,b as nc,c as sj}from"./vendor-react-SZ_qB27O.js";import{c as _t,gI as oj,j as Di,dx as Th,L as ac,m as Li,gJ as $i,a as mr,w as vr,aP as zr,gK as ic,gL as lj,aW as Qr,ad as il,$ as Mh,aR as Ba,T as nn,aY as cj,a_ as uj,P as Un,aX as dj,gM as sc,c4 as Fi,bb as Ga,a1 as oc,gN as Uu,R as Xt,ap as fj,gO as mj,aC as vj,aL as Bi,gP as Ih,dB as hj,aQ as Rh,d2 as Dh,bW as pj,aA as lc,c5 as yj,gQ as gj,ac as bj,eU as xj,gR as jj,a4 as Lh,gS as wj,gT as Cj,bF as Vu,gU as qu,d8 as kj,f4 as Sj,gf as Nj,gm as Ts,gV as Wu,gW as xa,gX as Pj,gY as Aj,gZ as Oj,g_ as Ej,g$ as _j,gj as Tj,gn as Mj,h0 as Ij,h1 as Rj,h2 as Dj,gh as Lj,h3 as $j,G as Fj,aD as Bj,go as $h,h4 as zj,cd as Kj,F as Uj,h5 as Vj,aj as qj,h6 as Wj,h7 as Hj,g6 as Ms,h8 as Gj,h9 as Hu,ha as Xj,hb as Yj,hc as Zj,hd as Jj,he as cc,hf as uc,hg as Gu,cU as Xa,hh as Xu,hi as sl,hj as Fh,hk as ol,bc as Bh,bG as zh,c6 as Kh,de as Qj,d0 as e0,K as dc,hl as t0,hm as r0,l as n0,ek as Yu,X as za,E as a0,B as i0,aU as Zu,ay as s0,hn as Ju,ho as o0,hp as l0,hq as c0,hr as u0,dy as d0,hs as Is,ht as f0,hu as m0,hv as v0}from"./index-CiVIbypZ.js";import{u as oe}from"./vendor-i18n-Duky4gdQ.js";import{a as Uh,b as Vh,p as h0,w as p0}from"./vendor-reactflow-BlIeoTu4.js";import{w as qh,n as Wh,a as Me,A as fc,G as y0,H as g0,l as Hh,t as zi,b as Tt,p as ll,s as Ya,c as Gh,q as b0,r as x0,u as j0,v as w0,x as C0,y as k0,z as S0,C as N0,D as P0,k as A0,E as O0,F as E0}from"./step-yuy0qJer.js";import{b as _0,p as T0}from"./band-CquvqAHh.js";import{d as Za,n as M0,e as I0,f as cl,g as Kr,h as mc,a as vc,i as Qu,j as Gt,c as R0,k as Ki,l as D0,m as L0}from"./linear-Dyk9wory.js";import{i as yr,a as er}from"./init-Dmth1JHB.js";import{m as ed,a as td,p as $0,q as F0,u as B0,s as z0,r as K0,v as U0,w as V0,x as q0,y as W0,z as H0,A as G0,B as X0,t as Y0}from"./time-2wBVBf9F.js";import{f as Z0,b as J0}from"./defaultLocale-DX6XiGOO.js";import{i as Q0,o as ew}from"./ordinal-DILIJJjt.js";import{g as tw,i as ul,r as rw}from"./agentsOrgChartLayout-CWqQ9XMW.js";import{U as hc}from"./upload-C1hBXwxT.js";import{b as nw}from"./agent-import-generation-BPFU14s8.js";import{r as aw,B as iw,R as sw,b as ow,a as lw}from"./ReportModal-YpkrGp21.js";import{PluginManager as cw}from"./PluginManager-BruzVBGM.js";import{v as uw}from"./projectDetection-G3XuxD2X.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-xterm-BNq00GSj.js";import"./DirectoryPicker-DMd9MEtq.js";import"./folder-open-CF9O-sX4.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a as z,w as T,d7 as ar,bb as ir,aP as Or,cV as le,L as ge,az as Fr,d8 as zr,d9 as $r,da as Hr,j as Br,db as or,aW as lr,dc as me,dd as Vr,de as Wr,df as Ir,V as qr,dg as Jr,bP as Xr,bS as Kr,dh as Gr,B as We,X as Yr,aK as Qr,R as Zr}from"./index-Cv_ouAgx.js";import{u as we}from"./vendor-i18n-Duky4gdQ.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const t=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",s=t==="root"?".":t,i=e.name,a=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():s,u=typeof e.confidence=="number"?e.confidence:1,f=t==="root"?"root":t,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:i,packagePath:a,confidence:u,cwd:s,source:t,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${i} (${f})`}}function se(e){const t=e.status,s=t==="starting"||t==="running"||t==="failed"||t==="stopped"?t:"stopped",i=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,a=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:s,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:i,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:i,detectedPort:e.detectedPort,manualPreviewUrl:a,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:a,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function et(e,t){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:t,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 rt(e){const s=(Array.isArray(e.lines)?e.lines:[]).map((i,a)=>et(i,a+1));return{lines:s,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:s.length}}function tt(e,t){const s=typeof t.maxLines=="number"&&Number.isFinite(t.maxLines)?Math.max(1,Math.floor(t.maxLines)):100,i=typeof t.offset=="number"&&Number.isFinite(t.offset)?Math.max(0,Math.floor(t.offset)):0,a=typeof t.lastEventId=="number"&&Number.isFinite(t.lastEventId)?Math.max(0,Math.floor(t.lastEventId)):null,u=e.length,f=e.map((N,$)=>({id:$+1,text:N,stream:"stdout",timestamp:""}));if(a!==null)return{lines:f.filter(N=>N.id>a).slice(0,s),totalLines:u};const m=Math.max(u-i,0),C=Math.max(m-s,0);return{lines:f.slice(C,m),totalLines:u}}function qe(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function cr(e){try{const t=await z(T("/dev-server/candidates",e));return qe(t)}catch(t){if(t instanceof Error&&/\/dev-server\/candidates/.test(t.message)){const s=await z(T("/dev-server/detect",e));return qe(s)}throw t}}function be(e){return z(T("/dev-server/status",e)).then(se)}async function Ee(e={},t){const s=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&s.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&s.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&s.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const i=s.size>0?`?${s.toString()}`:"";try{const a=await z(T(`/dev-server/logs/history${i}`,t));return rt(a)}catch(a){if(a instanceof Error&&/\/dev-server\/logs\/history/.test(a.message)){const u=await be(t);return tt(u.logs,e)}throw a}}function dr(e,t){const s=e.cwd??e.packagePath??".",i=e.scriptName;return z(T("/dev-server/start",t),{method:"POST",body:JSON.stringify({command:e.command,scriptName:i,scriptId:i,cwd:s,packagePath:e.packagePath})}).then(se)}function vr(e){return z(T("/dev-server/stop",e),{method:"POST"}).then(se)}function ur(e){return z(T("/dev-server/restart",e),{method:"POST"}).then(se)}async function mr(e,t){const s=typeof e=="string"?{url:e}:e;try{const i=await z(T("/dev-server/preview-url",t),{method:"POST",body:JSON.stringify(s)});return se(i)}catch(i){if(i instanceof Error&&/\/dev-server\/preview-url/.test(i.message)){const a=await z(T("/dev-server/preview-url",t),{method:"PUT",body:JSON.stringify(s)});return se(a)}throw i}}function Pe(e){return ar(T("/dev-server/logs/stream",e))}async function Me(e){try{return(await z(T("/devserver",e))).sessions??[]}catch{try{const t=await be(e);return[{config:{id:t.id??"default",name:t.name??"Dev Server",command:t.command??"",cwd:t.cwd??"."},status:t.status,runtime:t.pid?{pid:t.pid,startedAt:t.startedAt??new Date().toISOString(),exitCode:t.exitCode??void 0,previewUrl:t.previewUrl}:void 0,previewUrl:t.previewUrl??t.detectedUrl??void 0,logHistory:(t.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function pr(e,t){try{return await z(T(`/devserver/${encodeURIComponent(e)}`,t))}catch{try{const s=await be(t);return!e||e==="default"||e===s.id?{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(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Je(e,t){try{return await z(T(`/devserver/${encodeURIComponent(e)}/start`,t),{method:"POST"})}catch{const s=await dr({command:""},t);return{config:{id:s.id??e,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(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,t){try{return await z(T(`/devserver/${encodeURIComponent(e)}/stop`,t),{method:"POST"})}catch{const s=await vr(t);return{config:{id:s.id??e,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(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Ke(e,t){try{return await z(T(`/devserver/${encodeURIComponent(e)}/restart`,t),{method:"POST"})}catch{const s=await ur(t);return{config:{id:s.id??e,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(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Ge(e,t,s){try{const i=await z(T(`/devserver/${encodeURIComponent(e)}/preview`,s),{method:"POST",body:JSON.stringify({url:t})});return{url:i.url??null,source:i.source??null}}catch{const i=await mr({url:t},s);return{url:i.previewUrl??i.manualUrl??null,source:"manual"}}}async function Le(e){try{return(await z(T("/devserver/detect",e))).candidates??[]}catch{try{return(await cr(e)).map(s=>({name:s.name,command:s.command,cwd:s.cwd,scriptName:s.scriptName,packagePath:s.packagePath}))}catch{return[]}}}function st(e,t){return ar(T(`/devserver/${encodeURIComponent(e)}/logs/stream`,t))}const _e=500,nt=3e3;function J(e){return e instanceof Error?e.message:String(e)}function fr(e){return e.length<=_e?e:e.slice(-_e)}function je(e,t){return fr([...e,t])}function te(e){try{return JSON.parse(e)}catch{return null}}function pe(e){const t=e.text??"";return e.stream==="stderr"?`[stderr] ${t}`:t}function at(e){return e?.previewUrl??null}async function Ye(e){return be(e)}async function Qe(e,t){return dr(e,t)}async function it(e){return vr(e)}async function ot(e){return ur(e)}async function Ze(e){return cr(e)}function K(e){try{return e()}catch{return null}}function Re(){return typeof K(()=>Me)=="function"&&typeof K(()=>pr)=="function"}function ee(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(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}function lt(e){const{t}=we("app"),[s,i]=n.useState(null),[a,u]=n.useState([]),[f,m]=n.useState([]),[C,N]=n.useState([]),[$,L]=n.useState(!0),[E,h]=n.useState(null),v=n.useRef(0),[g,k]=n.useState(null),A=n.useCallback(d=>{if(i(d),d?.logHistory){const l=d.logHistory.slice(-_e).map(pe);m(l)}},[]),U=n.useCallback(async()=>{const d=v.current;try{if(Re())if(g){const l=await pr(g,e);if(v.current!==d)return;A(l)}else{const l=await Me(e);if(v.current!==d)return;u(l),l.length>0&&(k(l[0].config.id),A(l[0]))}else{const l=await Ye(e);if(v.current!==d)return;const b=ee(l);u([b]),A(b)}h(null)}catch(l){if(v.current!==d)return;h(J(l))}},[A,e,g]);n.useEffect(()=>{v.current+=1;const d=v.current;i(null),u([]),m([]),N([]),L(!0),h(null),k(null),(async()=>{try{const[b,p]=await Promise.allSettled([Re()?Me(e):Ye(e).then(x=>[ee(x)]),typeof K(()=>Le)=="function"?Le(e):Ze(e).then(x=>x.map(R=>({name:R.name,command:R.command,cwd:R.cwd,scriptName:R.scriptName,packagePath:R.packagePath})))]);if(v.current!==d)return;let w=null;if(b.status==="fulfilled"){const x=b.value;if(u(x),x.length>0){const R=x[0];Re()&&k(R.config.id),A(R)}}else w=J(b.reason);p.status==="fulfilled"&&N(p.value),w&&h(w)}catch(b){if(v.current!==d)return;h(J(b))}finally{v.current===d&&L(!1)}})()},[A,e]),n.useEffect(()=>{const d=g?st(g,e):typeof K(()=>Pe)=="function"?Pe(e):null;if(!d)return;const l=v.current,b=ir(d,{events:{history:p=>{if(v.current!==l)return;const w=te(p.data);if(w?.lines){const x=w.lines.map(pe);m(fr(x))}},log:p=>{if(v.current!==l)return;const w=te(p.data);if(w){const x=typeof w.line=="string"?w.line:pe(w);m(R=>je(R,x))}},"dev-server:log":p=>{if(v.current!==l)return;const w=te(p.data);if(w){const x=typeof w.line=="string"?w.line:pe(w);m(R=>je(R,x))}},"dev-server:output":p=>{if(v.current!==l)return;const w=te(p.data);w?.line&&m(x=>je(x,w.line))},status:p=>{if(v.current!==l)return;const w=te(p.data),x=w?.status;x&&i(R=>R&&{...R,status:x,runtime:w.pid?{...R.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:R.runtime})},"dev-server:status":p=>{if(v.current!==l)return;const w=te(p.data);if(w?.status){const x=ee(w);i(x),u([x])}},stopped:()=>{v.current},failed:()=>{v.current}},onReconnect:()=>{v.current===l&&U()},onError:()=>{v.current===l&&h(p=>p??t("devserver.lostConnection","Lost log stream connection."))}});return()=>{b()}},[e,U,g]);const O=s?.status==="running"||s?.status==="starting";Or(U,nt,{enabled:O});const j=n.useCallback(async(d,l)=>{v.current+=1;const b=v.current;try{let p;const w=typeof l=="string"&&l.length>0,x=s?.config?.cwd??".";if(!(w&&l!==x)&&g&&typeof K(()=>Je)=="function")p=await Je(g,e);else{const ne=await Qe({command:d,cwd:l},e);p=ee(ne)}if(v.current!==b)return;i(p),h(null)}catch(p){if(v.current!==b)return;throw h(J(p)),p}},[e,s?.config?.cwd,g]),H=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;if(g&&typeof K(()=>Xe)=="function")l=await Xe(g,e);else{const b=await it(e);l=ee(b)}if(v.current!==d)return;i(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e,g]),I=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;if(g&&typeof K(()=>Ke)=="function")l=await Ke(g,e);else{const b=await ot(e);l=ee(b)}if(v.current!==d)return;i(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e,g]),B=n.useCallback(async d=>{v.current+=1;const l=v.current;try{let b;if(g&&typeof K(()=>Ge)=="function")b=await Ge(g,d,e);else{const p=await mr({url:d},e);b={url:p.manualUrl??p.previewUrl??p.detectedUrl??null,source:p.manualUrl?"manual":"auto"}}if(v.current!==l)return;i(p=>p?{...p,previewUrl:b.url??void 0}:null),h(null)}catch(b){if(v.current!==l)return;throw h(J(b)),b}},[e,g]),P=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;try{l=await Le(e)}catch{l=(await Ze(e)).map(p=>({name:p.name,command:p.command,cwd:p.cwd,scriptName:p.scriptName,packagePath:p.packagePath}))}if(v.current!==d)return;N(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e]),V=n.useCallback(async(d,l)=>{if(typeof d!="string"&&!g)try{const w=d,x=await Qe({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),R=ee(x);i(R),u([R]),h(null);return}catch(w){throw h(J(w)),w}const b=typeof d=="string"?d:d.command,p=typeof d=="string"?l:d.cwd;await j(b,p)},[e,j,g]),c=n.useCallback(async()=>{await H()},[H]),M=n.useCallback(async()=>{await I()},[I]),F=n.useCallback(async d=>{await B(d)},[B]),W=n.useCallback(async()=>{await P()},[P]),D=n.useCallback(async()=>{await U()},[U]),S=at(s),y=s?{...s,pid:s.runtime?.pid}:null;return{session:s,sessions:a,logs:f,detectedCommands:C,previewUrl:S,isLoading:$,error:E,startServer:j,stopServer:H,restartServer:I,setPreviewUrl:B,detectCommands:P,refresh:U,candidates:C,serverState:y,loading:$,start:V,stop:c,restart:M,setManualUrl:F,detect:W,refreshStatus:D}}const er=500,rr=100;function hr(e){return e.length>er?e.slice(-er):e}function gr(e){return e==="stderr"?"stderr":"stdout"}function fe(e){try{return JSON.parse(e.data)}catch{return null}}function he(e,t){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:t,text:typeof e.text=="string"?e.text:"",stream:gr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function ct(e,t){return{id:t,text:e,stream:"stdout",timestamp:""}}function Ue(e,t){if(t.length===0)return e;const s=[...e],i=new Set(e.map(a=>a.id));for(const a of t)i.has(a.id)||(i.add(a.id),s.push(a));return s.sort((a,u)=>a.id-u.id),hr(s)}function dt(e,t){const[s,i]=n.useState([]),[a,u]=n.useState(!1),[f,m]=n.useState(!1),[C,N]=n.useState(!1),[$,L]=n.useState(null),E=n.useRef(null),h=n.useRef(!1),v=n.useRef(0),g=n.useRef(0),k=n.useRef(e),A=n.useRef(t),U=n.useRef(0),O=n.useRef(1);(k.current!==e||A.current!==t)&&(k.current=e,A.current=t,v.current++,le({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,U.current=0,O.current=1,i([]),u(!1),m(!1),N(!1),L(null),E.current&&(E.current(),E.current=null)),n.useEffect(()=>{if(!t){E.current&&(E.current(),E.current=null);return}const P=v.current,V=++g.current;h.current=!1,u(!0);const c=(D,S)=>{const y=hr(D);i(y),L(S),N(S!==null?S>y.length:!1);const d=y.length>0?y[y.length-1].id:0;U.current=d,O.current=d+1},M=D=>{if(h.current||v.current!==P||!D||typeof D!="object")return;const S=D.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const d=S.filter(l=>typeof l=="string").map((l,b)=>ct(l,b+1));c(d,d.length);return}const y=S.filter(d=>!!d&&typeof d=="object").map((d,l)=>he(d,l+1));c(y,y.length)},F=D=>{if(h.current||v.current!==P)return;const S=typeof D.text=="string"?D.text:typeof D.line=="string"?D.line:null;if(!S)return;const y=O.current,d=typeof D.id=="number"&&Number.isFinite(D.id)?D.id:y,l={id:d,text:S,stream:gr(D.stream),timestamp:typeof D.timestamp=="string"?D.timestamp:""};U.current=Math.max(U.current,d),O.current=Math.max(O.current,d+1),i(b=>Ue(b,[l])),L(b=>b===null?b:Math.max(b+1,l.id))};async function W(){try{const S=await Ee({maxLines:rr},e);if(h.current||v.current!==P||g.current!==V)return;const y=S.lines.map((d,l)=>he(d,l+1));c(y,S.totalLines)}catch{if(h.current||v.current!==P||g.current!==V)return;c([],null)}finally{!h.current&&v.current===P&&g.current===V&&u(!1)}const D=Pe(e);E.current=ir(D,{events:{"dev-server:log":S=>{const y=fe(S);y&&F(y)},log:S=>{const y=fe(S);y&&F(y)},history:S=>{const y=fe(S);M(y)},"dev-server:history":S=>{const y=fe(S);M(y)}},onReconnect:()=>{le({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:U.current??null,sseChannel:D,reason:"history-replay"}),!(h.current||v.current!==P)&&Ee({lastEventId:U.current,maxLines:50},e).then(S=>{if(h.current||v.current!==P)return;const y=S.lines.map((d,l)=>he(d,O.current+l));if(y.length>0){const d=y[y.length-1].id;U.current=Math.max(U.current,d),O.current=Math.max(O.current,d+1)}i(d=>Ue(d,y)),L(S.totalLines)}).catch(()=>{})}}),le({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:D})}return W(),()=>{h.current=!0,E.current&&(E.current(),E.current=null)}},[t,e]);const H=n.useCallback(async()=>{if(!t||f)return;const P=v.current,V=s.length;m(!0);try{const c=await Ee({maxLines:rr,offset:V},e);if(h.current||v.current!==P)return;const M=c.lines.map((F,W)=>he(F,W+1));i(F=>Ue(M,F)),N(c.totalLines>V+M.length),L(c.totalLines)}catch{}finally{m(!1)}},[t,s.length,f,e]),I=n.useCallback(()=>{i([])},[]),B=E.current!==null&&!a&&!h.current;return{entries:s,loading:a,loadingMore:f,hasMore:C,total:$,loadMore:H,clear:I,logs:s,isStreaming:B,clearLogs:I}}const vt="This preview appears to block iframe embedding. Open it in a new tab instead.",ut="The preview URL could not be loaded. Verify the server is running and the URL is correct.",mt="Preview is taking longer than expected and may block iframe embedding.";function pt(e){return e==="blocked"?vt:e==="error"?ut:null}function ft(e,t={}){const{loadTimeoutMs:s=1e4,detectionMethod:i=null}=t,a=n.useRef(null),u=n.useRef(null),[f,m]=n.useState("unknown"),[C,N]=n.useState(null),[$]=n.useState(i),L=n.useCallback(()=>{u.current!==null&&(window.clearTimeout(u.current),u.current=null)},[]),E=n.useCallback(j=>{m(j),N(pt(j))},[]),h=n.useCallback(()=>{m("blocked"),N(mt)},[]);n.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let j=!1;return queueMicrotask(()=>{j||(m("loading"),N(null))}),()=>{j=!0,L()}},[L,e]),n.useEffect(()=>{if(f!=="loading"){L();return}const j=setTimeout(()=>{u.current=null,h()},s);return u.current=j,()=>{clearTimeout(j),u.current===j&&(u.current=null)}},[L,f,s,h]);const v=n.useCallback(()=>{const j=a.current;if(!j){E("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){E("blocked");return}}catch{}E("embedded")},[E]),g=n.useCallback(()=>{E("error")},[E]);n.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[L]);const k=n.useCallback(()=>{L(),m("unknown"),N(null)},[L]),A=k,U=n.useMemo(()=>f==="embedded",[f]),O=n.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:U,isBlocked:O,blockReason:C,detectionMethod:$,iframeRef:a,resetEmbedStatus:k,setEmbedStatus:E,retry:A,embedContext:C,handleIframeLoad:v,handleIframeError:g}}const ht=/\x1b\[[0-9;]*m/g,gt=50;function wt(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=gt}function Ae(e){return e.replace(ht,"")}function bt(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?"":t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function xt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function yt(e){if(e.stream==="stderr")return"error";const t=Ae(e.text).toLowerCase();return/\b(warn|warning)\b/.test(t)?"warn":/\b(error|fatal)\b/.test(t)?"error":"info"}function St(e,t){if(!t)return e;const s=new RegExp(`(${xt(t)})`,"ig"),i=e.split(s),a=t.toLowerCase();return r.jsx(r.Fragment,{children:i.map((u,f)=>u.toLowerCase()===a?r.jsx("mark",{children:u},`${u}-${f}`):r.jsx("span",{children:u},`${u}-${f}`))})}function Nt({entries:e,loading:t,loadingMore:s,hasMore:i,total:a,onLoadMore:u,isRunning:f}){const{t:m}=we("app"),C=n.useRef(null),N=n.useRef(e.length),$=n.useRef(f),[L,E]=n.useState(!1),[h,v]=n.useState(!1),g=n.useRef(!1),[k,A]=n.useState(""),[U,O]=n.useState("all"),j=n.useMemo(()=>U==="all"?e:e.filter(c=>yt(c)===U),[e,U]),H=n.useMemo(()=>{const c=k.trim().toLowerCase();return c?j.filter(M=>Ae(M.text).toLowerCase().includes(c)):j},[j,k]),I=H.length,B=n.useCallback(c=>{g.current=c,v(c)},[]),P=n.useCallback(()=>{const c=C.current;c&&(c.scrollTop=c.scrollHeight,B(!1))},[B]);n.useEffect(()=>{const c=$.current,M=N.current,F=e.length>M;f&&(!c||!h&&F)&&P(),$.current=f,N.current=e.length},[e.length,f,h,P]);const V=n.useCallback(()=>{const c=C.current;c&&B(!wt(c))},[B]);return n.useEffect(()=>{t||e.length===0||!h&&f&&P()},[e,f,h,t,P]),n.useEffect(()=>{const c=C.current;if(!c||!f||typeof MutationObserver>"u")return;const M=new MutationObserver(()=>{g.current||P()});return M.observe(c,{childList:!0,characterData:!0,subtree:!0}),()=>M.disconnect()},[f,P]),t&&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(ge,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${L?" 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:[a!==null?`${e.length}/${a}`:`${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:U,onChange:c=>O(c.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(Fr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:k,onChange:c=>A(c.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),k.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:I,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>E(c=>!c),"data-testid":"devserver-log-fullscreen-toggle","aria-label":L?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:L?r.jsx(zr,{size:14}):r.jsx($r,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[i&&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:u,disabled:s,"data-testid":"devserver-log-load-more-button",children:s?r.jsxs(r.Fragment,{children:[r.jsx(ge,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:C,className:"devserver-log-viewer__content",onScroll:V,"data-testid":"devserver-log-content",children:[!t&&H.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."):j.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),H.map(c=>{const M=Ae(c.text),F=bt(c.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[F&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:F}),c.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:Hr(St(M,k.trim()))})]},c.id)})]}),h&&f&&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(Br,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const kt="devserver-preview-iframe";function Ct({url:e,embedStatus:t,onEmbedStatusChange:s,iframeRef:i,blockReason:a,onRetry:u,className:f=kt,embedContext:m}){const{t:C}=we("app"),N=a??m??null,[$,L]=n.useState(0);n.useEffect(()=>{!e||t!=="unknown"||(L(g=>g+1),s("loading"))},[t,s,e]);const E=n.useCallback(()=>{const g=i.current;if(!g){s("embedded");return}try{if(g.contentWindow?.location?.href==="about:blank"&&g.src!=="about:blank"){s("blocked");return}}catch{}s("embedded")},[i,s]),h=n.useCallback(g=>{g.stopPropagation(),s("error")},[s]),v=n.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:i,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:E,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${$}`),t==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(ge,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:C("preview.loading","Loading preview...")})]}),t==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(or,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:C("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:C("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:v,children:C("preview.openInNewTab","Open in new tab")}),u&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:u,children:C("actions.retry","Retry")})]})]}),t==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(lr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:C("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:C("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:v,children:C("preview.openInNewTab","Open in new tab")}),u&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:u,children:C("actions.retry","Retry")})]})]})]}):null}function Et(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 Lt=480;function jt(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function wr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const t=e.parentElement;return t?.classList.contains("right-dock__body")?t:null}function Rt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function Ut(e){if(!e||jt())return!1;const t=wr(e);return t?Rt(t)<=Lt:!1}function Dt(e){const[t,s]=n.useState(!1);return n.useEffect(()=>{const i=e.current;if(!i){s(!1);return}const a=wr(i),u=()=>s(Ut(i));if(u(),!a||typeof ResizeObserver>"u")return window.addEventListener("resize",u),()=>window.removeEventListener("resize",u);const f=new ResizeObserver(u);return f.observe(a),window.addEventListener("resize",u),()=>{f.disconnect(),window.removeEventListener("resize",u)}},[e]),t}let De=!1;function tr(e){return e instanceof Error?e.message:String(e)}function br(e){return e==="."?"root":e}function sr(e){return e?e==="root"?".":e:null}function nr(e,t,s){return!t||e.scriptName!==t?!1:s?br(e.cwd)===s:!0}function Pt(e){return e.cwd==="."?"root":e.cwd}function Mt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function $t({addToast:e,projectId:t,tasks:s,columnFlagsByTaskId:i}){const{t:a}=we("app");n.useEffect(()=>(le({view:"DevServerView",trigger:De?"route-active":"remount",projectId:t,replayAttempted:!1}),De=!1,()=>{De=!0,le({view:"DevServerView",trigger:"route-inactive",projectId:t,replayAttempted:!1})}),[t]);const{session:u,detectedCommands:f,previewUrl:m,isLoading:C,error:N,startServer:$,stopServer:L,restartServer:E,setPreviewUrl:h,detectCommands:v,refresh:g}=lt(t),k=u?.status??"stopped",A=k==="running"||k==="starting",U=Et(a),O=U[k]??U.stopped,{entries:j,loading:H,loadingMore:I,hasMore:B,total:P,loadMore:V}=dt(t,!!t),c=m,M=u?.config?.cwd??null,F=n.useRef(null),W=Dt(F),[D,S]=n.useState(!0),[y,d]=n.useState(()=>me(t)?.commandInput??""),[l,b]=n.useState(""),[p,w]=n.useState(()=>me(t)?.selectedScript??null),[x,R]=n.useState(()=>me(t)?.selectedTaskId??null),ne=n.useRef(t);n.useEffect(()=>{if(ne.current===t)return;ne.current=t;const o=me(t);d(o?.commandInput??""),w(o?.selectedScript??null),R(o?.selectedTaskId??null)},[t]),n.useEffect(()=>{ne.current===t&&Vr({selectedScript:p,selectedTaskId:x,commandInput:y},t)},[y,t,p,x]);const[G,Te]=n.useState(null),Y=n.useMemo(()=>(s??[]).filter(o=>Wr(i?.get(o.id),o.column)&&typeof o.worktree=="string"&&o.worktree.length>0),[s,i]),X=n.useMemo(()=>Y.find(o=>o.id===x)??null,[Y,x]);n.useEffect(()=>{x&&!Y.some(o=>o.id===x)&&R(null)},[Y,x]);const[ae,xr]=n.useState("embedded"),[ie,xe]=n.useState(!1),Oe=n.useRef(null),ye=n.useRef(null),yr=ae==="embedded"?c:null,{embedStatus:q,setEmbedStatus:Sr,resetEmbedStatus:ce,iframeRef:re,isEmbedded:Nr,isBlocked:Se,blockReason:Ne,retry:Fe}=ft(yr),[ze,Q]=n.useState(!1),$e=n.useRef(q);n.useEffect(()=>{const o=$e.current!==q;Se&&o&&Q(!0),q==="embedded"&&Q(!1),$e.current=q},[q,Se]),n.useEffect(()=>{Q(!1)},[c]);const de=n.useMemo(()=>{if(!p)return null;const o=sr(M);return f.find(_=>!(_.scriptName!==p||o&&_.cwd!==o||u?.config?.command&&_.command!==u.config.command))??f.find(_=>nr(_,p,M))??null},[f,u?.config?.command,p,M]);n.useEffect(()=>{typeof v=="function"&&v().catch(o=>{e(tr(o),"error")})},[e,v]),n.useEffect(()=>{if(p){S(!1);return}S(!0)},[p]),n.useEffect(()=>{if(u?.status==="running"||u?.status==="starting"){u.config?.command?.trim().length>0&&d(u.config.command);return}if(de){d(o=>o.trim().length>0?o:de.command);return}f.length>0&&d(o=>o.trim().length>0?o:f[0]?.command??"")},[f,de,u?.config?.command,u?.status]),n.useEffect(()=>{b(c??"")},[c]);const ve=n.useCallback(()=>{xe(!1),window.requestAnimationFrame(()=>Oe.current?.focus())},[]),kr=Ir(ve);n.useEffect(()=>{if(!ie)return;ye.current?.focus();const o=_=>{if(_.key==="Escape"){ve();return}if(_.key!=="Tab")return;const oe=Array.from(ye.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(Ve=>!Ve.hasAttribute("disabled")&&Ve.getAttribute("aria-hidden")!=="true"),Z=oe[0],Ce=oe.at(-1);!Z||!Ce||(_.shiftKey&&document.activeElement===Z?(_.preventDefault(),Ce.focus()):!_.shiftKey&&document.activeElement===Ce&&(_.preventDefault(),Z.focus()))};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[ve,ie]),n.useEffect(()=>{!W&&ie&&xe(!1)},[W,ie]);const ke=n.useCallback(()=>{c&&window.open(c,"_blank","noopener,noreferrer")},[c]),He=n.useCallback(()=>{Q(!1),Fe()},[Fe]),Cr=n.useCallback(()=>{try{const o=re.current;if(o?.contentWindow){o.contentWindow.location.reload(),Q(!1),ce();return}}catch{}if(!(!c||!re.current))try{const o=new URL(c);o.searchParams.set("_t",Date.now().toString()),re.current.src=o.toString(),Q(!1),ce()}catch{re.current.src=c,Q(!1),ce()}},[c,re,ce]),ue=n.useCallback(async(o,_,oe)=>{Te(o);try{await _(),e(oe,"success")}catch(Z){e(tr(Z),"error")}finally{Te(null)}},[e]),Er=n.useCallback(o=>{w(o.scriptName),S(!1),d(o.command),e(a("devserver.toast.selectedScript","Selected {{name}} script.",{name:o.scriptName}),"success")},[e]),Lr=n.useCallback(()=>{w(null),S(!0),e(a("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),jr=n.useCallback(o=>{A&&o&&o!==x&&e(a("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),R(o)},[e,A,x,a]),Rr=()=>{const o=y.trim();if(o.length===0){e(a("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const _=sr(M)??".",Z=X?.worktree??null??de?.cwd??_;ue("start",()=>$(o,Z),a("devserver.toast.started","Dev server started."))},Ur=()=>{ue("stop",L,a("devserver.toast.stopped","Dev server stopped."))},Dr=()=>{ue("restart",E,a("devserver.toast.restarted","Dev server restarted."))},Pr=()=>{const o=l.trim(),_=o.length>0?o:null;ue("preview",()=>h(_),_?a("devserver.toast.previewUpdated","Preview URL updated."):a("devserver.toast.previewCleared","Preview URL override cleared."))},Mr=n.useCallback(()=>{N&&g()},[N,g]),_r=k==="starting"||k==="running"||G!==null,Ar=k==="stopped"||G!==null,Tr=k==="stopped"||k==="starting"||G!==null,Be=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(We,{size:14}),r.jsx("span",{children:a("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:c??a("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[a("devserver.auto","Auto"),c?` · ${c}`:a("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>xr(o=>o==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:ae==="embedded"?a("devserver.externalOnly","External only"):a("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:a("devserver.openInNewTab","Open in new tab"),onClick:ke,disabled:!c,"data-testid":"devserver-preview-open-tab",children:r.jsx(Qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:a("devserver.refreshPreview","Refresh preview"),onClick:Cr,disabled:!c,"data-testid":"devserver-preview-refresh",children:r.jsx(Zr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":q,"data-embedded":Nr?"true":"false",children:[!c&&!A&&r.jsx("p",{className:"devserver-preview-empty",children:a("devserver.startDevServer","Start a dev server to see a live preview here.")}),!c&&A&&r.jsx("p",{className:"devserver-preview-empty",children:a("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),c&&ae==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:a("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:ke,"data-testid":"devserver-preview-external-open-tab",children:a("devserver.openInNewTab","Open in new tab")})]}),c&&ae==="embedded"&&ze&&Se&&r.jsxs("div",{className:q==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[q==="error"?r.jsx(lr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(or,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:q==="error"?a("devserver.previewFailed","Preview failed"):a("devserver.previewBlocked","Preview blocked")}),Ne&&r.jsx("p",{className:"devserver-preview-blocked-context",children:Ne})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:a("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:ke,"data-testid":"devserver-preview-fallback-open-tab",children:a("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:He,"data-testid":"devserver-preview-fallback-retry",children:a("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),c&&ae==="embedded"&&!ze&&r.jsx(Ct,{url:c,embedStatus:q,onEmbedStatusChange:Sr,iframeRef:re,blockReason:Ne,onRetry:He})]})]});return r.jsxs("div",{ref:F,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":W?"true":"false",children:[r.jsx(qr,{icon:Jr,title:a("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 ${O.className}`,"data-testid":"dev-server-status-badge",children:O.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Rr,disabled:_r,"data-testid":"dev-server-start-button",children:[r.jsx(Xr,{size:14}),r.jsx("span",{children:G==="start"?a("devserver.starting","Starting..."):a("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ur,disabled:Ar,"data-testid":"dev-server-stop-button",children:[r.jsx(Kr,{size:14}),r.jsx("span",{children:G==="stop"?a("devserver.stopping","Stopping..."):a("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Dr,disabled:Tr,"data-testid":"dev-server-restart-button",children:[r.jsx(Gr,{size:14}),r.jsx("span",{children:G==="restart"?a("devserver.restarting","Restarting..."):a("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":a("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:a("devserver.configuration","Configuration")}),C&&r.jsx("span",{className:"dev-server-muted",children:a("devserver.loading","Loading...")})]}),C&&!u&&f.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(ge,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:a("devserver.loadingConfig","Loading dev server configuration...")})]}),N&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:N}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Mr,children:a("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:a("devserver.scriptSelection","Script Selection")}),p&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:p}),r.jsx("span",{className:"dev-server-candidate-source",children:M??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>S(!0),"data-testid":"dev-server-change-selection",children:a("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Lr,"data-testid":"dev-server-clear-selection",children:a("devserver.clear","Clear")})]}),D&&f.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:a("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),D&&f.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:f.map(o=>{const _=nr(o,p,M);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${_?"dev-server-candidate--selected":""}`,onClick:()=>Er(o),"data-testid":`dev-server-candidate-${o.scriptName}-${br(o.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:o.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Mt(o.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:Pt(o)})]},`${o.cwd}::${o.scriptName}::${o.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:a("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:a("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:x??"",onChange:o=>jr(o.target.value.length>0?o.target.value:null),disabled:Y.length===0,"aria-label":a("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:a("devserver.projectRootNoTask","Project root (no task)")}),Y.map(o=>r.jsx("option",{value:o.id,children:o.title?`${o.id} — ${o.title}`:o.id},o.id))]}),Y.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:a("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),X&&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:X.title?`${X.id} — ${X.title}`:X.id})}),r.jsx("p",{className:"dev-server-task-description",children:X.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:a("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:X.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:a("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:y,onChange:o=>d(o.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:k==="running"||k==="starting"})]}),(k==="running"||k==="starting")&&u&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:a("devserver.runningCommand","Running command")}),r.jsx("code",{children:u.config?.command??y})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:a("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:l,onChange:o=>b(o.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Pr,disabled:G==="preview","data-testid":"dev-server-set-preview",children:a("devserver.save","Save")})]}),c&&r.jsx("p",{className:"dev-server-preview-hint",children:a("devserver.autoDetected","Auto-detected: {{url}}",{url:c})})]}),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":a("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:a("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:a("devserver.lines","{{count}} lines",{count:P??j.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(Nt,{entries:j,loading:H,loadingMore:I,hasMore:B,total:P,onLoadMore:V,isRunning:A})})]})}),W?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":a("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(We,{size:14}),r.jsx("span",{children:a("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:c??a("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:c||a("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:c?a("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):a("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:Oe,onClick:()=>xe(!0),"data-testid":"devserver-preview-modal-open",children:a("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":a("devserver.previewLabel","Dev server preview"),children:Be()}),W&&ie&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...kr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:ye,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:a("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ve,"aria-label":a("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Yr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:Be()})]})})]})}export{$t as DevServerView};
|
|
1
|
+
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a as z,w as T,d4 as ar,bb as ir,aP as Or,cU as le,L as ge,az as Fr,d5 as zr,d6 as $r,d7 as Hr,j as Br,d8 as or,aW as lr,d9 as me,da as Vr,db as Wr,dc as Ir,V as qr,dd as Jr,c4 as Xr,c6 as Kr,de as Gr,B as We,X as Yr,aK as Qr,R as Zr}from"./index-CiVIbypZ.js";import{u as we}from"./vendor-i18n-Duky4gdQ.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const t=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",s=t==="root"?".":t,i=e.name,a=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():s,u=typeof e.confidence=="number"?e.confidence:1,f=t==="root"?"root":t,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:i,packagePath:a,confidence:u,cwd:s,source:t,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${i} (${f})`}}function se(e){const t=e.status,s=t==="starting"||t==="running"||t==="failed"||t==="stopped"?t:"stopped",i=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,a=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:s,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:i,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:i,detectedPort:e.detectedPort,manualPreviewUrl:a,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:a,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function et(e,t){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:t,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 rt(e){const s=(Array.isArray(e.lines)?e.lines:[]).map((i,a)=>et(i,a+1));return{lines:s,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:s.length}}function tt(e,t){const s=typeof t.maxLines=="number"&&Number.isFinite(t.maxLines)?Math.max(1,Math.floor(t.maxLines)):100,i=typeof t.offset=="number"&&Number.isFinite(t.offset)?Math.max(0,Math.floor(t.offset)):0,a=typeof t.lastEventId=="number"&&Number.isFinite(t.lastEventId)?Math.max(0,Math.floor(t.lastEventId)):null,u=e.length,f=e.map((N,$)=>({id:$+1,text:N,stream:"stdout",timestamp:""}));if(a!==null)return{lines:f.filter(N=>N.id>a).slice(0,s),totalLines:u};const m=Math.max(u-i,0),C=Math.max(m-s,0);return{lines:f.slice(C,m),totalLines:u}}function qe(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function cr(e){try{const t=await z(T("/dev-server/candidates",e));return qe(t)}catch(t){if(t instanceof Error&&/\/dev-server\/candidates/.test(t.message)){const s=await z(T("/dev-server/detect",e));return qe(s)}throw t}}function be(e){return z(T("/dev-server/status",e)).then(se)}async function Ee(e={},t){const s=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&s.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&s.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&s.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const i=s.size>0?`?${s.toString()}`:"";try{const a=await z(T(`/dev-server/logs/history${i}`,t));return rt(a)}catch(a){if(a instanceof Error&&/\/dev-server\/logs\/history/.test(a.message)){const u=await be(t);return tt(u.logs,e)}throw a}}function dr(e,t){const s=e.cwd??e.packagePath??".",i=e.scriptName;return z(T("/dev-server/start",t),{method:"POST",body:JSON.stringify({command:e.command,scriptName:i,scriptId:i,cwd:s,packagePath:e.packagePath})}).then(se)}function vr(e){return z(T("/dev-server/stop",e),{method:"POST"}).then(se)}function ur(e){return z(T("/dev-server/restart",e),{method:"POST"}).then(se)}async function mr(e,t){const s=typeof e=="string"?{url:e}:e;try{const i=await z(T("/dev-server/preview-url",t),{method:"POST",body:JSON.stringify(s)});return se(i)}catch(i){if(i instanceof Error&&/\/dev-server\/preview-url/.test(i.message)){const a=await z(T("/dev-server/preview-url",t),{method:"PUT",body:JSON.stringify(s)});return se(a)}throw i}}function Pe(e){return ar(T("/dev-server/logs/stream",e))}async function Me(e){try{return(await z(T("/devserver",e))).sessions??[]}catch{try{const t=await be(e);return[{config:{id:t.id??"default",name:t.name??"Dev Server",command:t.command??"",cwd:t.cwd??"."},status:t.status,runtime:t.pid?{pid:t.pid,startedAt:t.startedAt??new Date().toISOString(),exitCode:t.exitCode??void 0,previewUrl:t.previewUrl}:void 0,previewUrl:t.previewUrl??t.detectedUrl??void 0,logHistory:(t.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function pr(e,t){try{return await z(T(`/devserver/${encodeURIComponent(e)}`,t))}catch{try{const s=await be(t);return!e||e==="default"||e===s.id?{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(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Je(e,t){try{return await z(T(`/devserver/${encodeURIComponent(e)}/start`,t),{method:"POST"})}catch{const s=await dr({command:""},t);return{config:{id:s.id??e,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(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,t){try{return await z(T(`/devserver/${encodeURIComponent(e)}/stop`,t),{method:"POST"})}catch{const s=await vr(t);return{config:{id:s.id??e,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(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Ke(e,t){try{return await z(T(`/devserver/${encodeURIComponent(e)}/restart`,t),{method:"POST"})}catch{const s=await ur(t);return{config:{id:s.id??e,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(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Ge(e,t,s){try{const i=await z(T(`/devserver/${encodeURIComponent(e)}/preview`,s),{method:"POST",body:JSON.stringify({url:t})});return{url:i.url??null,source:i.source??null}}catch{const i=await mr({url:t},s);return{url:i.previewUrl??i.manualUrl??null,source:"manual"}}}async function Le(e){try{return(await z(T("/devserver/detect",e))).candidates??[]}catch{try{return(await cr(e)).map(s=>({name:s.name,command:s.command,cwd:s.cwd,scriptName:s.scriptName,packagePath:s.packagePath}))}catch{return[]}}}function st(e,t){return ar(T(`/devserver/${encodeURIComponent(e)}/logs/stream`,t))}const _e=500,nt=3e3;function J(e){return e instanceof Error?e.message:String(e)}function fr(e){return e.length<=_e?e:e.slice(-_e)}function je(e,t){return fr([...e,t])}function te(e){try{return JSON.parse(e)}catch{return null}}function pe(e){const t=e.text??"";return e.stream==="stderr"?`[stderr] ${t}`:t}function at(e){return e?.previewUrl??null}async function Ye(e){return be(e)}async function Qe(e,t){return dr(e,t)}async function it(e){return vr(e)}async function ot(e){return ur(e)}async function Ze(e){return cr(e)}function K(e){try{return e()}catch{return null}}function Re(){return typeof K(()=>Me)=="function"&&typeof K(()=>pr)=="function"}function ee(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(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}function lt(e){const{t}=we("app"),[s,i]=n.useState(null),[a,u]=n.useState([]),[f,m]=n.useState([]),[C,N]=n.useState([]),[$,L]=n.useState(!0),[E,h]=n.useState(null),v=n.useRef(0),[g,k]=n.useState(null),A=n.useCallback(d=>{if(i(d),d?.logHistory){const l=d.logHistory.slice(-_e).map(pe);m(l)}},[]),U=n.useCallback(async()=>{const d=v.current;try{if(Re())if(g){const l=await pr(g,e);if(v.current!==d)return;A(l)}else{const l=await Me(e);if(v.current!==d)return;u(l),l.length>0&&(k(l[0].config.id),A(l[0]))}else{const l=await Ye(e);if(v.current!==d)return;const b=ee(l);u([b]),A(b)}h(null)}catch(l){if(v.current!==d)return;h(J(l))}},[A,e,g]);n.useEffect(()=>{v.current+=1;const d=v.current;i(null),u([]),m([]),N([]),L(!0),h(null),k(null),(async()=>{try{const[b,p]=await Promise.allSettled([Re()?Me(e):Ye(e).then(x=>[ee(x)]),typeof K(()=>Le)=="function"?Le(e):Ze(e).then(x=>x.map(R=>({name:R.name,command:R.command,cwd:R.cwd,scriptName:R.scriptName,packagePath:R.packagePath})))]);if(v.current!==d)return;let w=null;if(b.status==="fulfilled"){const x=b.value;if(u(x),x.length>0){const R=x[0];Re()&&k(R.config.id),A(R)}}else w=J(b.reason);p.status==="fulfilled"&&N(p.value),w&&h(w)}catch(b){if(v.current!==d)return;h(J(b))}finally{v.current===d&&L(!1)}})()},[A,e]),n.useEffect(()=>{const d=g?st(g,e):typeof K(()=>Pe)=="function"?Pe(e):null;if(!d)return;const l=v.current,b=ir(d,{events:{history:p=>{if(v.current!==l)return;const w=te(p.data);if(w?.lines){const x=w.lines.map(pe);m(fr(x))}},log:p=>{if(v.current!==l)return;const w=te(p.data);if(w){const x=typeof w.line=="string"?w.line:pe(w);m(R=>je(R,x))}},"dev-server:log":p=>{if(v.current!==l)return;const w=te(p.data);if(w){const x=typeof w.line=="string"?w.line:pe(w);m(R=>je(R,x))}},"dev-server:output":p=>{if(v.current!==l)return;const w=te(p.data);w?.line&&m(x=>je(x,w.line))},status:p=>{if(v.current!==l)return;const w=te(p.data),x=w?.status;x&&i(R=>R&&{...R,status:x,runtime:w.pid?{...R.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:R.runtime})},"dev-server:status":p=>{if(v.current!==l)return;const w=te(p.data);if(w?.status){const x=ee(w);i(x),u([x])}},stopped:()=>{v.current},failed:()=>{v.current}},onReconnect:()=>{v.current===l&&U()},onError:()=>{v.current===l&&h(p=>p??t("devserver.lostConnection","Lost log stream connection."))}});return()=>{b()}},[e,U,g]);const O=s?.status==="running"||s?.status==="starting";Or(U,nt,{enabled:O});const j=n.useCallback(async(d,l)=>{v.current+=1;const b=v.current;try{let p;const w=typeof l=="string"&&l.length>0,x=s?.config?.cwd??".";if(!(w&&l!==x)&&g&&typeof K(()=>Je)=="function")p=await Je(g,e);else{const ne=await Qe({command:d,cwd:l},e);p=ee(ne)}if(v.current!==b)return;i(p),h(null)}catch(p){if(v.current!==b)return;throw h(J(p)),p}},[e,s?.config?.cwd,g]),H=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;if(g&&typeof K(()=>Xe)=="function")l=await Xe(g,e);else{const b=await it(e);l=ee(b)}if(v.current!==d)return;i(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e,g]),I=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;if(g&&typeof K(()=>Ke)=="function")l=await Ke(g,e);else{const b=await ot(e);l=ee(b)}if(v.current!==d)return;i(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e,g]),B=n.useCallback(async d=>{v.current+=1;const l=v.current;try{let b;if(g&&typeof K(()=>Ge)=="function")b=await Ge(g,d,e);else{const p=await mr({url:d},e);b={url:p.manualUrl??p.previewUrl??p.detectedUrl??null,source:p.manualUrl?"manual":"auto"}}if(v.current!==l)return;i(p=>p?{...p,previewUrl:b.url??void 0}:null),h(null)}catch(b){if(v.current!==l)return;throw h(J(b)),b}},[e,g]),P=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;try{l=await Le(e)}catch{l=(await Ze(e)).map(p=>({name:p.name,command:p.command,cwd:p.cwd,scriptName:p.scriptName,packagePath:p.packagePath}))}if(v.current!==d)return;N(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e]),V=n.useCallback(async(d,l)=>{if(typeof d!="string"&&!g)try{const w=d,x=await Qe({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),R=ee(x);i(R),u([R]),h(null);return}catch(w){throw h(J(w)),w}const b=typeof d=="string"?d:d.command,p=typeof d=="string"?l:d.cwd;await j(b,p)},[e,j,g]),c=n.useCallback(async()=>{await H()},[H]),M=n.useCallback(async()=>{await I()},[I]),F=n.useCallback(async d=>{await B(d)},[B]),W=n.useCallback(async()=>{await P()},[P]),D=n.useCallback(async()=>{await U()},[U]),S=at(s),y=s?{...s,pid:s.runtime?.pid}:null;return{session:s,sessions:a,logs:f,detectedCommands:C,previewUrl:S,isLoading:$,error:E,startServer:j,stopServer:H,restartServer:I,setPreviewUrl:B,detectCommands:P,refresh:U,candidates:C,serverState:y,loading:$,start:V,stop:c,restart:M,setManualUrl:F,detect:W,refreshStatus:D}}const er=500,rr=100;function hr(e){return e.length>er?e.slice(-er):e}function gr(e){return e==="stderr"?"stderr":"stdout"}function fe(e){try{return JSON.parse(e.data)}catch{return null}}function he(e,t){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:t,text:typeof e.text=="string"?e.text:"",stream:gr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function ct(e,t){return{id:t,text:e,stream:"stdout",timestamp:""}}function Ue(e,t){if(t.length===0)return e;const s=[...e],i=new Set(e.map(a=>a.id));for(const a of t)i.has(a.id)||(i.add(a.id),s.push(a));return s.sort((a,u)=>a.id-u.id),hr(s)}function dt(e,t){const[s,i]=n.useState([]),[a,u]=n.useState(!1),[f,m]=n.useState(!1),[C,N]=n.useState(!1),[$,L]=n.useState(null),E=n.useRef(null),h=n.useRef(!1),v=n.useRef(0),g=n.useRef(0),k=n.useRef(e),A=n.useRef(t),U=n.useRef(0),O=n.useRef(1);(k.current!==e||A.current!==t)&&(k.current=e,A.current=t,v.current++,le({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,U.current=0,O.current=1,i([]),u(!1),m(!1),N(!1),L(null),E.current&&(E.current(),E.current=null)),n.useEffect(()=>{if(!t){E.current&&(E.current(),E.current=null);return}const P=v.current,V=++g.current;h.current=!1,u(!0);const c=(D,S)=>{const y=hr(D);i(y),L(S),N(S!==null?S>y.length:!1);const d=y.length>0?y[y.length-1].id:0;U.current=d,O.current=d+1},M=D=>{if(h.current||v.current!==P||!D||typeof D!="object")return;const S=D.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const d=S.filter(l=>typeof l=="string").map((l,b)=>ct(l,b+1));c(d,d.length);return}const y=S.filter(d=>!!d&&typeof d=="object").map((d,l)=>he(d,l+1));c(y,y.length)},F=D=>{if(h.current||v.current!==P)return;const S=typeof D.text=="string"?D.text:typeof D.line=="string"?D.line:null;if(!S)return;const y=O.current,d=typeof D.id=="number"&&Number.isFinite(D.id)?D.id:y,l={id:d,text:S,stream:gr(D.stream),timestamp:typeof D.timestamp=="string"?D.timestamp:""};U.current=Math.max(U.current,d),O.current=Math.max(O.current,d+1),i(b=>Ue(b,[l])),L(b=>b===null?b:Math.max(b+1,l.id))};async function W(){try{const S=await Ee({maxLines:rr},e);if(h.current||v.current!==P||g.current!==V)return;const y=S.lines.map((d,l)=>he(d,l+1));c(y,S.totalLines)}catch{if(h.current||v.current!==P||g.current!==V)return;c([],null)}finally{!h.current&&v.current===P&&g.current===V&&u(!1)}const D=Pe(e);E.current=ir(D,{events:{"dev-server:log":S=>{const y=fe(S);y&&F(y)},log:S=>{const y=fe(S);y&&F(y)},history:S=>{const y=fe(S);M(y)},"dev-server:history":S=>{const y=fe(S);M(y)}},onReconnect:()=>{le({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:U.current??null,sseChannel:D,reason:"history-replay"}),!(h.current||v.current!==P)&&Ee({lastEventId:U.current,maxLines:50},e).then(S=>{if(h.current||v.current!==P)return;const y=S.lines.map((d,l)=>he(d,O.current+l));if(y.length>0){const d=y[y.length-1].id;U.current=Math.max(U.current,d),O.current=Math.max(O.current,d+1)}i(d=>Ue(d,y)),L(S.totalLines)}).catch(()=>{})}}),le({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:D})}return W(),()=>{h.current=!0,E.current&&(E.current(),E.current=null)}},[t,e]);const H=n.useCallback(async()=>{if(!t||f)return;const P=v.current,V=s.length;m(!0);try{const c=await Ee({maxLines:rr,offset:V},e);if(h.current||v.current!==P)return;const M=c.lines.map((F,W)=>he(F,W+1));i(F=>Ue(M,F)),N(c.totalLines>V+M.length),L(c.totalLines)}catch{}finally{m(!1)}},[t,s.length,f,e]),I=n.useCallback(()=>{i([])},[]),B=E.current!==null&&!a&&!h.current;return{entries:s,loading:a,loadingMore:f,hasMore:C,total:$,loadMore:H,clear:I,logs:s,isStreaming:B,clearLogs:I}}const vt="This preview appears to block iframe embedding. Open it in a new tab instead.",ut="The preview URL could not be loaded. Verify the server is running and the URL is correct.",mt="Preview is taking longer than expected and may block iframe embedding.";function pt(e){return e==="blocked"?vt:e==="error"?ut:null}function ft(e,t={}){const{loadTimeoutMs:s=1e4,detectionMethod:i=null}=t,a=n.useRef(null),u=n.useRef(null),[f,m]=n.useState("unknown"),[C,N]=n.useState(null),[$]=n.useState(i),L=n.useCallback(()=>{u.current!==null&&(window.clearTimeout(u.current),u.current=null)},[]),E=n.useCallback(j=>{m(j),N(pt(j))},[]),h=n.useCallback(()=>{m("blocked"),N(mt)},[]);n.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let j=!1;return queueMicrotask(()=>{j||(m("loading"),N(null))}),()=>{j=!0,L()}},[L,e]),n.useEffect(()=>{if(f!=="loading"){L();return}const j=setTimeout(()=>{u.current=null,h()},s);return u.current=j,()=>{clearTimeout(j),u.current===j&&(u.current=null)}},[L,f,s,h]);const v=n.useCallback(()=>{const j=a.current;if(!j){E("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){E("blocked");return}}catch{}E("embedded")},[E]),g=n.useCallback(()=>{E("error")},[E]);n.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[L]);const k=n.useCallback(()=>{L(),m("unknown"),N(null)},[L]),A=k,U=n.useMemo(()=>f==="embedded",[f]),O=n.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:U,isBlocked:O,blockReason:C,detectionMethod:$,iframeRef:a,resetEmbedStatus:k,setEmbedStatus:E,retry:A,embedContext:C,handleIframeLoad:v,handleIframeError:g}}const ht=/\x1b\[[0-9;]*m/g,gt=50;function wt(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=gt}function Ae(e){return e.replace(ht,"")}function bt(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?"":t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function xt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function yt(e){if(e.stream==="stderr")return"error";const t=Ae(e.text).toLowerCase();return/\b(warn|warning)\b/.test(t)?"warn":/\b(error|fatal)\b/.test(t)?"error":"info"}function St(e,t){if(!t)return e;const s=new RegExp(`(${xt(t)})`,"ig"),i=e.split(s),a=t.toLowerCase();return r.jsx(r.Fragment,{children:i.map((u,f)=>u.toLowerCase()===a?r.jsx("mark",{children:u},`${u}-${f}`):r.jsx("span",{children:u},`${u}-${f}`))})}function Nt({entries:e,loading:t,loadingMore:s,hasMore:i,total:a,onLoadMore:u,isRunning:f}){const{t:m}=we("app"),C=n.useRef(null),N=n.useRef(e.length),$=n.useRef(f),[L,E]=n.useState(!1),[h,v]=n.useState(!1),g=n.useRef(!1),[k,A]=n.useState(""),[U,O]=n.useState("all"),j=n.useMemo(()=>U==="all"?e:e.filter(c=>yt(c)===U),[e,U]),H=n.useMemo(()=>{const c=k.trim().toLowerCase();return c?j.filter(M=>Ae(M.text).toLowerCase().includes(c)):j},[j,k]),I=H.length,B=n.useCallback(c=>{g.current=c,v(c)},[]),P=n.useCallback(()=>{const c=C.current;c&&(c.scrollTop=c.scrollHeight,B(!1))},[B]);n.useEffect(()=>{const c=$.current,M=N.current,F=e.length>M;f&&(!c||!h&&F)&&P(),$.current=f,N.current=e.length},[e.length,f,h,P]);const V=n.useCallback(()=>{const c=C.current;c&&B(!wt(c))},[B]);return n.useEffect(()=>{t||e.length===0||!h&&f&&P()},[e,f,h,t,P]),n.useEffect(()=>{const c=C.current;if(!c||!f||typeof MutationObserver>"u")return;const M=new MutationObserver(()=>{g.current||P()});return M.observe(c,{childList:!0,characterData:!0,subtree:!0}),()=>M.disconnect()},[f,P]),t&&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(ge,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${L?" 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:[a!==null?`${e.length}/${a}`:`${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:U,onChange:c=>O(c.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(Fr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:k,onChange:c=>A(c.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),k.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:I,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>E(c=>!c),"data-testid":"devserver-log-fullscreen-toggle","aria-label":L?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:L?r.jsx(zr,{size:14}):r.jsx($r,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[i&&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:u,disabled:s,"data-testid":"devserver-log-load-more-button",children:s?r.jsxs(r.Fragment,{children:[r.jsx(ge,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:C,className:"devserver-log-viewer__content",onScroll:V,"data-testid":"devserver-log-content",children:[!t&&H.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."):j.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),H.map(c=>{const M=Ae(c.text),F=bt(c.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[F&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:F}),c.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:Hr(St(M,k.trim()))})]},c.id)})]}),h&&f&&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(Br,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const kt="devserver-preview-iframe";function Ct({url:e,embedStatus:t,onEmbedStatusChange:s,iframeRef:i,blockReason:a,onRetry:u,className:f=kt,embedContext:m}){const{t:C}=we("app"),N=a??m??null,[$,L]=n.useState(0);n.useEffect(()=>{!e||t!=="unknown"||(L(g=>g+1),s("loading"))},[t,s,e]);const E=n.useCallback(()=>{const g=i.current;if(!g){s("embedded");return}try{if(g.contentWindow?.location?.href==="about:blank"&&g.src!=="about:blank"){s("blocked");return}}catch{}s("embedded")},[i,s]),h=n.useCallback(g=>{g.stopPropagation(),s("error")},[s]),v=n.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:i,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:E,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${$}`),t==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(ge,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:C("preview.loading","Loading preview...")})]}),t==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(or,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:C("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:C("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:v,children:C("preview.openInNewTab","Open in new tab")}),u&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:u,children:C("actions.retry","Retry")})]})]}),t==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(lr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:C("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:C("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:v,children:C("preview.openInNewTab","Open in new tab")}),u&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:u,children:C("actions.retry","Retry")})]})]})]}):null}function Et(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 Lt=480;function jt(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function wr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const t=e.parentElement;return t?.classList.contains("right-dock__body")?t:null}function Rt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function Ut(e){if(!e||jt())return!1;const t=wr(e);return t?Rt(t)<=Lt:!1}function Dt(e){const[t,s]=n.useState(!1);return n.useEffect(()=>{const i=e.current;if(!i){s(!1);return}const a=wr(i),u=()=>s(Ut(i));if(u(),!a||typeof ResizeObserver>"u")return window.addEventListener("resize",u),()=>window.removeEventListener("resize",u);const f=new ResizeObserver(u);return f.observe(a),window.addEventListener("resize",u),()=>{f.disconnect(),window.removeEventListener("resize",u)}},[e]),t}let De=!1;function tr(e){return e instanceof Error?e.message:String(e)}function br(e){return e==="."?"root":e}function sr(e){return e?e==="root"?".":e:null}function nr(e,t,s){return!t||e.scriptName!==t?!1:s?br(e.cwd)===s:!0}function Pt(e){return e.cwd==="."?"root":e.cwd}function Mt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function $t({addToast:e,projectId:t,tasks:s,columnFlagsByTaskId:i}){const{t:a}=we("app");n.useEffect(()=>(le({view:"DevServerView",trigger:De?"route-active":"remount",projectId:t,replayAttempted:!1}),De=!1,()=>{De=!0,le({view:"DevServerView",trigger:"route-inactive",projectId:t,replayAttempted:!1})}),[t]);const{session:u,detectedCommands:f,previewUrl:m,isLoading:C,error:N,startServer:$,stopServer:L,restartServer:E,setPreviewUrl:h,detectCommands:v,refresh:g}=lt(t),k=u?.status??"stopped",A=k==="running"||k==="starting",U=Et(a),O=U[k]??U.stopped,{entries:j,loading:H,loadingMore:I,hasMore:B,total:P,loadMore:V}=dt(t,!!t),c=m,M=u?.config?.cwd??null,F=n.useRef(null),W=Dt(F),[D,S]=n.useState(!0),[y,d]=n.useState(()=>me(t)?.commandInput??""),[l,b]=n.useState(""),[p,w]=n.useState(()=>me(t)?.selectedScript??null),[x,R]=n.useState(()=>me(t)?.selectedTaskId??null),ne=n.useRef(t);n.useEffect(()=>{if(ne.current===t)return;ne.current=t;const o=me(t);d(o?.commandInput??""),w(o?.selectedScript??null),R(o?.selectedTaskId??null)},[t]),n.useEffect(()=>{ne.current===t&&Vr({selectedScript:p,selectedTaskId:x,commandInput:y},t)},[y,t,p,x]);const[G,Te]=n.useState(null),Y=n.useMemo(()=>(s??[]).filter(o=>Wr(i?.get(o.id),o.column)&&typeof o.worktree=="string"&&o.worktree.length>0),[s,i]),X=n.useMemo(()=>Y.find(o=>o.id===x)??null,[Y,x]);n.useEffect(()=>{x&&!Y.some(o=>o.id===x)&&R(null)},[Y,x]);const[ae,xr]=n.useState("embedded"),[ie,xe]=n.useState(!1),Oe=n.useRef(null),ye=n.useRef(null),yr=ae==="embedded"?c:null,{embedStatus:q,setEmbedStatus:Sr,resetEmbedStatus:ce,iframeRef:re,isEmbedded:Nr,isBlocked:Se,blockReason:Ne,retry:Fe}=ft(yr),[ze,Q]=n.useState(!1),$e=n.useRef(q);n.useEffect(()=>{const o=$e.current!==q;Se&&o&&Q(!0),q==="embedded"&&Q(!1),$e.current=q},[q,Se]),n.useEffect(()=>{Q(!1)},[c]);const de=n.useMemo(()=>{if(!p)return null;const o=sr(M);return f.find(_=>!(_.scriptName!==p||o&&_.cwd!==o||u?.config?.command&&_.command!==u.config.command))??f.find(_=>nr(_,p,M))??null},[f,u?.config?.command,p,M]);n.useEffect(()=>{typeof v=="function"&&v().catch(o=>{e(tr(o),"error")})},[e,v]),n.useEffect(()=>{if(p){S(!1);return}S(!0)},[p]),n.useEffect(()=>{if(u?.status==="running"||u?.status==="starting"){u.config?.command?.trim().length>0&&d(u.config.command);return}if(de){d(o=>o.trim().length>0?o:de.command);return}f.length>0&&d(o=>o.trim().length>0?o:f[0]?.command??"")},[f,de,u?.config?.command,u?.status]),n.useEffect(()=>{b(c??"")},[c]);const ve=n.useCallback(()=>{xe(!1),window.requestAnimationFrame(()=>Oe.current?.focus())},[]),kr=Ir(ve);n.useEffect(()=>{if(!ie)return;ye.current?.focus();const o=_=>{if(_.key==="Escape"){ve();return}if(_.key!=="Tab")return;const oe=Array.from(ye.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(Ve=>!Ve.hasAttribute("disabled")&&Ve.getAttribute("aria-hidden")!=="true"),Z=oe[0],Ce=oe.at(-1);!Z||!Ce||(_.shiftKey&&document.activeElement===Z?(_.preventDefault(),Ce.focus()):!_.shiftKey&&document.activeElement===Ce&&(_.preventDefault(),Z.focus()))};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[ve,ie]),n.useEffect(()=>{!W&&ie&&xe(!1)},[W,ie]);const ke=n.useCallback(()=>{c&&window.open(c,"_blank","noopener,noreferrer")},[c]),He=n.useCallback(()=>{Q(!1),Fe()},[Fe]),Cr=n.useCallback(()=>{try{const o=re.current;if(o?.contentWindow){o.contentWindow.location.reload(),Q(!1),ce();return}}catch{}if(!(!c||!re.current))try{const o=new URL(c);o.searchParams.set("_t",Date.now().toString()),re.current.src=o.toString(),Q(!1),ce()}catch{re.current.src=c,Q(!1),ce()}},[c,re,ce]),ue=n.useCallback(async(o,_,oe)=>{Te(o);try{await _(),e(oe,"success")}catch(Z){e(tr(Z),"error")}finally{Te(null)}},[e]),Er=n.useCallback(o=>{w(o.scriptName),S(!1),d(o.command),e(a("devserver.toast.selectedScript","Selected {{name}} script.",{name:o.scriptName}),"success")},[e]),Lr=n.useCallback(()=>{w(null),S(!0),e(a("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),jr=n.useCallback(o=>{A&&o&&o!==x&&e(a("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),R(o)},[e,A,x,a]),Rr=()=>{const o=y.trim();if(o.length===0){e(a("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const _=sr(M)??".",Z=X?.worktree??null??de?.cwd??_;ue("start",()=>$(o,Z),a("devserver.toast.started","Dev server started."))},Ur=()=>{ue("stop",L,a("devserver.toast.stopped","Dev server stopped."))},Dr=()=>{ue("restart",E,a("devserver.toast.restarted","Dev server restarted."))},Pr=()=>{const o=l.trim(),_=o.length>0?o:null;ue("preview",()=>h(_),_?a("devserver.toast.previewUpdated","Preview URL updated."):a("devserver.toast.previewCleared","Preview URL override cleared."))},Mr=n.useCallback(()=>{N&&g()},[N,g]),_r=k==="starting"||k==="running"||G!==null,Ar=k==="stopped"||G!==null,Tr=k==="stopped"||k==="starting"||G!==null,Be=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(We,{size:14}),r.jsx("span",{children:a("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:c??a("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[a("devserver.auto","Auto"),c?` · ${c}`:a("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>xr(o=>o==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:ae==="embedded"?a("devserver.externalOnly","External only"):a("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:a("devserver.openInNewTab","Open in new tab"),onClick:ke,disabled:!c,"data-testid":"devserver-preview-open-tab",children:r.jsx(Qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:a("devserver.refreshPreview","Refresh preview"),onClick:Cr,disabled:!c,"data-testid":"devserver-preview-refresh",children:r.jsx(Zr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":q,"data-embedded":Nr?"true":"false",children:[!c&&!A&&r.jsx("p",{className:"devserver-preview-empty",children:a("devserver.startDevServer","Start a dev server to see a live preview here.")}),!c&&A&&r.jsx("p",{className:"devserver-preview-empty",children:a("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),c&&ae==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:a("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:ke,"data-testid":"devserver-preview-external-open-tab",children:a("devserver.openInNewTab","Open in new tab")})]}),c&&ae==="embedded"&&ze&&Se&&r.jsxs("div",{className:q==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[q==="error"?r.jsx(lr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(or,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:q==="error"?a("devserver.previewFailed","Preview failed"):a("devserver.previewBlocked","Preview blocked")}),Ne&&r.jsx("p",{className:"devserver-preview-blocked-context",children:Ne})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:a("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:ke,"data-testid":"devserver-preview-fallback-open-tab",children:a("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:He,"data-testid":"devserver-preview-fallback-retry",children:a("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),c&&ae==="embedded"&&!ze&&r.jsx(Ct,{url:c,embedStatus:q,onEmbedStatusChange:Sr,iframeRef:re,blockReason:Ne,onRetry:He})]})]});return r.jsxs("div",{ref:F,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":W?"true":"false",children:[r.jsx(qr,{icon:Jr,title:a("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 ${O.className}`,"data-testid":"dev-server-status-badge",children:O.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Rr,disabled:_r,"data-testid":"dev-server-start-button",children:[r.jsx(Xr,{size:14}),r.jsx("span",{children:G==="start"?a("devserver.starting","Starting..."):a("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ur,disabled:Ar,"data-testid":"dev-server-stop-button",children:[r.jsx(Kr,{size:14}),r.jsx("span",{children:G==="stop"?a("devserver.stopping","Stopping..."):a("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Dr,disabled:Tr,"data-testid":"dev-server-restart-button",children:[r.jsx(Gr,{size:14}),r.jsx("span",{children:G==="restart"?a("devserver.restarting","Restarting..."):a("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":a("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:a("devserver.configuration","Configuration")}),C&&r.jsx("span",{className:"dev-server-muted",children:a("devserver.loading","Loading...")})]}),C&&!u&&f.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(ge,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:a("devserver.loadingConfig","Loading dev server configuration...")})]}),N&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:N}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Mr,children:a("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:a("devserver.scriptSelection","Script Selection")}),p&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:p}),r.jsx("span",{className:"dev-server-candidate-source",children:M??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>S(!0),"data-testid":"dev-server-change-selection",children:a("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Lr,"data-testid":"dev-server-clear-selection",children:a("devserver.clear","Clear")})]}),D&&f.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:a("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),D&&f.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:f.map(o=>{const _=nr(o,p,M);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${_?"dev-server-candidate--selected":""}`,onClick:()=>Er(o),"data-testid":`dev-server-candidate-${o.scriptName}-${br(o.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:o.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Mt(o.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:Pt(o)})]},`${o.cwd}::${o.scriptName}::${o.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:a("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:a("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:x??"",onChange:o=>jr(o.target.value.length>0?o.target.value:null),disabled:Y.length===0,"aria-label":a("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:a("devserver.projectRootNoTask","Project root (no task)")}),Y.map(o=>r.jsx("option",{value:o.id,children:o.title?`${o.id} — ${o.title}`:o.id},o.id))]}),Y.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:a("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),X&&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:X.title?`${X.id} — ${X.title}`:X.id})}),r.jsx("p",{className:"dev-server-task-description",children:X.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:a("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:X.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:a("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:y,onChange:o=>d(o.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:k==="running"||k==="starting"})]}),(k==="running"||k==="starting")&&u&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:a("devserver.runningCommand","Running command")}),r.jsx("code",{children:u.config?.command??y})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:a("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:l,onChange:o=>b(o.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Pr,disabled:G==="preview","data-testid":"dev-server-set-preview",children:a("devserver.save","Save")})]}),c&&r.jsx("p",{className:"dev-server-preview-hint",children:a("devserver.autoDetected","Auto-detected: {{url}}",{url:c})})]}),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":a("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:a("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:a("devserver.lines","{{count}} lines",{count:P??j.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(Nt,{entries:j,loading:H,loadingMore:I,hasMore:B,total:P,onLoadMore:V,isRunning:A})})]})}),W?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":a("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(We,{size:14}),r.jsx("span",{children:a("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:c??a("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:c||a("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:c?a("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):a("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:Oe,onClick:()=>xe(!0),"data-testid":"devserver-preview-modal-open",children:a("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":a("devserver.previewLabel","Dev server preview"),children:Be()}),W&&ie&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...kr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:ye,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:a("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ve,"aria-label":a("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Yr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:Be()})]})})]})}export{$t as DevServerView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{W as z,Y as D,_ as B,$ as f,k as j,a0 as S,E as T,B as A,P as L,L as K,m as N}from"./index-
|
|
1
|
+
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{W as z,Y as D,_ as B,$ as f,k as j,a0 as S,E as T,B as A,P as L,L as K,m as N}from"./index-CiVIbypZ.js";import{u as R}from"./vendor-i18n-Duky4gdQ.js";import{F as U}from"./folder-open-CF9O-sX4.js";function $({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?B(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(S,{size:14}),r.jsx("span",{children:i("dirPicker.up","Up")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick: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(T,{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{$ as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-SZ_qB27O.js";import{ag as Qe,ah as Ge,ai as It,aj as $t,ak as Bt,al as Ze,am as _t,an as Vt,ao as fe,ap as qt,aq as We,ar as Ut,as as Qt,at as Gt,au as Wt,av as Ee,aw as Kt,ax as Ke,V as Yt,ay as oe,E as Xt,B as Jt,az as Zt,X as es,R as ts,aA as ke,A as Ye,l as Xe,aB as Je,p as De,r as Le,aC as ss,aD as et,aE as ns,aF as as,aG as cs,aH as os,H as rs,aI as is,aJ as ls,aK as ds,aL as us}from"./index-CiVIbypZ.js";import{u as ms}from"./vendor-i18n-Duky4gdQ.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";import"./vendor-xterm-BNq00GSj.js";function hs(a){const{projectId:l,searchQuery:d,includeProjectFiles:y=!0}=a??{},v=l?`${It.DOCUMENTS_PREFIX}${l}`:null,[w,T]=s.useState(()=>{if(!v)return[];const b=Qe(v,{maxAgeMs:Ge});return Array.isArray(b)?b:[]}),[E,t]=s.useState([]),[r,x]=s.useState(()=>w.length===0),[D,p]=s.useState(null),f=s.useRef(null),u=s.useRef(w.length>0),m=s.useRef(null),{capture:j}=$t(l,"useDocuments"),N=s.useCallback(async()=>{const b=j();f.current&&f.current.abort();const U=new AbortController;f.current=U;const L=!u.current;L&&x(!0),p(null);const $=Bt(d?{q:d}:void 0,l),ie=y?Ze(l):Promise.resolve({files:[]}),[S,Y]=await Promise.allSettled([$,ie]);if(U.signal.aborted||b.isStale())return;let B=null;if(S.status==="fulfilled"){if(T(S.value),v){const C=S.value.length>500?S.value.slice(0,500):S.value;_t(v,C,{maxBytes:5e5})}u.current=!0}else B=S.reason instanceof Error?S.reason.message:String(S.reason);if(Y.status==="fulfilled"){const C=Y.value.files,ee=d?.trim().toLowerCase(),Q=ee?C.filter(te=>te.name.toLowerCase().includes(ee)||te.path.toLowerCase().includes(ee)):C;t(Q)}p(B),L&&x(!1)},[v,j,y,l,d]);return s.useEffect(()=>{if(t([]),!v){u.current=!1,T([]),x(!0);return}const b=Qe(v,{maxAgeMs:Ge});Array.isArray(b)?(T(b),u.current=!0,x(!1)):(u.current=!1,T([]),x(!0))},[v]),s.useEffect(()=>(m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{N()},300),()=>{m.current&&clearTimeout(m.current)}),[N]),s.useEffect(()=>(N(),()=>{f.current&&f.current.abort()}),[]),{documents:w,projectFiles:E,loading:r,error:D,refresh:N}}function fs(a,l){const[d,y]=s.useState([]),[v,w]=s.useState(!0),[T,E]=s.useState(null),t=s.useRef(null),r=s.useRef(!1),x=l?.showHidden??!1,D=s.useCallback(async p=>{t.current&&t.current.abort();const f=new AbortController;t.current=f;const u=!r.current;u&&w(!0),E(null);try{const m=await Ze(a,{showHidden:p?.showHidden??x});if(f.signal.aborted)return;y(m.files),r.current=!0}catch(m){if(f.signal.aborted)return;E(m instanceof Error?m.message:String(m))}finally{!f.signal.aborted&&u&&w(!1)}},[a,x]);return s.useEffect(()=>(r.current=!1,D({showHidden:x}),()=>{t.current&&t.current.abort()}),[D,x]),{files:d,loading:v,error:T,refresh:D}}const ks=768,ps={image:os,doc:oe,pdf:cs,video:as,audio:ns,other:et};function re(a){return a?new Date(a).toLocaleString():""}function js(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 xs(a,l){return l?l.complete?"status-dot status-dot--online":l.intake||l.hold?"status-dot status-dot--pending":"status-dot status-dot--connecting":a==="done"?"status-dot status-dot--online":bs.has(a)?"status-dot status-dot--pending":"status-dot status-dot--connecting"}const bs=new Set(["triage","todo"]);function tt(a,l){switch(l){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 ws(a,l){return l?[a.title,a.description,a.taskId,a.taskTitle,a.mimeType,a.authorId].some(d=>d?.toLowerCase().includes(l)):!0}function gs(a){const l=a.mimeType?.toLowerCase().split(";",1)[0]??"";return!!a.content||a.type==="document"||l.startsWith("text/")||l==="application/json"||l==="application/xml"}function vs({artifact:a,projectId:l,content:d,loading:y,error:v,renderMarkdown:w,onToggleMarkdown:T,onOpenTask:E,t}){const[r,x]=s.useState(null),[D,p]=s.useState(!1),f=Ee(a),u=tt(t,f),m=a.title||t("documents.untitledArtifact","Untitled artifact"),j=rs(a.id,l),N=f==="doc"&&gs(a);s.useEffect(()=>{x(null)},[a.id]);const b=r?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:r}):null,U=f==="image"?e.jsxs(e.Fragment,{children:[b,e.jsx("button",{type:"button",className:"documents-task-artifact-image-button",onClick:()=>p(!0),"aria-label":t("documents.expandImageArtifact","Expand image artifact {{title}}",{title:m}),children:e.jsx(is,{className:"documents-task-artifact-media",artifactId:a.id,projectId:l,title:m,onError:()=>x(t("documents.artifactMediaFailed","Failed to load artifact preview."))})}),D&&e.jsx(ls,{artifactId:a.id,projectId:l,title:m,onClose:()=>p(!1)})]}):f==="video"?e.jsxs(e.Fragment,{children:[b,e.jsx("video",{className:"documents-task-artifact-media",controls:!0,src:j,"aria-label":t("documents.videoArtifactLabel","Video artifact: {{title}}",{title:m}),onError:()=>x(t("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):f==="audio"?e.jsxs(e.Fragment,{children:[b,e.jsx("audio",{className:"documents-task-artifact-audio",controls:!0,src:j,"aria-label":t("documents.audioArtifactLabel","Audio artifact: {{title}}",{title:m}),onError:()=>x(t("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):f==="pdf"?e.jsxs("div",{className:"documents-task-artifact-pdf",children:[e.jsx("iframe",{title:t("documents.pdfArtifactTitle","PDF artifact: {{title}}",{title:m}),src:j}),e.jsxs("a",{className:"btn btn-sm",href:j,target:"_blank",rel:"noreferrer",children:[e.jsx(ds,{size:14,"aria-hidden":"true"}),t("documents.openInNewTab","Open in new tab")]})]}):f==="doc"&&N?y?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:t("documents.loadingArtifactContent","Loading artifact content…")})}):v?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:v}):w?e.jsx("div",{className:"documents-content-markdown documents-task-artifact-doc-content",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Le],children:d??a.content??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text documents-task-artifact-doc-content",children:d??a.content??""}):e.jsxs("div",{className:"documents-task-artifact-download",children:[e.jsx(et,{size:24,"aria-hidden":"true"}),e.jsx("p",{children:a.description||t("documents.binaryArtifactFallback","This artifact cannot be previewed inline.")}),e.jsxs("a",{className:"btn btn-sm",href:j,target:"_blank",rel:"noreferrer","data-testid":"task-artifact-open-link",children:[e.jsx(us,{size:14,"aria-hidden":"true"}),t("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]}),f==="doc"&&N?e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:T,"aria-label":w?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":w,title:w?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:w?t("documents.markdown","Markdown"):t("documents.plain","Plain")}):null]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta documents-task-artifact-meta",children:[e.jsx("span",{children:u}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:a.authorId||t("documents.unknownAuthor","unknown")}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:re(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 E(a.taskId),children:t("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--${f}`,children:U})]})}function As({projectId:a,columnFlagsByTaskId:l,addToast:d,onOpenDetail:y,onOpenArtifactTaskDetail:v,onSendSelectionToTask:w,artifactUnreadCount:T=0,onSeen:E}){const{t}=ms("app"),[r,x]=s.useState("artifacts"),D=Vt(),[p,f]=s.useState(""),[u,m]=s.useState(null),[j,N]=s.useState(null),[b,U]=s.useState(!1),[L,$]=s.useState(null),[ie,S]=s.useState(!1),[Y,B]=s.useState(null),[C,ee]=s.useState(!1),Q=s.useRef(0),te=s.useRef(null),Me=s.useRef(null),Re=s.useRef(null),He=s.useRef(null),[X,Oe]=s.useState(!1),[st,ze]=s.useState(new Map),[nt,M]=s.useState(null),[pe,A]=s.useState(""),[le,P]=s.useState(null),[G,F]=s.useState(null),[de,je]=s.useState(!1),[at,R]=s.useState(null),[ct,_]=s.useState(!1),[ot,H]=s.useState(null),[rt,xe]=s.useState(!0),se=s.useRef(0),be=s.useRef(null),[we,W]=s.useState(!1),[ue,V]=s.useState(""),[ge,ve]=s.useState(!1),[me,Ie]=s.useState(!1),it=fe(te,{locked:me}),lt=fe(Me,{locked:me}),dt=fe(Re,{locked:me}),ut=fe(He,{locked:me}),Ne=X?it:lt,Se=r==="tasks"?p.trim():"",mt=r==="artifacts"?p.trim():"",{documents:ne,loading:ht,error:ft,refresh:ae}=hs({projectId:a,searchQuery:Se||void 0,includeProjectFiles:!1}),{files:K,loading:kt,error:pt,refresh:$e}=fs(a,{showHidden:b}),{artifacts:O,loading:jt,error:xt,refresh:Ce}=qt({projectId:a,searchQuery:mt||void 0});s.useEffect(()=>{const n=()=>{ee(window.innerWidth<=ks)};return n(),window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)}},[]),s.useEffect(()=>{T>0&&r==="artifacts"&&(be.current===null||be.current.projectId!==a)&&(be.current={projectId:a},E?.())},[r,T,E,a]),s.useEffect(()=>{x("artifacts"),m(null),N(null),U(!1),$(null),B(null),S(!1),Oe(!1),ze(new Map),M(null),A(""),P(null),F(null),je(!1),R(null),_(!1),H(null),xe(!0),W(!1),V(""),ve(!1)},[a]);const J=s.useMemo(()=>{const n=Se.toLowerCase(),c=new Map;for(const o of ne){const k=c.get(o.taskId)??{documents:[],artifacts:[]};k.documents.push(o),c.set(o.taskId,k)}for(const o of O){if(!o.taskId||!ws(o,n))continue;const k=c.get(o.taskId)??{documents:[],artifacts:[]};k.artifacts.push(o),c.set(o.taskId,k)}return Array.from(c.entries()).map(([o,k])=>{const I=[...k.documents].sort((g,ce)=>ce.updatedAt.localeCompare(g.updatedAt)),q=[...k.artifacts].sort((g,ce)=>ce.updatedAt.localeCompare(g.updatedAt)),Pe=[I[0]?.updatedAt,q[0]?.updatedAt].filter(Boolean).sort().at(-1)??"",h=I.find(g=>g.taskTitle)?.taskTitle??q.find(g=>g.taskTitle)?.taskTitle;return{taskId:o,taskTitle:h,taskColumn:I.find(g=>g.taskColumn)?.taskColumn??q.find(g=>g.taskColumn)?.taskColumn,documents:I,artifacts:q,latestUpdated:Pe}}).filter(o=>o.documents.length>0||o.artifacts.length>0).sort((o,k)=>k.latestUpdated.localeCompare(o.latestUpdated))},[O,ne,Se]),i=s.useMemo(()=>j?.kind!=="document"?null:ne.find(n=>n.id===j.id)??null,[ne,j]),z=s.useMemo(()=>j?.kind!=="artifact"?null:O.find(n=>n.id===j.id)??null,[O,j]),he=i??z;s.useEffect(()=>{if(!j)return;J.some(c=>j.kind==="document"?c.documents.some(o=>o.id===j.id):c.artifacts.some(o=>o.id===j.id))||(N(null),M(null),A(""),P(null),F(null),R(null),_(!1),H(null))},[J,j]);const ye=s.useMemo(()=>{const n=p.trim().toLowerCase();return n?K.filter(c=>{const o=c.path.toLowerCase(),k=c.name.toLowerCase();return o.includes(n)||k.includes(n)}):K},[K,p]);s.useEffect(()=>{if(!u)return;K.some(c=>c.path===u.path)||(m(null),$(null),B(null),S(!1))},[K,u]);const bt=s.useCallback(n=>{f(n.target.value)},[]),wt=s.useCallback(()=>{f("")},[]),Te=s.useCallback(n=>{x(n),n!=="tasks"&&(N(null),M(null),A(""),P(null),F(null),R(null),_(!1),H(null)),n!=="project"&&(W(!1),V(""))},[]),gt=s.useCallback(async n=>{try{const c=await We(n,a);y(c)}catch{d(`Failed to open task ${n}`,"error")}},[a,y,d]),Be=s.useCallback(async n=>{try{const c=await We(n,a);(v??y)(c)}catch{d(`Failed to open task ${n}`,"error")}},[a,v,y,d]),vt=s.useCallback(async n=>{m(n),S(!0),B(null),$(null),W(!1),V("");const c=Q.current+1;Q.current=c;try{const o=await Ut("project",n.path,a);if(Q.current!==c)return;$(o.content)}catch(o){if(Q.current!==c)return;const k=o instanceof Error?o.message:`Failed to open ${n.path}`;B(k),d(k,"error")}finally{Q.current===c&&S(!1)}},[a,d]),Nt=s.useCallback(()=>{m(null),$(null),B(null),S(!1),W(!1),V("")},[]),St=s.useCallback(()=>{L!==null&&(V(L),W(!0))},[L]),Ct=s.useCallback(()=>{W(!1),V("")},[]),yt=s.useCallback(async()=>{if(u){ve(!0);try{await Qt("project",u.path,ue,a),$(ue),W(!1),V(""),d(t("documents.projectFileSaved","File saved"),"success")}catch(n){d(n instanceof Error?n.message:String(n),"error")}finally{ve(!1)}}},[u,ue,a,d,t]),Tt=s.useCallback(n=>{N({kind:"document",id:n}),M(null),A(""),P(null),F(null),R(null),_(!1),H(null)},[]),Ft=s.useCallback(n=>{N({kind:"artifact",id:n}),M(null),A(""),P(null),F(null),R(null),H(null),xe(!0)},[]),At=s.useCallback(()=>{N(null),M(null),A(""),P(null),F(null),R(null),_(!1),H(null)},[]),Pt=s.useCallback(n=>{ze(c=>{const o=new Map(c),k=o.get(n)??!0;return o.set(n,!k),o})},[]),Et=s.useCallback(()=>{i&&(A(i.content),M(i.id),P({revision:i.revision,contentHash:i.contentHash}),F(null))},[i]),Dt=s.useCallback(()=>{M(null),A(""),P(null),F(null)},[]),Lt=s.useCallback(()=>{G&&(P(G),F(null))},[G]),Mt=s.useCallback(async()=>{if(!(!i||!le||G)){je(!0);try{await Gt(i.taskId,i.key,pe,{expectedRevision:le.revision,expectedContentHash:le.contentHash},a),await ae(),M(null),A(""),P(null),F(null),d(t("documents.taskDocumentSaved","Document saved"),"success")}catch(n){if(typeof n=="object"&&n!==null&&"status"in n&&n.status===409)try{const c=await Wt(i.taskId,i.key,a);await ae(),F({revision:c.revision,contentHash:c.contentHash}),d(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){d(c instanceof Error?c.message:String(c),"error")}else d(n instanceof Error?n.message:String(n),"error")}finally{je(!1)}}},[i,pe,le,G,a,ae,d,t]);s.useEffect(()=>{if(!z||Ee(z)!=="doc"){R(null),_(!1),H(null);return}const n=se.current+1;se.current=n,_(!0),H(null),R(null),Kt(z.id,a).then(c=>{se.current===n&&R(c.content??z.content??"")}).catch(c=>{se.current===n&&H(c instanceof Error?c.message:String(c))}).finally(()=>{se.current===n&&_(!1)})},[a,z]);const _e=r==="project"?pt:r==="tasks"?ft:xt,Rt=s.useCallback(async()=>{if(r==="project"){await $e();return}if(r==="tasks"){await ae();return}await Ce()},[r,Ce,$e,ae]),Ve=r==="project"?ye.length:r==="tasks"?J.length:O.length,Z=i?st.get(i.id)??!0:!1,Fe=Z?dt:ut,Ae=i!==null&&nt===i.id,Ht=r==="project"&&u&&!we&&w&&Ne?e.jsx(Ke,{selectedText:Ne.selectedText,anchorRect:Ne.anchorRect,filePath:u.path,onSubmit:w,onOpenChange:Ie}):null,Ot=r==="tasks"&&i&&!Ae&&w&&Fe?e.jsx(Ke,{selectedText:Fe.selectedText,anchorRect:Fe.anchorRect,filePath:`${i.taskId}/${i.key}`,onSubmit:w,onOpenChange:Ie}):null,qe=r==="project"?t("documents.searchProjectFiles","Search project markdown files…"):r==="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(Yt,{icon:oe,title:t("documents.title","Artifacts"),actions:e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:Ve,plural:Ve!==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${r==="artifacts"?" active":""}`,role:"tab","aria-selected":r==="artifacts","aria-label":t("documents.showArtifacts","Show artifacts"),onClick:()=>Te("artifacts"),children:[t("documents.artifactsTab","Artifacts"),e.jsx("span",{className:"documents-tab-count",children:O.length})]}),e.jsxs("button",{className:`btn documents-tab${r==="project"?" active":""}`,role:"tab","aria-selected":r==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>Te("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:K.length})]}),e.jsxs("button",{className:`btn documents-tab${r==="tasks"?" active":""}`,role:"tab","aria-selected":r==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>Te("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:J.length})]})]}),r==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>U(n=>!n),"aria-pressed":b,"aria-label":b?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:b?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[b?e.jsx(Xt,{size:14}):e.jsx(Jt,{size:14}),b?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(Zt,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:qe,value:p,onChange:bt,"aria-label":qe}),p&&e.jsx("button",{className:"documents-search-clear",onClick:wt,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(es,{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:r==="project"?t("documents.projectFiles","project files"):r==="tasks"?t("documents.taskDocuments","task documents"):t("documents.artifacts","artifacts"),error:_e})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void Rt(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(ts,{size:16}),t("documents.retry","Retry")]})]}):r==="project"?kt&&K.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…")})})}):ye.length===0?e.jsx("div",{className:"documents-view-empty",children:p.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:p.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(oe,{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${C?" documents-project-layout--mobile":""}`,children:[(!C||!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:ye.map(n=>{const c=u?.path===n.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 vt(n),"aria-label":`Open ${n.path}`,"aria-current":c?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:n.name}),e.jsx("span",{className:"markdown-file-item-path",children:n.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[js(n.size)," · ",re(n.mtime)]})]})},n.path)})})}),(!C||u)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.projectFilePreviewLabel","Project file content preview"),children:[C&&u&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Nt,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(Ye,{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:we?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:Ct,disabled:ge,children:t("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void yt(),disabled:ge,children:ge?t("documents.saving","Saving…"):t("documents.saveProjectFile","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>Oe(n=>!n),"aria-label":X?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":X,title:X?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:X?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:St,disabled:ie||Y!==null||L===null,"aria-label":t("documents.editProjectFile","Edit project file"),children:[e.jsx(Xe,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),ie?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:t("documents.loadingFileContent","Loading file content…")})}):Y?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:Y}):we?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.projectFileContentEditor","Project file content editor"),children:e.jsx(Je,{content:ue,onChange:V,filePath:u.path,forceToolbarActionsVisible:!0})}):X?e.jsx("div",{ref:te,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Le],children:L??""})})}):e.jsx("pre",{ref:Me,className:"document-card-content-text documents-content-viewer-text",children:L??""}),Ht]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):r==="artifacts"?jt&&O.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingArtifacts","Loading artifacts…")})}):O.length===0?e.jsx("div",{className:"documents-view-empty",children:p.trim()?e.jsx("p",{children:t("documents.noMatchArtifacts",'No artifacts match "{{query}}".',{query:p.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(oe,{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(ss,{artifacts:O,projectId:a,isMobile:C,addToast:d,onOpenTask:Be,onArtifactUpdated:()=>void Ce()}):ht&&ne.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingTaskDocuments","Loading task documents…")})})}):J.length===0?e.jsx("div",{className:"documents-view-empty",children:p.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:p.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(oe,{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${C?" documents-project-layout--mobile":""}`,children:[(!C||!he)&&e.jsx("aside",{className:"documents-view-sidebar documents-task-documents-sidebar","aria-label":t("documents.taskDocumentsListLabel","Task documents"),children:J.map(({taskId:n,taskTitle:c,taskColumn:o,documents:k,artifacts:I})=>{const q=o?D(o):null,Pe=o?xs(o,l?.get(n)):"status-dot";return e.jsxs("section",{className:"documents-task-sidebar-group","aria-labelledby":`documents-task-group-${n}`,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-${n}`,className:"documents-task-sidebar-title",children:[e.jsx("span",{className:"documents-group-task-id",children:n}),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:k.length,docPlural:k.length!==1?"s":"",artifactCount:I.length,artifactPlural:I.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>void gt(n),"aria-label":t("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:n,title:c||t("documents.untitled","Untitled")}),children:t("documents.openTask","Open task")})]})]}),e.jsxs("ul",{className:"markdown-file-list documents-task-document-list",children:[k.map(h=>{const g=i?.id===h.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item${g?" markdown-file-item--selected":""}`,onClick:()=>Tt(h.id),"aria-label":t("documents.openTaskDocument","Open {{taskId}} {{key}}",{taskId:h.taskId,key:h.key}),"aria-current":g?"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," · ",re(h.updatedAt)]})]})},`document-${h.id}`)}),I.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:I.map(h=>{const g=Ee(h),ce=ps[g],zt=tt(t,g),Ue=z?.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${Ue?" markdown-file-item--selected":""}`,onClick:()=>Ft(h.id),"aria-label":t("documents.openTaskArtifact","Open {{taskId}} artifact {{title}}",{taskId:n,title:h.title||t("documents.untitledArtifact","Untitled artifact")}),"aria-current":Ue?"true":void 0,children:[e.jsxs("span",{className:"documents-task-artifact-title-row",children:[e.jsx(ce,{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:[zt," · ",h.mimeType||h.type]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[h.authorId||t("documents.unknownAuthor","unknown")," · ",re(h.updatedAt)]})]})},`artifact-${h.id}`)})})]}):null]})]},n)})}),(!C||he)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.taskDocumentPreviewLabel","Task document content preview"),children:[C&&he&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:At,"aria-label":t("documents.backToTaskDocumentsList","Back to task documents list"),children:[e.jsx(Ye,{size:14}),t("documents.backToTaskDocuments","Back to documents")]}),he?z?e.jsx(vs,{artifact:z,projectId:a,content:at,loading:ct,error:ot,renderMarkdown:rt,onToggleMarkdown:()=>xe(n=>!n),onOpenTask:Be,t}):i?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:[i.taskId," / ",i.key]}),e.jsx("div",{className:"documents-task-document-actions",children:Ae?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:Dt,disabled:de,children:t("documents.cancelEdit","Cancel")}),G&&e.jsx("button",{className:"btn btn-sm",onClick:Lt,disabled:de,children:t("documents.rebaseTaskDocument","Rebase draft")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Mt(),disabled:de||G!==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:()=>Pt(i.id),"aria-label":Z?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":Z,title:Z?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:Z?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Et,"aria-label":t("documents.editTaskDocument","Edit task document"),children:[e.jsx(Xe,{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:i.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:t("documents.revisionShort","v{{revision}}",{revision:i.revision})}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:re(i.updatedAt)})]}),Ae?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.taskDocumentContentEditor","Task document content editor"),children:e.jsx(Je,{content:pe,onChange:A,filePath:i.key.includes(".")?i.key:`${i.key}.md`,forceToolbarActionsVisible:!0})}):Z?e.jsx("div",{ref:Re,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Le],children:i.content})})}):e.jsx("pre",{ref:He,className:"document-card-content-text documents-content-viewer-text",children:i.content}),Ot]}):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{As as DocumentsView,xs as getTaskColumnStatusDotClass};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{ag as P,ah as L,ai as O,aM as Y,aN as J,am as $,aO as Z,aP as ee,aQ as se,V as H,o as K,aR as ae,R as te,aA as le,s as re,v as ne,aK as ie}from"./index-
|
|
1
|
+
import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{ag as P,ah as L,ai as O,aM as Y,aN as J,am as $,aO as Z,aP as ee,aQ as se,V as H,o as K,aR as ae,R as te,aA as le,s as re,v as ne,aK as ie}from"./index-CiVIbypZ.js";import{u as ce}from"./vendor-i18n-Duky4gdQ.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";import"./vendor-xterm-BNq00GSj.js";const oe=300,de=15e3;function B(r){if(!r.trim())return;const a=Number(r);return Number.isFinite(a)?a:void 0}function I(...r){for(const a of r)if(Array.isArray(a))return a;return[]}function f(r){return typeof r=="object"&&r!==null?r:{}}function X(r){const a=f(r),m=f(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:I(a.categoryScores,f(a.scores).categories)}}function ue(r){const a=f(r);return{...X(a),rationale:String(a.rationale??a.summary??""),evidence:I(a.evidence,f(a.details).evidence),followUps:I(a.followUps,f(a.recommendations).followUps)}}function ve(r){const a=r?.projectId,m=a??"",t=`${O.EVALS_RUNS_PREFIX}${m}`,h=`${O.EVALS_RESULTS_PREFIX}${m}`,p=P(t,{maxAgeMs:L}),v=P(h,{maxAgeMs:L}),g=l.useRef(Array.isArray(p)&&p.length>0||Array.isArray(v)&&v.length>0),[o,S]=l.useState({q:"",runId:"",scoreMin:"",scoreMax:""}),[b,w]=l.useState(()=>Array.isArray(p)?p:[]),[d,M]=l.useState(()=>Array.isArray(v)?v:[]),[u,A]=l.useState(null),[F,R]=l.useState(null),[s,i]=l.useState(0),[y,j]=l.useState(!g.current),[W,z]=l.useState(null),C=l.useRef(0),V=l.useRef(a),_=l.useRef(u);_.current=u;const k=l.useCallback(async()=>{const c=++C.current;g.current||j(!0),z(null);try{const[n,x]=await Promise.all([Y({q:o.q||void 0,runId:o.runId||void 0,scoreMin:B(o.scoreMin),scoreMax:B(o.scoreMax),limit:100,offset:0},a),J(a)]);if(c!==C.current)return;const E=I(n.results,n.evals,n.items).map(X);M(E),$(h,E.length>500?E.slice(0,500):E,{maxBytes:5e5}),i(typeof n.count=="number"?n.count:E.length);const q=I(x.runs,x.items).map(U=>{const N=f(U),D=f(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(q),$(t,q,{maxBytes:5e5}),g.current=!0,_.current&&!E.some(U=>U.id===_.current)&&(A(null),R(null))}catch(n){if(c!==C.current)return;z(n instanceof Error?n.message:"Failed to load evals")}finally{c===C.current&&j(!1)}},[o.q,o.runId,o.scoreMax,o.scoreMin,a,h,t]),T=l.useCallback(async c=>{const n=await Z(c,a),x=n.result??n;R(ue(x))},[a]);l.useEffect(()=>{if(V.current===a)return;V.current=a;const c=P(t,{maxAgeMs:L}),n=P(h,{maxAgeMs:L}),x=Array.isArray(c)&&c.length>0||Array.isArray(n)&&n.length>0;w(Array.isArray(c)?c:[]),M(Array.isArray(n)?n:[]),j(!x),g.current=x},[a,h,t]),l.useEffect(()=>{const c=window.setTimeout(()=>{k()},oe);return()=>window.clearTimeout(c)},[k]),l.useEffect(()=>{if(!u){R(null);return}T(u)},[T,u]);const G=l.useCallback(()=>{k(),u&&T(u)},[T,k,u]);ee(G,de);const Q=l.useCallback(c=>{_.current=c,A(c)},[]);return{loading:y,error:W,results:d,count:s,runs:b,filters:o,setFilters:S,refresh:k,selectedEvalId:u,setSelectedEvalId:Q,selectedEval:F}}function je({projectId:r,onOpenSettings:a,onOpenTaskDetail:m}){const{t}=ce("app"),{loading:h,error:p,results:v,runs:g,filters:o,setFilters:S,selectedEvalId:b,setSelectedEvalId:w,selectedEval:d,refresh:M}=ve({projectId:r}),[u,A]=l.useState(!0);l.useEffect(()=>{let s=!1;return se(r).then(i=>{if(s)return;const y=i.evalSettings?.enabled;A(y??!1)}).catch(()=>{s||A(!1)}),()=>{s=!0}},[r]);const F=v.length>0,R=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:K,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=>S(i=>({...i,q:s.target.value}))}),e.jsxs("select",{className:"select",value:o.runId,onChange:s=>S(i=>({...i,runId:s.target.value})),children:[e.jsx("option",{value:"",children:t("evals.allRuns","All runs")}),g.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=>S(i=>({...i,scoreMin:s.target.value}))}),e.jsx("input",{className:"input",placeholder:t("evals.maxScorePlaceholder","Max score"),value:o.scoreMax,onChange:s=>S(i=>({...i,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(te,{size:16})})]}),h&&e.jsx("p",{className:"evals-state","data-testid":"evals-loading",children:e.jsx(le,{label:t("evals.loading","Loading evals…")})}),p&&e.jsx("p",{className:"evals-state evals-state--error",children:p}),!h&&!p&&!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:ne(),onDragStart:i=>{re(i.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:R?.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,i)=>{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(ie,{size:14})]}):e.jsx("span",{children:s.ref})},`${s.ref}-${i}`)})})]}),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:K,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(ae,{size:16}),t("evals.openSettings","Open Scheduled Evals Settings")]})]})]})}export{je as EvalsView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-SZ_qB27O.js";import{I as F,J as K,K as V,N as W,O as $,Q as z,U}from"./index-
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-SZ_qB27O.js";import{I as F,J as K,K as V,N as W,O as $,Q as z,U}from"./index-CiVIbypZ.js";import{u as J}from"./vendor-i18n-Duky4gdQ.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";import"./vendor-xterm-BNq00GSj.js";function te({isOpen:l,onClose:R,onUseDraft:M,projectId:x,existingAgents:P,mode:w="create",existingAgentConfig:L}){const{t:n}=J("app"),[g,d]=s.useState("initial"),[f,_]=s.useState(""),[c,S]=s.useState(null),[C,I]=s.useState(""),[k,A]=s.useState("answer"),[p,v]=s.useState(""),[t,H]=s.useState(null),[T,h]=s.useState(null),[E,y]=s.useState([]),b=w==="edit",o=s.useRef(l),N=s.useCallback(()=>{d("initial"),_(""),S(null),I(""),A("answer"),v(""),H(null),h(null),y([])},[]),O=s.useMemo(()=>F.map(a=>({id:a.id,label:a.name,description:a.description})),[]);s.useEffect(()=>{if(o.current=l,!c)return;const a=K(c,x,{onThinking:r=>{o.current&&y(G=>{const u=[...G],j=u[u.length-1];return j&&!j.question?(u[u.length-1]={...j,thinkingOutput:`${j.thinkingOutput??""}${r}`},u):[...u,{response:{},thinkingOutput:r}]})},onQuestion:r=>{o.current&&(I(r.question),A(r.id),d("question"))},onSummary:r=>{o.current&&(H(r),d("summary"))},onError:r=>{o.current&&(h(r),d("error"))}});return()=>{o.current=!1,a.close()}},[l,c,x]);const m=async()=>{o.current=!1;try{c&&await $(c,x)}catch{}finally{N(),R()}};if(s.useEffect(()=>{o.current=l,l||N()},[l,N]),!l)return null;const i=a=>a==null||a===""?e.jsx("em",{className:"experimental-agent-onboarding-modal__summary-empty",children:n("agents.onboarding.notSet","Not set")}):e.jsx("span",{children:a}),Q=async()=>{d("loading"),h(null);try{const a=await z(f,{mode:w,existingAgentConfig:L,existingAgents:P.map(r=>({id:r.id,name:r.name,role:r.role})),templates:O},x);if(!o.current)return;S(a.sessionId)}catch(a){if(!o.current)return;h(a.message),d("error")}},q=async()=>{if(c){d("loading"),h(null);try{const a={[k]:p};if(y(r=>[...r,{question:{id:k,type:"text",question:C},response:a}]),await U(c,a,x),!o.current)return;v("")}catch(a){if(!o.current)return;h(a.message),d("error")}}},D=async()=>{t&&(M(t),await m())};return e.jsx(V,{windowKey:"experimental-agent-onboarding",modal:!0,title:n("agents.onboarding.title","AI Interview"),ariaLabel:n("agents.onboarding.dialogLabel","AI Interview"),onClose:()=>void m(),hideHeader:!0,dragHandleSelector:".experimental-agent-onboarding-modal .modal-header",className:"floating-window--experimental-agent-onboarding",defaultSize:{width:720,height:620},minSize:{width:420,height:320},persistGeometryKey:"floating-window:experimental-agent-onboarding",suspendGeometryPersistenceOnMobile:!0,suspendGeometryPersistenceOnShortViewport:!0,children:e.jsxs("div",{className:"modal modal-lg experimental-agent-onboarding-modal",children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:n("agents.onboarding.title","AI Interview")}),e.jsx("button",{className:"modal-close",onClick:()=>void m(),"aria-label":n("common.closeAriaLabel","Close"),children:"×"})]}),E.length>0&&e.jsx(W,{entries:E}),g==="initial"&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"agent-onboarding-intent",children:b?n("agents.onboarding.intentLabelEdit","What should this agent change or improve?"):n("agents.onboarding.intentLabelCreate","What should this new agent own?")}),e.jsx("textarea",{id:"agent-onboarding-intent",className:"input experimental-agent-onboarding-modal__textarea",value:f,onChange:a=>_(a.target.value)}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{className:"btn",onClick:()=>void m(),children:n("common.cancel","Cancel")}),e.jsx("button",{className:"btn btn-primary",disabled:!f.trim(),onClick:()=>void Q(),children:b?n("agents.onboarding.startInterview","Start interview"):n("agents.onboarding.startOnboarding","Start onboarding")})]})]}),(g==="loading"||g==="question")&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"agent-onboarding-answer",children:C||n("agents.onboarding.thinking","Thinking...")}),e.jsx("textarea",{id:"agent-onboarding-answer",className:"input experimental-agent-onboarding-modal__textarea",value:p,onChange:a=>v(a.target.value)}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{className:"btn",onClick:()=>void m(),children:n("common.cancel","Cancel")}),e.jsx("button",{className:"btn btn-primary",disabled:g==="loading"||!p.trim(),onClick:()=>void q(),children:n("agents.onboarding.continue","Continue")})]})]}),g==="summary"&&t&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:b?n("agents.onboarding.updatedDraftReady","Updated draft ready for review"):n("agents.onboarding.draftReady","Draft ready for review")}),e.jsx("p",{className:"experimental-agent-onboarding-modal__summary-intro",children:n("agents.onboarding.draftIntro","Review this generated draft. Nothing is applied until you confirm.")}),e.jsxs("div",{className:"experimental-agent-onboarding-modal__summary card",children:[e.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[e.jsx("h4",{children:n("agents.onboarding.sectionIdentity","Identity")}),e.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldName","Name")}),e.jsx("dd",{children:i(t.name)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldRole","Role")}),e.jsx("dd",{children:i(t.role)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldTitle","Title")}),e.jsx("dd",{children:i(t.title)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldIcon","Icon")}),e.jsx("dd",{children:i(t.icon)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldReportsTo","Reports To")}),e.jsx("dd",{children:i(t.reportsTo)})]})]})]}),e.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[e.jsx("h4",{children:n("agents.onboarding.sectionConfiguration","Configuration")}),e.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldInlineInstructions","Inline Instructions")}),e.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:i(t.instructionsText)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldSoul","Soul")}),e.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:i(t.soul)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldAgentMemory","Agent Memory")}),e.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:i(t.memory)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldSkills","Skills")}),e.jsx("dd",{children:i(t.skills?.join(", "))})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldThinkingLevel","Thinking Level")}),e.jsx("dd",{children:i(t.thinkingLevel)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldMaxTurns","Max Turns")}),e.jsx("dd",{children:i(t.maxTurns)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldTemplate","Template")}),e.jsx("dd",{children:i(t.templateId)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldPatternAgent","Pattern Agent")}),e.jsx("dd",{children:i(t.patternAgentId)})]})]})]}),(t.heartbeatProcedurePath||t.heartbeatIntervalMs||t.heartbeatEnabled!==void 0||t.modelHint||t.runtimeHint)&&e.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[e.jsx("h4",{children:n("agents.onboarding.sectionRuntimeHints","Runtime Hints")}),e.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldHeartbeatPath","Heartbeat Procedure Path")}),e.jsx("dd",{children:i(t.heartbeatProcedurePath)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldHeartbeatInterval","Heartbeat Interval")}),e.jsx("dd",{children:i(t.heartbeatIntervalMs?`${t.heartbeatIntervalMs}ms`:void 0)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldHeartbeatEnabled","Heartbeat Enabled")}),e.jsx("dd",{children:i(t.heartbeatEnabled===void 0?void 0:t.heartbeatEnabled?n("agents.onboarding.yes","yes"):n("agents.onboarding.no","no"))})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldModelHint","Model Hint")}),e.jsx("dd",{children:i(t.modelHint)})]}),e.jsxs("div",{children:[e.jsx("dt",{children:n("agents.onboarding.fieldRuntimeHint","Runtime Hint")}),e.jsx("dd",{children:i(t.runtimeHint)})]})]})]}),t.rationale&&e.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[e.jsx("h4",{children:n("agents.onboarding.sectionRationale","Rationale")}),e.jsx("p",{className:"experimental-agent-onboarding-modal__summary-block",children:t.rationale})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{className:"btn",onClick:()=>void m(),children:n("common.cancel","Cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void D(),children:b?n("agents.onboarding.applyDraftSettings","Apply draft to settings form"):n("agents.onboarding.applyDraftAgent","Apply draft to agent form")})]})]}),g==="error"&&T&&e.jsxs("div",{className:"form-group",children:[e.jsx("div",{className:"form-error",children:T}),e.jsx("div",{className:"modal-actions",children:e.jsx("button",{className:"btn",onClick:()=>void m(),children:n("common.close","Close")})})]})]})})}export{te as ExperimentalAgentOnboardingModal};
|