@runfusion/fusion 0.74.0-beta.2 → 0.74.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.
Files changed (127) hide show
  1. package/dist/bin.js +5416 -3166
  2. package/dist/child-process-worker.js +3540 -1656
  3. package/dist/client/.vite/manifest.json +272 -272
  4. package/dist/client/assets/AgentDetailView-BGXTnuBR.js +13 -0
  5. package/dist/client/assets/AgentDetailView-CH11Ydji.css +1 -0
  6. package/dist/client/assets/{AgentPermissionPolicyEditor-BycC7HhP.js → AgentPermissionPolicyEditor-DswM202p.js} +1 -1
  7. package/dist/client/assets/AgentsView-CEpZDrmC.js +24 -0
  8. package/dist/client/assets/{ChatView-DAsZY1We.js → ChatView-BXXX0q6G.js} +3 -3
  9. package/dist/client/assets/CommandCenter-CqjN1-9X.js +97 -0
  10. package/dist/client/assets/DevServerView-BUO7JRi6.js +1 -0
  11. package/dist/client/assets/{DirectoryPicker-DsCk3Nsw.js → DirectoryPicker-CiP4h5C7.js} +1 -1
  12. package/dist/client/assets/{DocumentsView-8EI6KNBY.js → DocumentsView-DwLD0h2S.js} +1 -1
  13. package/dist/client/assets/EvalsView-C9juKffD.js +1 -0
  14. package/dist/client/assets/{ExperimentalAgentOnboardingModal-ce6DROKD.js → ExperimentalAgentOnboardingModal-DYvw9TEh.js} +1 -1
  15. package/dist/client/assets/{GoalsView-BVlTtw-u.js → GoalsView-BD1AkfVN.js} +1 -1
  16. package/dist/client/assets/{InsightsView-BKQeROkb.js → InsightsView-Q0mu759R.js} +1 -1
  17. package/dist/client/assets/{MemoryView-DCzTnxsV.js → MemoryView-DCTqPpCG.js} +1 -1
  18. package/dist/client/assets/{PiExtensionsManager-C94HwDz5.js → PiExtensionsManager-CSe_uGfa.js} +1 -1
  19. package/dist/client/assets/{PluginManager-C3DegklW.js → PluginManager-DPm8YQC0.js} +1 -1
  20. package/dist/client/assets/{PullRequestView-CrE89UL7.js → PullRequestView-BpJgNDLH.js} +2 -2
  21. package/dist/client/assets/{ReportModal-BD1ZUDdV.js → ReportModal-iGmTZqiF.js} +1 -1
  22. package/dist/client/assets/ResearchView-BfgKB-6z.js +2 -0
  23. package/dist/client/assets/{SecretsView-6qK8Idb7.js → SecretsView-CqvQLK7z.js} +1 -1
  24. package/dist/client/assets/SessionTerminal-A9di8GAo.js +2 -0
  25. package/dist/client/assets/SettingsModal-BsCUsAXe.js +21 -0
  26. package/dist/client/assets/{SettingsModal-BkOSlfyr.js → SettingsModal-D-iyPGZE.js} +1 -1
  27. package/dist/client/assets/SettingsModal-DmfMotcd.css +1 -0
  28. package/dist/client/assets/{SettingsTextareaRow-Btyx5kaR.js → SettingsTextareaRow-DwgHxMMY.js} +1 -1
  29. package/dist/client/assets/{SetupWizardModal-Blhx-dRt.js → SetupWizardModal-CrSnLN44.js} +2 -2
  30. package/dist/client/assets/{SkillsView-DGE5kYc3.js → SkillsView-C_STy7KI.js} +1 -1
  31. package/dist/client/assets/{TodoView-YSGI7ATd.js → TodoView-BJJNGNLq.js} +1 -1
  32. package/dist/client/assets/{WorkflowNodeEditor-CZiEThu2.js → WorkflowNodeEditor-Jp5i_Vxu.js} +3 -3
  33. package/dist/client/assets/{WorkflowNodeEditor-nCx4nqoL.css → WorkflowNodeEditor-sZ96V3Kd.css} +1 -1
  34. package/dist/client/assets/{agent-import-generation-DQeNZMAm.js → agent-import-generation-DbVrl8ou.js} +1 -1
  35. package/dist/client/assets/{app-Dn1u7zJ9.js → app-BYs5Cx-j.js} +2 -2
  36. package/dist/client/assets/{app-DaikOPcV.js → app-CTV8PCYh.js} +3 -3
  37. package/dist/client/assets/{app-DJIiVHdA.js → app-CwdZxrJI.js} +2 -2
  38. package/dist/client/assets/{app-hQw_x2KJ.js → app-DE-MPJxA.js} +2 -2
  39. package/dist/client/assets/{app-DxTbBEMH.js → app-e8c4wb5t.js} +2 -2
  40. package/dist/client/assets/{app-DMZ_RusZ.js → app-yKugq_Ld.js} +2 -2
  41. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DhaJNKa4.js → architectureDiagram-3BPJPVTR-Ctz8GX1N.js} +1 -1
  42. package/dist/client/assets/{blockDiagram-GPEHLZMM-pKpg7gJU.js → blockDiagram-GPEHLZMM-WI_YPphw.js} +1 -1
  43. package/dist/client/assets/{c4Diagram-AAUBKEIU-DVPXKJnr.js → c4Diagram-AAUBKEIU-BLwS5Zfh.js} +1 -1
  44. package/dist/client/assets/channel-CMMrQrQu.js +1 -0
  45. package/dist/client/assets/{chunk-2J33WTMH-CHt90T5z.js → chunk-2J33WTMH-DeXlX12-.js} +1 -1
  46. package/dist/client/assets/{chunk-4BX2VUAB-DsWFYy0a.js → chunk-4BX2VUAB-zvCEraJR.js} +1 -1
  47. package/dist/client/assets/{chunk-55IACEB6-D8XiXEo8.js → chunk-55IACEB6-BgZq96DR.js} +1 -1
  48. package/dist/client/assets/{chunk-727SXJPM-DlUYBn_Y.js → chunk-727SXJPM-CayoVGXL.js} +1 -1
  49. package/dist/client/assets/{chunk-AQP2D5EJ-BSdPOr9q.js → chunk-AQP2D5EJ-BmaktpVP.js} +1 -1
  50. package/dist/client/assets/{chunk-FMBD7UC4-B9IAeBld.js → chunk-FMBD7UC4-qYWgZPF8.js} +1 -1
  51. package/dist/client/assets/{chunk-ND2GUHAM-CmxnYQrR.js → chunk-ND2GUHAM-DIovauCc.js} +1 -1
  52. package/dist/client/assets/{chunk-QZHKN3VN-Dxp6Po_j.js → chunk-QZHKN3VN-DXWnr9LE.js} +1 -1
  53. package/dist/client/assets/classDiagram-4FO5ZUOK-CqxyehbN.js +1 -0
  54. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CqxyehbN.js +1 -0
  55. package/dist/client/assets/common-13IRj_PO.js +1 -0
  56. package/dist/client/assets/common-BBynATth.js +1 -0
  57. package/dist/client/assets/common-BG-vw0tL.js +1 -0
  58. package/dist/client/assets/common-DSo46rnH.js +1 -0
  59. package/dist/client/assets/common-DbOCE-0i.js +1 -0
  60. package/dist/client/assets/common-DnXF4Jmj.js +1 -0
  61. package/dist/client/assets/{cose-bilkent-S5V4N54A-BNl3bhpS.js → cose-bilkent-S5V4N54A-Dee9mTjK.js} +1 -1
  62. package/dist/client/assets/{dagre-BM42HDAG-DFs7WCcz.js → dagre-BM42HDAG-CU-v2zoi.js} +1 -1
  63. package/dist/client/assets/{dashboard-view-DnoTcnIo.js → dashboard-view-BM790i02.js} +1 -1
  64. package/dist/client/assets/{dashboard-view-ZGxLEL9r.js → dashboard-view-CG4rzThC.js} +1 -1
  65. package/dist/client/assets/{dashboard-view-vc8kgLMs.js → dashboard-view-COary9sK.js} +1 -1
  66. package/dist/client/assets/{diagram-2AECGRRQ-C2PVozvu.js → diagram-2AECGRRQ-DIqdnJ5B.js} +1 -1
  67. package/dist/client/assets/{diagram-5GNKFQAL-DFJ5b9H8.js → diagram-5GNKFQAL-ChpdUlpb.js} +1 -1
  68. package/dist/client/assets/{diagram-KO2AKTUF-D335CW-c.js → diagram-KO2AKTUF-BxmzOp-c.js} +1 -1
  69. package/dist/client/assets/{diagram-LMA3HP47-DSfhroAW.js → diagram-LMA3HP47-DLEx-0rl.js} +1 -1
  70. package/dist/client/assets/{diagram-OG6HWLK6-8iGveM-Z.js → diagram-OG6HWLK6-DEpkJ3cG.js} +1 -1
  71. package/dist/client/assets/{erDiagram-TEJ5UH35-Xc56MEEi.js → erDiagram-TEJ5UH35-C3Rjr78a.js} +1 -1
  72. package/dist/client/assets/{flowDiagram-I6XJVG4X-DjCU9WbD.js → flowDiagram-I6XJVG4X-aPbBbeiH.js} +1 -1
  73. package/dist/client/assets/{folder-open-BRrB44UX.js → folder-open-BnNbfyzc.js} +1 -1
  74. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CXQE1bea.js → ganttDiagram-6RSMTGT7-BEzAwvJ4.js} +1 -1
  75. package/dist/client/assets/{gitGraphDiagram-PVQCEYII--mrSABLC.js → gitGraphDiagram-PVQCEYII-Y4hB2swQ.js} +1 -1
  76. package/dist/client/assets/index-8wtfjIkg.js +2675 -0
  77. package/dist/client/assets/index-Bp3UBLOz.css +1 -0
  78. package/dist/client/assets/{infoDiagram-5YYISTIA-CTS_nljP.js → infoDiagram-5YYISTIA-pd3J7fRT.js} +1 -1
  79. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CpV5x3gk.js → ishikawaDiagram-YF4QCWOH-B968vfOH.js} +1 -1
  80. package/dist/client/assets/{journeyDiagram-JHISSGLW-BK2QCMnt.js → journeyDiagram-JHISSGLW-V4crhYKX.js} +1 -1
  81. package/dist/client/assets/{kanban-definition-UN3LZRKU-B4srpspY.js → kanban-definition-UN3LZRKU-Cl8LxR6k.js} +1 -1
  82. package/dist/client/assets/{mermaid.core-B8DVAt21.js → mermaid.core-rb_bKdHH.js} +4 -4
  83. package/dist/client/assets/{mindmap-definition-RKZ34NQL-CsmmiPpA.js → mindmap-definition-RKZ34NQL-Cnu-LPHz.js} +1 -1
  84. package/dist/client/assets/{pieDiagram-4H26LBE5-BahLDqf4.js → pieDiagram-4H26LBE5-C6hPYepr.js} +1 -1
  85. package/dist/client/assets/{puzzle-BFPQsuIa.js → puzzle-C8AvcmuM.js} +1 -1
  86. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Bo3u0wTU.js → quadrantDiagram-W4KKPZXB-CUImgAi-.js} +1 -1
  87. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DYkYsz7d.js → requirementDiagram-4Y6WPE33-DzDLxIYz.js} +1 -1
  88. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BCbh0BSY.js → sankeyDiagram-5OEKKPKP-DSr_oIy8.js} +1 -1
  89. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-C2AP9GlE.js → sequenceDiagram-3UESZ5HK-DO2E98Hv.js} +1 -1
  90. package/dist/client/assets/{shield-alert-tlZOi02c.js → shield-alert-Byjz1VmT.js} +1 -1
  91. package/dist/client/assets/{standing-instructions-template-C0Rzv9Mr.js → standing-instructions-template-Cf9fZ8bv.js} +1 -1
  92. package/dist/client/assets/{stateDiagram-AJRCARHV-CARkH0ug.js → stateDiagram-AJRCARHV-BYPlDS4u.js} +1 -1
  93. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-C2He043y.js → stateDiagram-v2-BHNVJYJU-Ce_6vh1Q.js} +1 -1
  94. package/dist/client/assets/{timeline-definition-PNZ67QCA-MvbYneEM.js → timeline-definition-PNZ67QCA-CG1FeaKV.js} +1 -1
  95. package/dist/client/assets/{upload-DWK0F17Z.js → upload-yPsE_DRN.js} +1 -1
  96. package/dist/client/assets/{users-1AkDfM14.js → users-C_YmWx9d.js} +1 -1
  97. package/dist/client/assets/{vennDiagram-CIIHVFJN-DOjzzLqc.js → vennDiagram-CIIHVFJN-JLUXqFyb.js} +1 -1
  98. package/dist/client/assets/{wardley-L42UT6IY-Di70vhu2.js → wardley-L42UT6IY-D_UBzrZ2.js} +1 -1
  99. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-nK6ARhDv.js → wardleyDiagram-YWT4CUSO-BzwMrdpL.js} +1 -1
  100. package/dist/client/assets/{xychartDiagram-2RQKCTM6-C7_y76B7.js → xychartDiagram-2RQKCTM6-C5TjbAcZ.js} +1 -1
  101. package/dist/client/index.html +2 -2
  102. package/dist/client/sw.js +633 -13
  103. package/dist/client/version.json +1 -1
  104. package/dist/extension.js +3999 -2008
  105. package/package.json +1 -1
  106. package/skill/fusion/references/engine-tools.md +1 -1
  107. package/dist/client/assets/AgentDetailView-CoeSgMXS.css +0 -1
  108. package/dist/client/assets/AgentDetailView-DH4Cn5iG.js +0 -13
  109. package/dist/client/assets/AgentsView-Dkij8Sm8.js +0 -24
  110. package/dist/client/assets/CommandCenter-jTzBo-pg.js +0 -97
  111. package/dist/client/assets/DevServerView-CxlacYJp.js +0 -1
  112. package/dist/client/assets/EvalsView-kYnaIk11.js +0 -1
  113. package/dist/client/assets/ResearchView-eMiRw1EM.js +0 -2
  114. package/dist/client/assets/SessionTerminal-DtFLyUaK.js +0 -2
  115. package/dist/client/assets/SettingsModal-BTfZlghk.css +0 -1
  116. package/dist/client/assets/SettingsModal-DSq-_qwo.js +0 -21
  117. package/dist/client/assets/channel-xFBfK0sX.js +0 -1
  118. package/dist/client/assets/classDiagram-4FO5ZUOK-BFBVD968.js +0 -1
  119. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BFBVD968.js +0 -1
  120. package/dist/client/assets/common-BDp2y6CF.js +0 -1
  121. package/dist/client/assets/common-BnEo5fLN.js +0 -1
  122. package/dist/client/assets/common-Bzr_Y8h4.js +0 -1
  123. package/dist/client/assets/common-CvwyFzfv.js +0 -1
  124. package/dist/client/assets/common-CztCXRkz.js +0 -1
  125. package/dist/client/assets/common-DPe2mbb7.js +0 -1
  126. package/dist/client/assets/index-C2xsZoNG.js +0 -2671
  127. package/dist/client/assets/index-Dv-95s50.css +0 -1
@@ -0,0 +1 @@
1
+ import{r as a,j as r}from"./vendor-react-SZ_qB27O.js";import{a as z,w as O,c$ as tr,bd as sr,aV as _r,cR as ie,L as fe,aH as Ar,d0 as Tr,d1 as Or,d2 as Fr,C as $r,a_ as nr,d3 as zr,V as Hr,d4 as Br,c5 as Ir,c7 as Vr,d5 as Wr,p as He,X as qr,aQ as Jr,R as Xr}from"./index-8wtfjIkg.js";import{u as he}from"./vendor-i18n-GF3RlKbq.js";import{S as ar}from"./shield-alert-Byjz1VmT.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function Be(e){const s=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",n=s==="root"?".":s,t=e.name,v=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():n,d=typeof e.confidence=="number"?e.confidence:1,b=s==="root"?"root":s,u=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:t,packagePath:v,confidence:d,cwd:n,source:s,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${u} · ${t} (${b})`}}function te(e){const s=e.status,n=s==="starting"||s==="running"||s==="failed"||s==="stopped"?s:"stopped",t=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,v=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:n,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:t,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:t,detectedPort:e.detectedPort,manualPreviewUrl:v,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:v,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function Kr(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Gr(e){const n=(Array.isArray(e.lines)?e.lines:[]).map((t,v)=>Kr(t,v+1));return{lines:n,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:n.length}}function Qr(e,s){const n=typeof s.maxLines=="number"&&Number.isFinite(s.maxLines)?Math.max(1,Math.floor(s.maxLines)):100,t=typeof s.offset=="number"&&Number.isFinite(s.offset)?Math.max(0,Math.floor(s.offset)):0,v=typeof s.lastEventId=="number"&&Number.isFinite(s.lastEventId)?Math.max(0,Math.floor(s.lastEventId)):null,d=e.length,b=e.map((N,H)=>({id:H+1,text:N,stream:"stdout",timestamp:""}));if(v!==null)return{lines:b.filter(N=>N.id>v).slice(0,n),totalLines:d};const u=Math.max(d-t,0),C=Math.max(u-n,0);return{lines:b.slice(C,u),totalLines:d}}function Ie(e){return Array.isArray(e)?e.map(Be):(e.candidates??[]).map(Be)}async function ir(e){try{const s=await z(O("/dev-server/candidates",e));return Ie(s)}catch(s){if(s instanceof Error&&/\/dev-server\/candidates/.test(s.message)){const n=await z(O("/dev-server/detect",e));return Ie(n)}throw s}}function ge(e){return z(O("/dev-server/status",e)).then(te)}async function ke(e={},s){const n=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&n.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&n.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&n.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const t=n.size>0?`?${n.toString()}`:"";try{const v=await z(O(`/dev-server/logs/history${t}`,s));return Gr(v)}catch(v){if(v instanceof Error&&/\/dev-server\/logs\/history/.test(v.message)){const d=await ge(s);return Qr(d.logs,e)}throw v}}function or(e,s){const n=e.cwd??e.packagePath??".",t=e.scriptName;return z(O("/dev-server/start",s),{method:"POST",body:JSON.stringify({command:e.command,scriptName:t,scriptId:t,cwd:n,packagePath:e.packagePath})}).then(te)}function lr(e){return z(O("/dev-server/stop",e),{method:"POST"}).then(te)}function cr(e){return z(O("/dev-server/restart",e),{method:"POST"}).then(te)}async function dr(e,s){const n=typeof e=="string"?{url:e}:e;try{const t=await z(O("/dev-server/preview-url",s),{method:"POST",body:JSON.stringify(n)});return te(t)}catch(t){if(t instanceof Error&&/\/dev-server\/preview-url/.test(t.message)){const v=await z(O("/dev-server/preview-url",s),{method:"PUT",body:JSON.stringify(n)});return te(v)}throw t}}function Ue(e){return tr(O("/dev-server/logs/stream",e))}async function De(e){try{return(await z(O("/devserver",e))).sessions??[]}catch{try{const s=await ge(e);return[{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function vr(e,s){try{return await z(O(`/devserver/${encodeURIComponent(e)}`,s))}catch{try{const n=await ge(s);return!e||e==="default"||e===n.id?{config:{id:n.id??"default",name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Ve(e,s){try{return await z(O(`/devserver/${encodeURIComponent(e)}/start`,s),{method:"POST"})}catch{const n=await or({command:""},s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function We(e,s){try{return await z(O(`/devserver/${encodeURIComponent(e)}/stop`,s),{method:"POST"})}catch{const n=await lr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function qe(e,s){try{return await z(O(`/devserver/${encodeURIComponent(e)}/restart`,s),{method:"POST"})}catch{const n=await cr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function Je(e,s,n){try{const t=await z(O(`/devserver/${encodeURIComponent(e)}/preview`,n),{method:"POST",body:JSON.stringify({url:s})});return{url:t.url??null,source:t.source??null}}catch{const t=await dr({url:s},n);return{url:t.previewUrl??t.manualUrl??null,source:"manual"}}}async function Ce(e){try{return(await z(O("/devserver/detect",e))).candidates??[]}catch{try{return(await ir(e)).map(n=>({name:n.name,command:n.command,cwd:n.cwd,scriptName:n.scriptName,packagePath:n.packagePath}))}catch{return[]}}}function Yr(e,s){return tr(O(`/devserver/${encodeURIComponent(e)}/logs/stream`,s))}const Pe=500,Zr=3e3;function q(e){return e instanceof Error?e.message:String(e)}function ur(e){return e.length<=Pe?e:e.slice(-Pe)}function je(e,s){return ur([...e,s])}function re(e){try{return JSON.parse(e)}catch{return null}}function ue(e){const s=e.text??"";return e.stream==="stderr"?`[stderr] ${s}`:s}function et(e){return e?.previewUrl??null}async function Xe(e){return ge(e)}async function Ke(e,s){return or(e,s)}async function rt(e){return lr(e)}async function tt(e){return cr(e)}async function Ge(e){return ir(e)}function K(e){try{return e()}catch{return null}}function Ee(){return typeof K(()=>De)=="function"&&typeof K(()=>vr)=="function"}function Z(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(s=>({timestamp:new Date().toISOString(),stream:s.startsWith("[stderr]")?"stderr":"stdout",text:s.replace(/^\[stderr\]\s*/,"")}))}}function st(e){const{t:s}=he("app"),[n,t]=a.useState(null),[v,d]=a.useState([]),[b,u]=a.useState([]),[C,N]=a.useState([]),[H,R]=a.useState(!0),[L,f]=a.useState(null),c=a.useRef(0),[m,M]=a.useState(null),$=a.useCallback(l=>{if(t(l),l?.logHistory){const i=l.logHistory.slice(-Pe).map(ue);u(i)}},[]),U=a.useCallback(async()=>{const l=c.current;try{if(Ee())if(m){const i=await vr(m,e);if(c.current!==l)return;$(i)}else{const i=await De(e);if(c.current!==l)return;d(i),i.length>0&&(M(i[0].config.id),$(i[0]))}else{const i=await Xe(e);if(c.current!==l)return;const g=Z(i);d([g]),$(g)}f(null)}catch(i){if(c.current!==l)return;f(q(i))}},[$,e,m]);a.useEffect(()=>{c.current+=1;const l=c.current;t(null),d([]),u([]),N([]),R(!0),f(null),M(null),(async()=>{try{const[g,w]=await Promise.allSettled([Ee()?De(e):Xe(e).then(E=>[Z(E)]),typeof K(()=>Ce)=="function"?Ce(e):Ge(e).then(E=>E.map(k=>({name:k.name,command:k.command,cwd:k.cwd,scriptName:k.scriptName,packagePath:k.packagePath})))]);if(c.current!==l)return;let h=null;if(g.status==="fulfilled"){const E=g.value;if(d(E),E.length>0){const k=E[0];Ee()&&M(k.config.id),$(k)}}else h=q(g.reason);w.status==="fulfilled"&&N(w.value),h&&f(h)}catch(g){if(c.current!==l)return;f(q(g))}finally{c.current===l&&R(!1)}})()},[$,e]),a.useEffect(()=>{const l=m?Yr(m,e):typeof K(()=>Ue)=="function"?Ue(e):null;if(!l)return;const i=c.current,g=sr(l,{events:{history:w=>{if(c.current!==i)return;const h=re(w.data);if(h?.lines){const E=h.lines.map(ue);u(ur(E))}},log:w=>{if(c.current!==i)return;const h=re(w.data);if(h){const E=typeof h.line=="string"?h.line:ue(h);u(k=>je(k,E))}},"dev-server:log":w=>{if(c.current!==i)return;const h=re(w.data);if(h){const E=typeof h.line=="string"?h.line:ue(h);u(k=>je(k,E))}},"dev-server:output":w=>{if(c.current!==i)return;const h=re(w.data);h?.line&&u(E=>je(E,h.line))},status:w=>{if(c.current!==i)return;const h=re(w.data),E=h?.status;E&&t(k=>k&&{...k,status:E,runtime:h.pid?{...k.runtime??{startedAt:new Date().toISOString()},pid:h.pid}:k.runtime})},"dev-server:status":w=>{if(c.current!==i)return;const h=re(w.data);if(h?.status){const E=Z(h);t(E),d([E])}},stopped:()=>{c.current},failed:()=>{c.current}},onReconnect:()=>{c.current===i&&U()},onError:()=>{c.current===i&&f(w=>w??s("devserver.lostConnection","Lost log stream connection."))}});return()=>{g()}},[e,U,m]);const F=n?.status==="running"||n?.status==="starting";_r(U,Zr,{enabled:F});const D=a.useCallback(async(l,i)=>{c.current+=1;const g=c.current;try{let w;const h=typeof i=="string"&&i.length>0,E=n?.config?.cwd??".";if(!(h&&i!==E)&&m&&typeof K(()=>Ve)=="function")w=await Ve(m,e);else{const oe=await Ke({command:l,cwd:i},e);w=Z(oe)}if(c.current!==g)return;t(w),f(null)}catch(w){if(c.current!==g)return;throw f(q(w)),w}},[e,n?.config?.cwd,m]),I=a.useCallback(async()=>{c.current+=1;const l=c.current;try{let i;if(m&&typeof K(()=>We)=="function")i=await We(m,e);else{const g=await rt(e);i=Z(g)}if(c.current!==l)return;t(i),f(null)}catch(i){if(c.current!==l)return;throw f(q(i)),i}},[e,m]),V=a.useCallback(async()=>{c.current+=1;const l=c.current;try{let i;if(m&&typeof K(()=>qe)=="function")i=await qe(m,e);else{const g=await tt(e);i=Z(g)}if(c.current!==l)return;t(i),f(null)}catch(i){if(c.current!==l)return;throw f(q(i)),i}},[e,m]),B=a.useCallback(async l=>{c.current+=1;const i=c.current;try{let g;if(m&&typeof K(()=>Je)=="function")g=await Je(m,l,e);else{const w=await dr({url:l},e);g={url:w.manualUrl??w.previewUrl??w.detectedUrl??null,source:w.manualUrl?"manual":"auto"}}if(c.current!==i)return;t(w=>w?{...w,previewUrl:g.url??void 0}:null),f(null)}catch(g){if(c.current!==i)return;throw f(q(g)),g}},[e,m]),P=a.useCallback(async()=>{c.current+=1;const l=c.current;try{let i;try{i=await Ce(e)}catch{i=(await Ge(e)).map(w=>({name:w.name,command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath}))}if(c.current!==l)return;N(i),f(null)}catch(i){if(c.current!==l)return;throw f(q(i)),i}},[e]),x=a.useCallback(async(l,i)=>{if(typeof l!="string"&&!m)try{const h=l,E=await Ke({command:h.command,cwd:h.cwd,scriptName:h.scriptName,packagePath:h.packagePath??h.cwd},e),k=Z(E);t(k),d([k]),f(null);return}catch(h){throw f(q(h)),h}const g=typeof l=="string"?l:l.command,w=typeof l=="string"?i:l.cwd;await D(g,w)},[e,D,m]),p=a.useCallback(async()=>{await I()},[I]),A=a.useCallback(async()=>{await V()},[V]),T=a.useCallback(async l=>{await B(l)},[B]),J=a.useCallback(async()=>{await P()},[P]),j=a.useCallback(async()=>{await U()},[U]),S=et(n),y=n?{...n,pid:n.runtime?.pid}:null;return{session:n,sessions:v,logs:b,detectedCommands:C,previewUrl:S,isLoading:H,error:L,startServer:D,stopServer:I,restartServer:V,setPreviewUrl:B,detectCommands:P,refresh:U,candidates:C,serverState:y,loading:H,start:x,stop:p,restart:A,setManualUrl:T,detect:J,refreshStatus:j}}const Qe=500,Ye=100;function mr(e){return e.length>Qe?e.slice(-Qe):e}function pr(e){return e==="stderr"?"stderr":"stdout"}function me(e){try{return JSON.parse(e.data)}catch{return null}}function pe(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:"",stream:pr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function nt(e,s){return{id:s,text:e,stream:"stdout",timestamp:""}}function Le(e,s){if(s.length===0)return e;const n=[...e],t=new Set(e.map(v=>v.id));for(const v of s)t.has(v.id)||(t.add(v.id),n.push(v));return n.sort((v,d)=>v.id-d.id),mr(n)}function at(e,s){const[n,t]=a.useState([]),[v,d]=a.useState(!1),[b,u]=a.useState(!1),[C,N]=a.useState(!1),[H,R]=a.useState(null),L=a.useRef(null),f=a.useRef(!1),c=a.useRef(0),m=a.useRef(0),M=a.useRef(e),$=a.useRef(s),U=a.useRef(0),F=a.useRef(1);(M.current!==e||$.current!==s)&&(M.current=e,$.current=s,c.current++,ie({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),f.current=!0,U.current=0,F.current=1,t([]),d(!1),u(!1),N(!1),R(null),L.current&&(L.current(),L.current=null)),a.useEffect(()=>{if(!s){L.current&&(L.current(),L.current=null);return}const P=c.current,x=++m.current;f.current=!1,d(!0);const p=(j,S)=>{const y=mr(j);t(y),R(S),N(S!==null?S>y.length:!1);const l=y.length>0?y[y.length-1].id:0;U.current=l,F.current=l+1},A=j=>{if(f.current||c.current!==P||!j||typeof j!="object")return;const S=j.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const l=S.filter(i=>typeof i=="string").map((i,g)=>nt(i,g+1));p(l,l.length);return}const y=S.filter(l=>!!l&&typeof l=="object").map((l,i)=>pe(l,i+1));p(y,y.length)},T=j=>{if(f.current||c.current!==P)return;const S=typeof j.text=="string"?j.text:typeof j.line=="string"?j.line:null;if(!S)return;const y=F.current,l=typeof j.id=="number"&&Number.isFinite(j.id)?j.id:y,i={id:l,text:S,stream:pr(j.stream),timestamp:typeof j.timestamp=="string"?j.timestamp:""};U.current=Math.max(U.current,l),F.current=Math.max(F.current,l+1),t(g=>Le(g,[i])),R(g=>g===null?g:Math.max(g+1,i.id))};async function J(){try{const S=await ke({maxLines:Ye},e);if(f.current||c.current!==P||m.current!==x)return;const y=S.lines.map((l,i)=>pe(l,i+1));p(y,S.totalLines)}catch{if(f.current||c.current!==P||m.current!==x)return;p([],null)}finally{!f.current&&c.current===P&&m.current===x&&d(!1)}const j=Ue(e);L.current=sr(j,{events:{"dev-server:log":S=>{const y=me(S);y&&T(y)},log:S=>{const y=me(S);y&&T(y)},history:S=>{const y=me(S);A(y)},"dev-server:history":S=>{const y=me(S);A(y)}},onReconnect:()=>{ie({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:U.current??null,sseChannel:j,reason:"history-replay"}),!(f.current||c.current!==P)&&ke({lastEventId:U.current,maxLines:50},e).then(S=>{if(f.current||c.current!==P)return;const y=S.lines.map((l,i)=>pe(l,F.current+i));if(y.length>0){const l=y[y.length-1].id;U.current=Math.max(U.current,l),F.current=Math.max(F.current,l+1)}t(l=>Le(l,y)),R(S.totalLines)}).catch(()=>{})}}),ie({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:j})}return J(),()=>{f.current=!0,L.current&&(L.current(),L.current=null)}},[s,e]);const I=a.useCallback(async()=>{if(!s||b)return;const P=c.current,x=n.length;u(!0);try{const p=await ke({maxLines:Ye,offset:x},e);if(f.current||c.current!==P)return;const A=p.lines.map((T,J)=>pe(T,J+1));t(T=>Le(A,T)),N(p.totalLines>x+A.length),R(p.totalLines)}catch{}finally{u(!1)}},[s,n.length,b,e]),V=a.useCallback(()=>{t([])},[]),B=L.current!==null&&!v&&!f.current;return{entries:n,loading:v,loadingMore:b,hasMore:C,total:H,loadMore:I,clear:V,logs:n,isStreaming:B,clearLogs:V}}const it="This preview appears to block iframe embedding. Open it in a new tab instead.",ot="The preview URL could not be loaded. Verify the server is running and the URL is correct.",lt="Preview is taking longer than expected and may block iframe embedding.";function ct(e){return e==="blocked"?it:e==="error"?ot:null}function dt(e,s={}){const{loadTimeoutMs:n=1e4,detectionMethod:t=null}=s,v=a.useRef(null),d=a.useRef(null),[b,u]=a.useState("unknown"),[C,N]=a.useState(null),[H]=a.useState(t),R=a.useCallback(()=>{d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),L=a.useCallback(D=>{u(D),N(ct(D))},[]),f=a.useCallback(()=>{u("blocked"),N(lt)},[]);a.useEffect(()=>{if(R(),!e){u("unknown"),N(null);return}u("unknown"),N(null);let D=!1;return queueMicrotask(()=>{D||(u("loading"),N(null))}),()=>{D=!0,R()}},[R,e]),a.useEffect(()=>{if(b!=="loading"){R();return}const D=setTimeout(()=>{d.current=null,f()},n);return d.current=D,()=>{clearTimeout(D),d.current===D&&(d.current=null)}},[R,b,n,f]);const c=a.useCallback(()=>{const D=v.current;if(!D){L("embedded");return}try{if(D.contentWindow?.location?.href==="about:blank"&&D.src!=="about:blank"){L("blocked");return}}catch{}L("embedded")},[L]),m=a.useCallback(()=>{L("error")},[L]);a.useEffect(()=>{if(R(),!e){u("unknown"),N(null);return}u("unknown"),N(null)},[R]);const M=a.useCallback(()=>{R(),u("unknown"),N(null)},[R]),$=M,U=a.useMemo(()=>b==="embedded",[b]),F=a.useMemo(()=>b==="blocked"||b==="error",[b]);return{embedStatus:b,isEmbedded:U,isBlocked:F,blockReason:C,detectionMethod:H,iframeRef:v,resetEmbedStatus:M,setEmbedStatus:L,retry:$,embedContext:C,handleIframeLoad:c,handleIframeError:m}}const vt=/\x1b\[[0-9;]*m/g,ut=50;function mt(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=ut}function Me(e){return e.replace(vt,"")}function pt(e){if(!e)return"";const s=new Date(e);return Number.isNaN(s.getTime())?"":s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function ft(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ht(e){if(e.stream==="stderr")return"error";const s=Me(e.text).toLowerCase();return/\b(warn|warning)\b/.test(s)?"warn":/\b(error|fatal)\b/.test(s)?"error":"info"}function gt(e,s){if(!s)return e;const n=new RegExp(`(${ft(s)})`,"ig"),t=e.split(n),v=s.toLowerCase();return r.jsx(r.Fragment,{children:t.map((d,b)=>d.toLowerCase()===v?r.jsx("mark",{children:d},`${d}-${b}`):r.jsx("span",{children:d},`${d}-${b}`))})}function wt({entries:e,loading:s,loadingMore:n,hasMore:t,total:v,onLoadMore:d,isRunning:b}){const{t:u}=he("app"),C=a.useRef(null),N=a.useRef(e.length),H=a.useRef(b),[R,L]=a.useState(!1),[f,c]=a.useState(!1),m=a.useRef(!1),[M,$]=a.useState(""),[U,F]=a.useState("all"),D=a.useMemo(()=>U==="all"?e:e.filter(p=>ht(p)===U),[e,U]),I=a.useMemo(()=>{const p=M.trim().toLowerCase();return p?D.filter(A=>Me(A.text).toLowerCase().includes(p)):D},[D,M]),V=I.length,B=a.useCallback(p=>{m.current=p,c(p)},[]),P=a.useCallback(()=>{const p=C.current;p&&(p.scrollTop=p.scrollHeight,B(!1))},[B]);a.useEffect(()=>{const p=H.current,A=N.current,T=e.length>A;b&&(!p||!f&&T)&&P(),H.current=b,N.current=e.length},[e.length,b,f,P]);const x=a.useCallback(()=>{const p=C.current;p&&B(!mt(p))},[B]);return a.useEffect(()=>{s||e.length===0||!f&&b&&P()},[e,b,f,s,P]),a.useEffect(()=>{const p=C.current;if(!p||!b||typeof MutationObserver>"u")return;const A=new MutationObserver(()=>{m.current||P()});return A.observe(p,{childList:!0,characterData:!0,subtree:!0}),()=>A.disconnect()},[b,P]),s&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(fe,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:u("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${R?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:u("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[v!==null?`${e.length}/${v}`:`${e.length}`," ",u("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:u("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:U,onChange:p=>F(p.target.value),"data-testid":"devserver-log-severity-filter","aria-label":u("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:u("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:u("devserver.info","Info")}),r.jsx("option",{value:"warn",children:u("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:u("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:u("devserver.searchLogs","Search logs")}),r.jsx(Ar,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:M,onChange:p=>$(p.target.value),placeholder:u("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":u("devserver.searchLogs","Search logs")})]}),M.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:u("devserver.matchCount",{count:V,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>L(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":R?u("devserver.exitFullscreen","Exit fullscreen logs"):u("devserver.enterFullscreen","Enter fullscreen logs"),children:R?r.jsx(Tr,{size:14}):r.jsx(Or,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[t&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:d,disabled:n,"data-testid":"devserver-log-load-more-button",children:n?r.jsxs(r.Fragment,{children:[r.jsx(fe,{size:14,className:"devserver-log-viewer__spinner"}),u("devserver.loadingOlderLogs","Loading older logs…")]}):u("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:C,className:"devserver-log-viewer__content",onScroll:x,"data-testid":"devserver-log-content",children:[!s&&I.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?u("devserver.noLogsYet","No logs yet. Start the dev server to see output."):D.length===0?u("devserver.noMatchesSeverity","No log lines match the selected severity."):u("devserver.noMatchesSearch","No log lines match your search.")}),I.map(p=>{const A=Me(p.text),T=pt(p.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[T&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:T}),p.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:u("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Fr(gt(A,M.trim()))})]},p.id)})]}),f&&b&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx($r,{size:14}),u("devserver.newLogs","New logs")]})]})]})}const bt="devserver-preview-iframe";function xt({url:e,embedStatus:s,onEmbedStatusChange:n,iframeRef:t,blockReason:v,onRetry:d,className:b=bt,embedContext:u}){const{t:C}=he("app"),N=v??u??null,[H,R]=a.useState(0);a.useEffect(()=>{!e||s!=="unknown"||(R(m=>m+1),n("loading"))},[s,n,e]);const L=a.useCallback(()=>{const m=t.current;if(!m){n("embedded");return}try{if(m.contentWindow?.location?.href==="about:blank"&&m.src!=="about:blank"){n("blocked");return}}catch{}n("embedded")},[t,n]),f=a.useCallback(m=>{m.stopPropagation(),n("error")},[n]),c=a.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:t,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:b,title:"Dev server preview",onLoad:L,onError:f,onErrorCapture:f,"data-testid":"devserver-preview-iframe"},`${e}-${H}`),s==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(fe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:C("preview.loading","Loading preview...")})]}),s==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children: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:c,children:C("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:C("actions.retry","Retry")})]})]}),s==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children: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:c,children:C("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:C("actions.retry","Retry")})]})]})]}):null}function yt(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 St=480;function Nt(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function fr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const s=e.parentElement;return s?.classList.contains("right-dock__body")?s:null}function kt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function Ct(e){if(!e||Nt())return!1;const s=fr(e);return s?kt(s)<=St:!1}function jt(e){const[s,n]=a.useState(!1);return a.useEffect(()=>{const t=e.current;if(!t){n(!1);return}const v=fr(t),d=()=>n(Ct(t));if(d(),!v||typeof ResizeObserver>"u")return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d);const b=new ResizeObserver(d);return b.observe(v),window.addEventListener("resize",d),()=>{b.disconnect(),window.removeEventListener("resize",d)}},[e]),s}let Re=!1;function Ze(e){return e instanceof Error?e.message:String(e)}function hr(e){return e==="."?"root":e}function er(e){return e?e==="root"?".":e:null}function rr(e,s,n){return!s||e.scriptName!==s?!1:n?hr(e.cwd)===n:!0}function Et(e){return e.cwd==="."?"root":e.cwd}function Lt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Tt({addToast:e,projectId:s,tasks:n}){const{t}=he("app");a.useEffect(()=>(ie({view:"DevServerView",trigger:Re?"route-active":"remount",projectId:s,replayAttempted:!1}),Re=!1,()=>{Re=!0,ie({view:"DevServerView",trigger:"route-inactive",projectId:s,replayAttempted:!1})}),[s]);const{session:v,detectedCommands:d,previewUrl:b,isLoading:u,error:C,startServer:N,stopServer:H,restartServer:R,setPreviewUrl:L,detectCommands:f,refresh:c}=st(s),m=v?.status??"stopped",M=m==="running"||m==="starting",$=yt(t),U=$[m]??$.stopped,{entries:F,loading:D,loadingMore:I,hasMore:V,total:B,loadMore:P}=at(s,!!s),x=b,p=v?.config?.cwd??null,A=a.useRef(null),T=jt(A),[J,j]=a.useState(!0),[S,y]=a.useState(""),[l,i]=a.useState(""),[g,w]=a.useState(null),[h,E]=a.useState(null),[k,oe]=a.useState(null),G=a.useMemo(()=>(n??[]).filter(o=>o.column==="in-progress"&&typeof o.worktree=="string"&&o.worktree.length>0),[n]),X=a.useMemo(()=>G.find(o=>o.id===h)??null,[G,h]);a.useEffect(()=>{h&&!G.some(o=>o.id===h)&&E(null)},[G,h]);const[se,gr]=a.useState("embedded"),[ne,we]=a.useState(!1),_e=a.useRef(null),be=a.useRef(null),wr=se==="embedded"?x:null,{embedStatus:W,setEmbedStatus:br,resetEmbedStatus:le,iframeRef:ee,isEmbedded:xr,isBlocked:xe,blockReason:ye,retry:Ae}=dt(wr),[Te,Q]=a.useState(!1),Oe=a.useRef(W);a.useEffect(()=>{const o=Oe.current!==W;xe&&o&&Q(!0),W==="embedded"&&Q(!1),Oe.current=W},[W,xe]),a.useEffect(()=>{Q(!1)},[x]);const ce=a.useMemo(()=>{if(!g)return null;const o=er(p);return d.find(_=>!(_.scriptName!==g||o&&_.cwd!==o||v?.config?.command&&_.command!==v.config.command))??d.find(_=>rr(_,g,p))??null},[d,v?.config?.command,g,p]);a.useEffect(()=>{typeof f=="function"&&f().catch(o=>{e(Ze(o),"error")})},[e,f]),a.useEffect(()=>{if(g){j(!1);return}j(!0)},[g]),a.useEffect(()=>{if(v?.status==="running"||v?.status==="starting"){v.config?.command?.trim().length>0&&y(v.config.command);return}if(ce){y(ce.command);return}d.length>0&&y(o=>o.trim().length>0?o:d[0]?.command??"")},[d,ce,v?.config?.command,v?.status]),a.useEffect(()=>{i(x??"")},[x]);const de=a.useCallback(()=>{we(!1),window.requestAnimationFrame(()=>_e.current?.focus())},[]),yr=zr(de);a.useEffect(()=>{if(!ne)return;be.current?.focus();const o=_=>{if(_.key==="Escape"){de();return}if(_.key!=="Tab")return;const ae=Array.from(be.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(ze=>!ze.hasAttribute("disabled")&&ze.getAttribute("aria-hidden")!=="true"),Y=ae[0],Ne=ae.at(-1);!Y||!Ne||(_.shiftKey&&document.activeElement===Y?(_.preventDefault(),Ne.focus()):!_.shiftKey&&document.activeElement===Ne&&(_.preventDefault(),Y.focus()))};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[de,ne]),a.useEffect(()=>{!T&&ne&&we(!1)},[T,ne]);const Se=a.useCallback(()=>{x&&window.open(x,"_blank","noopener,noreferrer")},[x]),Fe=a.useCallback(()=>{Q(!1),Ae()},[Ae]),Sr=a.useCallback(()=>{try{const o=ee.current;if(o?.contentWindow){o.contentWindow.location.reload(),Q(!1),le();return}}catch{}if(!(!x||!ee.current))try{const o=new URL(x);o.searchParams.set("_t",Date.now().toString()),ee.current.src=o.toString(),Q(!1),le()}catch{ee.current.src=x,Q(!1),le()}},[x,ee,le]),ve=a.useCallback(async(o,_,ae)=>{oe(o);try{await _(),e(ae,"success")}catch(Y){e(Ze(Y),"error")}finally{oe(null)}},[e]),Nr=a.useCallback(o=>{w(o.scriptName),j(!1),y(o.command),e(t("devserver.toast.selectedScript","Selected {{name}} script.",{name:o.scriptName}),"success")},[e]),kr=a.useCallback(()=>{w(null),j(!0),e(t("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Cr=a.useCallback(o=>{M&&o&&o!==h&&e(t("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),E(o)},[e,M,h,t]),jr=()=>{const o=S.trim();if(o.length===0){e(t("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const _=er(p)??".",Y=X?.worktree??null??ce?.cwd??_;ve("start",()=>N(o,Y),t("devserver.toast.started","Dev server started."))},Er=()=>{ve("stop",H,t("devserver.toast.stopped","Dev server stopped."))},Lr=()=>{ve("restart",R,t("devserver.toast.restarted","Dev server restarted."))},Rr=()=>{const o=l.trim(),_=o.length>0?o:null;ve("preview",()=>L(_),_?t("devserver.toast.previewUpdated","Preview URL updated."):t("devserver.toast.previewCleared","Preview URL override cleared."))},Ur=a.useCallback(()=>{C&&c()},[C,c]),Dr=m==="starting"||m==="running"||k!==null,Pr=m==="stopped"||k!==null,Mr=m==="stopped"||m==="starting"||k!==null,$e=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[t("devserver.auto","Auto"),x?` · ${x}`:t("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>gr(o=>o==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:se==="embedded"?t("devserver.externalOnly","External only"):t("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.openInNewTab","Open in new tab"),onClick:Se,disabled:!x,"data-testid":"devserver-preview-open-tab",children:r.jsx(Jr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.refreshPreview","Refresh preview"),onClick:Sr,disabled:!x,"data-testid":"devserver-preview-refresh",children:r.jsx(Xr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":W,"data-embedded":xr?"true":"false",children:[!x&&!M&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.startDevServer","Start a dev server to see a live preview here.")}),!x&&M&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),x&&se==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:t("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:Se,"data-testid":"devserver-preview-external-open-tab",children:t("devserver.openInNewTab","Open in new tab")})]}),x&&se==="embedded"&&Te&&xe&&r.jsxs("div",{className:W==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[W==="error"?r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:W==="error"?t("devserver.previewFailed","Preview failed"):t("devserver.previewBlocked","Preview blocked")}),ye&&r.jsx("p",{className:"devserver-preview-blocked-context",children:ye})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:t("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:Se,"data-testid":"devserver-preview-fallback-open-tab",children:t("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Fe,"data-testid":"devserver-preview-fallback-retry",children:t("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),x&&se==="embedded"&&!Te&&r.jsx(xt,{url:x,embedStatus:W,onEmbedStatusChange:br,iframeRef:ee,blockReason:ye,onRetry:Fe})]})]});return r.jsxs("div",{ref:A,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":T?"true":"false",children:[r.jsx(Hr,{icon:Br,title:t("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${U.className}`,"data-testid":"dev-server-status-badge",children:U.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:jr,disabled:Dr,"data-testid":"dev-server-start-button",children:[r.jsx(Ir,{size:14}),r.jsx("span",{children:k==="start"?t("devserver.starting","Starting..."):t("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Er,disabled:Pr,"data-testid":"dev-server-stop-button",children:[r.jsx(Vr,{size:14}),r.jsx("span",{children:k==="stop"?t("devserver.stopping","Stopping..."):t("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Lr,disabled:Mr,"data-testid":"dev-server-restart-button",children:[r.jsx(Wr,{size:14}),r.jsx("span",{children:k==="restart"?t("devserver.restarting","Restarting..."):t("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":t("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.configuration","Configuration")}),u&&r.jsx("span",{className:"dev-server-muted",children:t("devserver.loading","Loading...")})]}),u&&!v&&d.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(fe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:t("devserver.loadingConfig","Loading dev server configuration...")})]}),C&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:C}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ur,children:t("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:t("devserver.scriptSelection","Script Selection")}),g&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:g}),r.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>j(!0),"data-testid":"dev-server-change-selection",children:t("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:kr,"data-testid":"dev-server-clear-selection",children:t("devserver.clear","Clear")})]}),J&&d.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:t("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),J&&d.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:d.map(o=>{const _=rr(o,g,p);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${_?"dev-server-candidate--selected":""}`,onClick:()=>Nr(o),"data-testid":`dev-server-candidate-${o.scriptName}-${hr(o.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:o.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Lt(o.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:Et(o)})]},`${o.cwd}::${o.scriptName}::${o.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:t("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:t("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:h??"",onChange:o=>Cr(o.target.value.length>0?o.target.value:null),disabled:G.length===0,"aria-label":t("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:t("devserver.projectRootNoTask","Project root (no task)")}),G.map(o=>r.jsx("option",{value:o.id,children:o.title?`${o.id} — ${o.title}`:o.id},o.id))]}),G.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:t("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),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:t("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:t("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:S,onChange:o=>y(o.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:m==="running"||m==="starting"})]}),(m==="running"||m==="starting")&&v&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.runningCommand","Running command")}),r.jsx("code",{children:v.config?.command??S})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:t("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:l,onChange:o=>i(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:Rr,disabled:k==="preview","data-testid":"dev-server-set-preview",children:t("devserver.save","Save")})]}),x&&r.jsx("p",{className:"dev-server-preview-hint",children:t("devserver.autoDetected","Auto-detected: {{url}}",{url:x})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":t("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:t("devserver.lines","{{count}} lines",{count:B??F.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(wt,{entries:F,loading:D,loadingMore:I,hasMore:V,total:B,onLoadMore:P,isRunning:M})})]})}),T?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":t("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:x||t("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:x?t("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):t("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:_e,onClick:()=>we(!0),"data-testid":"devserver-preview-modal-open",children:t("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":t("devserver.previewLabel","Dev server preview"),children:$e()}),T&&ne&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...yr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:be,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:t("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:de,"aria-label":t("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(qr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:$e()})]})})]})}export{Tt as DevServerView};
@@ -1 +1 @@
1
- import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a5 as z,a6 as D,a7 as S,a8 as f,g as j,a9 as T,E as B,p as A,P as L,L as K,h as N}from"./index-C2xsZoNG.js";import{u as R}from"./vendor-i18n-GF3RlKbq.js";import{F as U}from"./folder-open-BRrB44UX.js";function M({value:b,onChange:h,placeholder:F,onInputKeyDown:g,nodeId:k,localNodeId:m,selectCreatedDirectory:x=!1}){const{t:i}=R("app"),[e,s]=n.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1,createFolderOpen:!1,createFolderError:null}),[p,u]=n.useState(""),d=n.useCallback(async(t,c=!1)=>{s(o=>({...o,loading:!0,error:null}));try{const o=await z(t,c,k,m);s(a=>({...a,loading:!1,currentPath:o.currentPath,parentPath:o.parentPath,entries:o.entries}))}catch(o){s(a=>({...a,loading:!1,error:o instanceof Error?o.message:"Failed to browse directory"}))}},[k,m]),C=n.useCallback(()=>{s(t=>t.isOpen?{...t,isOpen:!1}:{...t,isOpen:!0})},[]);n.useEffect(()=>{e.isOpen&&!e.loading&&!e.currentPath&&!e.error&&d(b||void 0,e.showHidden)},[e.isOpen,e.loading,e.currentPath,e.error,b,e.showHidden,d,k,m]);const y=n.useCallback(t=>{d(t,e.showHidden)},[d,e.showHidden]),H=n.useCallback(()=>{h(e.currentPath),s(t=>({...t,isOpen:!1}))},[e.currentPath,h]),E=n.useCallback(()=>{s(t=>{const c=!t.showHidden;return{...t,showHidden:c}})},[]);n.useEffect(()=>{e.isOpen&&e.currentPath&&d(e.currentPath,e.showHidden)},[e.showHidden,d]);const w=n.useCallback(()=>{s(t=>({...t,createFolderOpen:!t.createFolderOpen,createFolderError:null})),u("")},[]),P=n.useCallback(async()=>{if(!p.trim()||!e.currentPath)return;const t=p.trim();if(t.includes("/")||t.includes("\\")||t.includes("..")){s(a=>({...a,createFolderError:i("dirPicker.createFolderError","Folder name cannot contain path separators or '..'")}));return}const c=e.currentPath.includes("\\")?"\\":"/",o=e.currentPath.endsWith(c)?e.currentPath+t:e.currentPath+c+t;s(a=>({...a,loading:!0,createFolderError:null}));try{const a=await D(o);u(""),s(l=>({...l,createFolderOpen:!1})),x?(h(a.path),await d(a.path,e.showHidden),s(l=>l.error?{...l,isOpen:!1,error:null}:l)):await d(e.currentPath,e.showHidden)}catch(a){s(l=>({...l,loading:!1,createFolderError:a instanceof Error?a.message:"Failed to create folder"}))}},[p,e.currentPath,e.showHidden,d,h,x]),O=n.useCallback(t=>{t.key==="Enter"?(t.preventDefault(),P()):t.key==="Escape"&&(s(c=>({...c,createFolderOpen:!1,createFolderError:null})),u(""))},[P]),v=e.currentPath?S(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:b,onChange:t=>h(t.target.value),onKeyDown:g,placeholder:F||i("dirPicker.defaultPlaceholder","/path/to/your/project")}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:C,"aria-label":e.isOpen?i("dirPicker.closeBrowser","Close directory browser"):i("dirPicker.openBrowser","Browse directories"),children:[e.isOpen?r.jsx(U,{size:16}):r.jsx(f,{size:16}),r.jsx("span",{children:i("dirPicker.browse","Browse")})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":i("dirPicker.ariaLabel","Directory browser"),children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:v.map((t,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(j,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>y(t.path),title:t.path,children:t.label})]},t.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>y(e.parentPath),"aria-label":i("dirPicker.parentDir","Go to parent directory"),title:i("dirPicker.parentDirTitle","Parent directory"),children:[r.jsx(T,{size:14}),r.jsx("span",{children:i("dirPicker.up","Up")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:E,"aria-label":e.showHidden?i("dirPicker.hideHiddenAria","Hide hidden directories"):i("dirPicker.showHiddenAria","Show hidden directories"),title:e.showHidden?i("dirPicker.hideHiddenTitle","Hide hidden"):i("dirPicker.showHiddenTitle","Show hidden"),children:[e.showHidden?r.jsx(B,{size:14}):r.jsx(A,{size:14}),r.jsx("span",{children:e.showHidden?i("dirPicker.hideHidden","Hide hidden"):i("dirPicker.showHidden","Show hidden")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-create-folder-toggle",onClick:w,"aria-label":i("dirPicker.createFolderAria","Create new folder"),title:i("dirPicker.createFolderTitle","Create folder"),children:[r.jsx(L,{size:14}),r.jsx("span",{children:i("dirPicker.createFolder","New folder")})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(K,{size:20,className:"animate-spin"}),r.jsx("span",{children:i("dirPicker.loading","Loading…")})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(N,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:i("dirPicker.noSubdirs","No subdirectories")}):e.entries.map(t=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>y(t.path),role:"treeitem",title:t.path,children:[r.jsx(f,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:t.name}),t.hasChildren&&r.jsx(j,{size:14,className:"directory-picker-entry-arrow"})]},t.path))}),e.createFolderOpen&&r.jsxs("div",{className:"directory-picker-create-folder",children:[r.jsx("input",{type:"text",className:"input directory-picker-create-folder-input",value:p,onChange:t=>u(t.target.value),onKeyDown:O,placeholder:i("dirPicker.newFolderPlaceholder","Folder name"),autoFocus:!0}),r.jsxs("div",{className:"directory-picker-create-folder-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm btn-primary",onClick:P,disabled:!p.trim()||e.loading||!e.currentPath,children:i("dirPicker.createFolderConfirm","Create")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-secondary",onClick:w,children:i("dirPicker.cancel","Cancel")})]}),e.createFolderError&&r.jsxs("div",{className:"directory-picker-create-folder-error",children:[r.jsx(N,{size:14}),r.jsx("span",{children:e.createFolderError})]})]}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:H,children:i("dirPicker.select","Select")})]})]})]})}export{M as D};
1
+ import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a5 as z,a6 as D,a7 as S,a8 as f,g as j,a9 as T,E as B,p as A,P as L,L as K,h as N}from"./index-8wtfjIkg.js";import{u as R}from"./vendor-i18n-GF3RlKbq.js";import{F as U}from"./folder-open-BnNbfyzc.js";function M({value:b,onChange:h,placeholder:F,onInputKeyDown:g,nodeId:k,localNodeId:m,selectCreatedDirectory:x=!1}){const{t:i}=R("app"),[e,s]=n.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1,createFolderOpen:!1,createFolderError:null}),[p,u]=n.useState(""),d=n.useCallback(async(t,c=!1)=>{s(o=>({...o,loading:!0,error:null}));try{const o=await z(t,c,k,m);s(a=>({...a,loading:!1,currentPath:o.currentPath,parentPath:o.parentPath,entries:o.entries}))}catch(o){s(a=>({...a,loading:!1,error:o instanceof Error?o.message:"Failed to browse directory"}))}},[k,m]),C=n.useCallback(()=>{s(t=>t.isOpen?{...t,isOpen:!1}:{...t,isOpen:!0})},[]);n.useEffect(()=>{e.isOpen&&!e.loading&&!e.currentPath&&!e.error&&d(b||void 0,e.showHidden)},[e.isOpen,e.loading,e.currentPath,e.error,b,e.showHidden,d,k,m]);const y=n.useCallback(t=>{d(t,e.showHidden)},[d,e.showHidden]),H=n.useCallback(()=>{h(e.currentPath),s(t=>({...t,isOpen:!1}))},[e.currentPath,h]),E=n.useCallback(()=>{s(t=>{const c=!t.showHidden;return{...t,showHidden:c}})},[]);n.useEffect(()=>{e.isOpen&&e.currentPath&&d(e.currentPath,e.showHidden)},[e.showHidden,d]);const w=n.useCallback(()=>{s(t=>({...t,createFolderOpen:!t.createFolderOpen,createFolderError:null})),u("")},[]),P=n.useCallback(async()=>{if(!p.trim()||!e.currentPath)return;const t=p.trim();if(t.includes("/")||t.includes("\\")||t.includes("..")){s(a=>({...a,createFolderError:i("dirPicker.createFolderError","Folder name cannot contain path separators or '..'")}));return}const c=e.currentPath.includes("\\")?"\\":"/",o=e.currentPath.endsWith(c)?e.currentPath+t:e.currentPath+c+t;s(a=>({...a,loading:!0,createFolderError:null}));try{const a=await D(o);u(""),s(l=>({...l,createFolderOpen:!1})),x?(h(a.path),await d(a.path,e.showHidden),s(l=>l.error?{...l,isOpen:!1,error:null}:l)):await d(e.currentPath,e.showHidden)}catch(a){s(l=>({...l,loading:!1,createFolderError:a instanceof Error?a.message:"Failed to create folder"}))}},[p,e.currentPath,e.showHidden,d,h,x]),O=n.useCallback(t=>{t.key==="Enter"?(t.preventDefault(),P()):t.key==="Escape"&&(s(c=>({...c,createFolderOpen:!1,createFolderError:null})),u(""))},[P]),v=e.currentPath?S(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:b,onChange:t=>h(t.target.value),onKeyDown:g,placeholder:F||i("dirPicker.defaultPlaceholder","/path/to/your/project")}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:C,"aria-label":e.isOpen?i("dirPicker.closeBrowser","Close directory browser"):i("dirPicker.openBrowser","Browse directories"),children:[e.isOpen?r.jsx(U,{size:16}):r.jsx(f,{size:16}),r.jsx("span",{children:i("dirPicker.browse","Browse")})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":i("dirPicker.ariaLabel","Directory browser"),children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:v.map((t,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(j,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>y(t.path),title:t.path,children:t.label})]},t.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>y(e.parentPath),"aria-label":i("dirPicker.parentDir","Go to parent directory"),title:i("dirPicker.parentDirTitle","Parent directory"),children:[r.jsx(T,{size:14}),r.jsx("span",{children:i("dirPicker.up","Up")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:E,"aria-label":e.showHidden?i("dirPicker.hideHiddenAria","Hide hidden directories"):i("dirPicker.showHiddenAria","Show hidden directories"),title:e.showHidden?i("dirPicker.hideHiddenTitle","Hide hidden"):i("dirPicker.showHiddenTitle","Show hidden"),children:[e.showHidden?r.jsx(B,{size:14}):r.jsx(A,{size:14}),r.jsx("span",{children:e.showHidden?i("dirPicker.hideHidden","Hide hidden"):i("dirPicker.showHidden","Show hidden")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-create-folder-toggle",onClick:w,"aria-label":i("dirPicker.createFolderAria","Create new folder"),title:i("dirPicker.createFolderTitle","Create folder"),children:[r.jsx(L,{size:14}),r.jsx("span",{children:i("dirPicker.createFolder","New folder")})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(K,{size:20,className:"animate-spin"}),r.jsx("span",{children:i("dirPicker.loading","Loading…")})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(N,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:i("dirPicker.noSubdirs","No subdirectories")}):e.entries.map(t=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>y(t.path),role:"treeitem",title:t.path,children:[r.jsx(f,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:t.name}),t.hasChildren&&r.jsx(j,{size:14,className:"directory-picker-entry-arrow"})]},t.path))}),e.createFolderOpen&&r.jsxs("div",{className:"directory-picker-create-folder",children:[r.jsx("input",{type:"text",className:"input directory-picker-create-folder-input",value:p,onChange:t=>u(t.target.value),onKeyDown:O,placeholder:i("dirPicker.newFolderPlaceholder","Folder name"),autoFocus:!0}),r.jsxs("div",{className:"directory-picker-create-folder-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm btn-primary",onClick:P,disabled:!p.trim()||e.loading||!e.currentPath,children:i("dirPicker.createFolderConfirm","Create")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-secondary",onClick:w,children:i("dirPicker.cancel","Cancel")})]}),e.createFolderError&&r.jsxs("div",{className:"directory-picker-create-folder-error",children:[r.jsx(N,{size:14}),r.jsx("span",{children:e.createFolderError})]})]}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:H,children:i("dirPicker.select","Select")})]})]})]})}export{M as D};
@@ -1 +1 @@
1
- import{r as n,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as qe,ap as Ue,aq as Rt,ar as Ht,as as zt,at as Ke,au as $t,av as Ot,aw as fe,ax as It,ay as _e,az as Bt,aA as qt,aB as Ut,aC as _t,aD as Ae,aE as Vt,aF as Ve,V as Qt,aG as ce,E as Wt,p as Gt,aH as Kt,X as Xt,R as Yt,aI as ke,A as Qe,v as We,aJ as Ge,j as De,r as Ee,aK as Jt,aL as Xe,aM as Zt,aN as es,aO as ts,aP as ss,z as ns,aQ as as,aR as cs}from"./index-C2xsZoNG.js";import{u as os}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function rs(a){const{projectId:r,searchQuery:g,includeProjectFiles:P=!0}=a??{},x=r?`${Rt.DOCUMENTS_PREFIX}${r}`:null,[t,i]=n.useState(()=>{if(!x)return[];const N=qe(x,{maxAgeMs:Ue});return Array.isArray(N)?N:[]}),[A,d]=n.useState([]),[k,b]=n.useState(()=>t.length===0),[u,C]=n.useState(null),m=n.useRef(null),f=n.useRef(t.length>0),p=n.useRef(null),{capture:D}=Ht(r,"useDocuments"),S=n.useCallback(async()=>{const N=D();m.current&&m.current.abort();const J=new AbortController;m.current=J;const $=!f.current;$&&b(!0),C(null);const Z=zt(g?{q:g}:void 0,r),U=P?Ke(r):Promise.resolve({files:[]}),[w,re]=await Promise.allSettled([Z,U]);if(J.signal.aborted||N.isStale())return;let O=null;if(w.status==="fulfilled"){if(i(w.value),x){const _=w.value.length>500?w.value.slice(0,500):w.value;$t(x,_,{maxBytes:5e5})}f.current=!0}else O=w.reason instanceof Error?w.reason.message:String(w.reason);if(re.status==="fulfilled"){const _=re.value.files,G=g?.trim().toLowerCase(),ie=G?_.filter(ee=>ee.name.toLowerCase().includes(G)||ee.path.toLowerCase().includes(G)):_;d(ie)}C(O),$&&b(!1)},[x,D,P,r,g]);return n.useEffect(()=>{if(d([]),!x){f.current=!1,i([]),b(!0);return}const N=qe(x,{maxAgeMs:Ue});Array.isArray(N)?(i(N),f.current=!0,b(!1)):(f.current=!1,i([]),b(!0))},[x]),n.useEffect(()=>(p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{S()},300),()=>{p.current&&clearTimeout(p.current)}),[S]),n.useEffect(()=>(S(),()=>{m.current&&m.current.abort()}),[]),{documents:t,projectFiles:A,loading:k,error:u,refresh:S}}function is(a,r){const[g,P]=n.useState([]),[x,t]=n.useState(!0),[i,A]=n.useState(null),d=n.useRef(null),k=n.useRef(!1),b=r?.showHidden??!1,u=n.useCallback(async C=>{d.current&&d.current.abort();const m=new AbortController;d.current=m;const f=!k.current;f&&t(!0),A(null);try{const p=await Ke(a,{showHidden:C?.showHidden??b});if(m.signal.aborted)return;P(p.files),k.current=!0}catch(p){if(m.signal.aborted)return;A(p instanceof Error?p.message:String(p))}finally{!m.signal.aborted&&f&&t(!1)}},[a,b]);return n.useEffect(()=>(k.current=!1,u({showHidden:b}),()=>{d.current&&d.current.abort()}),[u,b]),{files:g,loading:x,error:i,refresh:u}}const ls=768,ds={image:ss,doc:ce,pdf:ts,video:es,audio:Zt,other:Xe};function oe(a){return a?new Date(a).toLocaleString():""}function us(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function ms(a){return a==="done"?"status-dot status-dot--online":a==="archived"?"status-dot status-dot--offline":a==="todo"||a==="triage"?"status-dot status-dot--pending":"status-dot status-dot--connecting"}function Ye(a,r){switch(r){case"image":return a("documents.artifactCategoryImage","Image");case"doc":return a("documents.artifactCategoryDoc","Document");case"pdf":return a("documents.artifactCategoryPdf","PDF");case"video":return a("documents.artifactCategoryVideo","Video");case"audio":return a("documents.artifactCategoryAudioSingle","Audio");case"other":return a("documents.artifactCategoryOtherSingle","Other")}}function hs(a,r){return r?[a.title,a.description,a.taskId,a.taskTitle,a.mimeType,a.authorId].some(g=>g?.toLowerCase().includes(r)):!0}function fs(a){const r=a.mimeType?.toLowerCase().split(";",1)[0]??"";return!!a.content||a.type==="document"||r.startsWith("text/")||r==="application/json"||r==="application/xml"}function ks({artifact:a,projectId:r,content:g,loading:P,error:x,renderMarkdown:t,onToggleMarkdown:i,onOpenTask:A,t:d}){const[k,b]=n.useState(null),u=Ae(a),C=Ye(d,u),m=a.title||d("documents.untitledArtifact","Untitled artifact"),f=ns(a.id,r),p=u==="doc"&&fs(a);n.useEffect(()=>{b(null)},[a.id]);const D=k?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:k}):null,S=u==="image"?e.jsxs(e.Fragment,{children:[D,e.jsx("img",{className:"documents-task-artifact-media",src:f,alt:m,onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="video"?e.jsxs(e.Fragment,{children:[D,e.jsx("video",{className:"documents-task-artifact-media",controls:!0,src:f,"aria-label":d("documents.videoArtifactLabel","Video artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="audio"?e.jsxs(e.Fragment,{children:[D,e.jsx("audio",{className:"documents-task-artifact-audio",controls:!0,src:f,"aria-label":d("documents.audioArtifactLabel","Audio artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="pdf"?e.jsxs("div",{className:"documents-task-artifact-pdf",children:[e.jsx("iframe",{title:d("documents.pdfArtifactTitle","PDF artifact: {{title}}",{title:m}),src:f}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer",children:[e.jsx(as,{size:14,"aria-hidden":"true"}),d("documents.openInNewTab","Open in new tab")]})]}):u==="doc"&&p?P?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:d("documents.loadingArtifactContent","Loading artifact content…")})}):x?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:x}):t?e.jsx("div",{className:"documents-content-markdown documents-task-artifact-doc-content",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:g??a.content??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text documents-task-artifact-doc-content",children:g??a.content??""}):e.jsxs("div",{className:"documents-task-artifact-download",children:[e.jsx(Xe,{size:24,"aria-hidden":"true"}),e.jsx("p",{children:a.description||d("documents.binaryArtifactFallback","This artifact cannot be previewed inline.")}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer","data-testid":"task-artifact-open-link",children:[e.jsx(cs,{size:14,"aria-hidden":"true"}),d("documents.openArtifact","Open artifact")]})]});return e.jsxs("div",{className:"documents-content-viewer documents-task-artifact-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[a.taskId," / ",m]}),u==="doc"&&p?e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:i,"aria-label":t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":t,title:t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),children:t?d("documents.markdown","Markdown"):d("documents.plain","Plain")}):null]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta documents-task-artifact-meta",children:[e.jsx("span",{children:C}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:a.authorId||d("documents.unknownAuthor","unknown")}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:oe(a.updatedAt)}),a.taskId?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("button",{className:"documents-task-artifact-open-task",onClick:()=>void A(a.taskId),children:d("documents.openTask","Open task")})]}):null]}),a.description?e.jsx("p",{className:"documents-task-artifact-description",children:a.description}):null,e.jsx("div",{className:`documents-task-artifact-preview documents-task-artifact-preview--${u}`,children:S})]})}function gs({projectId:a,addToast:r,onOpenDetail:g,onOpenArtifactTaskDetail:P,onSendSelectionToTask:x}){const{t}=os("app"),[i,A]=n.useState("artifacts"),d=Ot(),[k,b]=n.useState(""),[u,C]=n.useState(null),[m,f]=n.useState(null),[p,D]=n.useState(!1),[S,N]=n.useState(null),[J,$]=n.useState(!1),[Z,U]=n.useState(null),[w,re]=n.useState(!1),O=n.useRef(0),_=n.useRef(null),G=n.useRef(null),ie=n.useRef(null),ee=n.useRef(null),[K,Le]=n.useState(!1),[Je,Me]=n.useState(new Map),[Ze,E]=n.useState(null),[pe,T]=n.useState(""),[le,F]=n.useState(null),[V,y]=n.useState(null),[de,je]=n.useState(!1),[et,L]=n.useState(null),[tt,I]=n.useState(!1),[st,M]=n.useState(null),[nt,xe]=n.useState(!0),te=n.useRef(0),[be,Q]=n.useState(!1),[ue,B]=n.useState(""),[we,ve]=n.useState(!1),[me,Re]=n.useState(!1),at=fe(_,{locked:me}),ct=fe(G,{locked:me}),ot=fe(ie,{locked:me}),rt=fe(ee,{locked:me}),ge=K?at:ct,Ne=i==="tasks"?k.trim():"",it=i==="artifacts"?k.trim():"",{documents:se,loading:lt,error:dt,refresh:ne}=rs({projectId:a,searchQuery:Ne||void 0,includeProjectFiles:!1}),{files:W,loading:ut,error:mt,refresh:He}=is(a,{showHidden:p}),{artifacts:R,loading:ht,error:ft,refresh:Se}=It({projectId:a,searchQuery:it||void 0});n.useEffect(()=>{const s=()=>{re(window.innerWidth<=ls)};return s(),window.addEventListener("resize",s),()=>{window.removeEventListener("resize",s)}},[]),n.useEffect(()=>{A("artifacts"),C(null),f(null),D(!1),N(null),U(null),$(!1),Le(!1),Me(new Map),E(null),T(""),F(null),y(null),je(!1),L(null),I(!1),M(null),xe(!0),Q(!1),B(""),ve(!1)},[a]);const X=n.useMemo(()=>{const s=Ne.toLowerCase(),c=new Map;for(const o of se){const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.documents.push(o),c.set(o.taskId,j)}for(const o of R){if(!o.taskId||!hs(o,s))continue;const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.artifacts.push(o),c.set(o.taskId,j)}return Array.from(c.entries()).map(([o,j])=>{const z=[...j.documents].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),q=[...j.artifacts].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),Pe=[z[0]?.updatedAt,q[0]?.updatedAt].filter(Boolean).sort().at(-1)??"",h=z.find(v=>v.taskTitle)?.taskTitle??q.find(v=>v.taskTitle)?.taskTitle;return{taskId:o,taskTitle:h,taskColumn:z.find(v=>v.taskColumn)?.taskColumn??q.find(v=>v.taskColumn)?.taskColumn,documents:z,artifacts:q,latestUpdated:Pe}}).filter(o=>o.documents.length>0||o.artifacts.length>0).sort((o,j)=>j.latestUpdated.localeCompare(o.latestUpdated))},[R,se,Ne]),l=n.useMemo(()=>m?.kind!=="document"?null:se.find(s=>s.id===m.id)??null,[se,m]),H=n.useMemo(()=>m?.kind!=="artifact"?null:R.find(s=>s.id===m.id)??null,[R,m]),he=l??H;n.useEffect(()=>{if(!m)return;X.some(c=>m.kind==="document"?c.documents.some(o=>o.id===m.id):c.artifacts.some(o=>o.id===m.id))||(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null))},[X,m]);const Ce=n.useMemo(()=>{const s=k.trim().toLowerCase();return s?W.filter(c=>{const o=c.path.toLowerCase(),j=c.name.toLowerCase();return o.includes(s)||j.includes(s)}):W},[W,k]);n.useEffect(()=>{if(!u)return;W.some(c=>c.path===u.path)||(C(null),N(null),U(null),$(!1))},[W,u]);const kt=n.useCallback(s=>{b(s.target.value)},[]),pt=n.useCallback(()=>{b("")},[]),ye=n.useCallback(s=>{A(s),s!=="tasks"&&(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)),s!=="project"&&(Q(!1),B(""))},[]),jt=n.useCallback(async s=>{try{const c=await _e(s,a);g(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,g,r]),ze=n.useCallback(async s=>{try{const c=await _e(s,a);(P??g)(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,P,g,r]),xt=n.useCallback(async s=>{C(s),$(!0),U(null),N(null),Q(!1),B("");const c=O.current+1;O.current=c;try{const o=await Bt("project",s.path,a);if(O.current!==c)return;N(o.content)}catch(o){if(O.current!==c)return;const j=o instanceof Error?o.message:`Failed to open ${s.path}`;U(j),r(j,"error")}finally{O.current===c&&$(!1)}},[a,r]),bt=n.useCallback(()=>{C(null),N(null),U(null),$(!1),Q(!1),B("")},[]),wt=n.useCallback(()=>{S!==null&&(B(S),Q(!0))},[S]),vt=n.useCallback(()=>{Q(!1),B("")},[]),gt=n.useCallback(async()=>{if(u){ve(!0);try{await qt("project",u.path,ue,a),N(ue),Q(!1),B(""),r(t("documents.projectFileSaved","File saved"),"success")}catch(s){r(s instanceof Error?s.message:String(s),"error")}finally{ve(!1)}}},[u,ue,a,r,t]),Nt=n.useCallback(s=>{f({kind:"document",id:s}),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),St=n.useCallback(s=>{f({kind:"artifact",id:s}),E(null),T(""),F(null),y(null),L(null),M(null),xe(!0)},[]),Ct=n.useCallback(()=>{f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),yt=n.useCallback(s=>{Me(c=>{const o=new Map(c),j=o.get(s)??!0;return o.set(s,!j),o})},[]),Tt=n.useCallback(()=>{l&&(T(l.content),E(l.id),F({revision:l.revision,contentHash:l.contentHash}),y(null))},[l]),Ft=n.useCallback(()=>{E(null),T(""),F(null),y(null)},[]),Pt=n.useCallback(()=>{V&&(F(V),y(null))},[V]),At=n.useCallback(async()=>{if(!(!l||!le||V)){je(!0);try{await Ut(l.taskId,l.key,pe,{expectedRevision:le.revision,expectedContentHash:le.contentHash},a),await ne(),E(null),T(""),F(null),y(null),r(t("documents.taskDocumentSaved","Document saved"),"success")}catch(s){if(typeof s=="object"&&s!==null&&"status"in s&&s.status===409)try{const c=await _t(l.taskId,l.key,a);await ne(),y({revision:c.revision,contentHash:c.contentHash}),r(t("documents.taskDocumentStale","This document changed since you opened it. Your draft is preserved; review the latest revision, then choose Rebase draft before saving."),"error")}catch(c){r(c instanceof Error?c.message:String(c),"error")}else r(s instanceof Error?s.message:String(s),"error")}finally{je(!1)}}},[l,pe,le,V,a,ne,r,t]);n.useEffect(()=>{if(!H||Ae(H)!=="doc"){L(null),I(!1),M(null);return}const s=te.current+1;te.current=s,I(!0),M(null),L(null),Vt(H.id,a).then(c=>{te.current===s&&L(c.content??H.content??"")}).catch(c=>{te.current===s&&M(c instanceof Error?c.message:String(c))}).finally(()=>{te.current===s&&I(!1)})},[a,H]);const $e=i==="project"?mt:i==="tasks"?dt:ft,Dt=n.useCallback(async()=>{if(i==="project"){await He();return}if(i==="tasks"){await ne();return}await Se()},[i,Se,He,ne]),Oe=i==="project"?Ce.length:i==="tasks"?X.length:R.length,Y=l?Je.get(l.id)??!0:!1,Te=Y?ot:rt,Fe=l!==null&&Ze===l.id,Et=i==="project"&&u&&!be&&x&&ge?e.jsx(Ve,{selectedText:ge.selectedText,anchorRect:ge.anchorRect,filePath:u.path,onSubmit:x,onOpenChange:Re}):null,Lt=i==="tasks"&&l&&!Fe&&x&&Te?e.jsx(Ve,{selectedText:Te.selectedText,anchorRect:Te.anchorRect,filePath:`${l.taskId}/${l.key}`,onSubmit:x,onOpenChange:Re}):null,Ie=i==="project"?t("documents.searchProjectFiles","Search project markdown files…"):i==="tasks"?t("documents.searchTaskDocuments","Search task documents…"):t("documents.searchArtifacts","Search artifacts…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsx(Qt,{icon:ce,title:t("documents.title","Artifacts"),actions:e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:Oe,plural:Oe!==1?"s":""})})}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":t("documents.sectionsLabel","Documents sections"),children:[e.jsxs("button",{className:`btn documents-tab${i==="artifacts"?" active":""}`,role:"tab","aria-selected":i==="artifacts","aria-label":t("documents.showArtifacts","Show artifacts"),onClick:()=>ye("artifacts"),children:[t("documents.artifactsTab","Artifacts"),e.jsx("span",{className:"documents-tab-count",children:R.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="project"?" active":""}`,role:"tab","aria-selected":i==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>ye("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:W.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="tasks"?" active":""}`,role:"tab","aria-selected":i==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>ye("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:X.length})]})]}),i==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>D(s=>!s),"aria-pressed":p,"aria-label":p?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:p?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[p?e.jsx(Wt,{size:14}):e.jsx(Gt,{size:14}),p?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(Kt,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:Ie,value:k,onChange:kt,"aria-label":Ie}),k&&e.jsx("button",{className:"documents-search-clear",onClick:pt,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(Xt,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:$e?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:i==="project"?t("documents.projectFiles","project files"):i==="tasks"?t("documents.taskDocuments","task documents"):t("documents.artifacts","artifacts"),error:$e})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void Dt(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(Yt,{size:16}),t("documents.retry","Retry")]})]}):i==="project"?ut&&W.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingProjectFiles","Loading project markdown files…")})})}):Ce.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!u)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":t("documents.projectMarkdownFilesLabel","Project markdown files"),children:e.jsx("ul",{className:"markdown-file-list",children:Ce.map(s=>{const c=u?.path===s.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${c?" markdown-file-item--selected":""}`,onClick:()=>void xt(s),"aria-label":`Open ${s.path}`,"aria-current":c?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:s.name}),e.jsx("span",{className:"markdown-file-item-path",children:s.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[us(s.size)," · ",oe(s.mtime)]})]})},s.path)})})}),(!w||u)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.projectFilePreviewLabel","Project file content preview"),children:[w&&u&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:bt,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(Qe,{size:14}),t("documents.backToFiles","Back to files")]}),u?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:u.path}),e.jsx("div",{className:"documents-task-document-actions",children:be?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:vt,disabled:we,children:t("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void gt(),disabled:we,children:we?t("documents.saving","Saving…"):t("documents.saveProjectFile","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>Le(s=>!s),"aria-label":K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":K,title:K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:K?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:wt,disabled:J||Z!==null||S===null,"aria-label":t("documents.editProjectFile","Edit project file"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),J?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:t("documents.loadingFileContent","Loading file content…")})}):Z?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:Z}):be?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.projectFileContentEditor","Project file content editor"),children:e.jsx(Ge,{content:ue,onChange:B,filePath:u.path,forceToolbarActionsVisible:!0})}):K?e.jsx("div",{ref:_,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:S??""})})}):e.jsx("pre",{ref:G,className:"document-card-content-text documents-content-viewer-text",children:S??""}),Et]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):i==="artifacts"?ht&&R.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingArtifacts","Loading artifacts…")})}):R.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchArtifacts",'No artifacts match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noArtifacts","No artifacts yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.artifactsCreatedBy","Agents register screenshots, wireframes, mockups, recordings, and documents here as they work on tasks.")})]})}):e.jsx(Jt,{artifacts:R,projectId:a,isMobile:w,addToast:r,onOpenTask:ze,onArtifactUpdated:()=>void Se()}):lt&&se.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingTaskDocuments","Loading task documents…")})})}):X.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsxs("div",{className:`documents-project-layout documents-task-documents-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!he)&&e.jsx("aside",{className:"documents-view-sidebar documents-task-documents-sidebar","aria-label":t("documents.taskDocumentsListLabel","Task documents"),children:X.map(({taskId:s,taskTitle:c,taskColumn:o,documents:j,artifacts:z})=>{const q=o?d(o):null,Pe=o?ms(o):"status-dot";return e.jsxs("section",{className:"documents-task-sidebar-group","aria-labelledby":`documents-task-group-${s}`,children:[e.jsxs("div",{className:"documents-task-sidebar-group-header",children:[e.jsxs("div",{className:"documents-task-sidebar-title-wrap",children:[e.jsxs("h3",{id:`documents-task-group-${s}`,className:"documents-task-sidebar-title",children:[e.jsx("span",{className:"documents-group-task-id",children:s}),e.jsx("span",{className:"documents-group-task-title",children:c||t("documents.untitled","Untitled")})]}),q?e.jsxs("span",{className:"documents-group-status badge","aria-label":t("documents.taskStatusAria","Task status: {{status}}",{status:q}),children:[e.jsx("span",{className:Pe,"aria-hidden":"true"}),e.jsx("span",{children:q})]}):null]}),e.jsxs("div",{className:"documents-task-sidebar-actions",children:[e.jsx("span",{className:"documents-group-count",children:t("documents.taskOutputCount","{{docCount}} doc{{docPlural}} · {{artifactCount}} artifact{{artifactPlural}}",{docCount:j.length,docPlural:j.length!==1?"s":"",artifactCount:z.length,artifactPlural:z.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>void jt(s),"aria-label":t("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:s,title:c||t("documents.untitled","Untitled")}),children:t("documents.openTask","Open task")})]})]}),e.jsxs("ul",{className:"markdown-file-list documents-task-document-list",children:[j.map(h=>{const v=l?.id===h.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item${v?" markdown-file-item--selected":""}`,onClick:()=>Nt(h.id),"aria-label":t("documents.openTaskDocument","Open {{taskId}} {{key}}",{taskId:h.taskId,key:h.key}),"aria-current":v?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:h.key}),e.jsxs("span",{className:"markdown-file-item-path",children:[h.taskId," · ",h.taskTitle||t("documents.untitled","Untitled")]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[t("documents.revisionShort","v{{revision}}",{revision:h.revision})," · ",h.author," · ",oe(h.updatedAt)]})]})},`document-${h.id}`)}),z.length>0?e.jsxs("li",{className:"documents-task-artifacts-subsection","aria-label":t("documents.taskArtifactsSubsection","Task artifacts"),children:[e.jsx("div",{className:"documents-task-artifacts-label",children:t("documents.taskArtifactsLabel","Artifacts")}),e.jsx("ul",{className:"markdown-file-list documents-task-artifact-list",children:z.map(h=>{const v=Ae(h),ae=ds[v],Mt=Ye(t,v),Be=H?.id===h.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item documents-task-artifact-item${Be?" markdown-file-item--selected":""}`,onClick:()=>St(h.id),"aria-label":t("documents.openTaskArtifact","Open {{taskId}} artifact {{title}}",{taskId:s,title:h.title||t("documents.untitledArtifact","Untitled artifact")}),"aria-current":Be?"true":void 0,children:[e.jsxs("span",{className:"documents-task-artifact-title-row",children:[e.jsx(ae,{size:14,"aria-hidden":"true"}),e.jsx("span",{className:"markdown-file-item-name",children:h.title||t("documents.untitledArtifact","Untitled artifact")})]}),e.jsxs("span",{className:"markdown-file-item-path",children:[Mt," · ",h.mimeType||h.type]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[h.authorId||t("documents.unknownAuthor","unknown")," · ",oe(h.updatedAt)]})]})},`artifact-${h.id}`)})})]}):null]})]},s)})}),(!w||he)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.taskDocumentPreviewLabel","Task document content preview"),children:[w&&he&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Ct,"aria-label":t("documents.backToTaskDocumentsList","Back to task documents list"),children:[e.jsx(Qe,{size:14}),t("documents.backToTaskDocuments","Back to documents")]}),he?H?e.jsx(ks,{artifact:H,projectId:a,content:et,loading:tt,error:st,renderMarkdown:nt,onToggleMarkdown:()=>xe(s=>!s),onOpenTask:ze,t}):l?e.jsxs("div",{className:"documents-content-viewer documents-task-document-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[l.taskId," / ",l.key]}),e.jsx("div",{className:"documents-task-document-actions",children:Fe?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:Ft,disabled:de,children:t("documents.cancelEdit","Cancel")}),V&&e.jsx("button",{className:"btn btn-sm",onClick:Pt,disabled:de,children:t("documents.rebaseTaskDocument","Rebase draft")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void At(),disabled:de||V!==null,children:de?t("documents.saving","Saving…"):t("documents.saveTaskDocument","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>yt(l.id),"aria-label":Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":Y,title:Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:Y?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Tt,"aria-label":t("documents.editTaskDocument","Edit task document"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta",children:[e.jsx("span",{className:"document-card-author",children:l.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:t("documents.revisionShort","v{{revision}}",{revision:l.revision})}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:oe(l.updatedAt)})]}),Fe?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.taskDocumentContentEditor","Task document content editor"),children:e.jsx(Ge,{content:pe,onChange:T,filePath:l.key.includes(".")?l.key:`${l.key}.md`,forceToolbarActionsVisible:!0})}):Y?e.jsx("div",{ref:ie,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:l.content})})}):e.jsx("pre",{ref:ee,className:"document-card-content-text documents-content-viewer-text",children:l.content}),Lt]}):null:e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectTaskDocument","Select a task document or artifact to view its content.")})})]})]})})]})}export{gs as DocumentsView};
1
+ import{r as n,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as qe,ap as Ue,aq as Rt,ar as Ht,as as zt,at as Ke,au as $t,av as Ot,aw as fe,ax as It,ay as _e,az as Bt,aA as qt,aB as Ut,aC as _t,aD as Ae,aE as Vt,aF as Ve,V as Qt,aG as ce,E as Wt,p as Gt,aH as Kt,X as Xt,R as Yt,aI as ke,A as Qe,v as We,aJ as Ge,j as De,r as Ee,aK as Jt,aL as Xe,aM as Zt,aN as es,aO as ts,aP as ss,z as ns,aQ as as,aR as cs}from"./index-8wtfjIkg.js";import{u as os}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function rs(a){const{projectId:r,searchQuery:g,includeProjectFiles:P=!0}=a??{},x=r?`${Rt.DOCUMENTS_PREFIX}${r}`:null,[t,i]=n.useState(()=>{if(!x)return[];const N=qe(x,{maxAgeMs:Ue});return Array.isArray(N)?N:[]}),[A,d]=n.useState([]),[k,b]=n.useState(()=>t.length===0),[u,C]=n.useState(null),m=n.useRef(null),f=n.useRef(t.length>0),p=n.useRef(null),{capture:D}=Ht(r,"useDocuments"),S=n.useCallback(async()=>{const N=D();m.current&&m.current.abort();const J=new AbortController;m.current=J;const $=!f.current;$&&b(!0),C(null);const Z=zt(g?{q:g}:void 0,r),U=P?Ke(r):Promise.resolve({files:[]}),[w,re]=await Promise.allSettled([Z,U]);if(J.signal.aborted||N.isStale())return;let O=null;if(w.status==="fulfilled"){if(i(w.value),x){const _=w.value.length>500?w.value.slice(0,500):w.value;$t(x,_,{maxBytes:5e5})}f.current=!0}else O=w.reason instanceof Error?w.reason.message:String(w.reason);if(re.status==="fulfilled"){const _=re.value.files,G=g?.trim().toLowerCase(),ie=G?_.filter(ee=>ee.name.toLowerCase().includes(G)||ee.path.toLowerCase().includes(G)):_;d(ie)}C(O),$&&b(!1)},[x,D,P,r,g]);return n.useEffect(()=>{if(d([]),!x){f.current=!1,i([]),b(!0);return}const N=qe(x,{maxAgeMs:Ue});Array.isArray(N)?(i(N),f.current=!0,b(!1)):(f.current=!1,i([]),b(!0))},[x]),n.useEffect(()=>(p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{S()},300),()=>{p.current&&clearTimeout(p.current)}),[S]),n.useEffect(()=>(S(),()=>{m.current&&m.current.abort()}),[]),{documents:t,projectFiles:A,loading:k,error:u,refresh:S}}function is(a,r){const[g,P]=n.useState([]),[x,t]=n.useState(!0),[i,A]=n.useState(null),d=n.useRef(null),k=n.useRef(!1),b=r?.showHidden??!1,u=n.useCallback(async C=>{d.current&&d.current.abort();const m=new AbortController;d.current=m;const f=!k.current;f&&t(!0),A(null);try{const p=await Ke(a,{showHidden:C?.showHidden??b});if(m.signal.aborted)return;P(p.files),k.current=!0}catch(p){if(m.signal.aborted)return;A(p instanceof Error?p.message:String(p))}finally{!m.signal.aborted&&f&&t(!1)}},[a,b]);return n.useEffect(()=>(k.current=!1,u({showHidden:b}),()=>{d.current&&d.current.abort()}),[u,b]),{files:g,loading:x,error:i,refresh:u}}const ls=768,ds={image:ss,doc:ce,pdf:ts,video:es,audio:Zt,other:Xe};function oe(a){return a?new Date(a).toLocaleString():""}function us(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function ms(a){return a==="done"?"status-dot status-dot--online":a==="archived"?"status-dot status-dot--offline":a==="todo"||a==="triage"?"status-dot status-dot--pending":"status-dot status-dot--connecting"}function Ye(a,r){switch(r){case"image":return a("documents.artifactCategoryImage","Image");case"doc":return a("documents.artifactCategoryDoc","Document");case"pdf":return a("documents.artifactCategoryPdf","PDF");case"video":return a("documents.artifactCategoryVideo","Video");case"audio":return a("documents.artifactCategoryAudioSingle","Audio");case"other":return a("documents.artifactCategoryOtherSingle","Other")}}function hs(a,r){return r?[a.title,a.description,a.taskId,a.taskTitle,a.mimeType,a.authorId].some(g=>g?.toLowerCase().includes(r)):!0}function fs(a){const r=a.mimeType?.toLowerCase().split(";",1)[0]??"";return!!a.content||a.type==="document"||r.startsWith("text/")||r==="application/json"||r==="application/xml"}function ks({artifact:a,projectId:r,content:g,loading:P,error:x,renderMarkdown:t,onToggleMarkdown:i,onOpenTask:A,t:d}){const[k,b]=n.useState(null),u=Ae(a),C=Ye(d,u),m=a.title||d("documents.untitledArtifact","Untitled artifact"),f=ns(a.id,r),p=u==="doc"&&fs(a);n.useEffect(()=>{b(null)},[a.id]);const D=k?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:k}):null,S=u==="image"?e.jsxs(e.Fragment,{children:[D,e.jsx("img",{className:"documents-task-artifact-media",src:f,alt:m,onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="video"?e.jsxs(e.Fragment,{children:[D,e.jsx("video",{className:"documents-task-artifact-media",controls:!0,src:f,"aria-label":d("documents.videoArtifactLabel","Video artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="audio"?e.jsxs(e.Fragment,{children:[D,e.jsx("audio",{className:"documents-task-artifact-audio",controls:!0,src:f,"aria-label":d("documents.audioArtifactLabel","Audio artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="pdf"?e.jsxs("div",{className:"documents-task-artifact-pdf",children:[e.jsx("iframe",{title:d("documents.pdfArtifactTitle","PDF artifact: {{title}}",{title:m}),src:f}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer",children:[e.jsx(as,{size:14,"aria-hidden":"true"}),d("documents.openInNewTab","Open in new tab")]})]}):u==="doc"&&p?P?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:d("documents.loadingArtifactContent","Loading artifact content…")})}):x?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:x}):t?e.jsx("div",{className:"documents-content-markdown documents-task-artifact-doc-content",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:g??a.content??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text documents-task-artifact-doc-content",children:g??a.content??""}):e.jsxs("div",{className:"documents-task-artifact-download",children:[e.jsx(Xe,{size:24,"aria-hidden":"true"}),e.jsx("p",{children:a.description||d("documents.binaryArtifactFallback","This artifact cannot be previewed inline.")}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer","data-testid":"task-artifact-open-link",children:[e.jsx(cs,{size:14,"aria-hidden":"true"}),d("documents.openArtifact","Open artifact")]})]});return e.jsxs("div",{className:"documents-content-viewer documents-task-artifact-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[a.taskId," / ",m]}),u==="doc"&&p?e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:i,"aria-label":t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":t,title:t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),children:t?d("documents.markdown","Markdown"):d("documents.plain","Plain")}):null]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta documents-task-artifact-meta",children:[e.jsx("span",{children:C}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:a.authorId||d("documents.unknownAuthor","unknown")}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:oe(a.updatedAt)}),a.taskId?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("button",{className:"documents-task-artifact-open-task",onClick:()=>void A(a.taskId),children:d("documents.openTask","Open task")})]}):null]}),a.description?e.jsx("p",{className:"documents-task-artifact-description",children:a.description}):null,e.jsx("div",{className:`documents-task-artifact-preview documents-task-artifact-preview--${u}`,children:S})]})}function gs({projectId:a,addToast:r,onOpenDetail:g,onOpenArtifactTaskDetail:P,onSendSelectionToTask:x}){const{t}=os("app"),[i,A]=n.useState("artifacts"),d=Ot(),[k,b]=n.useState(""),[u,C]=n.useState(null),[m,f]=n.useState(null),[p,D]=n.useState(!1),[S,N]=n.useState(null),[J,$]=n.useState(!1),[Z,U]=n.useState(null),[w,re]=n.useState(!1),O=n.useRef(0),_=n.useRef(null),G=n.useRef(null),ie=n.useRef(null),ee=n.useRef(null),[K,Le]=n.useState(!1),[Je,Me]=n.useState(new Map),[Ze,E]=n.useState(null),[pe,T]=n.useState(""),[le,F]=n.useState(null),[V,y]=n.useState(null),[de,je]=n.useState(!1),[et,L]=n.useState(null),[tt,I]=n.useState(!1),[st,M]=n.useState(null),[nt,xe]=n.useState(!0),te=n.useRef(0),[be,Q]=n.useState(!1),[ue,B]=n.useState(""),[we,ve]=n.useState(!1),[me,Re]=n.useState(!1),at=fe(_,{locked:me}),ct=fe(G,{locked:me}),ot=fe(ie,{locked:me}),rt=fe(ee,{locked:me}),ge=K?at:ct,Ne=i==="tasks"?k.trim():"",it=i==="artifacts"?k.trim():"",{documents:se,loading:lt,error:dt,refresh:ne}=rs({projectId:a,searchQuery:Ne||void 0,includeProjectFiles:!1}),{files:W,loading:ut,error:mt,refresh:He}=is(a,{showHidden:p}),{artifacts:R,loading:ht,error:ft,refresh:Se}=It({projectId:a,searchQuery:it||void 0});n.useEffect(()=>{const s=()=>{re(window.innerWidth<=ls)};return s(),window.addEventListener("resize",s),()=>{window.removeEventListener("resize",s)}},[]),n.useEffect(()=>{A("artifacts"),C(null),f(null),D(!1),N(null),U(null),$(!1),Le(!1),Me(new Map),E(null),T(""),F(null),y(null),je(!1),L(null),I(!1),M(null),xe(!0),Q(!1),B(""),ve(!1)},[a]);const X=n.useMemo(()=>{const s=Ne.toLowerCase(),c=new Map;for(const o of se){const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.documents.push(o),c.set(o.taskId,j)}for(const o of R){if(!o.taskId||!hs(o,s))continue;const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.artifacts.push(o),c.set(o.taskId,j)}return Array.from(c.entries()).map(([o,j])=>{const z=[...j.documents].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),q=[...j.artifacts].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),Pe=[z[0]?.updatedAt,q[0]?.updatedAt].filter(Boolean).sort().at(-1)??"",h=z.find(v=>v.taskTitle)?.taskTitle??q.find(v=>v.taskTitle)?.taskTitle;return{taskId:o,taskTitle:h,taskColumn:z.find(v=>v.taskColumn)?.taskColumn??q.find(v=>v.taskColumn)?.taskColumn,documents:z,artifacts:q,latestUpdated:Pe}}).filter(o=>o.documents.length>0||o.artifacts.length>0).sort((o,j)=>j.latestUpdated.localeCompare(o.latestUpdated))},[R,se,Ne]),l=n.useMemo(()=>m?.kind!=="document"?null:se.find(s=>s.id===m.id)??null,[se,m]),H=n.useMemo(()=>m?.kind!=="artifact"?null:R.find(s=>s.id===m.id)??null,[R,m]),he=l??H;n.useEffect(()=>{if(!m)return;X.some(c=>m.kind==="document"?c.documents.some(o=>o.id===m.id):c.artifacts.some(o=>o.id===m.id))||(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null))},[X,m]);const Ce=n.useMemo(()=>{const s=k.trim().toLowerCase();return s?W.filter(c=>{const o=c.path.toLowerCase(),j=c.name.toLowerCase();return o.includes(s)||j.includes(s)}):W},[W,k]);n.useEffect(()=>{if(!u)return;W.some(c=>c.path===u.path)||(C(null),N(null),U(null),$(!1))},[W,u]);const kt=n.useCallback(s=>{b(s.target.value)},[]),pt=n.useCallback(()=>{b("")},[]),ye=n.useCallback(s=>{A(s),s!=="tasks"&&(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)),s!=="project"&&(Q(!1),B(""))},[]),jt=n.useCallback(async s=>{try{const c=await _e(s,a);g(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,g,r]),ze=n.useCallback(async s=>{try{const c=await _e(s,a);(P??g)(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,P,g,r]),xt=n.useCallback(async s=>{C(s),$(!0),U(null),N(null),Q(!1),B("");const c=O.current+1;O.current=c;try{const o=await Bt("project",s.path,a);if(O.current!==c)return;N(o.content)}catch(o){if(O.current!==c)return;const j=o instanceof Error?o.message:`Failed to open ${s.path}`;U(j),r(j,"error")}finally{O.current===c&&$(!1)}},[a,r]),bt=n.useCallback(()=>{C(null),N(null),U(null),$(!1),Q(!1),B("")},[]),wt=n.useCallback(()=>{S!==null&&(B(S),Q(!0))},[S]),vt=n.useCallback(()=>{Q(!1),B("")},[]),gt=n.useCallback(async()=>{if(u){ve(!0);try{await qt("project",u.path,ue,a),N(ue),Q(!1),B(""),r(t("documents.projectFileSaved","File saved"),"success")}catch(s){r(s instanceof Error?s.message:String(s),"error")}finally{ve(!1)}}},[u,ue,a,r,t]),Nt=n.useCallback(s=>{f({kind:"document",id:s}),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),St=n.useCallback(s=>{f({kind:"artifact",id:s}),E(null),T(""),F(null),y(null),L(null),M(null),xe(!0)},[]),Ct=n.useCallback(()=>{f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),yt=n.useCallback(s=>{Me(c=>{const o=new Map(c),j=o.get(s)??!0;return o.set(s,!j),o})},[]),Tt=n.useCallback(()=>{l&&(T(l.content),E(l.id),F({revision:l.revision,contentHash:l.contentHash}),y(null))},[l]),Ft=n.useCallback(()=>{E(null),T(""),F(null),y(null)},[]),Pt=n.useCallback(()=>{V&&(F(V),y(null))},[V]),At=n.useCallback(async()=>{if(!(!l||!le||V)){je(!0);try{await Ut(l.taskId,l.key,pe,{expectedRevision:le.revision,expectedContentHash:le.contentHash},a),await ne(),E(null),T(""),F(null),y(null),r(t("documents.taskDocumentSaved","Document saved"),"success")}catch(s){if(typeof s=="object"&&s!==null&&"status"in s&&s.status===409)try{const c=await _t(l.taskId,l.key,a);await ne(),y({revision:c.revision,contentHash:c.contentHash}),r(t("documents.taskDocumentStale","This document changed since you opened it. Your draft is preserved; review the latest revision, then choose Rebase draft before saving."),"error")}catch(c){r(c instanceof Error?c.message:String(c),"error")}else r(s instanceof Error?s.message:String(s),"error")}finally{je(!1)}}},[l,pe,le,V,a,ne,r,t]);n.useEffect(()=>{if(!H||Ae(H)!=="doc"){L(null),I(!1),M(null);return}const s=te.current+1;te.current=s,I(!0),M(null),L(null),Vt(H.id,a).then(c=>{te.current===s&&L(c.content??H.content??"")}).catch(c=>{te.current===s&&M(c instanceof Error?c.message:String(c))}).finally(()=>{te.current===s&&I(!1)})},[a,H]);const $e=i==="project"?mt:i==="tasks"?dt:ft,Dt=n.useCallback(async()=>{if(i==="project"){await He();return}if(i==="tasks"){await ne();return}await Se()},[i,Se,He,ne]),Oe=i==="project"?Ce.length:i==="tasks"?X.length:R.length,Y=l?Je.get(l.id)??!0:!1,Te=Y?ot:rt,Fe=l!==null&&Ze===l.id,Et=i==="project"&&u&&!be&&x&&ge?e.jsx(Ve,{selectedText:ge.selectedText,anchorRect:ge.anchorRect,filePath:u.path,onSubmit:x,onOpenChange:Re}):null,Lt=i==="tasks"&&l&&!Fe&&x&&Te?e.jsx(Ve,{selectedText:Te.selectedText,anchorRect:Te.anchorRect,filePath:`${l.taskId}/${l.key}`,onSubmit:x,onOpenChange:Re}):null,Ie=i==="project"?t("documents.searchProjectFiles","Search project markdown files…"):i==="tasks"?t("documents.searchTaskDocuments","Search task documents…"):t("documents.searchArtifacts","Search artifacts…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsx(Qt,{icon:ce,title:t("documents.title","Artifacts"),actions:e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:Oe,plural:Oe!==1?"s":""})})}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":t("documents.sectionsLabel","Documents sections"),children:[e.jsxs("button",{className:`btn documents-tab${i==="artifacts"?" active":""}`,role:"tab","aria-selected":i==="artifacts","aria-label":t("documents.showArtifacts","Show artifacts"),onClick:()=>ye("artifacts"),children:[t("documents.artifactsTab","Artifacts"),e.jsx("span",{className:"documents-tab-count",children:R.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="project"?" active":""}`,role:"tab","aria-selected":i==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>ye("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:W.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="tasks"?" active":""}`,role:"tab","aria-selected":i==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>ye("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:X.length})]})]}),i==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>D(s=>!s),"aria-pressed":p,"aria-label":p?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:p?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[p?e.jsx(Wt,{size:14}):e.jsx(Gt,{size:14}),p?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(Kt,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:Ie,value:k,onChange:kt,"aria-label":Ie}),k&&e.jsx("button",{className:"documents-search-clear",onClick:pt,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(Xt,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:$e?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:i==="project"?t("documents.projectFiles","project files"):i==="tasks"?t("documents.taskDocuments","task documents"):t("documents.artifacts","artifacts"),error:$e})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void Dt(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(Yt,{size:16}),t("documents.retry","Retry")]})]}):i==="project"?ut&&W.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingProjectFiles","Loading project markdown files…")})})}):Ce.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!u)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":t("documents.projectMarkdownFilesLabel","Project markdown files"),children:e.jsx("ul",{className:"markdown-file-list",children:Ce.map(s=>{const c=u?.path===s.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${c?" markdown-file-item--selected":""}`,onClick:()=>void xt(s),"aria-label":`Open ${s.path}`,"aria-current":c?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:s.name}),e.jsx("span",{className:"markdown-file-item-path",children:s.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[us(s.size)," · ",oe(s.mtime)]})]})},s.path)})})}),(!w||u)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.projectFilePreviewLabel","Project file content preview"),children:[w&&u&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:bt,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(Qe,{size:14}),t("documents.backToFiles","Back to files")]}),u?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:u.path}),e.jsx("div",{className:"documents-task-document-actions",children:be?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:vt,disabled:we,children:t("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void gt(),disabled:we,children:we?t("documents.saving","Saving…"):t("documents.saveProjectFile","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>Le(s=>!s),"aria-label":K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":K,title:K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:K?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:wt,disabled:J||Z!==null||S===null,"aria-label":t("documents.editProjectFile","Edit project file"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),J?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:t("documents.loadingFileContent","Loading file content…")})}):Z?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:Z}):be?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.projectFileContentEditor","Project file content editor"),children:e.jsx(Ge,{content:ue,onChange:B,filePath:u.path,forceToolbarActionsVisible:!0})}):K?e.jsx("div",{ref:_,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:S??""})})}):e.jsx("pre",{ref:G,className:"document-card-content-text documents-content-viewer-text",children:S??""}),Et]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):i==="artifacts"?ht&&R.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingArtifacts","Loading artifacts…")})}):R.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchArtifacts",'No artifacts match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noArtifacts","No artifacts yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.artifactsCreatedBy","Agents register screenshots, wireframes, mockups, recordings, and documents here as they work on tasks.")})]})}):e.jsx(Jt,{artifacts:R,projectId:a,isMobile:w,addToast:r,onOpenTask:ze,onArtifactUpdated:()=>void Se()}):lt&&se.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingTaskDocuments","Loading task documents…")})})}):X.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsxs("div",{className:`documents-project-layout documents-task-documents-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!he)&&e.jsx("aside",{className:"documents-view-sidebar documents-task-documents-sidebar","aria-label":t("documents.taskDocumentsListLabel","Task documents"),children:X.map(({taskId:s,taskTitle:c,taskColumn:o,documents:j,artifacts:z})=>{const q=o?d(o):null,Pe=o?ms(o):"status-dot";return e.jsxs("section",{className:"documents-task-sidebar-group","aria-labelledby":`documents-task-group-${s}`,children:[e.jsxs("div",{className:"documents-task-sidebar-group-header",children:[e.jsxs("div",{className:"documents-task-sidebar-title-wrap",children:[e.jsxs("h3",{id:`documents-task-group-${s}`,className:"documents-task-sidebar-title",children:[e.jsx("span",{className:"documents-group-task-id",children:s}),e.jsx("span",{className:"documents-group-task-title",children:c||t("documents.untitled","Untitled")})]}),q?e.jsxs("span",{className:"documents-group-status badge","aria-label":t("documents.taskStatusAria","Task status: {{status}}",{status:q}),children:[e.jsx("span",{className:Pe,"aria-hidden":"true"}),e.jsx("span",{children:q})]}):null]}),e.jsxs("div",{className:"documents-task-sidebar-actions",children:[e.jsx("span",{className:"documents-group-count",children:t("documents.taskOutputCount","{{docCount}} doc{{docPlural}} · {{artifactCount}} artifact{{artifactPlural}}",{docCount:j.length,docPlural:j.length!==1?"s":"",artifactCount:z.length,artifactPlural:z.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>void jt(s),"aria-label":t("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:s,title:c||t("documents.untitled","Untitled")}),children:t("documents.openTask","Open task")})]})]}),e.jsxs("ul",{className:"markdown-file-list documents-task-document-list",children:[j.map(h=>{const v=l?.id===h.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item${v?" markdown-file-item--selected":""}`,onClick:()=>Nt(h.id),"aria-label":t("documents.openTaskDocument","Open {{taskId}} {{key}}",{taskId:h.taskId,key:h.key}),"aria-current":v?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:h.key}),e.jsxs("span",{className:"markdown-file-item-path",children:[h.taskId," · ",h.taskTitle||t("documents.untitled","Untitled")]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[t("documents.revisionShort","v{{revision}}",{revision:h.revision})," · ",h.author," · ",oe(h.updatedAt)]})]})},`document-${h.id}`)}),z.length>0?e.jsxs("li",{className:"documents-task-artifacts-subsection","aria-label":t("documents.taskArtifactsSubsection","Task artifacts"),children:[e.jsx("div",{className:"documents-task-artifacts-label",children:t("documents.taskArtifactsLabel","Artifacts")}),e.jsx("ul",{className:"markdown-file-list documents-task-artifact-list",children:z.map(h=>{const v=Ae(h),ae=ds[v],Mt=Ye(t,v),Be=H?.id===h.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item documents-task-artifact-item${Be?" markdown-file-item--selected":""}`,onClick:()=>St(h.id),"aria-label":t("documents.openTaskArtifact","Open {{taskId}} artifact {{title}}",{taskId:s,title:h.title||t("documents.untitledArtifact","Untitled artifact")}),"aria-current":Be?"true":void 0,children:[e.jsxs("span",{className:"documents-task-artifact-title-row",children:[e.jsx(ae,{size:14,"aria-hidden":"true"}),e.jsx("span",{className:"markdown-file-item-name",children:h.title||t("documents.untitledArtifact","Untitled artifact")})]}),e.jsxs("span",{className:"markdown-file-item-path",children:[Mt," · ",h.mimeType||h.type]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[h.authorId||t("documents.unknownAuthor","unknown")," · ",oe(h.updatedAt)]})]})},`artifact-${h.id}`)})})]}):null]})]},s)})}),(!w||he)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.taskDocumentPreviewLabel","Task document content preview"),children:[w&&he&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Ct,"aria-label":t("documents.backToTaskDocumentsList","Back to task documents list"),children:[e.jsx(Qe,{size:14}),t("documents.backToTaskDocuments","Back to documents")]}),he?H?e.jsx(ks,{artifact:H,projectId:a,content:et,loading:tt,error:st,renderMarkdown:nt,onToggleMarkdown:()=>xe(s=>!s),onOpenTask:ze,t}):l?e.jsxs("div",{className:"documents-content-viewer documents-task-document-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[l.taskId," / ",l.key]}),e.jsx("div",{className:"documents-task-document-actions",children:Fe?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:Ft,disabled:de,children:t("documents.cancelEdit","Cancel")}),V&&e.jsx("button",{className:"btn btn-sm",onClick:Pt,disabled:de,children:t("documents.rebaseTaskDocument","Rebase draft")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void At(),disabled:de||V!==null,children:de?t("documents.saving","Saving…"):t("documents.saveTaskDocument","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>yt(l.id),"aria-label":Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":Y,title:Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:Y?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Tt,"aria-label":t("documents.editTaskDocument","Edit task document"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta",children:[e.jsx("span",{className:"document-card-author",children:l.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:t("documents.revisionShort","v{{revision}}",{revision:l.revision})}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:oe(l.updatedAt)})]}),Fe?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.taskDocumentContentEditor","Task document content editor"),children:e.jsx(Ge,{content:pe,onChange:T,filePath:l.key.includes(".")?l.key:`${l.key}.md`,forceToolbarActionsVisible:!0})}):Y?e.jsx("div",{ref:ie,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:l.content})})}):e.jsx("pre",{ref:ee,className:"document-card-content-text documents-content-viewer-text",children:l.content}),Lt]}):null:e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectTaskDocument","Select a task document or artifact to view its content.")})})]})]})})]})}export{gs as DocumentsView};
@@ -0,0 +1 @@
1
+ import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as P,ap as L,aq as $,aS as Q,aT as J,au as O,aU as Z,aV as ee,aW as se,V as H,T as B,Y as ae,R as te,aI as le,s as re,l as ne,aQ as ie}from"./index-8wtfjIkg.js";import{u as ce}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";const oe=300,de=15e3;function K(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 W(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{...W(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=`${$.EVALS_RUNS_PREFIX}${m}`,h=`${$.EVALS_RESULTS_PREFIX}${m}`,p=P(t,{maxAgeMs:L}),v=P(h,{maxAgeMs:L}),S=l.useRef(Array.isArray(p)&&p.length>0||Array.isArray(v)&&v.length>0),[o,g]=l.useState({q:"",runId:"",scoreMin:"",scoreMax:""}),[N,w]=l.useState(()=>Array.isArray(p)?p:[]),[d,C]=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(!S.current),[X,V]=l.useState(null),M=l.useRef(0),q=l.useRef(a),T=l.useRef(u);T.current=u;const k=l.useCallback(async()=>{const c=++M.current;S.current||j(!0),V(null);try{const[n,x]=await Promise.all([Q({q:o.q||void 0,runId:o.runId||void 0,scoreMin:K(o.scoreMin),scoreMax:K(o.scoreMax),limit:100,offset:0},a),J(a)]);if(c!==M.current)return;const E=I(n.results,n.evals,n.items).map(W);C(E),O(h,E.length>500?E.slice(0,500):E,{maxBytes:5e5}),i(typeof n.count=="number"?n.count:E.length);const z=I(x.runs,x.items).map(U=>{const b=f(U),D=f(b.counts);return{id:String(b.id??""),createdAt:String(b.createdAt??""),completedAt:typeof b.completedAt=="string"?b.completedAt:void 0,status:String(b.status??"pending"),evaluatedTaskCount:typeof D.totalTasks=="number"?D.totalTasks:0}});w(z),O(t,z,{maxBytes:5e5}),S.current=!0,T.current&&!E.some(U=>U.id===T.current)&&(A(null),R(null))}catch(n){if(c!==M.current)return;V(n instanceof Error?n.message:"Failed to load evals")}finally{c===M.current&&j(!1)}},[o.q,o.runId,o.scoreMax,o.scoreMin,a,h,t]),_=l.useCallback(async c=>{const n=await Z(c,a),x=n.result??n;R(ue(x))},[a]);l.useEffect(()=>{if(q.current===a)return;q.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:[]),C(Array.isArray(n)?n:[]),j(!x),S.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}_(u)},[_,u]);const Y=l.useCallback(()=>{k(),u&&_(u)},[_,k,u]);ee(Y,de);const G=l.useCallback(c=>{T.current=c,A(c)},[]);return{loading:y,error:X,results:d,count:s,runs:N,filters:o,setFilters:g,refresh:k,selectedEvalId:u,setSelectedEvalId:G,selectedEval:F}}function je({projectId:r,onOpenSettings:a,onOpenTaskDetail:m}){const{t}=ce("app"),{loading:h,error:p,results:v,runs:S,filters:o,setFilters:g,selectedEvalId:N,setSelectedEvalId:w,selectedEval:d,refresh:C}=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===N)??null,[v,N]);return u?e.jsxs("section",{className:"evals-view","data-testid":"evals-view",children:[e.jsx(H,{icon:B,title:t("evals.title","Evals")}),e.jsxs("div",{className:"evals-view__body",children:[e.jsxs("div",{className:"evals-list card",children:[e.jsxs("div",{className:"evals-toolbar",children:[e.jsx("input",{className:"input",placeholder:t("evals.searchPlaceholder","Search task or rationale"),value:o.q,onChange:s=>g(i=>({...i,q:s.target.value}))}),e.jsxs("select",{className:"select",value:o.runId,onChange:s=>g(i=>({...i,runId:s.target.value})),children:[e.jsx("option",{value:"",children:t("evals.allRuns","All runs")}),S.map(s=>e.jsx("option",{value:s.id,children:s.id},s.id))]}),e.jsx("input",{className:"input",placeholder:t("evals.minScorePlaceholder","Min score"),value:o.scoreMin,onChange:s=>g(i=>({...i,scoreMin:s.target.value}))}),e.jsx("input",{className:"input",placeholder:t("evals.maxScorePlaceholder","Max score"),value:o.scoreMax,onChange:s=>g(i=>({...i,scoreMax:s.target.value}))}),e.jsx("button",{className:"btn btn-icon",type:"button",onClick:()=>void C(),"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===N?"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:B,title:t("evals.title","Evals")}),e.jsxs("div",{className:"evals-view__empty",children:[e.jsx("h2",{className:"evals-title",children:t("evals.disabledTitle","Scheduled evals are disabled")}),e.jsx("p",{className:"evals-empty-copy",children:t("evals.enablePrompt","Enable Scheduled Evals to review scored tasks, evidence, and follow-up recommendations.")}),e.jsxs("button",{className:"btn btn-primary",type:"button",onClick:()=>a?.("scheduled-evals"),children:[e.jsx(ae,{size:16}),t("evals.openSettings","Open Scheduled Evals Settings")]})]})]})}export{je as EvalsView};
@@ -1 +1 @@
1
- import{r as s,j as n}from"./vendor-react-SZ_qB27O.js";import{B as $,D as G,F as V,G as W,H as B,I as U}from"./index-C2xsZoNG.js";import{u as z}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function en({isOpen:l,onClose:R,onUseDraft:M,projectId:x,existingAgents:P,mode:_="create",existingAgentConfig:L}){const{t:e}=z("app"),[m,d]=s.useState("initial"),[f,S]=s.useState(""),[c,k]=s.useState(null),[C,I]=s.useState(""),[w,A]=s.useState("answer"),[v,p]=s.useState(""),[t,H]=s.useState(null),[T,g]=s.useState(null),[E,y]=s.useState([]),b=_==="edit",o=s.useRef(l),N=s.useCallback(()=>{d("initial"),S(""),k(null),I(""),A("answer"),p(""),H(null),g(null),y([])},[]),D=s.useMemo(()=>$.map(a=>({id:a.id,label:a.name,description:a.description})),[]);s.useEffect(()=>{if(o.current=l,!c)return;const a=G(c,x,{onThinking:i=>{o.current&&y(F=>{const h=[...F],j=h[h.length-1];return j&&!j.question?(h[h.length-1]={...j,thinkingOutput:`${j.thinkingOutput??""}${i}`},h):[...h,{response:{},thinkingOutput:i}]})},onQuestion:i=>{o.current&&(I(i.question),A(i.id),d("question"))},onSummary:i=>{o.current&&(H(i),d("summary"))},onError:i=>{o.current&&(g(i),d("error"))}});return()=>{o.current=!1,a.close()}},[l,c,x]);const u=async()=>{o.current=!1;try{c&&await W(c,x)}catch{}finally{N(),R()}};if(s.useEffect(()=>{o.current=l,l||N()},[l,N]),!l)return null;const r=a=>a==null||a===""?n.jsx("em",{className:"experimental-agent-onboarding-modal__summary-empty",children:e("agents.onboarding.notSet","Not set")}):n.jsx("span",{children:a}),q=async()=>{d("loading"),g(null);try{const a=await B(f,{mode:_,existingAgentConfig:L,existingAgents:P.map(i=>({id:i.id,name:i.name,role:i.role})),templates:D},x);if(!o.current)return;k(a.sessionId)}catch(a){if(!o.current)return;g(a.message),d("error")}},Q=async()=>{if(c){d("loading"),g(null);try{const a={[w]:v};if(y(i=>[...i,{question:{id:w,type:"text",question:C},response:a}]),await U(c,a,x),!o.current)return;p("")}catch(a){if(!o.current)return;g(a.message),d("error")}}},O=async()=>{t&&(M(t),await u())};return n.jsx("div",{className:"modal-overlay open",role:"presentation",children:n.jsxs("div",{className:"modal modal-lg experimental-agent-onboarding-modal",role:"dialog","aria-modal":"true","aria-label":e("agents.onboarding.dialogLabel","AI Interview"),children:[n.jsxs("div",{className:"modal-header",children:[n.jsx("h3",{children:e("agents.onboarding.title","AI Interview")}),n.jsx("button",{className:"modal-close",onClick:()=>void u(),"aria-label":e("common.closeAriaLabel","Close"),children:"×"})]}),E.length>0&&n.jsx(V,{entries:E}),m==="initial"&&n.jsxs("div",{className:"form-group",children:[n.jsx("label",{htmlFor:"agent-onboarding-intent",children:b?e("agents.onboarding.intentLabelEdit","What should this agent change or improve?"):e("agents.onboarding.intentLabelCreate","What should this new agent own?")}),n.jsx("textarea",{id:"agent-onboarding-intent",className:"input experimental-agent-onboarding-modal__textarea",value:f,onChange:a=>S(a.target.value)}),n.jsxs("div",{className:"modal-actions",children:[n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.cancel","Cancel")}),n.jsx("button",{className:"btn btn-primary",disabled:!f.trim(),onClick:()=>void q(),children:b?e("agents.onboarding.startInterview","Start interview"):e("agents.onboarding.startOnboarding","Start onboarding")})]})]}),(m==="loading"||m==="question")&&n.jsxs("div",{className:"form-group",children:[n.jsx("label",{htmlFor:"agent-onboarding-answer",children:C||e("agents.onboarding.thinking","Thinking...")}),n.jsx("textarea",{id:"agent-onboarding-answer",className:"input experimental-agent-onboarding-modal__textarea",value:v,onChange:a=>p(a.target.value)}),n.jsxs("div",{className:"modal-actions",children:[n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.cancel","Cancel")}),n.jsx("button",{className:"btn btn-primary",disabled:m==="loading"||!v.trim(),onClick:()=>void Q(),children:e("agents.onboarding.continue","Continue")})]})]}),m==="summary"&&t&&n.jsxs("div",{className:"form-group",children:[n.jsx("label",{children:b?e("agents.onboarding.updatedDraftReady","Updated draft ready for review"):e("agents.onboarding.draftReady","Draft ready for review")}),n.jsx("p",{className:"experimental-agent-onboarding-modal__summary-intro",children:e("agents.onboarding.draftIntro","Review this generated draft. Nothing is applied until you confirm.")}),n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary card",children:[n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionIdentity","Identity")}),n.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldName","Name")}),n.jsx("dd",{children:r(t.name)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldRole","Role")}),n.jsx("dd",{children:r(t.role)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldTitle","Title")}),n.jsx("dd",{children:r(t.title)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldIcon","Icon")}),n.jsx("dd",{children:r(t.icon)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldReportsTo","Reports To")}),n.jsx("dd",{children:r(t.reportsTo)})]})]})]}),n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionConfiguration","Configuration")}),n.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldInlineInstructions","Inline Instructions")}),n.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:r(t.instructionsText)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldSoul","Soul")}),n.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:r(t.soul)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldAgentMemory","Agent Memory")}),n.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:r(t.memory)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldSkills","Skills")}),n.jsx("dd",{children:r(t.skills?.join(", "))})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldThinkingLevel","Thinking Level")}),n.jsx("dd",{children:r(t.thinkingLevel)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldMaxTurns","Max Turns")}),n.jsx("dd",{children:r(t.maxTurns)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldTemplate","Template")}),n.jsx("dd",{children:r(t.templateId)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldPatternAgent","Pattern Agent")}),n.jsx("dd",{children:r(t.patternAgentId)})]})]})]}),(t.heartbeatProcedurePath||t.heartbeatIntervalMs||t.heartbeatEnabled!==void 0||t.modelHint||t.runtimeHint)&&n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionRuntimeHints","Runtime Hints")}),n.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldHeartbeatPath","Heartbeat Procedure Path")}),n.jsx("dd",{children:r(t.heartbeatProcedurePath)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldHeartbeatInterval","Heartbeat Interval")}),n.jsx("dd",{children:r(t.heartbeatIntervalMs?`${t.heartbeatIntervalMs}ms`:void 0)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldHeartbeatEnabled","Heartbeat Enabled")}),n.jsx("dd",{children:r(t.heartbeatEnabled===void 0?void 0:t.heartbeatEnabled?e("agents.onboarding.yes","yes"):e("agents.onboarding.no","no"))})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldModelHint","Model Hint")}),n.jsx("dd",{children:r(t.modelHint)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldRuntimeHint","Runtime Hint")}),n.jsx("dd",{children:r(t.runtimeHint)})]})]})]}),t.rationale&&n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionRationale","Rationale")}),n.jsx("p",{className:"experimental-agent-onboarding-modal__summary-block",children:t.rationale})]})]}),n.jsxs("div",{className:"modal-actions",children:[n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.cancel","Cancel")}),n.jsx("button",{className:"btn btn-primary",onClick:()=>void O(),children:b?e("agents.onboarding.applyDraftSettings","Apply draft to settings form"):e("agents.onboarding.applyDraftAgent","Apply draft to agent form")})]})]}),m==="error"&&T&&n.jsxs("div",{className:"form-group",children:[n.jsx("div",{className:"form-error",children:T}),n.jsx("div",{className:"modal-actions",children:n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.close","Close")})})]})]})})}export{en as ExperimentalAgentOnboardingModal};
1
+ import{r as s,j as n}from"./vendor-react-SZ_qB27O.js";import{B as $,D as G,F as V,G as W,H as B,I as U}from"./index-8wtfjIkg.js";import{u as z}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function en({isOpen:l,onClose:R,onUseDraft:M,projectId:x,existingAgents:P,mode:_="create",existingAgentConfig:L}){const{t:e}=z("app"),[m,d]=s.useState("initial"),[f,S]=s.useState(""),[c,k]=s.useState(null),[C,I]=s.useState(""),[w,A]=s.useState("answer"),[v,p]=s.useState(""),[t,H]=s.useState(null),[T,g]=s.useState(null),[E,y]=s.useState([]),b=_==="edit",o=s.useRef(l),N=s.useCallback(()=>{d("initial"),S(""),k(null),I(""),A("answer"),p(""),H(null),g(null),y([])},[]),D=s.useMemo(()=>$.map(a=>({id:a.id,label:a.name,description:a.description})),[]);s.useEffect(()=>{if(o.current=l,!c)return;const a=G(c,x,{onThinking:i=>{o.current&&y(F=>{const h=[...F],j=h[h.length-1];return j&&!j.question?(h[h.length-1]={...j,thinkingOutput:`${j.thinkingOutput??""}${i}`},h):[...h,{response:{},thinkingOutput:i}]})},onQuestion:i=>{o.current&&(I(i.question),A(i.id),d("question"))},onSummary:i=>{o.current&&(H(i),d("summary"))},onError:i=>{o.current&&(g(i),d("error"))}});return()=>{o.current=!1,a.close()}},[l,c,x]);const u=async()=>{o.current=!1;try{c&&await W(c,x)}catch{}finally{N(),R()}};if(s.useEffect(()=>{o.current=l,l||N()},[l,N]),!l)return null;const r=a=>a==null||a===""?n.jsx("em",{className:"experimental-agent-onboarding-modal__summary-empty",children:e("agents.onboarding.notSet","Not set")}):n.jsx("span",{children:a}),q=async()=>{d("loading"),g(null);try{const a=await B(f,{mode:_,existingAgentConfig:L,existingAgents:P.map(i=>({id:i.id,name:i.name,role:i.role})),templates:D},x);if(!o.current)return;k(a.sessionId)}catch(a){if(!o.current)return;g(a.message),d("error")}},Q=async()=>{if(c){d("loading"),g(null);try{const a={[w]:v};if(y(i=>[...i,{question:{id:w,type:"text",question:C},response:a}]),await U(c,a,x),!o.current)return;p("")}catch(a){if(!o.current)return;g(a.message),d("error")}}},O=async()=>{t&&(M(t),await u())};return n.jsx("div",{className:"modal-overlay open",role:"presentation",children:n.jsxs("div",{className:"modal modal-lg experimental-agent-onboarding-modal",role:"dialog","aria-modal":"true","aria-label":e("agents.onboarding.dialogLabel","AI Interview"),children:[n.jsxs("div",{className:"modal-header",children:[n.jsx("h3",{children:e("agents.onboarding.title","AI Interview")}),n.jsx("button",{className:"modal-close",onClick:()=>void u(),"aria-label":e("common.closeAriaLabel","Close"),children:"×"})]}),E.length>0&&n.jsx(V,{entries:E}),m==="initial"&&n.jsxs("div",{className:"form-group",children:[n.jsx("label",{htmlFor:"agent-onboarding-intent",children:b?e("agents.onboarding.intentLabelEdit","What should this agent change or improve?"):e("agents.onboarding.intentLabelCreate","What should this new agent own?")}),n.jsx("textarea",{id:"agent-onboarding-intent",className:"input experimental-agent-onboarding-modal__textarea",value:f,onChange:a=>S(a.target.value)}),n.jsxs("div",{className:"modal-actions",children:[n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.cancel","Cancel")}),n.jsx("button",{className:"btn btn-primary",disabled:!f.trim(),onClick:()=>void q(),children:b?e("agents.onboarding.startInterview","Start interview"):e("agents.onboarding.startOnboarding","Start onboarding")})]})]}),(m==="loading"||m==="question")&&n.jsxs("div",{className:"form-group",children:[n.jsx("label",{htmlFor:"agent-onboarding-answer",children:C||e("agents.onboarding.thinking","Thinking...")}),n.jsx("textarea",{id:"agent-onboarding-answer",className:"input experimental-agent-onboarding-modal__textarea",value:v,onChange:a=>p(a.target.value)}),n.jsxs("div",{className:"modal-actions",children:[n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.cancel","Cancel")}),n.jsx("button",{className:"btn btn-primary",disabled:m==="loading"||!v.trim(),onClick:()=>void Q(),children:e("agents.onboarding.continue","Continue")})]})]}),m==="summary"&&t&&n.jsxs("div",{className:"form-group",children:[n.jsx("label",{children:b?e("agents.onboarding.updatedDraftReady","Updated draft ready for review"):e("agents.onboarding.draftReady","Draft ready for review")}),n.jsx("p",{className:"experimental-agent-onboarding-modal__summary-intro",children:e("agents.onboarding.draftIntro","Review this generated draft. Nothing is applied until you confirm.")}),n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary card",children:[n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionIdentity","Identity")}),n.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldName","Name")}),n.jsx("dd",{children:r(t.name)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldRole","Role")}),n.jsx("dd",{children:r(t.role)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldTitle","Title")}),n.jsx("dd",{children:r(t.title)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldIcon","Icon")}),n.jsx("dd",{children:r(t.icon)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldReportsTo","Reports To")}),n.jsx("dd",{children:r(t.reportsTo)})]})]})]}),n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionConfiguration","Configuration")}),n.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldInlineInstructions","Inline Instructions")}),n.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:r(t.instructionsText)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldSoul","Soul")}),n.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:r(t.soul)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldAgentMemory","Agent Memory")}),n.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:r(t.memory)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldSkills","Skills")}),n.jsx("dd",{children:r(t.skills?.join(", "))})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldThinkingLevel","Thinking Level")}),n.jsx("dd",{children:r(t.thinkingLevel)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldMaxTurns","Max Turns")}),n.jsx("dd",{children:r(t.maxTurns)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldTemplate","Template")}),n.jsx("dd",{children:r(t.templateId)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldPatternAgent","Pattern Agent")}),n.jsx("dd",{children:r(t.patternAgentId)})]})]})]}),(t.heartbeatProcedurePath||t.heartbeatIntervalMs||t.heartbeatEnabled!==void 0||t.modelHint||t.runtimeHint)&&n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionRuntimeHints","Runtime Hints")}),n.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldHeartbeatPath","Heartbeat Procedure Path")}),n.jsx("dd",{children:r(t.heartbeatProcedurePath)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldHeartbeatInterval","Heartbeat Interval")}),n.jsx("dd",{children:r(t.heartbeatIntervalMs?`${t.heartbeatIntervalMs}ms`:void 0)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldHeartbeatEnabled","Heartbeat Enabled")}),n.jsx("dd",{children:r(t.heartbeatEnabled===void 0?void 0:t.heartbeatEnabled?e("agents.onboarding.yes","yes"):e("agents.onboarding.no","no"))})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldModelHint","Model Hint")}),n.jsx("dd",{children:r(t.modelHint)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldRuntimeHint","Runtime Hint")}),n.jsx("dd",{children:r(t.runtimeHint)})]})]})]}),t.rationale&&n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionRationale","Rationale")}),n.jsx("p",{className:"experimental-agent-onboarding-modal__summary-block",children:t.rationale})]})]}),n.jsxs("div",{className:"modal-actions",children:[n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.cancel","Cancel")}),n.jsx("button",{className:"btn btn-primary",onClick:()=>void O(),children:b?e("agents.onboarding.applyDraftSettings","Apply draft to settings form"):e("agents.onboarding.applyDraftAgent","Apply draft to agent form")})]})]}),m==="error"&&T&&n.jsxs("div",{className:"form-group",children:[n.jsx("div",{className:"form-error",children:T}),n.jsx("div",{className:"modal-actions",children:n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.close","Close")})})]})]})})}export{en as ExperimentalAgentOnboardingModal};
@@ -1,2 +1,2 @@
1
- import{r as n,j as t}from"./vendor-react-SZ_qB27O.js";import{V as js,T as ws,P as Ns,S as Es,j as Ss,r as $s,k as Ms,X as Cs,s as Ts,l as As,m as Gs,n as Ls}from"./index-C2xsZoNG.js";import{u as Ds}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";const Ps=5,Fs=3,Rs=280;function h(d,m){if(!m)return d;const r=d.includes("?")?"&":"?";return`${d}${r}projectId=${encodeURIComponent(m)}`}function is(d){return!!(d&&typeof d=="object"&&"code"in d&&d.code==="ACTIVE_GOAL_LIMIT_EXCEEDED")}function Hs({initialGoals:d,anchorGoalId:m,projectId:r,onNavigateToMission:as}){const{t:a}=Ds("app"),[c,k]=n.useState(()=>d??[]),[ns,j]=n.useState(null),p=n.useRef(null),[w,L]=n.useState(d===void 0),[D,l]=n.useState(null),[os,P]=n.useState(!1),[v,F]=n.useState(""),[R,N]=n.useState(""),[U,u]=n.useState(null),[O,_]=n.useState(!1),[y,E]=n.useState(!1),[S,V]=n.useState(null),[q,$]=n.useState(""),[B,M]=n.useState(""),[H,f]=n.useState(null),[I,z]=n.useState(!1),[ls,rs]=n.useState(()=>new Set),[ds,cs]=n.useState([]),[x,C]=n.useState({}),[T,W]=n.useState({}),[A,K]=n.useState(null),[us,X]=n.useState(null);n.useEffect(()=>{if(d!==void 0)return;let s=!0;return(async()=>{try{L(!0),l(null);const i=await fetch(h("/api/goals",r));if(!i.ok)throw new Error(`Failed to load goals (${i.status})`);const o=await i.json();if(!s)return;k(Array.isArray(o.goals)?o.goals:[])}catch{if(!s)return;l(a("goals.loadError","Unable to load goals right now. Please try again."))}finally{s&&L(!1)}})(),()=>{s=!1}},[d,r]),n.useEffect(()=>{let s=!0;return(async()=>{try{const i=await fetch(h("/api/missions",r));if(!i.ok)throw new Error(`Failed to load missions (${i.status})`);const o=await i.json(),g=Array.isArray(o)?o:Array.isArray(o.missions)?o.missions:[];s&&cs(g.map(b=>({id:b.id,title:b.title,status:b.status})))}catch{s&&l(a("goals.missionsLoadError","Unable to load missions right now. Please try again."))}})(),()=>{s=!1}},[r,a]);const J=async s=>{const e=await fetch(h(`/api/goals/${encodeURIComponent(s)}/missions`,r));if(!e.ok)throw new Error(`Failed to load linked missions (${e.status})`);const i=await e.json();return Array.isArray(i.missions)?i.missions:[]};n.useEffect(()=>{let s=!0;return(async()=>{if(c.length===0){C({});return}try{const i=await Promise.all(c.map(async o=>[o.id,await J(o.id)]));s&&C(Object.fromEntries(i))}catch{s&&l(a("goals.linkedMissionsLoadError","Unable to load linked missions right now. Please try again."))}})(),()=>{s=!1}},[c,a]);const G=n.useMemo(()=>c.filter(s=>s.status==="active").length,[c]),gs=G>=Fs&&G<=Ps;n.useEffect(()=>{if(!m){j(null);return}const s=document.getElementById(`goal-card-${m}`);if(s)return j(m),typeof s.scrollIntoView=="function"&&s.scrollIntoView({behavior:"smooth",block:"center"}),p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{j(e=>e===m?null:e),p.current=null},1600),()=>{p.current&&(clearTimeout(p.current),p.current=null)}},[m,c]);function ms(){l(null),u(null),P(!0)}function hs(s){V(s.id),$(s.title),M(s.description??""),f(null)}function Q(){V(null),$(""),M(""),f(null)}function Y(){P(!1),F(""),N(""),u(null),E(!1)}async function ps(){const s=v.trim();if(!s){u(a("goals.titleRequired","Title is required."));return}try{E(!0),u(null);const e=await Gs(s,r);N(e)}catch(e){u(Ls(e))}finally{E(!1)}}async function fs(){const s=v.trim();if(!s){u(a("goals.titleRequired","Title is required."));return}try{_(!0),u(null),l(null);const e=await fetch(h("/api/goals",r),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:s,description:R})});if(e.ok){const o=await e.json();k(g=>[...g,o]),Y();return}let i=null;try{i=await e.json()}catch{i=null}if(e.status===409&&is(i)){l(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}u(a("goals.createError","Unable to create goal right now. Please try again."))}catch{u(a("goals.createError","Unable to create goal right now. Please try again."))}finally{_(!1)}}async function bs(){if(!S)return;const s=q.trim();if(!s){f(a("goals.titleRequired","Title is required."));return}try{z(!0),f(null);const e=await fetch(h(`/api/goals/${S}`,r),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({title:s,description:B})});if(!e.ok)throw new Error(`Failed to update goal (${e.status})`);const i=await e.json();k(o=>o.map(g=>g.id===i.id?i:g)),Q()}catch{f(a("goals.saveError","Unable to save goal right now. Please try again."))}finally{z(!1)}}function ks(s){return s.length>Rs||s.includes(`
1
+ import{r as n,j as t}from"./vendor-react-SZ_qB27O.js";import{V as js,T as ws,P as Ns,S as Es,j as Ss,r as $s,k as Ms,X as Cs,s as Ts,l as As,m as Gs,n as Ls}from"./index-8wtfjIkg.js";import{u as Ds}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";const Ps=5,Fs=3,Rs=280;function h(d,m){if(!m)return d;const r=d.includes("?")?"&":"?";return`${d}${r}projectId=${encodeURIComponent(m)}`}function is(d){return!!(d&&typeof d=="object"&&"code"in d&&d.code==="ACTIVE_GOAL_LIMIT_EXCEEDED")}function Hs({initialGoals:d,anchorGoalId:m,projectId:r,onNavigateToMission:as}){const{t:a}=Ds("app"),[c,k]=n.useState(()=>d??[]),[ns,j]=n.useState(null),p=n.useRef(null),[w,L]=n.useState(d===void 0),[D,l]=n.useState(null),[os,P]=n.useState(!1),[v,F]=n.useState(""),[R,N]=n.useState(""),[U,u]=n.useState(null),[O,_]=n.useState(!1),[y,E]=n.useState(!1),[S,V]=n.useState(null),[q,$]=n.useState(""),[B,M]=n.useState(""),[H,f]=n.useState(null),[I,z]=n.useState(!1),[ls,rs]=n.useState(()=>new Set),[ds,cs]=n.useState([]),[x,C]=n.useState({}),[T,W]=n.useState({}),[A,K]=n.useState(null),[us,X]=n.useState(null);n.useEffect(()=>{if(d!==void 0)return;let s=!0;return(async()=>{try{L(!0),l(null);const i=await fetch(h("/api/goals",r));if(!i.ok)throw new Error(`Failed to load goals (${i.status})`);const o=await i.json();if(!s)return;k(Array.isArray(o.goals)?o.goals:[])}catch{if(!s)return;l(a("goals.loadError","Unable to load goals right now. Please try again."))}finally{s&&L(!1)}})(),()=>{s=!1}},[d,r]),n.useEffect(()=>{let s=!0;return(async()=>{try{const i=await fetch(h("/api/missions",r));if(!i.ok)throw new Error(`Failed to load missions (${i.status})`);const o=await i.json(),g=Array.isArray(o)?o:Array.isArray(o.missions)?o.missions:[];s&&cs(g.map(b=>({id:b.id,title:b.title,status:b.status})))}catch{s&&l(a("goals.missionsLoadError","Unable to load missions right now. Please try again."))}})(),()=>{s=!1}},[r,a]);const J=async s=>{const e=await fetch(h(`/api/goals/${encodeURIComponent(s)}/missions`,r));if(!e.ok)throw new Error(`Failed to load linked missions (${e.status})`);const i=await e.json();return Array.isArray(i.missions)?i.missions:[]};n.useEffect(()=>{let s=!0;return(async()=>{if(c.length===0){C({});return}try{const i=await Promise.all(c.map(async o=>[o.id,await J(o.id)]));s&&C(Object.fromEntries(i))}catch{s&&l(a("goals.linkedMissionsLoadError","Unable to load linked missions right now. Please try again."))}})(),()=>{s=!1}},[c,a]);const G=n.useMemo(()=>c.filter(s=>s.status==="active").length,[c]),gs=G>=Fs&&G<=Ps;n.useEffect(()=>{if(!m){j(null);return}const s=document.getElementById(`goal-card-${m}`);if(s)return j(m),typeof s.scrollIntoView=="function"&&s.scrollIntoView({behavior:"smooth",block:"center"}),p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{j(e=>e===m?null:e),p.current=null},1600),()=>{p.current&&(clearTimeout(p.current),p.current=null)}},[m,c]);function ms(){l(null),u(null),P(!0)}function hs(s){V(s.id),$(s.title),M(s.description??""),f(null)}function Q(){V(null),$(""),M(""),f(null)}function Y(){P(!1),F(""),N(""),u(null),E(!1)}async function ps(){const s=v.trim();if(!s){u(a("goals.titleRequired","Title is required."));return}try{E(!0),u(null);const e=await Gs(s,r);N(e)}catch(e){u(Ls(e))}finally{E(!1)}}async function fs(){const s=v.trim();if(!s){u(a("goals.titleRequired","Title is required."));return}try{_(!0),u(null),l(null);const e=await fetch(h("/api/goals",r),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:s,description:R})});if(e.ok){const o=await e.json();k(g=>[...g,o]),Y();return}let i=null;try{i=await e.json()}catch{i=null}if(e.status===409&&is(i)){l(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}u(a("goals.createError","Unable to create goal right now. Please try again."))}catch{u(a("goals.createError","Unable to create goal right now. Please try again."))}finally{_(!1)}}async function bs(){if(!S)return;const s=q.trim();if(!s){f(a("goals.titleRequired","Title is required."));return}try{z(!0),f(null);const e=await fetch(h(`/api/goals/${S}`,r),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({title:s,description:B})});if(!e.ok)throw new Error(`Failed to update goal (${e.status})`);const i=await e.json();k(o=>o.map(g=>g.id===i.id?i:g)),Q()}catch{f(a("goals.saveError","Unable to save goal right now. Please try again."))}finally{z(!1)}}function ks(s){return s.length>Rs||s.includes(`
2
2
  `)}function vs(s){rs(e=>{const i=new Set(e);return i.has(s)?i.delete(s):i.add(s),i})}function Z(s){const e=new Set((x[s]??[]).map(i=>i.id));return ds.filter(i=>!e.has(i.id))}async function ss(s){const e=await J(s);C(i=>({...i,[s]:e})),W(i=>({...i,[s]:""}))}async function ys(s){const e=T[s];if(e)try{K(s),l(null);const i=await fetch(h(`/api/missions/${encodeURIComponent(e)}/goals/${encodeURIComponent(s)}`,r),{method:"POST"});if(!i.ok)throw new Error(`Failed to link mission (${i.status})`);await ss(s)}catch{l(a("goals.linkMissionError","Unable to link mission right now. Please try again."))}finally{K(null)}}async function xs(s,e){try{X(`${s}:${e}`),l(null);const i=await fetch(h(`/api/missions/${encodeURIComponent(e)}/goals/${encodeURIComponent(s)}`,r),{method:"DELETE"});if(!i.ok)throw new Error(`Failed to unlink mission (${i.status})`);await ss(s)}catch{l(a("goals.unlinkMissionError","Unable to unlink mission right now. Please try again."))}finally{X(null)}}async function ts(s){const e=s.status==="active"?`/api/goals/${s.id}/archive`:`/api/goals/${s.id}/unarchive`;try{l(null);const i=await fetch(h(e,r),{method:"POST"});if(i.ok){const g=await i.json();k(b=>b.map(es=>es.id===g.id?g:es));return}let o=null;try{o=await i.json()}catch{o=null}if(i.status===409&&is(o)){l(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}l(a("goals.updateError","Unable to update goal status right now. Please try again."))}catch{l(a("goals.updateError","Unable to update goal status right now. Please try again."))}}return t.jsxs("section",{className:"goals-view","data-testid":"goals-view",children:[t.jsx(js,{icon:ws,title:a("goals.title","Goals"),actions:t.jsxs(t.Fragment,{children:[t.jsx("p",{className:"goals-count","data-testid":"goals-active-count",children:a("goals.activeCount","{{count}} active goals",{count:G})}),t.jsxs("button",{type:"button",className:"btn btn-primary goals-add-button",onClick:ms,"data-testid":"goals-add-button",children:[t.jsx(Ns,{size:18,"aria-hidden":"true"}),a("goals.addGoal","Add Goal")]})]})}),t.jsxs("div",{className:"goals-view__content",children:[os?t.jsxs("div",{className:"card goals-form","data-testid":"goals-form",children:[t.jsx("label",{className:"goals-form-label",htmlFor:"goals-form-title",children:a("goals.labelTitle","Title")}),t.jsx("input",{id:"goals-form-title",className:"input",type:"text",value:v,maxLength:200,onChange:s=>F(s.target.value),"data-testid":"goals-form-title"}),t.jsxs("div",{className:"goals-form-label-row",children:[t.jsx("label",{className:"goals-form-label",htmlFor:"goals-form-description",children:a("goals.labelDescription","Description")}),t.jsxs("button",{type:"button",className:"btn goals-form-draft-button",onClick:()=>void ps(),disabled:!v.trim()||y,"data-testid":"goals-form-draft-ai",children:[t.jsx(Es,{"aria-hidden":"true"}),y?a("goals.drafting","Drafting…"):a("goals.draftWithAi","Draft with AI")]})]}),t.jsx("textarea",{id:"goals-form-description",className:"input",value:R,maxLength:5e3,onChange:s=>N(s.target.value),"data-testid":"goals-form-description"}),U?t.jsx("p",{className:"form-error goals-error",role:"alert",children:U}):null,t.jsxs("div",{className:"goals-form-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void fs(),disabled:O||y,"data-testid":"goals-form-submit",children:a("actions.save","Save")}),t.jsx("button",{type:"button",className:"btn",onClick:Y,disabled:O||y,"data-testid":"goals-form-cancel",children:a("actions.cancel","Cancel")})]})]}):null,gs?t.jsx("p",{className:"goals-warning",role:"status",children:a("goals.capWarning","Approaching the 5-active goal cap. Keep active goals focused.")}):null,D?t.jsx("p",{className:"form-error goals-error",role:"alert","data-testid":"goals-error",children:D}):null,w?t.jsx("p",{className:"goals-loading",role:"status","data-testid":"goals-loading",children:a("goals.loading","Loading goals…")}):null,!w&&c.length===0?t.jsx("div",{className:"goals-empty card","data-testid":"goals-empty-state",children:a("goals.emptyState","No goals yet. Add one to begin tracking strategic outcomes.")}):null,!w&&c.length>0?t.jsx("div",{className:"goals-list","data-testid":"goals-list",children:c.map(s=>t.jsxs("article",{id:`goal-card-${s.id}`,className:`card goals-card ${s.status==="archived"?"goals-card-archived":""} ${ns===s.id?"goals-card--anchored":""}`.trim(),"data-testid":`goal-card-${s.id}`,draggable:As(),onDragStart:e=>{Ts(e.dataTransfer,{kind:"goal",id:s.id,projectId:r})},children:[S===s.id?t.jsxs("div",{className:"goals-card-main goals-card-edit",children:[t.jsx("label",{className:"goals-form-label",htmlFor:`goal-edit-title-${s.id}`,children:a("goals.labelTitle","Title")}),t.jsx("input",{id:`goal-edit-title-${s.id}`,className:"input",type:"text",value:q,maxLength:200,onChange:e=>$(e.target.value),"data-testid":`goal-edit-title-${s.id}`}),t.jsx("label",{className:"goals-form-label",htmlFor:`goal-edit-description-${s.id}`,children:a("goals.labelDescription","Description")}),t.jsx("textarea",{id:`goal-edit-description-${s.id}`,className:"input",value:B,maxLength:5e3,onChange:e=>M(e.target.value),"data-testid":`goal-edit-description-${s.id}`}),H?t.jsx("p",{className:"form-error goals-error",role:"alert",children:H}):null,t.jsxs("div",{className:"goals-card-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void bs(),disabled:I,"data-testid":`goal-edit-save-${s.id}`,children:a("actions.save","Save")}),t.jsx("button",{type:"button",className:"btn",onClick:Q,disabled:I,"data-testid":`goal-edit-cancel-${s.id}`,children:a("actions.cancel","Cancel")})]})]}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"goals-card-main",children:[t.jsx("h3",{className:"goals-card-title",children:s.title}),s.description?(()=>{const e=ks(s.description),i=ls.has(s.id);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:`markdown-body goals-card-description ${e&&!i?"goals-card-description-collapsed":""}`.trim(),children:t.jsx(Ss,{remarkPlugins:[$s],children:s.description})}),e?t.jsx("button",{type:"button",className:"btn goals-card-description-toggle","aria-expanded":i,"data-testid":`goal-description-toggle-${s.id}`,onClick:()=>vs(s.id),children:i?a("actions.showLess","Show less"):a("actions.showMore","Show more")}):null]})})():null,t.jsxs("p",{className:"goals-card-status",children:[a("goals.status","Status"),": ",s.status]})]}),t.jsxs("div",{className:"goals-card-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:()=>hs(s),"data-testid":`goal-edit-${s.id}`,children:a("actions.edit","Edit")}),s.status==="active"?t.jsx("button",{type:"button",className:"btn goals-activate-button",onClick:()=>void ts(s),"data-testid":`goal-archive-${s.id}`,children:a("goals.archive","Archive")}):t.jsx("button",{type:"button",className:"btn goals-activate-button",onClick:()=>void ts(s),"data-testid":`goal-unarchive-${s.id}`,children:a("goals.unarchive","Unarchive")})]})]}),t.jsxs("section",{className:"goals-linked-missions","aria-label":a("goals.linkedMissions","Linked missions"),children:[t.jsxs("div",{className:"goals-linked-missions-header",children:[t.jsx("h4",{className:"goals-linked-missions-title",children:a("goals.linkedMissionsTitle","Linked Missions")}),t.jsx("span",{className:"goals-linked-missions-count",children:a("goals.linkedMissionsCount",{count:x[s.id]?.length??0,defaultValue_one:"{{count}} linked",defaultValue_other:"{{count}} linked"})})]}),t.jsxs("div",{className:"goals-linked-missions-controls",children:[t.jsxs("select",{className:"input goals-linked-missions-picker","data-testid":`goal-mission-picker-${s.id}`,value:T[s.id]??"",onChange:e=>W(i=>({...i,[s.id]:e.target.value})),"aria-label":a("goals.missionPicker","Mission to link"),disabled:A===s.id||Z(s.id).length===0,children:[t.jsx("option",{value:"",children:a("goals.selectMission","Select a mission")}),Z(s.id).map(e=>t.jsx("option",{value:e.id,children:e.title},e.id))]}),t.jsxs("button",{type:"button",className:"btn btn-primary goals-linked-missions-link-button","data-testid":`goal-mission-link-button-${s.id}`,disabled:!T[s.id]||A===s.id,onClick:()=>void ys(s.id),children:[t.jsx(Ms,{size:16,"aria-hidden":"true"}),A===s.id?a("goals.linkingMission","Linking…"):a("goals.linkMission","Link mission")]})]}),(x[s.id]?.length??0)>0?t.jsx("div",{className:"goals-linked-missions-list",children:(x[s.id]??[]).map(e=>t.jsxs("div",{className:"goals-linked-mission-chip","data-testid":`goal-linked-mission-chip-${e.id}`,children:[t.jsx("button",{type:"button",className:"btn goals-linked-mission-link",onClick:()=>as?.(e.id),children:e.title}),t.jsx("span",{className:"goals-linked-mission-status",children:e.status}),t.jsx("button",{type:"button",className:"btn-icon goals-linked-mission-unlink","data-testid":`goal-linked-mission-unlink-${e.id}`,"aria-label":a("goals.unlinkMission","Unlink mission"),disabled:us===`${s.id}:${e.id}`,onClick:()=>void xs(s.id,e.id),children:t.jsx(Cs,{size:16,"aria-hidden":"true"})})]},e.id))}):t.jsx("p",{className:"goals-linked-missions-empty",children:a("goals.noLinkedMissions","No linked missions.")})]})]},s.id))}):null]})]})}export{Hs as GoalsView};
@@ -1,4 +1,4 @@
1
- import{r as c,j as e}from"./vendor-react-SZ_qB27O.js";import{c as ze,ao as ce,ap as we,aq as Ce,bx as je,by as Ye,au as Me,bz as Qe,bA as Je,bB as Ze,bC as es,bD as ss,bE as ts,bF as Ie,bG as is,bH as ns,bI as Ae,V as as,S as A,bJ as rs,X as Ne,bK as fe,R as N,Y as cs,bL as ls,am as _e,h as le,bM as Ee,bu as os,P as De,aQ as hs,a_ as Pe,bN as gs,s as ds,l as us}from"./index-C2xsZoNG.js";import{u as $e}from"./vendor-i18n-GF3RlKbq.js";import{U as Fe}from"./users-1AkDfM14.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";/**
1
+ import{r as c,j as e}from"./vendor-react-SZ_qB27O.js";import{c as ze,ao as ce,ap as we,aq as Ce,by as je,bz as Ye,au as Me,bA as Qe,bB as Je,bC as Ze,bD as es,bE as ss,bF as ts,bG as Ie,bH as is,bI as ns,bJ as Ae,V as as,S as A,bK as rs,X as Ne,bL as fe,R as N,Y as cs,bM as ls,am as _e,h as le,bN as Ee,bv as os,P as De,aQ as hs,a$ as Pe,bO as gs,s as ds,l as us}from"./index-8wtfjIkg.js";import{u as $e}from"./vendor-i18n-GF3RlKbq.js";import{U as Fe}from"./users-C_YmWx9d.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.