@runfusion/fusion 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/README.md +2 -1
  2. package/dist/bin.js +7431 -2240
  3. package/dist/client/.vite/manifest.json +1118 -331
  4. package/dist/client/assets/AgentDetailView-CgbB51Iw.css +1 -0
  5. package/dist/client/assets/AgentDetailView-D1cA9Bfj.js +18 -0
  6. package/dist/client/assets/{AgentPermissionPolicyEditor--YS4iMUY.js → AgentPermissionPolicyEditor-DE0wv8-L.js} +2 -2
  7. package/dist/client/assets/AgentsView-Bm_FA_1w.js +29 -0
  8. package/dist/client/assets/AgentsView-CzMa5Olf.css +1 -0
  9. package/dist/client/assets/ChatView-BtjkE0V7.css +1 -0
  10. package/dist/client/assets/ChatView-CHEkov6q.js +19 -0
  11. package/dist/client/assets/CommandCenter-Cfgek-dC.js +71 -0
  12. package/dist/client/assets/CommandCenter-DDjpYkPe.css +1 -0
  13. package/dist/client/assets/DevServerView-DgDksVH2.css +1 -0
  14. package/dist/client/assets/DevServerView-_or2KLVw.js +1 -0
  15. package/dist/client/assets/DirectoryPicker-etVwa-6X.js +1 -0
  16. package/dist/client/assets/DocumentsView-e8ZTdPIZ.js +1 -0
  17. package/dist/client/assets/EvalsView-CTbgPUne.css +1 -0
  18. package/dist/client/assets/EvalsView-CjDRQFMQ.js +1 -0
  19. package/dist/client/assets/ExperimentalAgentOnboardingModal-3ZEFv8sr.css +1 -0
  20. package/dist/client/assets/ExperimentalAgentOnboardingModal-DXR0OAsR.js +1 -0
  21. package/dist/client/assets/GoalsView-CUh8JBnJ.css +1 -0
  22. package/dist/client/assets/GoalsView-WWDKVslN.js +2 -0
  23. package/dist/client/assets/InsightsView-C7yRTMPn.css +1 -0
  24. package/dist/client/assets/InsightsView-DxIfxOzx.js +11 -0
  25. package/dist/client/assets/MemoryView-BVW2hkWf.js +2 -0
  26. package/dist/client/assets/MemoryView-CBDUr2Jy.css +1 -0
  27. package/dist/client/assets/PiExtensionsManager-CpSfMok2.js +11 -0
  28. package/dist/client/assets/PluginManager-CpBCy656.js +1 -0
  29. package/dist/client/assets/PullRequestView-BMspX1ga.js +6 -0
  30. package/dist/client/assets/PullRequestView-CpdE3Yo_.css +1 -0
  31. package/dist/client/assets/ResearchView--YEtcv_s.js +1 -0
  32. package/dist/client/assets/ResearchView-DIVNQF4_.css +1 -0
  33. package/dist/client/assets/SecretsView-CC6QDMWN.js +1 -0
  34. package/dist/client/assets/SecretsView-CvFioX7R.css +1 -0
  35. package/dist/client/assets/SessionTerminal-D4R3ScvQ.css +1 -0
  36. package/dist/client/assets/SessionTerminal-DJGtgIls.js +2 -0
  37. package/dist/client/assets/SettingsModal-4d_p8D7W.js +1 -0
  38. package/dist/client/assets/SettingsModal-BESN59Ao.css +1 -0
  39. package/dist/client/assets/SettingsModal-ino68pI2.css +1 -0
  40. package/dist/client/assets/SettingsModal-wABa7xmZ.js +21 -0
  41. package/dist/client/assets/SetupWizardModal-DHe2tXzx.js +2 -0
  42. package/dist/client/assets/ShadcnColorPicker-HX3j1v66.js +11 -0
  43. package/dist/client/assets/ShadcnColorPicker-pqVWCC5-.css +1 -0
  44. package/dist/client/assets/SkillsView-CJ8snrma.css +1 -0
  45. package/dist/client/assets/SkillsView-mdFVTX-r.js +1 -0
  46. package/dist/client/assets/TodoView-CIsL_uvQ.css +1 -0
  47. package/dist/client/assets/TodoView-DQVugDpW.js +6 -0
  48. package/dist/client/assets/WorkflowNodeEditor-CeERQHHu.js +8 -0
  49. package/dist/client/assets/WorkflowNodeEditor-f_XPV5Jd.css +1 -0
  50. package/dist/client/assets/{addon-fit-SnYDEvGm.js → addon-fit-C1WQXRvu.js} +1 -1
  51. package/dist/client/assets/{addon-unicode11-s5GoZCpi.js → addon-unicode11-BVmNDUBM.js} +1 -1
  52. package/dist/client/assets/{addon-web-links-jjt2f_oV.js → addon-web-links-CkVew5xs.js} +1 -1
  53. package/dist/client/assets/{addon-webgl-Icn-RnEx.js → addon-webgl-uLc0RKcC.js} +1 -1
  54. package/dist/client/assets/agentSkills-C2v1wbxh.js +1 -0
  55. package/dist/client/assets/{ExperimentalAgentOnboardingModal-CZ_jbgep.css → agentSkills-bQJ4X1gH.css} +1 -1
  56. package/dist/client/assets/agentsOrgChartLayout-BMvyuaLA.js +1 -0
  57. package/dist/client/assets/app-BJGkp7Tt.js +13 -0
  58. package/dist/client/assets/app-BKLUvvm8.js +13 -0
  59. package/dist/client/assets/app-BaoNC9zg.js +13 -0
  60. package/dist/client/assets/app-CZQ_fFNf.js +13 -0
  61. package/dist/client/assets/app-DAu3AzsS.js +13 -0
  62. package/dist/client/assets/app-DgezOJub.js +13 -0
  63. package/dist/client/assets/arc-cxkkNsnK.js +1 -0
  64. package/dist/client/assets/architectureDiagram-3BPJPVTR-CGEhhgX_.js +36 -0
  65. package/dist/client/assets/band-CquvqAHh.js +1 -0
  66. package/dist/client/assets/blockDiagram-GPEHLZMM-D0DTo0HT.js +132 -0
  67. package/dist/client/assets/c4Diagram-AAUBKEIU-DNykNaRb.js +10 -0
  68. package/dist/client/assets/channel-Dwf1FoGU.js +1 -0
  69. package/dist/client/assets/chunk-2J33WTMH-5oQfAhmr.js +1 -0
  70. package/dist/client/assets/chunk-4BX2VUAB-BqLZXgFw.js +1 -0
  71. package/dist/client/assets/chunk-55IACEB6-C1oIjX3T.js +1 -0
  72. package/dist/client/assets/chunk-727SXJPM-BaovQTgk.js +206 -0
  73. package/dist/client/assets/chunk-AQP2D5EJ-B4ikBK42.js +231 -0
  74. package/dist/client/assets/chunk-FMBD7UC4-5zgtNnG2.js +15 -0
  75. package/dist/client/assets/chunk-ND2GUHAM-ByrypRna.js +1 -0
  76. package/dist/client/assets/chunk-QZHKN3VN-B7D1exsu.js +1 -0
  77. package/dist/client/assets/classDiagram-4FO5ZUOK-WqSUwcK_.js +1 -0
  78. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-WqSUwcK_.js +1 -0
  79. package/dist/client/assets/common-BDp2y6CF.js +1 -0
  80. package/dist/client/assets/common-BnEo5fLN.js +1 -0
  81. package/dist/client/assets/common-Bzr_Y8h4.js +1 -0
  82. package/dist/client/assets/common-CvwyFzfv.js +1 -0
  83. package/dist/client/assets/common-CztCXRkz.js +1 -0
  84. package/dist/client/assets/common-DPe2mbb7.js +1 -0
  85. package/dist/client/assets/cose-bilkent-S5V4N54A-CQmiNzGr.js +1 -0
  86. package/dist/client/assets/cytoscape.esm-OyMbaexL.js +331 -0
  87. package/dist/client/assets/dagre-BM42HDAG-BH8Uk0Up.js +4 -0
  88. package/dist/client/assets/{dashboard-view-B4LXCv5H.js → dashboard-view-CWJ-b59n.js} +1680 -1620
  89. package/dist/client/assets/dashboard-view-D3PWY2PH.js +1 -0
  90. package/dist/client/assets/dashboard-view-D_zsA-kz.css +1 -0
  91. package/dist/client/assets/defaultLocale-DX6XiGOO.js +1 -0
  92. package/dist/client/assets/diagram-2AECGRRQ-CDoHfkxY.js +43 -0
  93. package/dist/client/assets/diagram-5GNKFQAL-DARILCuD.js +10 -0
  94. package/dist/client/assets/diagram-KO2AKTUF-CNP-qi0y.js +3 -0
  95. package/dist/client/assets/diagram-LMA3HP47-SCiVmkcf.js +24 -0
  96. package/dist/client/assets/diagram-OG6HWLK6-iTJLXH61.js +24 -0
  97. package/dist/client/assets/erDiagram-TEJ5UH35-ByMpiPIa.js +85 -0
  98. package/dist/client/assets/flowDiagram-I6XJVG4X-DW3m3ZpM.js +162 -0
  99. package/dist/client/assets/{folder-open-33WGVnbp.js → folder-open-G-9vPAdv.js} +1 -1
  100. package/dist/client/assets/ganttDiagram-6RSMTGT7-BJeYH7Ol.js +292 -0
  101. package/dist/client/assets/gitGraphDiagram-PVQCEYII-CK_Chj4m.js +106 -0
  102. package/dist/client/assets/graph--OzhPTMs.js +1 -0
  103. package/dist/client/assets/index-BZBQ_KsL.css +1 -0
  104. package/dist/client/assets/index-ccFe_1av.js +1459 -0
  105. package/dist/client/assets/infoDiagram-5YYISTIA-D8Wg1IgN.js +2 -0
  106. package/dist/client/assets/init-Dmth1JHB.js +1 -0
  107. package/dist/client/assets/ishikawaDiagram-YF4QCWOH-DWROR2aX.js +70 -0
  108. package/dist/client/assets/journeyDiagram-JHISSGLW-Bns9774_.js +139 -0
  109. package/dist/client/assets/kanban-definition-UN3LZRKU-QtURfAoI.js +89 -0
  110. package/dist/client/assets/katex-HP8lGamR.js +257 -0
  111. package/dist/client/assets/layout-SsrduOYp.js +1 -0
  112. package/dist/client/assets/linear-dXivciGL.js +1 -0
  113. package/dist/client/assets/mermaid.core-DqgrgWWm.js +309 -0
  114. package/dist/client/assets/mindmap-definition-RKZ34NQL-jLaDb5_X.js +96 -0
  115. package/dist/client/assets/ordinal-DILIJJjt.js +1 -0
  116. package/dist/client/assets/pieDiagram-4H26LBE5-CjbHuIje.js +30 -0
  117. package/dist/client/assets/quadrantDiagram-W4KKPZXB-xgHbylQr.js +7 -0
  118. package/dist/client/assets/requirementDiagram-4Y6WPE33-CHdD7W41.js +84 -0
  119. package/dist/client/assets/sankeyDiagram-5OEKKPKP-C3me87g9.js +40 -0
  120. package/dist/client/assets/sequenceDiagram-3UESZ5HK-DSHfs1kU.js +162 -0
  121. package/dist/client/assets/{shield-alert-CqeGWBUK.js → shield-alert-DkGlhVjI.js} +1 -1
  122. package/dist/client/assets/stateDiagram-AJRCARHV-C08n7sMP.js +1 -0
  123. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BosoAbfO.js +1 -0
  124. package/dist/client/assets/step-yuy0qJer.js +1 -0
  125. package/dist/client/assets/time-DoDTxsna.js +1 -0
  126. package/dist/client/assets/timeline-definition-PNZ67QCA-C21h9Zqh.js +120 -0
  127. package/dist/client/assets/{upload-C11J2diI.js → upload-B9B-tYt9.js} +1 -1
  128. package/dist/client/assets/{users-a-ELbyyZ.js → users-C_BA3C7E.js} +1 -1
  129. package/dist/client/assets/{vendor-i18n-DYlSUfot.js → vendor-i18n-GF3RlKbq.js} +2 -2
  130. package/dist/client/assets/{vendor-react-BTgM5bbZ.js → vendor-react-SZ_qB27O.js} +1 -1
  131. package/dist/client/assets/vendor-reactflow-Bg-Qjzh8.js +15 -0
  132. package/dist/client/assets/{vendor-xterm-ea7-K05z.js → vendor-xterm-BNq00GSj.js} +1 -1
  133. package/dist/client/assets/vennDiagram-CIIHVFJN-Bv3G0dwI.js +34 -0
  134. package/dist/client/assets/wardley-L42UT6IY-WX0hHKcN.js +173 -0
  135. package/dist/client/assets/wardleyDiagram-YWT4CUSO-CMwIPWm7.js +78 -0
  136. package/dist/client/assets/xychartDiagram-2RQKCTM6-CZvFdt6j.js +7 -0
  137. package/dist/client/assets/zoom-out-NWbVkreR.js +41 -0
  138. package/dist/client/index.html +30 -10
  139. package/dist/client/sw.js +1 -1
  140. package/dist/client/theme-data.css +3082 -206
  141. package/dist/client/version.json +1 -1
  142. package/dist/droid-cli/index.ts +56 -40
  143. package/dist/droid-cli/package.json +1 -1
  144. package/dist/droid-cli/src/__tests__/index.test.ts +47 -21
  145. package/dist/droid-cli/src/__tests__/process-manager.test.ts +50 -33
  146. package/dist/extension.js +5405 -919
  147. package/dist/pi-claude-cli/package.json +1 -1
  148. package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +25 -0
  149. package/dist/pi-claude-cli/src/process-manager.ts +11 -1
  150. package/dist/plugin-sdk/index.d.ts +137 -4
  151. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  152. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  153. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  154. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  155. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  156. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +68 -44
  157. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  158. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  159. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  160. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  161. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  162. package/dist/plugins/fusion-plugin-roadmap/bundled.js +5 -11
  163. package/dist/plugins/fusion-plugin-roadmap/manifest.json +1 -11
  164. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  165. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  166. package/package.json +3 -3
  167. package/skill/fusion/SKILL.md +1 -1
  168. package/skill/fusion/references/cli-commands.md +2 -1
  169. package/skill/fusion/references/extension-tools.md +10 -0
  170. package/skill/fusion/references/fusion-capabilities.md +3 -1
  171. package/dist/client/assets/AgentDetailView-CanIeYHg.css +0 -1
  172. package/dist/client/assets/AgentDetailView-DxV8pFHX.js +0 -18
  173. package/dist/client/assets/AgentsView-BVILQjdS.css +0 -1
  174. package/dist/client/assets/AgentsView-CTzbcvhK.js +0 -29
  175. package/dist/client/assets/ChatView-COygcnyk.js +0 -6
  176. package/dist/client/assets/ChatView-DwJAd5G1.css +0 -1
  177. package/dist/client/assets/CommandCenter-CTaopaC0.css +0 -1
  178. package/dist/client/assets/CommandCenter-DoKX2HWm.js +0 -56
  179. package/dist/client/assets/DevServerView-Cyevyvqx.js +0 -1
  180. package/dist/client/assets/DevServerView-VTQY28P7.css +0 -1
  181. package/dist/client/assets/DirectoryPicker-DBdyXEhR.js +0 -1
  182. package/dist/client/assets/DocumentsView-BzSMyrns.js +0 -1
  183. package/dist/client/assets/DocumentsView-WfVoTZt8.css +0 -1
  184. package/dist/client/assets/EvalsView-CUNJ1TLc.css +0 -1
  185. package/dist/client/assets/EvalsView-ikz00o9g.js +0 -1
  186. package/dist/client/assets/ExperimentalAgentOnboardingModal-D-rzCCET.js +0 -499
  187. package/dist/client/assets/GoalsView-Bfu1Oy2-.js +0 -2
  188. package/dist/client/assets/GoalsView-rg9VSIza.css +0 -1
  189. package/dist/client/assets/InsightsView-Cgmf5nES.js +0 -11
  190. package/dist/client/assets/InsightsView-LMv1M1dU.css +0 -1
  191. package/dist/client/assets/MemoryView-DkEuDKQs.js +0 -2
  192. package/dist/client/assets/MemoryView-zaXewZzi.css +0 -1
  193. package/dist/client/assets/NodesView-7VInxyf_.css +0 -1
  194. package/dist/client/assets/NodesView-B_KYfS4o.js +0 -14
  195. package/dist/client/assets/PiExtensionsManager-Dz69kkKs.js +0 -11
  196. package/dist/client/assets/PluginManager-LHCVcduP.js +0 -1
  197. package/dist/client/assets/PullRequestView-3AdbS2a1.css +0 -1
  198. package/dist/client/assets/PullRequestView-DBJutLLl.js +0 -6
  199. package/dist/client/assets/ResearchView-DTh8FLUm.css +0 -1
  200. package/dist/client/assets/ResearchView-gpn1XcVy.js +0 -1
  201. package/dist/client/assets/SecretsView-B7YqIowt.js +0 -1
  202. package/dist/client/assets/SecretsView-Djo1rahi.css +0 -1
  203. package/dist/client/assets/SessionTerminal-9l4bdKcn.js +0 -2
  204. package/dist/client/assets/SessionTerminal-BNgtmXb3.css +0 -1
  205. package/dist/client/assets/SettingsModal-BGEK9_9A.js +0 -31
  206. package/dist/client/assets/SettingsModal-CKv0TJfM.css +0 -1
  207. package/dist/client/assets/SettingsModal-CXogw-Er.css +0 -1
  208. package/dist/client/assets/SettingsModal-DIIoHGUH.js +0 -1
  209. package/dist/client/assets/SetupWizardModal-BcVeMxeX.js +0 -1
  210. package/dist/client/assets/SetupWizardModal-CIqFbkrD.css +0 -1
  211. package/dist/client/assets/SkillsView-3bhGyWs1.css +0 -1
  212. package/dist/client/assets/SkillsView-BxSJ4PHL.js +0 -1
  213. package/dist/client/assets/StashRecoveryView-B_8WIQEo.css +0 -1
  214. package/dist/client/assets/StashRecoveryView-BhFQ2FsP.js +0 -1
  215. package/dist/client/assets/TodoView-7xIh-Fmi.css +0 -1
  216. package/dist/client/assets/TodoView-BZpewjy0.js +0 -6
  217. package/dist/client/assets/WorkflowNodeEditor-Yn1FRF2v.css +0 -1
  218. package/dist/client/assets/WorkflowNodeEditor-tWsgCdVt.js +0 -8
  219. package/dist/client/assets/app-BmGA0Hiz.js +0 -13
  220. package/dist/client/assets/app-CEVYlVuJ.js +0 -13
  221. package/dist/client/assets/app-CbBFax2C.js +0 -13
  222. package/dist/client/assets/app-DORKrGAz.js +0 -13
  223. package/dist/client/assets/app-DQibuQ9z.js +0 -13
  224. package/dist/client/assets/app-k76GrQP0.js +0 -13
  225. package/dist/client/assets/common-BRyX4VxB.js +0 -1
  226. package/dist/client/assets/common-CN9QPI2d.js +0 -1
  227. package/dist/client/assets/common-CNbjPELi.js +0 -1
  228. package/dist/client/assets/common-DFDqu_n0.js +0 -1
  229. package/dist/client/assets/common-DgWWKG8Z.js +0 -1
  230. package/dist/client/assets/common-X6PzBnVA.js +0 -1
  231. package/dist/client/assets/createLucideIcon-DmVITl5d.js +0 -21
  232. package/dist/client/assets/dashboard-view-BFoyhTYF.js +0 -3
  233. package/dist/client/assets/dashboard-view-Cxzm_eqc.js +0 -1
  234. package/dist/client/assets/dashboard-view-DdGlfuu-.css +0 -1
  235. package/dist/client/assets/dashboard-view-_8yfNwju.css +0 -1
  236. package/dist/client/assets/index-Bglw05rM.js +0 -791
  237. package/dist/client/assets/index-FYgnflWD.css +0 -1
  238. package/dist/client/assets/vendor-reactflow-ZasuEfF9.js +0 -15
  239. package/dist/client/assets/x-PItWc-wQ.js +0 -61
  240. package/dist/client/assets/zoom-out-CzlHv0Kj.js +0 -21
@@ -0,0 +1,8 @@
1
+ import{r as o,j as e,b as To}from"./vendor-react-SZ_qB27O.js";import{R as zo,u as Wo,d as $o,e as _o,f as Bo,B as qo,C as Vo,M as Go}from"./vendor-reactflow-Bg-Qjzh8.js";import{c as Ho,eb as ns,ec as we,ed as Ga,ee as Uo,ef as Ko,eg as Yo,eh as Ha,bo as le,bn as Et,P as Se,b6 as Le,bt as Jo,ac as Xo,n as Ce,I as be,al as Ua,ei as Qo,bK as Ft,ej as sa,bE as Ka,ek as is,ak as Zo,C as Ee,bO as rs,el,em as tl,H as sl,en as al,eo as ol,cp as aa,ep as ll,eq as nl,er as il,cd as rl,es as dl,dw as cl,a2 as oa,ad as ul,et as fl,eu as pl,ev as ml,ew as wl,ex as hl,ey as gl,ez as bl,eA as xl,eB as kl,eC as la,eD as na,eE as ia,eF as ra,eG as da,eH as ca,eI as vl,eJ as jl,eK as Nl,eL as yl,eM as Cl,eN as Sl,eO as El,eP as Fl,eQ as Ml,eR as Pl,eS as ua,eT as fa,eU as Al,eV as pa,eW as ma,eX as Il,eY as es,eZ as Rl,e_ as Ya,e$ as Dl,f0 as wa,f1 as Ol,h as ha,f2 as Ja,df as ga,f3 as ba,X as ds,br as xa,L as Ie,f4 as ts,bq as Xa,ba as Ll,f5 as Tl,a0 as zl,aj as Wl,b9 as $l,f6 as _l,f7 as Bl,f8 as ql,f9 as ka,fa as Vl,fb as Gl,fc as Hl,fd as St,S as He,fe as Ul,ff as Kl,fg as Yl,dg as va,fh as ja,fi as Jl,fj as Xl}from"./index-ccFe_1av.js";import{u as xe}from"./vendor-i18n-GF3RlKbq.js";import{U as Ql}from"./upload-B9B-tYt9.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";/**
2
+ * @license lucide-react v1.7.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const Zl=[["path",{d:"m16 6 4 14",key:"ji33uf"}],["path",{d:"M12 6v14",key:"1n7gus"}],["path",{d:"M8 8v12",key:"1gg7y9"}],["path",{d:"M4 4v16",key:"6qkkli"}]],en=Ho("library",Zl),tn=80,sn=24,Na=16,ya=Uo+tn,an=0,on=0,ss=Ga+sn;function ln(a){return!(we(a.id)||a.parentId)}function nn(a,r){const d=new Set(a),w=new Map,i=new Map;for(const g of a)i.set(g,0);for(const g of r)g.data?.kind!=="rework"&&(!d.has(g.source)||!d.has(g.target)||g.source!==g.target&&((w.get(g.source)??w.set(g.source,[]).get(g.source)).push(g.target),i.set(g.target,(i.get(g.target)??0)+1)));const h=a.filter(g=>g==="start"),A=h.length?h:a.filter(g=>(i.get(g)??0)===0),u=new Map,F=a.length+1,M=[];for(const g of A)u.set(g,0),M.push(g);let E=a.length*a.length+a.length+1;for(;M.length&&E-- >0;){const g=M.shift(),b=u.get(g)??0;for(const c of w.get(g)??[]){const y=b+1,k=u.get(c);(k===void 0||y>k)&&y<=F&&(u.set(c,y),M.push(c))}}let v=0;for(const g of u.values())g>v&&(v=g);const x=u.size?v+1:0;for(const g of a)u.has(g)||u.set(g,x);return u}function Ca(a,r,d){const w=a.filter(ln),i=w.map(E=>E.id),h=nn(i,r),A=new Map(w.map(E=>[E.id,E])),u=new Map,F=new Map;for(const E of i){const v=h.get(E)??0;(F.get(v)??F.set(v,[]).get(v)).push(E)}const M=d.length>0;for(const[E,v]of F){const x=[...v].sort((c,y)=>{const k=A.get(c),O=A.get(y);return k.position.y!==O.position.y?k.position.y-O.position.y:c<y?-1:c>y?1:0}),g=an+E*ya;if(!M){x.forEach((c,y)=>{u.set(c,{x:g,y:on+y*ss})});continue}const b=new Map;for(const c of x){const y=A.get(c),k=y.data.column??(ns(y.position.y,d)?ns(y.position.y,d):void 0);if(!k){u.set(c,{x:g,y:y.position.y});continue}const O=d.findIndex(C=>C.id===k),j=O>=0?O:0,T=Ko(j),P=T+Na,Q=T+Yo-Ga-Na,ie=Math.max(1,Math.floor((Q-P)/ss)+1),B=b.get(k??`__idx${j}`)??0,q=B%ie,ne=Math.floor(B/ie),G=P+q*ss,te=g+ne*(ya/2);u.set(c,{x:te,y:G}),b.set(k??`__idx${j}`,B+1)}}return u}function Sa(a,r){return a.map(d=>{const w=r.get(d.id);return w?{...d,position:w}:d})}let Ea=0;function rn(){return Ea+=1,`col-${Date.now().toString(36)}-${Ea}`}function Fa({columns:a,onChange:r,violations:d,readOnly:w,projectId:i,addToast:h,columnAgentsEnabled:A}){const{t:u}=xe("app"),[F,M]=o.useState([]),[E,v]=o.useState([]),[x,g]=o.useState(!0),[b,c]=o.useState(null);o.useEffect(()=>{let C=!1;return Ha(i).then(D=>{C||M(D)}).catch(D=>{C||h(le(D)||u("workflowColumns.traitsLoadFailed","Failed to load traits"),"error")}),()=>{C=!0}},[i,h,u]),o.useEffect(()=>{let C=!1;return g(!0),c(null),Promise.resolve(Et(void 0,i)).then(D=>{C||(v(D??[]),g(!1))}).catch(D=>{if(C)return;const L=le(D)||u("workflowColumns.agentsLoadFailed","Failed to load agents");c(L),g(!1),h(L,"error")}),()=>{C=!0}},[i,h,u]);const y=o.useMemo(()=>E.map(C=>C.id).join(","),[E]),k=o.useMemo(()=>{const C=new Map;for(const D of E)C.set(D.id,D);return C},[y]),O=o.useCallback((C,D)=>{r(a.map(L=>{if(L.id!==C)return L;if(!D){const{agent:V,...ee}=L;return ee}return{...L,agent:D}}))},[a,r]),j=o.useCallback((C,D)=>{if(!D){O(C,void 0);return}const L=a.find(V=>V.id===C)?.agent;O(C,{agentId:D,mode:L?.mode??"defer"})},[a,O]),T=o.useCallback((C,D)=>{const L=a.find(V=>V.id===C)?.agent;L&&O(C,{...L,mode:D})},[a,O]),P=w||!A||x||!!b,Q=d.filter(C=>C.columnId===null),ie=o.useCallback(C=>d.filter(D=>D.columnId===C),[d]),B=o.useCallback(()=>{const C=rn();r([...a,{id:C,name:u("workflowColumns.newColumnName","New column"),traits:[]}])},[a,r,u]),q=o.useCallback((C,D)=>{r(a.map(L=>L.id===C?{...L,name:D}:L))},[a,r]),ne=o.useCallback(C=>{r(a.filter(D=>D.id!==C))},[a,r]),G=o.useCallback((C,D)=>{const L=C+D;if(L<0||L>=a.length)return;const V=[...a];[V[C],V[L]]=[V[L],V[C]],r(V)},[a,r]),te=o.useCallback((C,D)=>{r(a.map(L=>{if(L.id!==C)return L;const V=L.traits.some(ee=>ee.trait===D);return{...L,traits:V?L.traits.filter(ee=>ee.trait!==D):[...L.traits,{trait:D}]}}))},[a,r]);return e.jsxs("aside",{className:"wf-column-panel","data-testid":"wf-column-panel",children:[e.jsxs("header",{className:"wf-column-panel-header",children:[e.jsx("h3",{children:u("workflowColumns.title","Columns")}),e.jsxs("button",{className:"wf-column-add",onClick:B,disabled:w,title:w?u("workflowColumns.readOnlyHint","Built-in workflows are read-only — duplicate to edit"):void 0,children:[e.jsx(Se,{size:13})," ",u("workflowColumns.add","Add column")]})]}),Q.length>0&&e.jsx("div",{className:"wf-column-panel-errors",role:"alert",children:Q.map((C,D)=>e.jsxs("p",{className:"wf-column-violation",children:[e.jsx(Le,{size:12,"aria-hidden":!0})," ",C.message]},`${C.code}-${D}`))}),a.length===0?e.jsx("p",{className:"wf-column-panel-empty",children:u("workflowColumns.empty","No columns yet. Add a column to place nodes into board lanes.")}):e.jsx("ul",{className:"wf-column-list",children:a.map((C,D)=>{const L=ie(C.id),V=C.agent?.agentId,ee=V?k.get(V):void 0,de=!!V&&!x&&!b&&!ee,re=ee?.name??(de?u("workflowColumns.agentNotFound","Agent not found — {{id}}",{id:V??""}):V);return e.jsxs("li",{className:`wf-column-item${L.length?" wf-column-item--error":""}`,"data-testid":`wf-column-${C.id}`,"data-column-error":L.length?"true":void 0,children:[e.jsxs("div",{className:"wf-column-item-head",children:[e.jsx("input",{className:"wf-column-name","aria-label":u("workflowColumns.nameLabel","Column name"),value:C.name,disabled:w,onChange:U=>q(C.id,U.target.value)}),V&&e.jsxs("span",{className:`wf-column-agent-badge${de?" wf-column-agent-badge--stale":""}`,"data-testid":`wf-column-agent-badge-${C.id}`,title:C.agent?.mode==="override"?u("workflowColumns.agentBadgeOverride","Column agent (override)"):u("workflowColumns.agentBadgeDefer","Column agent (defer)"),children:[e.jsx(Jo,{size:11,"aria-hidden":!0})," ",re]}),e.jsxs("div",{className:"wf-column-item-actions",children:[e.jsx("button",{className:"wf-column-move","aria-label":u("workflowColumns.moveUp","Move column up"),disabled:w||D===0,onClick:()=>G(D,-1),children:e.jsx(Xo,{size:13})}),e.jsx("button",{className:"wf-column-move","aria-label":u("workflowColumns.moveDown","Move column down"),disabled:w||D===a.length-1,onClick:()=>G(D,1),children:e.jsx(Ce,{size:13})}),e.jsx("button",{className:"wf-column-remove","aria-label":u("workflowColumns.remove","Remove column"),disabled:w,onClick:()=>ne(C.id),children:e.jsx(be,{size:13})})]})]}),L.map((U,he)=>e.jsxs("p",{className:"wf-column-violation",role:"alert",children:[e.jsx(Le,{size:12,"aria-hidden":!0})," ",U.message]},`${U.code}-${he}`)),e.jsxs("div",{className:"wf-column-traits",children:[e.jsx("span",{className:"wf-column-traits-label",children:u("workflowColumns.traits","Traits")}),e.jsx("div",{className:"wf-column-trait-options",children:F.map(U=>{const he=C.traits.some(R=>R.trait===U.id);return e.jsxs("label",{className:"wf-column-trait",title:U.description,children:[e.jsx("input",{type:"checkbox",checked:he,disabled:w,onChange:()=>te(C.id,U.id)}),e.jsx("span",{children:U.name})]},U.id)})})]}),e.jsxs("div",{className:"wf-column-agent",children:[e.jsx("span",{className:"wf-column-agent-label",children:u("workflowColumns.agent","Column agent")}),e.jsxs("select",{className:"wf-column-agent-select","data-testid":`wf-column-agent-select-${C.id}`,"aria-label":u("workflowColumns.agentLabel","Column agent"),value:V??"",disabled:P,title:w?u("workflowColumns.readOnlyHint","Built-in workflows are read-only — duplicate to edit"):void 0,onChange:U=>j(C.id,U.target.value),children:[e.jsx("option",{value:"",children:u("workflowColumns.agentNone","(none)")}),de&&V&&e.jsx("option",{value:V,children:u("workflowColumns.agentNotFound","Agent not found — {{id}}",{id:V})}),E.map(U=>e.jsx("option",{value:U.id,children:U.name},U.id))]}),b&&e.jsxs("p",{className:"wf-column-agent-error",role:"alert",children:[e.jsx(Le,{size:12,"aria-hidden":!0})," ",b]}),de&&e.jsxs("p",{className:"wf-column-agent-stale",role:"alert","data-testid":`wf-column-agent-stale-${C.id}`,children:[e.jsx(Le,{size:12,"aria-hidden":!0})," ",u("workflowColumns.agentNotFound","Agent not found — {{id}}",{id:V??""})]}),V&&e.jsxs("div",{className:"wf-column-agent-mode",role:"radiogroup","aria-label":u("workflowColumns.agentMode","Agent mode"),children:[e.jsxs("label",{className:"wf-column-agent-mode-option",children:[e.jsx("input",{type:"radio",name:`wf-column-agent-mode-${C.id}`,checked:(C.agent?.mode??"defer")==="defer",disabled:P,onChange:()=>T(C.id,"defer")}),e.jsx("span",{title:u("workflowColumns.agentModeDeferHint","Column agent applies only when the work carries no agent/model settings of its own"),children:u("workflowColumns.agentModeDefer","Defer")})]}),e.jsxs("label",{className:"wf-column-agent-mode-option",children:[e.jsx("input",{type:"radio",name:`wf-column-agent-mode-${C.id}`,checked:C.agent?.mode==="override",disabled:P,onChange:()=>T(C.id,"override")}),e.jsx("span",{title:u("workflowColumns.agentModeOverrideHint","Column agent supersedes node- and task-level agent/model settings"),children:u("workflowColumns.agentModeOverride","Override")})]})]})]})]},C.id)})})]})}const dn=["string","text","number","boolean","enum","multi-enum","date","url"],Ma={string:["input"],text:["textarea","input"],number:["input"],boolean:["toggle"],enum:["select","radio","chips"],"multi-enum":["chips"],date:["input"],url:["input"]},cn=["#4f7cff","#22c55e","#f59e0b","#ef4444","#a855f7","#06b6d4","#ec4899","#64748b"];function Mt(a){return a==="enum"||a==="multi-enum"}function un(a){return a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}let Pa=0;function fn(){return Pa+=1,`field-${Date.now().toString(36)}-${Pa}`}function pn({field:a}){const r=o.useMemo(()=>{if(Mt(a.type)){const w=a.options?.[0];return w?a.type==="multi-enum"?{node:e.jsx("span",{className:"card-field-badge card-field-badge--multi",title:a.name,children:(a.options??[]).slice(0,2).map(i=>e.jsx("span",{className:"card-field-badge-token",style:i.color?{backgroundColor:i.color,borderColor:i.color,color:"#fff"}:void 0,children:i.label},i.value))})}:{node:e.jsx("span",{className:"card-field-badge card-field-badge--enum",title:`${a.name}: ${w.label}`,style:w.color?{backgroundColor:w.color,borderColor:w.color,color:"#fff"}:void 0,children:w.label})}:null}if(a.type==="boolean")return{node:e.jsx("span",{className:"card-field-badge card-field-badge--boolean",title:a.name,children:a.name})};const d=a.type==="number"?"42":a.type==="date"?"2026-06-04":a.type==="url"?"example.com":a.name;return{node:e.jsx("span",{className:"card-field-badge",title:a.name,children:d})}},[a]);return r?e.jsx("div",{className:"wf-field-preview","data-testid":`wf-field-preview-${a.id}`,children:e.jsx("div",{className:"card-field-badges",children:r.node})}):null}function Aa({fields:a,onChange:r,readOnly:d,addToast:w}){const{t:i}=xe("app"),[h,A]=o.useState(null),u=o.useCallback((c,y)=>{r(a.map(k=>k.id===c?{...k,...y}:k))},[a,r]),F=o.useCallback(()=>{const c=fn();r([...a,{id:c,name:i("workflowFields.newFieldName","New field"),type:"string"}])},[a,r,i]),M=o.useCallback(c=>{r(a.filter(y=>y.id!==c))},[a,r]),E=o.useCallback((c,y)=>{const k=un(y);if(k){if(k!==c&&a.some(O=>O.id===k)){w(i("workflowFields.duplicateId","A field with that id already exists"),"error");return}u(c,{id:k})}},[a,u,w,i]),v=o.useCallback((c,y)=>{const k=a.find(j=>j.id===c);if(!k)return;const O={type:y};Mt(y)?(!k.options||k.options.length===0)&&(O.options=[{value:"option-1",label:i("workflowFields.newOptionLabel","Option 1")}]):O.options=void 0,k.render?.widget&&!Ma[y].includes(k.render.widget)&&(O.render={...k.render,widget:void 0}),O.default=void 0,u(c,O)},[a,u,i]),x=o.useCallback((c,y)=>u(c,{options:y}),[u]),g=o.useCallback((c,y)=>{const k=!y||y.placement===void 0&&y.widget===void 0&&!y.badge;u(c,{render:k?void 0:y})},[u]),b=c=>{const y=j=>u(c.id,{default:j});if(c.type==="boolean")return e.jsxs("label",{className:"wf-field--checkbox",children:[e.jsx("input",{type:"checkbox",checked:c.default===!0,disabled:d,onChange:j=>y(j.target.checked)}),e.jsx("span",{children:i("workflowFields.defaultTrue","Default on")})]});if(Mt(c.type)){const j=c.type==="multi-enum"?Array.isArray(c.default)?c.default[0]??"":"":typeof c.default=="string"?c.default:"";return e.jsxs("select",{"aria-label":i("workflowFields.defaultLabel","Default value"),value:j,disabled:d,onChange:T=>{const P=T.target.value;if(P==="")return y(void 0);y(c.type==="multi-enum"?[P]:P)},children:[e.jsx("option",{value:"",children:i("workflowFields.noDefault","— none —")}),(c.options??[]).map(T=>e.jsx("option",{value:T.value,children:T.label},T.value))]})}const k=c.type==="number"?"number":c.type==="date"?"date":c.type==="url"?"url":"text",O=c.type==="number"?typeof c.default=="number"?String(c.default):"":typeof c.default=="string"?c.default:"";return e.jsx("input",{type:k,"aria-label":i("workflowFields.defaultLabel","Default value"),defaultValue:O,disabled:d,onBlur:j=>{const T=j.target.value;if(T==="")return y(void 0);y(c.type==="number"?Number(T):T)}})};return e.jsxs("aside",{className:"wf-fields-panel","data-testid":"wf-fields-panel",children:[e.jsxs("header",{className:"wf-fields-panel-header",children:[e.jsx("h3",{children:i("workflowFields.title","Fields")}),e.jsxs("button",{className:"wf-fields-add",onClick:F,disabled:d,title:d?i("workflowFields.readOnlyHint","Built-in workflows are read-only — duplicate to edit"):void 0,children:[e.jsx(Se,{size:13})," ",i("workflowFields.add","Add field")]})]}),a.length===0?e.jsx("p",{className:"wf-fields-panel-empty",children:i("workflowFields.empty","No custom fields yet. Add a field to extend the task form and cards.")}):e.jsx("ul",{className:"wf-fields-list",children:a.map(c=>{const y=Ma[c.type],k=c.render?.placement??"detail",O=h===c.id;return e.jsxs("li",{className:"wf-field-item","data-testid":`wf-field-${c.id}`,children:[e.jsxs("div",{className:"wf-field-item-head",children:[e.jsx("input",{className:"wf-field-name","aria-label":i("workflowFields.nameLabel","Field name"),value:c.name,disabled:d,onChange:j=>u(c.id,{name:j.target.value})}),e.jsx("button",{className:"wf-field-remove","aria-label":i("workflowFields.remove","Remove field"),disabled:d,onClick:()=>M(c.id),children:e.jsx(be,{size:13})})]}),e.jsx("div",{className:"wf-field-id-row",children:O?e.jsxs(e.Fragment,{children:[e.jsx("input",{className:"wf-field-id","aria-label":i("workflowFields.idLabel","Field id"),defaultValue:c.id,disabled:d,onBlur:j=>{E(c.id,j.target.value),A(null)}}),e.jsxs("p",{className:"wf-field-id-warn",role:"note",children:[e.jsx(Le,{size:11,"aria-hidden":!0})," ",i("workflowFields.idWarn","Changing the id discards values stored under the old id (remove + add).")]})]}):e.jsxs(e.Fragment,{children:[e.jsx("code",{className:"wf-field-id-static",children:c.id}),e.jsx("button",{className:"wf-field-id-edit",disabled:d,onClick:()=>A(c.id),children:i("workflowFields.editId","Edit id")})]})}),e.jsxs("div",{className:"wf-field-row",children:[e.jsxs("label",{className:"wf-field-sub",children:[e.jsx("span",{children:i("workflowFields.typeLabel","Type")}),e.jsx("select",{value:c.type,disabled:d,onChange:j=>v(c.id,j.target.value),children:dn.map(j=>e.jsx("option",{value:j,children:j},j))})]}),e.jsxs("label",{className:"wf-field--checkbox wf-field-required",children:[e.jsx("input",{type:"checkbox",checked:c.required===!0,disabled:d,onChange:j=>u(c.id,{required:j.target.checked||void 0})}),e.jsx("span",{children:i("workflowFields.required","Required")})]})]}),e.jsxs("label",{className:"wf-field-sub",children:[e.jsx("span",{children:i("workflowFields.default","Default")}),b(c)]}),Mt(c.type)&&e.jsxs("div",{className:"wf-field-options","data-testid":`wf-field-options-${c.id}`,children:[e.jsx("span",{className:"wf-field-options-label",children:i("workflowFields.options","Options")}),(c.options??[]).map((j,T)=>e.jsxs("div",{className:"wf-field-option-row",children:[e.jsx("input",{className:"wf-field-option-value","aria-label":i("workflowFields.optionValue","Option value"),value:j.value,disabled:d,onChange:P=>{const Q=[...c.options??[]];Q[T]={...j,value:P.target.value},x(c.id,Q)}}),e.jsx("input",{className:"wf-field-option-label","aria-label":i("workflowFields.optionLabel","Option label"),value:j.label,disabled:d,onChange:P=>{const Q=[...c.options??[]];Q[T]={...j,label:P.target.value},x(c.id,Q)}}),e.jsx("div",{className:"wf-field-option-colors",role:"group","aria-label":i("workflowFields.optionColor","Option color"),children:cn.map(P=>e.jsx("button",{type:"button",className:`wf-field-color-swatch${j.color===P?" is-active":""}`,style:{backgroundColor:P},"aria-label":P,"aria-pressed":j.color===P,disabled:d,onClick:()=>{const Q=[...c.options??[]];Q[T]={...j,color:j.color===P?void 0:P},x(c.id,Q)}},P))}),e.jsx("button",{className:"wf-field-option-remove","aria-label":i("workflowFields.removeOption","Remove option"),disabled:d,onClick:()=>x(c.id,(c.options??[]).filter((P,Q)=>Q!==T)),children:e.jsx(be,{size:12})})]},T)),e.jsxs("button",{className:"wf-field-option-add",disabled:d,onClick:()=>{const j=(c.options??[]).length+1;x(c.id,[...c.options??[],{value:`option-${j}`,label:i("workflowFields.optionN","Option {{n}}",{n:j})}])},children:[e.jsx(Se,{size:12})," ",i("workflowFields.addOption","Add option")]})]}),e.jsxs("div",{className:"wf-field-render",children:[e.jsxs("label",{className:"wf-field-sub",children:[e.jsx("span",{children:i("workflowFields.placement","Placement")}),e.jsxs("select",{value:k,disabled:d,onChange:j=>g(c.id,{...c.render,placement:j.target.value}),children:[e.jsx("option",{value:"detail",children:i("workflowFields.placementDetail","Detail (inline)")}),e.jsx("option",{value:"detail-section",children:i("workflowFields.placementSection","Detail section")}),e.jsx("option",{value:"card",children:i("workflowFields.placementCard","Card badge")})]})]}),e.jsxs("label",{className:"wf-field-sub",children:[e.jsx("span",{children:i("workflowFields.widget","Widget")}),e.jsxs("select",{value:c.render?.widget??"",disabled:d,onChange:j=>g(c.id,{...c.render,widget:j.target.value||void 0}),children:[e.jsx("option",{value:"",children:i("workflowFields.widgetDefault","Default")}),y.map(j=>e.jsx("option",{value:j,children:j},j))]})]}),e.jsxs("label",{className:"wf-field--checkbox",children:[e.jsx("input",{type:"checkbox",checked:c.render?.badge===!0,disabled:d,onChange:j=>g(c.id,{...c.render,badge:j.target.checked||void 0})}),e.jsx("span",{children:i("workflowFields.badge","Render as badge")})]})]}),k==="card"&&e.jsx(pn,{field:c})]},c.id)})})]})}const mn={planningProvider:{group:"models",label:"Plan/Triage provider",description:"Provider used when planning or triaging tasks."},planningModelId:{group:"models",label:"Plan/Triage model",description:"Model used when planning or triaging tasks."},planningFallbackProvider:{group:"models",label:"Plan/Triage fallback provider"},planningFallbackModelId:{group:"models",label:"Plan/Triage fallback model"},executionProvider:{group:"models",label:"Executor provider",description:"Provider used by task implementation agents."},executionModelId:{group:"models",label:"Executor model",description:"Model used by task implementation agents."},validatorProvider:{group:"models",label:"Reviewer provider",description:"Provider used by review and validation agents."},validatorModelId:{group:"models",label:"Reviewer model",description:"Model used by review and validation agents."},validatorFallbackProvider:{group:"models",label:"Reviewer fallback provider"},validatorFallbackModelId:{group:"models",label:"Reviewer fallback model"},requirePrApproval:{group:"review",label:"Require PR approval"},requirePlanApproval:{group:"review",label:"Require plan approval"},reviewHandoffPolicy:{group:"review",label:"Review handoff policy"},maxReviewerContextRetries:{group:"review",label:"Reviewer context retries"},maxReviewerFallbackRetries:{group:"review",label:"Reviewer fallback retries"},reflectionEnabled:{group:"review",label:"Reflection enabled"},workflowStepTimeoutMs:{group:"steps",label:"Step timeout"},workflowStepScopeEnforcement:{group:"steps",label:"Step scope enforcement"},planOnlyScopeLeakEnforcement:{group:"steps",label:"Plan-only scope leak enforcement"},workflowRevisionForkOnScopeMismatch:{group:"steps",label:"Fork revision on scope mismatch"},strictScopeEnforcement:{group:"steps",label:"Strict scope enforcement"},runStepsInNewSessions:{group:"steps",label:"Run steps in new sessions"},maxParallelSteps:{group:"steps",label:"Max parallel steps"},buildRetryCount:{group:"steps",label:"Build retry count"},verificationFixRetries:{group:"steps",label:"Verification fix retries"},maxPostReviewFixes:{group:"steps",label:"Post-review fix passes"}},wn=["models","review","steps","advanced"],hn={models:"Models",review:"Review & Approval",steps:"Step Execution",advanced:"Advanced"};function Qa(a){return mn[a.id]??{group:"advanced",label:a.name,description:a.description}}function gn(a){const r=new Map;for(const d of a){const w=Qa(d).group,i=r.get(w)??[];i.push(d),r.set(w,i)}return wn.map(d=>({group:d,settings:r.get(d)??[]})).filter(d=>d.settings.length>0)}function Ke({htmlFor:a,label:r,help:d,error:w,scope:i,disabled:h,clearable:A,onClear:u,children:F}){const{t:M}=xe("app");return e.jsxs("div",{className:`settings-field-row${h?" is-disabled":""}`,children:[e.jsxs("div",{className:"settings-field-row-head",children:[e.jsx("label",{className:"settings-field-row-label",htmlFor:a,children:r}),i&&e.jsx("span",{className:`settings-field-row-scope settings-field-row-scope--${i}`,"data-testid":"settings-field-row-scope",children:i})]}),e.jsxs("div",{className:"settings-field-row-control",children:[F,A&&e.jsx("button",{type:"button",className:"settings-field-row-clear","aria-label":M("settings.clearToDefault","Reset to default"),title:M("settings.clearToDefault","Reset to default"),disabled:h,onClick:u,children:e.jsx(Ua,{size:13,"aria-hidden":!0})})]}),d&&e.jsx("p",{className:"settings-field-row-help",children:d}),w&&e.jsx("p",{className:"settings-field-row-error",role:"alert",children:w})]})}function bn({descriptor:a,value:r,onChange:d,error:w,clearable:i}){const{key:h,label:A,help:u,scope:F,disabled:M}=a;return e.jsx(Ke,{htmlFor:h,label:A,help:u,error:w,scope:F,disabled:M,clearable:i,onClear:()=>d(null),children:e.jsx("label",{className:"settings-toggle",children:e.jsx("input",{id:h,type:"checkbox",checked:r===!0,disabled:M,onChange:E=>d(E.target.checked)})})})}function xn({descriptor:a,value:r,onChange:d,error:w,clearable:i}){const{key:h,label:A,help:u,scope:F,disabled:M,min:E,max:v,step:x,placeholder:g}=a;return e.jsx(Ke,{htmlFor:h,label:A,help:u,error:w,scope:F,disabled:M,clearable:i,onClear:()=>d(null),children:e.jsx("input",{id:h,className:"settings-number",type:"number",value:r??"",min:E,max:v,step:x,placeholder:g,disabled:M,onChange:b=>{const c=b.target.value;if(c==="")return d(null);const y=Number(c);Number.isNaN(y)||d(y)}})})}function Ia({descriptor:a,value:r,onChange:d,error:w,clearable:i}){const{key:h,label:A,help:u,scope:F,disabled:M,options:E}=a;return e.jsx(Ke,{htmlFor:h,label:A,help:u,error:w,scope:F,disabled:M,clearable:i,onClear:()=>d(null),children:e.jsx("select",{id:h,className:"settings-select",value:r??"",disabled:M,onChange:v=>d(v.target.value),children:E.map(v=>e.jsx("option",{value:v.value,children:v.label},v.value))})})}function kn({descriptor:a,value:r,onChange:d,error:w,clearable:i}){const{key:h,label:A,help:u,scope:F,disabled:M,placeholder:E}=a;return e.jsx(Ke,{htmlFor:h,label:A,help:u,error:w,scope:F,disabled:M,clearable:i,onClear:()=>d(null),children:e.jsx("input",{id:h,className:"settings-text",type:"text",value:r??"",placeholder:E,disabled:M,onChange:v=>d(v.target.value)})})}function vn({descriptor:a,value:r,onChange:d,error:w,clearable:i}){const{key:h,label:A,help:u,scope:F,disabled:M,placeholder:E}=a;return e.jsx(Ke,{htmlFor:h,label:A,help:u,error:w,scope:F,disabled:M,clearable:i,onClear:()=>d(null),children:e.jsx("textarea",{id:h,className:"settings-textarea",value:r??"",placeholder:E,disabled:M,rows:3,onChange:v=>d(v.target.value)})})}const jn=["string","text","number","boolean","enum","multi-enum"],Ra={string:["input"],text:["textarea","input"],number:["input"],boolean:["toggle"],enum:["select","radio","chips"],"multi-enum":["chips"]},Nn=["#4f7cff","#22c55e","#f59e0b","#ef4444","#a855f7","#06b6d4","#ec4899","#64748b"];function as(a){return a==="enum"||a==="multi-enum"}function yn(a){return a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}let Da=0;function Cn(){return Da+=1,`setting-${Date.now().toString(36)}-${Da}`}function Sn({settings:a,onChange:r,readOnly:d,addToast:w}){const{t:i}=xe("app"),[h,A]=o.useState(null),u=o.useCallback((b,c)=>{r(a.map(y=>y.id===b?{...y,...c}:y))},[a,r]),F=o.useCallback(()=>{r([...a,{id:Cn(),name:i("workflowSettings.newSettingName","New setting"),type:"string"}])},[a,r,i]),M=o.useCallback(b=>r(a.filter(c=>c.id!==b)),[a,r]),E=o.useCallback((b,c)=>{const y=yn(c);if(y){if(y!==b&&a.some(k=>k.id===y)){w(i("workflowSettings.duplicateId","A setting with that id already exists"),"error");return}u(b,{id:y})}},[a,u,w,i]),v=o.useCallback((b,c)=>{const y=a.find(O=>O.id===b);if(!y)return;const k={type:c};as(c)?(!y.options||y.options.length===0)&&(k.options=[{value:"option-1",label:i("workflowSettings.newOptionLabel","Option 1")}]):k.options=void 0,y.render?.widget&&!Ra[c].includes(y.render.widget)&&(k.render=void 0),k.default=void 0,u(b,k)},[a,u,i]),x=o.useCallback((b,c)=>u(b,{options:c}),[u]),g=b=>{const c=O=>u(b.id,{default:O});if(b.type==="boolean")return e.jsxs("label",{className:"wf-setting--checkbox",children:[e.jsx("input",{type:"checkbox",checked:b.default===!0,disabled:d,onChange:O=>c(O.target.checked)}),e.jsx("span",{children:i("workflowSettings.defaultTrue","Default on")})]});if(as(b.type)){const O=b.type==="multi-enum"?Array.isArray(b.default)?b.default[0]??"":"":typeof b.default=="string"?b.default:"";return e.jsxs("select",{"aria-label":i("workflowSettings.defaultLabel","Default value"),value:O,disabled:d,onChange:j=>{const T=j.target.value;if(T==="")return c(void 0);c(b.type==="multi-enum"?[T]:T)},children:[e.jsx("option",{value:"",children:i("workflowSettings.noDefault","— none —")}),(b.options??[]).map(j=>e.jsx("option",{value:j.value,children:j.label},j.value))]})}const y=b.type==="number"?"number":"text",k=b.type==="number"?typeof b.default=="number"?String(b.default):"":typeof b.default=="string"?b.default:"";return e.jsx("input",{type:y,"aria-label":i("workflowSettings.defaultLabel","Default value"),defaultValue:k,disabled:d,onBlur:O=>{const j=O.target.value;if(j==="")return c(void 0);c(b.type==="number"?Number(j):j)}})};return e.jsxs("div",{className:"wf-settings-tabpanel","data-testid":"wf-settings-definitions",children:[e.jsx("div",{className:"wf-settings-tabpanel-head",children:e.jsxs("button",{className:"wf-settings-add",onClick:F,disabled:d,title:d?i("workflowSettings.readOnlyHint","Built-in workflows are read-only — duplicate to edit"):void 0,children:[e.jsx(Se,{size:13})," ",i("workflowSettings.add","Add setting")]})}),d&&e.jsx("p",{className:"wf-settings-note wf-settings-note--info",role:"note",children:i("workflowSettings.builtinDefinitionsReadOnly","Built-in workflow — declarations are read-only. Values are editable below.")}),a.length===0?e.jsx("p",{className:"wf-settings-empty",children:i("workflowSettings.empty","No settings declared yet. Add a setting to expose a typed, per-project knob.")}):e.jsx("ul",{className:"wf-settings-list",children:a.map(b=>{const c=Ra[b.type],y=h===b.id;return e.jsxs("li",{className:"wf-setting-item","data-testid":`wf-setting-${b.id}`,children:[e.jsxs("div",{className:"wf-setting-item-head",children:[e.jsx("input",{className:"wf-setting-name","aria-label":i("workflowSettings.nameLabel","Setting name"),value:b.name,disabled:d,onChange:k=>u(b.id,{name:k.target.value})}),e.jsx("button",{className:"wf-setting-remove","aria-label":i("workflowSettings.remove","Remove setting"),disabled:d,onClick:()=>M(b.id),children:e.jsx(be,{size:13})})]}),e.jsx("div",{className:"wf-setting-id-row",children:y?e.jsxs(e.Fragment,{children:[e.jsx("input",{className:"wf-setting-id","aria-label":i("workflowSettings.idLabel","Setting id"),defaultValue:b.id,disabled:d,onBlur:k=>{E(b.id,k.target.value),A(null)}}),e.jsxs("p",{className:"wf-setting-id-warn",role:"note",children:[e.jsx(Le,{size:11,"aria-hidden":!0})," ",i("workflowSettings.idWarn","Changing the id discards values stored under the old id (remove + add).")]})]}):e.jsxs(e.Fragment,{children:[e.jsx("code",{className:"wf-setting-id-static",children:b.id}),e.jsx("button",{className:"wf-setting-id-edit",disabled:d,onClick:()=>A(b.id),children:i("workflowSettings.editId","Edit id")})]})}),e.jsxs("div",{className:"wf-setting-row",children:[e.jsxs("label",{className:"wf-setting-sub",children:[e.jsx("span",{children:i("workflowSettings.typeLabel","Type")}),e.jsx("select",{value:b.type,disabled:d,onChange:k=>v(b.id,k.target.value),children:jn.map(k=>e.jsx("option",{value:k,children:k},k))})]}),e.jsxs("label",{className:"wf-setting-sub",children:[e.jsx("span",{children:i("workflowSettings.widget","Widget")}),e.jsxs("select",{value:b.render?.widget??"",disabled:d,onChange:k=>u(b.id,{render:k.target.value?{widget:k.target.value}:void 0}),children:[e.jsx("option",{value:"",children:i("workflowSettings.widgetDefault","Default")}),c.map(k=>e.jsx("option",{value:k,children:k},k))]})]})]}),e.jsxs("label",{className:"wf-setting-sub",children:[e.jsx("span",{children:i("workflowSettings.default","Default")}),g(b)]}),e.jsxs("label",{className:"wf-setting-sub",children:[e.jsx("span",{children:i("workflowSettings.description","Description")}),e.jsx("input",{"aria-label":i("workflowSettings.descriptionLabel","Setting description"),value:b.description??"",disabled:d,onChange:k=>u(b.id,{description:k.target.value||void 0})})]}),as(b.type)&&e.jsxs("div",{className:"wf-setting-options","data-testid":`wf-setting-options-${b.id}`,children:[e.jsx("span",{className:"wf-setting-options-label",children:i("workflowSettings.options","Options")}),(b.options??[]).map((k,O)=>e.jsxs("div",{className:"wf-setting-option-row",children:[e.jsx("input",{className:"wf-setting-option-value","aria-label":i("workflowSettings.optionValue","Option value"),value:k.value,disabled:d,onChange:j=>{const T=[...b.options??[]];T[O]={...k,value:j.target.value},x(b.id,T)}}),e.jsx("input",{className:"wf-setting-option-label","aria-label":i("workflowSettings.optionLabel","Option label"),value:k.label,disabled:d,onChange:j=>{const T=[...b.options??[]];T[O]={...k,label:j.target.value},x(b.id,T)}}),e.jsx("div",{className:"wf-setting-option-colors",role:"group","aria-label":i("workflowSettings.optionColor","Option color"),children:Nn.map(j=>e.jsx("button",{type:"button",className:`wf-setting-color-swatch${k.color===j?" is-active":""}`,style:{backgroundColor:j},"aria-label":j,"aria-pressed":k.color===j,disabled:d,onClick:()=>{const T=[...b.options??[]];T[O]={...k,color:k.color===j?void 0:j},x(b.id,T)}},j))}),e.jsx("button",{className:"wf-setting-option-remove","aria-label":i("workflowSettings.removeOption","Remove option"),disabled:d,onClick:()=>x(b.id,(b.options??[]).filter((j,T)=>T!==O)),children:e.jsx(be,{size:12})})]},O)),e.jsxs("button",{className:"wf-setting-option-add",disabled:d,onClick:()=>{const k=(b.options??[]).length+1;x(b.id,[...b.options??[],{value:`option-${k}`,label:i("workflowSettings.optionN","Option {{n}}",{n:k})}])},children:[e.jsx(Se,{size:12})," ",i("workflowSettings.addOption","Add option")]})]})]},b.id)})})]})}function En(a){if(typeof a=="string")return a;try{return JSON.stringify(a)}catch{return String(a)}}const Fn=[{id:"planning",providerId:"planningProvider",modelId:"planningModelId",label:"Plan/Triage Model",help:"Provider and model used when planning or triaging tasks. Leave unset to inherit from the default lane."},{id:"execution",providerId:"executionProvider",modelId:"executionModelId",label:"Executor Model",help:"Provider and model used by task implementation agents. Leave unset to inherit from the default lane."},{id:"validator",providerId:"validatorProvider",modelId:"validatorModelId",label:"Reviewer Model",help:"Provider and model used by review and validation agents. Leave unset to inherit from the default lane."},{id:"planning-fallback",providerId:"planningFallbackProvider",modelId:"planningFallbackModelId",label:"Planning Fallback Model",help:"Fallback provider and model used when the primary Plan/Triage model cannot be used."},{id:"validator-fallback",providerId:"validatorFallbackProvider",modelId:"validatorFallbackModelId",label:"Reviewer Fallback Model",help:"Fallback provider and model used when the primary Reviewer model cannot be used."}];function Mn(a){if(!a)return null;const r=a.indexOf("/");return r<=0||r===a.length-1?null:{provider:a.slice(0,r),modelId:a.slice(r+1)}}function Pn({workflowId:a,settings:r,boundProjectId:d,currentProjectId:w,addToast:i}){const{t:h}=xe("app"),[A,u]=o.useState(null),[F,M]=o.useState(!1),[E,v]=o.useState({}),[x,g]=o.useState({}),[b,c]=o.useState(!1),[y,k]=o.useState(!1),[O,j]=o.useState([]),[T,P]=o.useState(!1),[Q,ie]=o.useState([]),[B,q]=o.useState([]),ne=o.useRef(0),G=o.useRef(0),te=o.useMemo(()=>new Map(r.map(m=>[m.id,m])),[r]),C=o.useMemo(()=>Fn.filter(m=>{const W=te.get(m.providerId),J=te.get(m.modelId);return W?.type==="string"&&J?.type==="string"}),[te]),D=o.useMemo(()=>new Set(C.flatMap(m=>[m.providerId,m.modelId])),[C]),L=d!==void 0&&w!==void 0&&w!==d,V=o.useCallback(async()=>{if(d===void 0)return;const m=++ne.current;M(!0);try{const W=await Qo(a,d);ne.current===m&&(u(W),v({}),g({}))}catch{ne.current===m&&i(h("workflowSettings.loadFailed","Failed to load setting values"),"error")}finally{ne.current===m&&M(!1)}},[a,d,i,h]);if(o.useEffect(()=>{V()},[V]),o.useEffect(()=>{if(d===void 0||C.length===0){j([]),ie([]),q([]),P(!1);return}const m=++G.current;P(!0),Ft().then(W=>{G.current===m&&(j(W.models??[]),ie(W.favoriteProviders??[]),q(W.favoriteModels??[]))}).catch(()=>{G.current===m&&(j([]),ie([]),q([]),i(h("workflowSettings.modelsLoadFailed","Failed to load available models"),"error"))}).finally(()=>{G.current===m&&P(!1)})},[d,C.length,i,h]),d===void 0)return e.jsx("div",{className:"wf-settings-tabpanel","data-testid":"wf-settings-values",children:e.jsx("p",{className:"wf-settings-note wf-settings-note--info",role:"note",children:h("workflowSettings.requiresProject","Open a project to view and edit per-project setting values.")})});const ee=m=>{if(Object.prototype.hasOwnProperty.call(E,m.id)){const W=E[m.id];return W===null?m.default:W}return A?.effective?.[m.id]??m.default},de=m=>Object.prototype.hasOwnProperty.call(E,m.id)?E[m.id]!==null:A?Object.prototype.hasOwnProperty.call(A.stored,m.id):!1,re=(m,W)=>{v(J=>({...J,[m]:W})),g(J=>{if(!J[m])return J;const X={...J};return delete X[m],X})},U=m=>re(m,null),he=(m,W)=>{const J=Mn(W);v(X=>({...X,[m.providerId]:J?.provider??null,[m.modelId]:J?.modelId??null})),g(X=>{if(!X[m.providerId]&&!X[m.modelId])return X;const oe={...X};return delete oe[m.providerId],delete oe[m.modelId],oe})},R=Object.keys(E).length>0,K=o.useCallback(async()=>{if(!R)return;const m=new Set(Object.keys(E));c(!0);try{const W=await sa(a,E,d);u(W),v(J=>{const X={...J};for(const oe of m)delete X[oe];return X}),g({}),i(h("workflowSettings.valuesSaved","Setting values saved"),"success")}catch(W){if(W instanceof Ka&&W.status===400&&W.details){const J=W.details.rejections??[];if(J.length>0){const X={};for(const oe of J)X[oe.settingId]=oe;g(X),i(h("workflowSettings.valuesRejected","Some values were rejected — see the highlighted fields"),"error");return}}i(h("workflowSettings.saveFailed","Failed to save setting values"),"error")}finally{c(!1)}},[R,a,E,d,i,h]),ae=m=>{const W=te.get(m);return W?ee(W):void 0},ue=m=>{const W=te.get(m);return W?de(W):!1},ke=m=>{const W=ae(m.providerId),J=ae(m.modelId),X=typeof W=="string"&&typeof J=="string"?`${W}/${J}`:"",oe=x[m.providerId]?.message??x[m.modelId]?.message,Y=ue(m.providerId)||ue(m.modelId),ce=T||O.length===0,se=!T&&O.length===0?` ${h("workflowSettings.noModelsAvailable","No models are available. Configure authentication before selecting a workflow model.")}`:"";return e.jsxs("div",{className:"wf-settings-value-item","data-testid":`wf-settings-value-${m.id}`,children:[e.jsx(Ke,{htmlFor:`wf-model-lane-${m.id}`,label:m.label,help:`${m.help}${se}`,error:oe,scope:"project",disabled:T,clearable:Y,onClear:()=>he(m,""),children:e.jsx(rs,{id:`wf-model-lane-${m.id}`,label:m.label,models:O,value:X,onChange:fe=>he(m,fe),placeholder:h("workflowSettings.selectModel","Select a model…"),defaultOptionLabel:h("workflowSettings.useInheritedModel","Use inherited/default model"),disabled:ce,favoriteProviders:Q,favoriteModels:B})}),Y&&e.jsx("span",{className:"wf-settings-customized","data-testid":`wf-settings-customized-${m.id}`,children:h("workflowSettings.customized","Customized")})]},m.id)},s=m=>{const W=ee(m),J=x[m.id]?.message,X=de(m),oe=Qa(m),Y={key:m.id,label:oe.label,help:oe.description??m.description,scope:"project"},ce=X;switch(m.type){case"boolean":return e.jsx(bn,{descriptor:Y,value:W===!0,error:J,clearable:ce,onChange:se=>se===null?U(m.id):re(m.id,se)});case"number":return e.jsx(xn,{descriptor:Y,value:typeof W=="number"?W:null,error:J,clearable:ce,onChange:se=>se===null?U(m.id):re(m.id,se)});case"enum":return e.jsx(Ia,{descriptor:{...Y,options:(m.options??[]).map(se=>({value:se.value,label:se.label}))},value:typeof W=="string"?W:null,error:J,clearable:ce,onChange:se=>se===null?U(m.id):re(m.id,se)});case"multi-enum":{const se=Array.isArray(W)?W[0]??null:null;return e.jsx(Ia,{descriptor:{...Y,options:(m.options??[]).map(fe=>({value:fe.value,label:fe.label}))},value:se,error:J,clearable:ce,onChange:fe=>fe===null?U(m.id):re(m.id,[fe])})}case"text":return e.jsx(vn,{descriptor:Y,value:typeof W=="string"?W:null,error:J,clearable:ce,onChange:se=>se===null||se===""?U(m.id):re(m.id,se)});case"string":default:return e.jsx(kn,{descriptor:Y,value:typeof W=="string"?W:null,error:J,clearable:ce,onChange:se=>se===null||se===""?U(m.id):re(m.id,se)})}},ve=A?.orphaned??[],ct=o.useCallback(async m=>{try{const W=await sa(a,{[m]:null},d);u(W),i(h("workflowSettings.orphanDeleted","Orphaned value removed"),"success")}catch{i(h("workflowSettings.saveFailed","Failed to save setting values"),"error")}},[a,d,i,h]);return e.jsxs("div",{className:"wf-settings-tabpanel","data-testid":"wf-settings-values",children:[L&&e.jsxs("p",{className:"wf-settings-note wf-settings-note--warn",role:"note","data-testid":"wf-settings-stale-notice",children:[e.jsx(Le,{size:12,"aria-hidden":!0})," ",h("workflowSettings.staleContext","Values shown are for project {{project}} — reopen the editor to edit values for the current project.",{project:d})]}),e.jsx("div",{className:"wf-settings-values-head",children:e.jsxs("button",{className:"wf-settings-save-values",onClick:K,disabled:!R||b||L,"data-testid":"wf-settings-save-values",children:[e.jsx(is,{size:13})," ",h("workflowSettings.saveValues","Save values")]})}),r.length===0?e.jsx("p",{className:"wf-settings-empty",children:F?e.jsx(Zo,{label:h("workflowSettings.loading","Loading…")}):h("workflowSettings.noDeclarations","This workflow declares no settings, so there are no values to edit.")}):e.jsx("div",{className:"wf-settings-values-list",children:gn(r).map(({group:m,settings:W})=>{const J=new Set(W.map(Y=>Y.id)),X=m==="models"?C.filter(Y=>J.has(Y.providerId)&&J.has(Y.modelId)):[],oe=W.filter(Y=>!D.has(Y.id));return e.jsxs("section",{className:"wf-settings-value-group","data-testid":`wf-settings-group-${m}`,children:[e.jsx("h4",{className:"wf-settings-value-group-title",children:h(`workflowSettings.group.${m}`,hn[m])}),X.map(Y=>ke(Y)),oe.map(Y=>e.jsxs("div",{className:"wf-settings-value-item","data-testid":`wf-settings-value-${Y.id}`,children:[s(Y),de(Y)&&e.jsx("span",{className:"wf-settings-customized","data-testid":`wf-settings-customized-${Y.id}`,children:h("workflowSettings.customized","Customized")})]},Y.id))]},m)})}),ve.length>0&&e.jsxs("div",{className:"wf-settings-orphaned","data-testid":"wf-settings-orphaned",children:[e.jsxs("button",{className:"wf-settings-orphaned-toggle",onClick:()=>k(m=>!m),"aria-expanded":y,children:[y?e.jsx(Ce,{size:13}):e.jsx(Ee,{size:13})," ",h("workflowSettings.orphanedTitle","Orphaned values ({{count}})",{count:ve.length})]}),y&&e.jsxs("div",{className:"wf-settings-orphaned-body",children:[e.jsx("p",{className:"wf-settings-note wf-settings-note--muted",role:"note",children:h("workflowSettings.orphanedNote","These stored values no longer match a current declaration (the setting was retyped or removed). They are ignored by the engine; delete them to clean up.")}),e.jsx("ul",{className:"wf-settings-orphaned-list",children:ve.map(m=>e.jsxs("li",{className:"wf-settings-orphaned-row","data-testid":`wf-settings-orphan-${m.id}`,children:[e.jsx("code",{className:"wf-settings-orphan-id",children:m.id}),e.jsx("span",{className:"wf-settings-orphan-value",children:En(m.value)}),e.jsx("button",{className:"wf-settings-orphan-delete","aria-label":h("workflowSettings.deleteOrphan","Delete orphaned value"),disabled:L||b,onClick:()=>ct(m.id),children:e.jsx(be,{size:12})})]},m.id))})]})]}),r.length>0&&e.jsxs("p",{className:"wf-settings-reset-hint",role:"note",children:[e.jsx(Ua,{size:11,"aria-hidden":!0})," ",h("workflowSettings.clearHint","Use the reset control on a row to clear a value back to its declaration default.")]})]})}function Oa({workflowId:a,settings:r,onChange:d,readOnly:w,projectId:i,addToast:h,initialTab:A}){const{t:u}=xe("app"),[F,M]=o.useState(()=>A??(r.length>0?"values":"definitions")),E=o.useRef({workflowId:a,projectId:i});E.current.workflowId!==a&&(E.current={workflowId:a,projectId:i});const v=E.current.projectId;return e.jsxs("aside",{className:"wf-settings-panel","data-testid":"wf-settings-panel",children:[e.jsx("header",{className:"wf-settings-panel-header",children:e.jsx("h3",{children:u("workflowSettings.title","Settings")})}),e.jsxs("div",{className:"wf-settings-tabs",role:"tablist",children:[e.jsx("button",{role:"tab","aria-selected":F==="definitions",className:`wf-settings-tab${F==="definitions"?" is-active":""}`,onClick:()=>M("definitions"),"data-testid":"wf-settings-tab-definitions",children:u("workflowSettings.definitionsTab","Definitions")}),e.jsx("button",{role:"tab","aria-selected":F==="values",className:`wf-settings-tab${F==="values"?" is-active":""}`,onClick:()=>M("values"),"data-testid":"wf-settings-tab-values",children:u("workflowSettings.valuesTab","Values")})]}),F==="definitions"?e.jsx(Sn,{settings:r,onChange:d,readOnly:w,addToast:h}):e.jsx(Pn,{workflowId:a,settings:r,boundProjectId:v,currentProjectId:i,addToast:h},a)]})}function La({optionalSteps:a,onChange:r,readOnly:d,pluginTemplates:w=[]}){const{t:i}=xe("app"),h=o.useMemo(()=>{const v=new Map;for(const x of[...el,...w])v.set(x.id,x);return v},[w]),A=o.useMemo(()=>new Set(a.map(v=>v.templateId)),[a]),u=o.useMemo(()=>[...h.values()].filter(v=>!A.has(v.id)),[h,A]),F=o.useCallback(v=>{!v||A.has(v)||r([...a,{templateId:v,defaultOn:!1}])},[a,r,A]),M=o.useCallback(v=>r(a.filter(x=>x.templateId!==v)),[a,r]),E=o.useCallback((v,x)=>r(a.map(g=>g.templateId===v?{...g,defaultOn:x}:g)),[a,r]);return e.jsxs("aside",{className:"wf-optional-steps-panel","data-testid":"wf-optional-steps-panel",children:[e.jsxs("header",{className:"wf-optional-steps-header",children:[e.jsx("h3",{children:i("workflowOptionalSteps.title","Optional steps")}),e.jsx("p",{className:"wf-optional-steps-hint",children:i("workflowOptionalSteps.hint","Steps a task can toggle on or off. Default sets the initial state for new tasks.")})]}),a.length===0?e.jsx("p",{className:"wf-optional-steps-empty",children:i("workflowOptionalSteps.empty","No optional steps. Add one to let tasks opt in or out.")}):e.jsx("ul",{className:"wf-optional-steps-list",children:a.map(v=>{const x=h.get(v.templateId),g=v.defaultOn??x?.defaultOn??!1;return e.jsxs("li",{className:`wf-optional-step-item${x?"":" is-unknown"}`,"data-testid":`wf-optional-step-${v.templateId}`,children:[e.jsxs("div",{className:"wf-optional-step-head",children:[e.jsx("div",{className:"wf-optional-step-title",children:x?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"wf-optional-step-name",children:x.name}),tl(x.phase??"pre-merge",v.templateId,"wf-optional-step-phase",i)]}):e.jsx("span",{className:"wf-optional-step-name wf-optional-step-name--unknown",children:i("workflowOptionalSteps.unknown","Unknown step ({{id}})",{id:v.templateId})})}),e.jsx("button",{type:"button",className:"wf-optional-step-remove","aria-label":i("workflowOptionalSteps.remove","Remove optional step"),disabled:d,onClick:()=>M(v.templateId),children:e.jsx(be,{size:13})})]}),x?.description&&e.jsx("p",{className:"wf-optional-step-description",children:x.description}),e.jsxs("label",{className:"wf-optional-step-default",children:[e.jsx("input",{type:"checkbox",checked:g,disabled:d,"aria-label":i("workflowOptionalSteps.defaultOnFor","Default on for {{name}}",{name:x?.name??v.templateId}),onChange:b=>E(v.templateId,b.target.checked)}),e.jsx("span",{children:i("workflowOptionalSteps.defaultOn","Default on")})]})]},v.templateId)})}),u.length>0&&e.jsxs("div",{className:"wf-optional-steps-add",children:[e.jsxs("label",{className:"wf-optional-steps-add-label",htmlFor:"wf-optional-steps-add-select",children:[e.jsx(Se,{size:13})," ",i("workflowOptionalSteps.add","Add optional step")]}),e.jsxs("select",{id:"wf-optional-steps-add-select","data-testid":"wf-optional-steps-add-select",value:"",disabled:d,onChange:v=>{F(v.target.value),v.target.value=""},children:[e.jsx("option",{value:"",disabled:!0,children:i("workflowOptionalSteps.addPlaceholder","Select a step…")}),u.map(v=>e.jsx("option",{value:v.id,children:v.name},v.id))]})]})]})}function Za(a,r){return a[r]?.editable?{up:a[r-1]?.editable===!0,down:a[r+1]?.editable===!0}:{up:!1,down:!1}}function eo({row:a,depth:r,selectedNodeId:d,selectedEdgeId:w,onSelectNode:i,onSelectEdge:h,onCreateConnection:A,canReorder:u,onMoveNode:F,canMoveUp:M,canMoveDown:E}){const{t:v}=xe("app"),x=a.children.length>0,[g,b]=o.useState(r===0),[c,y]=o.useState(!1),k=d===a.id,O=a.connectionTargets??[],j=!!A&&a.editable&&O.length>0,T=!!u&&!!F&&a.editable;return e.jsxs("div",{className:"mobile-wf-node-group",children:[e.jsxs("div",{className:`mobile-wf-node-row${k?" mobile-wf-node-row--selected":""}`,style:{"--mobile-wf-depth":String(r)},"data-testid":`mobile-wf-node-${a.id}`,children:[e.jsxs("button",{type:"button",className:"mobile-wf-node-main",onClick:()=>i(a.id),"aria-current":k?"true":void 0,children:[e.jsx("span",{className:"mobile-wf-node-kind",children:a.kind}),e.jsxs("span",{className:"mobile-wf-node-text",children:[e.jsx("span",{className:"mobile-wf-node-title",children:a.label}),a.summary?e.jsx("span",{className:"mobile-wf-node-summary",children:a.summary}):null]}),a.editable?e.jsx(sl,{size:14,"aria-hidden":!0}):null]}),x||T?e.jsxs("div",{className:"mobile-wf-node-actions",children:[T?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"btn-icon mobile-wf-node-move","data-testid":`mobile-wf-node-move-up-${a.id}`,"aria-label":v("workflowNodes.mobileMoveUp","Move up"),disabled:!M,onClick:()=>F?.(a.id,"up"),children:e.jsx(al,{size:16,"aria-hidden":!0})}),e.jsx("button",{type:"button",className:"btn-icon mobile-wf-node-move","data-testid":`mobile-wf-node-move-down-${a.id}`,"aria-label":v("workflowNodes.mobileMoveDown","Move down"),disabled:!E,onClick:()=>F?.(a.id,"down"),children:e.jsx(ol,{size:16,"aria-hidden":!0})})]}):null,x?e.jsx("button",{type:"button",className:"mobile-wf-node-expand","aria-expanded":g,"aria-label":g?v("common.collapse","Collapse"):v("common.expand","Expand"),onClick:()=>b(P=>!P),children:g?e.jsx(Ce,{size:16}):e.jsx(Ee,{size:16})}):null]}):null]}),j?e.jsx("div",{className:"mobile-wf-node-actions mobile-wf-node-actions--connect",style:{"--mobile-wf-depth":String(r)},children:e.jsxs("button",{type:"button",className:"mobile-wf-connect-button","data-testid":`mobile-wf-connect-${a.id}`,"aria-expanded":c,onClick:()=>y(P=>!P),children:[e.jsx(aa,{size:14,"aria-hidden":!0}),e.jsx("span",{children:v("workflowNodes.mobileConnect","Connect")})]})}):null,j&&c?e.jsxs("div",{className:"mobile-wf-connect-picker",style:{"--mobile-wf-depth":String(r)},children:[e.jsx("label",{className:"mobile-wf-connect-label",htmlFor:`mobile-wf-connect-target-${a.id}`,children:v("workflowNodes.mobileConnectTarget","Target node")}),e.jsxs("select",{id:`mobile-wf-connect-target-${a.id}`,className:"input mobile-wf-connect-select","data-testid":`mobile-wf-connect-target-${a.id}`,defaultValue:"",onChange:P=>{const Q=P.currentTarget.value;Q&&(A?.(a.id,Q),P.currentTarget.value="",y(!1))},children:[e.jsx("option",{value:"",children:v("workflowNodes.mobileConnectChooseTarget","Choose a target…")}),O.map(P=>e.jsxs("option",{value:P.id,children:[P.label," (",P.kind,")"]},P.id))]})]}):null,(a.columnName||a.outgoing.length>0)&&e.jsxs("div",{className:"mobile-wf-node-meta",style:{"--mobile-wf-depth":String(r)},children:[a.columnName?e.jsx("span",{className:"mobile-wf-column-chip",children:a.columnName}):null,a.outgoing.map(P=>e.jsxs("button",{type:"button",className:`mobile-wf-edge-chip${w===P.id?" mobile-wf-edge-chip--selected":""}`,"data-testid":`mobile-wf-edge-${P.id}`,onClick:()=>h(P.id),children:[e.jsx(aa,{size:12,"aria-hidden":!0}),e.jsx("span",{children:P.label}),e.jsx("span",{className:"mobile-wf-edge-target",children:P.targetLabel})]},P.id))]}),x&&g?e.jsx("div",{className:"mobile-wf-node-children",children:a.children.map((P,Q)=>{const ie=Za(a.children,Q);return e.jsx(eo,{row:P,depth:r+1,selectedNodeId:d,selectedEdgeId:w,onSelectNode:i,onSelectEdge:h,onCreateConnection:A,canReorder:u,onMoveNode:F,canMoveUp:ie.up,canMoveDown:ie.down},P.id)})}):null]})}function An({rows:a,selectedNodeId:r,selectedEdgeId:d,onSelectNode:w,onSelectEdge:i,onCreateConnection:h,canReorder:A,onMoveNode:u}){const{t:F}=xe("app");return a.length===0?e.jsx("div",{className:"mobile-wf-graph-empty","data-testid":"mobile-wf-graph-empty",children:F("workflowNodes.mobileGraphEmpty","No graph nodes yet.")}):e.jsx("div",{className:"mobile-wf-graph","data-testid":"mobile-wf-graph",children:a.map((M,E)=>{const v=Za(a,E);return e.jsx(eo,{row:M,depth:0,selectedNodeId:r,selectedEdgeId:d,onSelectNode:w,onSelectEdge:i,onCreateConnection:h,canReorder:A,onMoveNode:u,canMoveUp:v.up,canMoveDown:v.down},M.id)})})}function In(a){return typeof a.label=="string"&&a.label.trim()?a.label:String(a.data?.condition??"success")}function Ta(a){return a.data.label||a.id}function cs(a,r){const d=Math.round(a.position.y),w=Math.round(r.position.y);return d!==w?d-w:Math.round(a.position.x)-Math.round(r.position.x)}function za(a){return a.data.kind!=="start"&&a.data.kind!=="end"&&!we(a.id)}function Rn(a,r){return we(r.id)?!1:a.parentId||r.parentId?a.parentId===r.parentId:a.data.column===r.data.column}function Dn(a,r,d){const w=a.find(u=>u.id===r);if(!w||!za(w))return a;const i=a.filter(u=>Rn(w,u)).sort(cs),h=i.findIndex(u=>u.id===r),A=i[h+(d==="up"?-1:1)];return!A||!za(A)?a:a.map(u=>u.id===w.id?{...u,position:{...A.position}}:u.id===A.id?{...u,position:{...w.position}}:u)}function On(a,r){const d=new Map(a.map(w=>[w.id,w.name||w.id]));for(const w of r){if(!we(w.id))continue;const i=ll(w.id);d.has(i)||d.set(i,w.data.label||i)}return d}function Ln(a,r,d=[],w={},i){const h=On(d,a),A=new Map(a.map(x=>[x.id,x])),u=new Map,F=new Map;for(const x of a){if(!x.parentId)continue;const g=u.get(x.parentId)??[];g.push(x),u.set(x.parentId,g)}for(const x of u.values())x.sort(cs);for(const x of r){const g=F.get(x.source)??[];g.push(x),F.set(x.source,g)}const M=x=>{const g=A.get(x.target);return{id:x.id,source:x.source,target:x.target,targetLabel:g?Ta(g):x.target,label:In(x),kind:typeof x.data?.kind=="string"?x.data.kind:void 0}},E=x=>{const g=(u.get(x.id)??[]).map(E),b=x.data.column;return{id:x.id,label:Ta(x),kind:x.data.kind,summary:il(x.data,w,i),columnName:b?h.get(b)??b:void 0,editable:x.data.kind!=="start"&&x.data.kind!=="end"&&!we(x.id),parentId:x.parentId,templateLocalId:x.parentId?nl(x.parentId,x.id):void 0,outgoing:(F.get(x.id)??[]).map(M),children:g}};return a.filter(x=>!x.parentId&&!we(x.id)).sort(cs).map(E)}function Tn(a){switch(typeof a?.seam=="string"?a.seam:""){case"planning":return"Generate the task plan and write the planning artifact that downstream workflow nodes consume.";case"execute":return"Run Fusion's standard implementation prompt for this task, generated from the task spec, current project context, workflow fields, and available tools.";case"step-execute":return"Run Fusion's step implementation prompt for the active planned step in the task worktree.";case"review":return"Run Fusion's review boundary for completed implementation work and route the task based on the review result.";case"merge":return"Run Fusion's merge boundary: verify merge readiness, apply the configured merge strategy, and update the final task state.";default:return""}}const zn=[{id:"claude-code",name:"Claude Code",tier:"native"},{id:"codex",name:"Codex",tier:"hybrid"},{id:"droid",name:"Droid",tier:"hybrid"},{id:"pi",name:"Pi",tier:"hybrid"},{id:"generic",name:"Generic CLI",tier:"generic"}],Ue=a=>a.startsWith("builtin:");function Wa(a,r){return a&&r?`${a}/${r}`:""}function $a(a){if(!a)return{provider:"",modelId:""};const r=a.indexOf("/");return r===-1?{provider:"",modelId:""}:{provider:a.slice(0,r),modelId:a.slice(r+1)}}function Wn(a){return we(a.id)?"transparent":a.data.kind==="start"?"var(--ws-success)":a.data.kind==="end"?"var(--ws-info)":a.data.kind==="gate"||a.data.kind==="step-review"?"var(--ws-warning)":a.data.kind==="merge"||a.data.kind==="join"?"var(--accent)":"var(--todo)"}function $n(a){return we(a.id)?"transparent":"var(--border-strong, var(--border))"}function os(a,r,d,w,i,h,A,u){const{ir:F,layout:M}=Ya(a,d,w,i.length?i:void 0,h.length?h:void 0,A.length?A:void 0,u.length?u:void 0);return JSON.stringify({name:a,description:r,ir:F,layout:M})}let _a=0;function Ba(){return _a+=1,`n-${Date.now().toString(36)}-${_a}`}const _n=["step-headings","json-steps"],Bn=["approve","revise","rethink","unavailable"],qa=["in-review","merged","failed","awaiting-approval","task-created","workflow-notify"],ls="__custom",qn="npm test -- --runInBand",Vn='export default async (ctx) => ({ outcome: "success" });',Gn="Task {{taskId}} reached {{workflowName}}",Va=[{kind:"prompt",label:"Prompt",icon:Ll},{kind:"prompt",label:"User input",icon:Tl,presetConfig:{awaitInput:!0}},{kind:"script",label:"Script",icon:zl},{kind:"gate",label:"Gate",icon:Wl},{kind:"merge",label:"Merge boundary",icon:$l},{kind:"hold",label:"Hold",icon:_l,presetConfig:{release:"manual"}},{kind:"split",label:"Split",icon:Bl},{kind:"join",label:"Join",icon:ql,presetConfig:{mode:"all",onBranchFailure:"collect"}},{kind:"foreach",label:"For-each step",icon:ka,presetConfig:{source:"task-steps"}},{kind:"loop",label:"Loop",icon:ka,presetConfig:{maxIterations:3,exitWhen:{type:"output-contains",value:"DONE"}}},{kind:"step-review",label:"Step review",icon:Vl,presetConfig:{type:"code"}},{kind:"parse-steps",label:"Parse steps",icon:Xa,presetConfig:{artifact:"PROMPT.md",parser:"step-headings"}},{kind:"code",label:"Code",icon:Gl,presetConfig:{source:""}},{kind:"notify",label:"Notify",icon:Hl,presetConfig:{event:"in-review",title:"{{taskTitle}}",message:""}}];function Hn(a){const r={name:a.name,gateMode:a.gateMode??"advisory"};return a.description&&(r.description=a.description),a.mode==="script"?(a.scriptName&&(r.scriptName=a.scriptName),{kind:"script",label:a.name,config:r}):(r.prompt=a.prompt??"",r.toolMode=a.toolMode==="coding"?"coding":"readonly",a.modelProvider&&a.modelId&&(r.modelProvider=a.modelProvider,r.modelId=a.modelId),{kind:"prompt",label:a.name,config:r})}const Un=new Set(["prompt","script","gate","code","hold","split","join","foreach","loop","step-review","parse-steps","notify","merge"]);function Kn({workflows:a,onCreate:r,onDesign:d,onClose:w}){const{t:i}=xe("app"),[h,A]=o.useState(""),[u,F]=o.useState(""),[M,E]=o.useState(null),[v,x]=o.useState(!1),[g,b]=o.useState(!1),[c,y]=o.useState(""),[k,O]=o.useState(!1),[j,T]=o.useState(null),P=o.useRef(null),[Q,ie]=o.useState(!1),B=o.useRef(null),q=o.useRef([]),ne=o.useMemo(()=>{const R={id:null,name:i("workflows.templateBlank","Blank"),description:i("workflows.templateBlankDescription","Start from an empty start → end graph."),nodeCount:0,builtin:!1},K=a.filter(s=>s.kind!=="fragment"),ae=s=>({id:s.id,name:s.name,description:s.description??"",nodeCount:s.ir.nodes.length,source:s,builtin:Ue(s.id)}),ue=K.filter(s=>Ue(s.id)).map(ae),ke=K.filter(s=>!Ue(s.id)).map(ae);return[R,...ue,...ke]},[a,i]),[G,te]=o.useState(0),C=ne[G]??ne[0];o.useEffect(()=>{B.current?.focus()},[]);const D=o.useCallback(R=>{const K=ne[R];K&&(te(R),Q||(K.id===null?(A(""),F("")):(A(i("workflows.templateCopyName","{{name}} copy",{name:K.name})),F(K.description))),M&&E(null))},[ne,Q,M,i]),L=o.useCallback(R=>{if(R.key==="ArrowDown"||R.key==="ArrowRight"){R.preventDefault();const K=Math.min(G+1,ne.length-1);D(K),q.current[K]?.focus()}else if(R.key==="ArrowUp"||R.key==="ArrowLeft"){R.preventDefault();const K=Math.max(G-1,0);D(K),q.current[K]?.focus()}else(R.key==="Enter"||R.key===" ")&&(R.preventDefault(),D(G),B.current?.focus())},[G,ne.length,D]),V=Ja(w),ee=o.useCallback(async R=>{R.preventDefault();const K=h.trim();if(!K){E(i("workflows.createNameRequired","Enter a workflow name"));return}x(!0),E(null);try{await r(K,u.trim(),C)}catch(ae){E(le(ae)||i("workflows.createFailed","Failed to create workflow")),x(!1)}},[h,u,C,r,i]),de=o.useCallback(async()=>{const R=c.trim();if(!R){T(i("workflows.aiPromptRequired","Describe the workflow you want"));return}const K=new AbortController;P.current=K,O(!0),T(null);try{await d(R,h.trim(),K.signal)}catch(ae){if(K.signal.aborted)return;T(le(ae)||i("workflows.aiFailed","Failed to design workflow"))}finally{P.current===K&&(P.current=null),O(!1)}},[c,h,d,i]),re=o.useCallback(()=>{P.current?.abort(),O(!1)},[]),U=ne.findIndex(R=>R.id!==null&&R.builtin),he=ne.findIndex(R=>R.id!==null&&!R.builtin);return e.jsx("div",{className:"modal-overlay open wf-create-overlay",...V,children:e.jsxs("div",{className:"modal wf-create-modal","data-testid":"wf-create-dialog",role:"dialog","aria-modal":"true","aria-label":i("workflows.createTitle","New workflow"),onClick:R=>R.stopPropagation(),onKeyDown:R=>{R.key==="Escape"&&(R.stopPropagation(),w())},children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:i("workflows.createTitle","New workflow")}),e.jsx("button",{type:"button",className:"modal-close",onClick:w,"aria-label":i("actions.close","Close"),children:e.jsx(ds,{size:16})})]}),e.jsxs("form",{onSubmit:ee,children:[e.jsxs("div",{className:"modal-body",children:[e.jsxs("div",{className:"wf-ai-create","aria-busy":k,"data-testid":"wf-ai-create",children:[e.jsxs("button",{type:"button",className:"wf-ai-toggle","data-testid":"wf-ai-toggle","aria-expanded":g,onClick:()=>{b(R=>!R),T(null)},children:[e.jsx(He,{size:13})," ",i("workflows.aiToggle","Describe it instead")]}),g&&e.jsxs("div",{className:"wf-ai-create-body",children:[e.jsx("textarea",{className:"wf-ai-prompt","data-testid":"wf-ai-prompt",rows:3,value:c,disabled:k,placeholder:i("workflows.aiPromptPlaceholder","e.g. Run lint and tests before merge, then post a changelog comment after merge"),onChange:R=>{y(R.target.value),j&&T(null)}}),j&&e.jsx("p",{className:"wf-create-error",role:"alert","data-testid":"wf-ai-error",children:j}),e.jsxs("div",{className:"wf-ai-actions",children:[e.jsxs("button",{type:"button",className:"btn btn-primary wf-ai-submit","data-testid":"wf-ai-submit",disabled:k,onClick:()=>void de(),children:[k?e.jsx(Ie,{size:13,className:"wf-spin"}):e.jsx(He,{size:13})," ",i("workflows.aiSubmit","Design with AI")]}),k&&e.jsx("button",{type:"button",className:"btn wf-ai-cancel","data-testid":"wf-ai-cancel",onClick:re,children:i("common.cancel","Cancel")})]})]})]}),e.jsxs("div",{className:"wf-field",children:[e.jsx("span",{id:"wf-template-label",children:i("workflows.templatePickerLabel","Start from")}),e.jsx("div",{className:"wf-template-list",role:"radiogroup","aria-labelledby":"wf-template-label","data-testid":"wf-template-list",children:ne.map((R,K)=>{const ae=K===G,ue=R.id??"blank";return e.jsxs("div",{children:[K===U&&U>=0&&e.jsx("p",{className:"wf-template-section",children:i("workflows.templateSectionBuiltin","Built-in workflows")}),K===he&&he>=0&&e.jsx("p",{className:"wf-template-section",children:i("workflows.templateSectionYours","Your workflows")}),e.jsxs("div",{ref:ke=>{q.current[K]=ke},role:"radio","aria-checked":ae,tabIndex:ae?0:-1,className:`wf-template-option${ae?" selected":""}`,"data-testid":R.id===null?"wf-template-option-blank":`wf-template-option-${R.id}`,onClick:()=>{D(K),q.current[K]?.focus()},onKeyDown:L,children:[e.jsx("span",{className:"wf-template-option-name",children:R.name}),R.description&&e.jsx("span",{className:"wf-template-option-desc",children:R.description}),R.id!==null&&e.jsx("span",{className:"wf-template-option-count",children:i("workflows.templateNodeCount","{{count}} nodes",{count:R.nodeCount})})]})]},ue)})})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:i("workflows.createName","Name")}),e.jsx("input",{ref:B,"data-testid":"wf-create-name",value:h,onChange:R=>{A(R.target.value),ie(!0),M&&E(null)}})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:i("workflows.createDescription","Description (optional)")}),e.jsx("textarea",{rows:2,"data-testid":"wf-create-description",value:u,onChange:R=>F(R.target.value)})]}),M&&e.jsx("p",{className:"wf-create-error",role:"alert","data-testid":"wf-create-error",children:M})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:w,children:i("common.cancel","Cancel")}),e.jsxs("button",{type:"submit",className:"btn btn-primary","data-testid":"wf-create-submit",disabled:v,children:[v?e.jsx(Ie,{size:13,className:"wf-spin"}):null," ",i("workflows.createSubmit","Create")]})]})]})]})})}function Yn({onClose:a,addToast:r,projectId:d,initialPanel:w,initialAction:i,initialWorkflowId:h,modalRef:A,isEmbedded:u=!1}){const[F,M]=o.useState([]),[E,v]=o.useState(null),g=cl()==="mobile",[b,c]=o.useState(()=>oa()),[y,k]=o.useState(!1),[O,j]=o.useState(!1),[T,P]=o.useState(null),[Q,ie]=o.useState(!1),[B,q,ne]=Wo([]),[G,te,C]=$o([]),[D,L]=o.useState(null),[V,ee]=o.useState(null),[de,re]=o.useState(!1),[U,he]=o.useState(!1),[R,K]=o.useState(!1),[ae,ue]=o.useState(()=>w==="settings"?"settings":"graph"),ke=g||R,{t:s}=xe("app"),{confirm:ve}=ul(),[ct,m]=o.useState(i==="create"),W=o.useRef(null),J=o.useRef(null),[X,oe]=o.useState(""),[Y,ce]=o.useState(""),[se,fe]=o.useState(!1),[to,Ye]=o.useState(!1),Je=o.useRef(null),[Z,Xe]=o.useState([]),[Fe,Qe]=o.useState([]),[Me,Ze]=o.useState([]),[Pe,et]=o.useState([]),[Te,ut]=o.useState(null),[so,ze]=o.useState(null),Pt=o.useRef(null),[us,ao]=o.useState([]),[oo,lo]=o.useState([..._n]),[At,no]=o.useState([]),[tt,io]=o.useState([]),fs="fusion:wf-templates-collapsed",[We,ro]=o.useState(()=>{try{const t=localStorage.getItem(fs);return t!=null?t==="1":oa()}catch{return!1}}),[ft,ps]=o.useState(""),[pt,ms]=o.useState(null),It=o.useRef(!1),ws="fusion:wf-left-sidebar-collapsed",hs="fusion:wf-sidebar-columns-collapsed",gs="fusion:wf-sidebar-fields-collapsed",bs="fusion:wf-sidebar-settings-collapsed",xs="fusion:wf-sidebar-optional-steps-collapsed",[st,ks]=o.useState(()=>{try{return localStorage.getItem(ws)==="1"}catch{return!1}}),[at,co]=o.useState(()=>{try{return localStorage.getItem(hs)==="1"}catch{return!1}}),[ot,uo]=o.useState(()=>{try{return localStorage.getItem(gs)==="1"}catch{return!1}}),[lt,fo]=o.useState(()=>{try{return localStorage.getItem(bs)==="1"}catch{return!1}}),[nt,po]=o.useState(()=>{try{return localStorage.getItem(xs)==="1"}catch{return!1}});o.useEffect(()=>{try{localStorage.setItem(ws,st?"1":"0")}catch{}},[st]),o.useEffect(()=>{try{localStorage.setItem(hs,at?"1":"0")}catch{}},[at]),o.useEffect(()=>{try{localStorage.setItem(gs,ot?"1":"0")}catch{}},[ot]),o.useEffect(()=>{try{localStorage.setItem(bs,lt?"1":"0")}catch{}},[lt]),o.useEffect(()=>{try{localStorage.setItem(xs,nt?"1":"0")}catch{}},[nt]);const{setViewport:vs}=_o(),Rt=o.useRef(null),mt=o.useMemo(()=>`fusion:wf-migration-notice-dismissed${d?`:${d}`:""}`,[d]),[mo,js]=o.useState(!1),[Ns,Dt]=o.useState(null),[ys,Cs]=o.useState([]),[Ss,Es]=o.useState(!1),wt=o.useRef(null),[Ot,Lt]=o.useState(!1),[ht,Tt]=o.useState(""),[je,zt]=o.useState(!1),[$e,_e]=o.useState(null),gt=o.useRef(null),Wt=o.useRef(!1),S=o.useMemo(()=>F.find(t=>t.id===E),[F,E]),z=!!S&&Ue(S.id),Fs=o.useRef(E);Fs.current=E;const wo=o.useMemo(()=>!S||z?!1:!B.some(t=>Un.has(t.data.kind)),[S,z,B]),Ms=!0;o.useEffect(()=>{let t=!1;return Ha(d).then(l=>{t||ao(l)}).catch(()=>{}),()=>{t=!0}},[d]),o.useEffect(()=>{let t=!1;return fl(d).then(l=>{!t&&l.length>0&&lo(l)}).catch(()=>{}),()=>{t=!0}},[d]),o.useEffect(()=>{let t=!1;return pl().then(l=>{t||no(l.templates??[])}).catch(()=>{}),ml().then(l=>{t||io(l.templates??[])}).catch(()=>{}),()=>{t=!0}},[]),o.useEffect(()=>{try{localStorage.setItem(fs,We?"1":"0")}catch{}},[We]),o.useEffect(()=>{D&&re(!1)},[D]),o.useEffect(()=>{w==="settings"&&ue("settings")},[w]);const $t=o.useMemo(()=>F.filter(t=>t.kind==="fragment"),[F]),pe=o.useMemo(()=>{const t=ft.trim().toLowerCase(),l=I=>!t||I.toLowerCase().includes(t),n=(I,H)=>I.name.localeCompare(H.name),p=[...$t].sort(n).filter(I=>l(I.name)),N=[...At].sort(n).filter(I=>l(I.name)),_=[...tt].sort((I,H)=>I.template.name.localeCompare(H.template.name)).filter(I=>l(I.template.name));return{fragmentEntries:p,stepEntries:N,pluginEntries:_}},[$t,At,tt,ft]),_t=$t.length+At.length+tt.length,Ps=_t>0,Bt=o.useMemo(()=>Z.length?wl(Z,us):[],[Z,us]),Re=o.useMemo(()=>hl(B,Z),[B,Z]),As=Bt.filter(t=>t.severity==="error").length,it=o.useMemo(()=>z||!S||Je.current===null?!1:os(X,Y,B,G,Z,Fe,Me,Pe)!==Je.current,[z,S,X,Y,B,G,Z,Fe,Me,Pe]),Be=o.useCallback(async()=>{k(!0);try{const t=await gl(d);M(t),v(l=>l&&t.some(n=>n.id===l)?l:i!=="create"&&h&&t.some(n=>n.id===h)?h:g?null:t[0]?.id??null)}catch(t){r(le(t)||s("workflows.loadFailed","Failed to load workflows"),"error")}finally{k(!1)}},[d,r,g,i,h,s]);o.useEffect(()=>{Be()},[Be]),o.useEffect(()=>{!h||!g||!b||E===h&&J.current!==h&&(J.current=h,c(!1))},[E,h,g,b]);const Is=o.useRef(!1);o.useEffect(()=>{if(Is.current)return;Is.current=!0;let t=!1;return(async()=>{try{const l=await bl(d);if(t)return;if(l.migrated>0){if(await Be(),t)return;let n=!1;try{n=localStorage.getItem(mt)==="1"}catch{}n||js(!0)}}catch{}})(),()=>{t=!0}},[d,Be,mt]);const ho=o.useCallback(()=>{js(!1);try{localStorage.setItem(mt,"1")}catch{}},[mt]),bt=o.useCallback(async()=>{if(S)try{await xl(S.id,d)}catch(t){r(le(t)||s("workflows.exportFailed","Failed to export workflow"),"error")}},[S,d,r,s]),go=o.useCallback(async t=>{const l=t.target.files?.[0];if(wt.current&&(wt.current.value=""),!!l){Dt(null),Cs([]),Es(!0);try{const n=await l.text();let p;try{p=JSON.parse(n)}catch{Dt(s("workflows.importInvalidJson","That file isn't valid JSON."));return}const N=await kl(p,d);await Be(),v(N.workflow.id),c(!1),r(s("workflows.imported",'Imported workflow "{{name}}"',{name:N.workflow.name}),"success"),N.strippedApprovalFlags&&r(s("workflows.importStripped","Auto-approval flags were removed from imported nodes"),"warning"),N.warnings.length>0&&Cs(N.warnings)}catch(n){n instanceof Ka&&n.status>=400&&n.status<500?Dt(le(n)||s("workflows.importFailed","Import failed")):r(le(n)||s("workflows.importFailed","Import failed"),"error")}finally{Es(!1)}}},[d,Be,r,s]);o.useEffect(()=>{if(It.current=!1,!S){q([]),te([]),Xe([]),Qe([]),Ze([]),et([]),ut(null),ze(null),oe(""),ce(""),Je.current=null;return}const t=la(S),l=na(S),n=ia(S),p=ra(S),N=da(S),_=Ca(t.nodes,t.edges,l),I=Sa(t.nodes,_);q(I),te(t.edges),Xe(l),Qe(n),Ze(p),et(N),oe(S.name),ce(S.description??""),fe(!1),Ye(!1),Je.current=os(S.name,S.description??"",I,t.edges,l,n,p,N),L(null),ee(null),P(null),vs({x:0,y:0,zoom:1},{duration:0}),Wt.current?(Wt.current=!1,ie(!0)):ie(!1)},[S,q,te,vs]),o.useEffect(()=>{B.length>0&&(It.current=!0)},[B]),o.useEffect(()=>{if(!S||!z){ut(null),ze(null);return}let t=!1;return ca(S.id,d).then(l=>{t||(ut(l),q(n=>n.map(p=>{if(p.data.kind!=="prompt"&&p.data.kind!=="gate")return p;const N=l.effective[p.id];return N===void 0?p:{...p,data:{...p.data,config:{...p.data.config??{},prompt:N}}}})))}).catch(l=>{t||r(le(l)||s("workflowEditor.promptOverridesLoadFailed","Failed to load prompt overrides"),"error")}),()=>{t=!0}},[S,z,d,r,s,q]);const qt=o.useRef(!1);o.useEffect(()=>{if(w!=="settings"||qt.current||!S)return;const t=Pt.current;t&&(qt.current=!0,t.scrollIntoView({behavior:"smooth",inline:"end",block:"nearest"}))},[w,S]),o.useEffect(()=>()=>{qt.current=!1},[w]);const[Vt,Rs]=o.useState(null);o.useEffect(()=>{q(t=>{const l=t.filter(n=>!we(n.id)&&n.type!=="group");return[...vl(Z),...jl(l,Z)]})},[Z,q]);const xt=o.useCallback((t,l={})=>{const n=Nl(t,G,B);if("error"in n){n.error==="cycle"?r(s("workflowNodes.cycleBlocked","That connection would create a cycle — only rework edges inside a for-each template may loop back"),"warning"):n.error==="duplicate"&&r(s("workflowNodes.duplicateBlocked","That connection already exists"),"warning");return}te(p=>[...p,n.edge]),l.selectCreatedEdge&&(ee(n.edge.id),L(null),re(!1))},[G,B,te,r,s]),bo=o.useCallback(t=>{xt(t)},[xt]),xo=o.useCallback((t,l)=>{xt({source:t,target:l,sourceHandle:null,targetHandle:null},{selectCreatedEdge:!0})},[xt]),ko=o.useCallback((t,l)=>{q(n=>Dn(n,t,l))},[q]),vo=o.useCallback((t,l)=>{if(we(l.id)||Z.length===0)return;const n=ns(l.position.y,Z);n&&q(p=>p.map(N=>N.id===l.id?{...N,data:{...N.data,column:n}}:N))},[Z,q]),kt=o.useCallback((t,l,n)=>{const p=Ba(),N=l??(t==="merge"?"Merge boundary":t.charAt(0).toUpperCase()+t.slice(1)),_=t==="gate"?{gateMode:"gate"}:{},I=n?{..._,...n}:_;if(t==="foreach"||t==="loop"){const H=yl(p,Ba()),ge=t==="foreach"?s("workflowNodes.stepExecuteLabel","Step execute"):s("workflowNodes.loopStepLabel","Loop step"),Ae=t==="foreach"?{seam:"step-execute"}:{prompt:""};q(Zt=>[...Zt,{id:p,type:t,position:{x:200+Zt.length*40,y:240+Zt.length%3*70},data:{kind:t,label:N,config:I,templateEmpty:!1},style:{width:Sl,height:Cl},deletable:!0},{id:H,type:"prompt",position:{x:Fl,y:El},parentId:p,extent:"parent",data:{kind:"prompt",label:ge,config:Ae},deletable:!0}]),L(p);return}q(H=>[...H,{id:p,type:t,position:{x:200+H.length*40,y:240+H.length%3*70},data:{kind:t,label:N,config:I},deletable:!0}]),L(p)},[q,s]),vt=o.useCallback(t=>{if(z)return;const{kind:l,label:n,config:p}=Hn(t);kt(l,n,p)},[z,kt]),Ds=o.useCallback(t=>{if(z)return!1;const l=It.current?void 0:S?.ir,n=Ml(t.ir,B,l);if(n.length>0)return ms(n.join(", ")),!1;ms(null);const p=Pl(B,G,t.ir,{x:240,y:200+B.length%4*40},t.layout);return q(p.nodes),te(p.edges),L(p.insertedNodeIds[0]??null),!0},[z,B,G,S,q,te]),Os=o.useCallback(()=>{q(t=>Sa(t,Ca(t,G,Z)))},[q,G,Z]),Ls=o.useCallback(async()=>{if(!S||z)return;const t=ht.trim();if(!t){_e(s("workflows.aiPromptRequired","Describe the workflow you want"));return}const l=new AbortController;gt.current=l;const n=S;zt(!0),_e(null);try{const p=await ua({prompt:t,workflowId:n.id},d,l.signal);if(Fs.current!==n.id){r(s("workflows.aiStaleDiscarded","Discarded AI design — you switched workflows"),"warning");return}if(!await ve({title:s("workflows.aiReplaceTitle","Replace graph?"),message:s("workflows.aiReplaceConfirm","Replace the current graph with the AI design? Unsaved changes will be lost."),confirmLabel:s("workflows.aiReplaceConfirmLabel","Replace"),danger:!0}))return;const _=la({...n,ir:p.ir,layout:p.layout});q(_.nodes),te(_.edges),Xe(na({...n,ir:p.ir})),Qe(ia({...n,ir:p.ir})),Ze(ra({...n,ir:p.ir})),et(da({...n,ir:p.ir})),L(null),ee(null),P(null),ie(p.interpreterOnly),p.strippedApprovalFlags&&r(s("workflows.importStripped","Auto-approval flags were removed from imported nodes"),"warning"),Lt(!1),Tt("")}catch(p){if(l.signal.aborted)return;_e(le(p)||s("workflows.aiFailed","Failed to design workflow"))}finally{gt.current===l&&(gt.current=null),zt(!1)}},[S,z,ht,d,ve,s,q,te,r]),Ts=o.useCallback(()=>{gt.current?.abort(),zt(!1)},[]),$=o.useCallback(t=>{D&&q(l=>l.map(n=>n.id===D?{...n,data:{...n.data,..."config"in t?{config:typeof t.config=="function"?t.config(n.data.config??{}):{...n.data.config??{},...t.config}}:t}}:n))},[D,q]),rt=o.useCallback((t,l)=>{ut(l);const n=l.effective[t]??l.defaults[t]??"";q(p=>p.map(N=>N.id===t?{...N,data:{...N.data,config:{...N.data.config??{},prompt:n}}}:N))},[q]),zs=o.useCallback(async(t,l)=>{if(!(!S||!z)){ze(t);try{const n=await fa(S.id,{[t]:l},d);rt(t,n),r(s("workflowEditor.promptOverrideSaved","Prompt override saved"),"success")}catch(n){r(le(n)||s("workflowEditor.promptOverrideSaveFailed","Failed to save prompt override"),"error");try{const p=await ca(S.id,d);rt(t,p)}catch{}}finally{ze(n=>n===t?null:n)}}},[S,z,d,r,s,rt]),Ws=o.useCallback(async t=>{if(!(!S||!z)){ze(t);try{const l=await fa(S.id,{[t]:null},d);rt(t,l),r(s("workflowEditor.promptOverrideReset","Prompt reset to default"),"success")}catch(l){r(le(l)||s("workflowEditor.promptOverrideResetFailed","Failed to reset prompt"),"error")}finally{ze(l=>l===t?null:l)}}},[S,z,d,r,s,rt]),Gt=o.useCallback(t=>{V&&te(l=>l.map(n=>{if(n.id!==V)return n;const p=t.condition??n.data?.condition??"success",N=t.rework??n.data?.kind==="rework";return{...n,label:N?`${pa(p)} (rework)`:pa(p),data:{...n.data??{},condition:p,kind:N?"rework":void 0},type:N?"step":void 0,animated:N,className:Al(p,N)}}))},[V,te]),$s=o.useCallback(t=>{const l=new Set(t);let n=null;q(p=>(n=ma(p,G,l),n.nodes)),n&&te(n.edges),D!==null&&l.has(D)&&L(null),V!==null&&l.has(V)&&ee(null)},[G,q,te,D,V]),jo=o.useCallback(async({nodes:t,edges:l})=>{if(z)return!1;const n=new Set([...t.map(I=>I.id),...l.map(I=>I.id)]),p=ma(B,G,n),N=new Set(B.map(I=>I.id));for(const I of p.nodes)N.delete(I.id);const _=new Set(G.map(I=>I.id));for(const I of p.edges)_.delete(I.id);return N.size===0&&_.size===0?!1:{nodes:B.filter(I=>N.has(I.id)),edges:G.filter(I=>_.has(I.id))}},[z,B,G]),No=o.useCallback(()=>{L(null),Rt.current?.focus()},[]),yo=o.useCallback(()=>{ee(null),Rt.current?.focus()},[]),dt=o.useCallback(()=>{m(!1),W.current?.focus()},[]),Co=o.useCallback(async(t,l,n)=>{const p=n.source!==void 0?Il(n.source.ir,n.source.layout):{ir:Xl(t),layout:Jl()},N=await es({name:t,description:l||void 0,kind:"workflow",ir:p.ir,layout:p.layout},d);M(_=>[..._,N]),v(N.id),c(!1),r(s("workflows.created",'Created workflow "{{name}}"',{name:N.name}),"success"),dt()},[d,r,s,dt]),So=o.useCallback(async(t,l,n)=>{const p=await ua({prompt:t},d,n),N=`AI: ${t.slice(0,30)}`,I=await es({name:l||N,kind:"workflow",ir:p.ir,layout:p.layout},d);Wt.current=p.interpreterOnly,M(H=>[...H,I]),v(I.id),c(!1),r(s("workflows.created",'Created workflow "{{name}}"',{name:I.name}),"success"),p.strippedApprovalFlags&&r(s("workflows.importStripped","Auto-approval flags were removed from imported nodes"),"warning"),dt()},[d,r,s,dt]),_s=o.useCallback(async()=>{if(!(!S||Ue(S.id)||!await ve({title:s("workflows.deleteTitle","Delete workflow?"),message:s("workflows.deleteMessage",'Delete workflow "{{name}}"? This cannot be undone.',{name:S.name}),confirmLabel:s("common.delete","Delete"),danger:!0})))try{await Rl(S.id,d),M(l=>l.filter(n=>n.id!==S.id)),v(null),g&&c(!0),r(s("workflows.deleted","Workflow deleted"),"success")}catch(l){r(le(l)||s("workflows.deleteFailed","Failed to delete workflow"),"error")}},[S,d,r,ve,s,g]),Bs=o.useCallback(async()=>{if(S)try{const t=await es({name:`${S.name} (copy)`,description:S.description,ir:S.ir,layout:S.layout},d);M(l=>[...l,t]),v(t.id),c(!1),r(s("workflows.duplicatedEditable",'Duplicated to "{{name}}" — editable',{name:t.name}),"success")}catch(t){r(le(t)||s("workflows.duplicateFailed","Failed to duplicate workflow"),"error")}},[S,d,r,s]),qs=o.useCallback(async()=>{if(S&&!Ue(S.id)){if(Re.length>0){const t=s("workflowColumns.unplacedCount","{{count}} nodes not placed in a column",{count:Re.length});P(t),r(t,"error");return}if(As>0){const t=s("workflowColumns.compositionBlocked","Resolve trait conflicts on highlighted columns before saving");P(t),r(t,"error");return}j(!0),P(null),ie(!1),Rs(null);try{const t=X.trim()||S.name,{ir:l,layout:n}=Ya(t,B,G,Z.length?Z:void 0,Fe.length?Fe:void 0,Me.length?Me:void 0,Pe.length?Pe:void 0),p=t!==S.name,N=Y!==(S.description??""),_=async H=>{M(ge=>ge.map(Ae=>Ae.id===H.id?H:Ae)),Je.current=os(H.name,H.description??"",B,G,Z,Fe,Me,Pe),oe(H.name),ce(H.description??"");try{await Dl(H.id,d),r(s("workflows.saved","Workflow saved"),"success")}catch(ge){const Ae=le(ge)||"";Ae.includes("require the workflow interpreter (deferred)")?ie(!0):P(Ae||s("workflows.savedNotCompilable","Workflow saved but cannot be compiled"))}},I={ir:l,layout:n,...p?{name:t}:{},...N?{description:Y}:{}};try{await _(await wa(S.id,I,d))}catch(H){if(!(H?.details?.policyEscalation===!0))throw H;if(!window.confirm(`${le(H)}
7
+
8
+ ${s("workflowColumns.confirmPolicyEscalation","Bind it anyway? The column agent will run with broader permissions than this project's default.")}`)){r(s("workflowColumns.escalationDeclined","Save cancelled — column agent binding not confirmed"),"error");return}await _(await wa(S.id,{...I,confirmPolicyEscalation:!0},d))}}catch(t){const l=le(t)||s("workflows.saveFailed","Failed to save workflow"),n=/node '([^']+)'/.exec(l);n&&B.some(p=>p.id===n[1])&&Rs({nodeId:n[1],message:l}),P(l),r(l,"error")}finally{j(!1)}}},[S,X,Y,B,G,Z,Fe,Me,Pe,Re,As,d,r,s]),qe=o.useMemo(()=>{const t=new Set(Re),l=new Map;for(const n of B)n.parentId&&l.set(n.parentId,(l.get(n.parentId)??0)+1);return B.map(n=>{let p;t.has(n.id)&&(p=s("workflowColumns.nodeUnplaced","Not placed in a column")),Vt?.nodeId===n.id&&(p=Vt.message);const N=n.data.kind==="foreach"||n.data.kind==="loop",_=n.data.kind==="loop"?s("workflowNodes.loopEmptyHint","Drag loop steps here"):s("workflowNodes.foreachEmptyHint","Drag a step-execute node here"),I=N?(l.get(n.id)??0)===0:void 0;return p===n.data.errorBadge&&(!N||I===n.data.templateEmpty&&n.data.emptyHint===_)?n:{...n,data:{...n.data,errorBadge:p,...N?{templateEmpty:I,emptyHint:_}:{}}}})},[B,Re,Vt,s]),f=B.find(t=>t.id===D)??null,Vs=f!==null&&f.data.kind!=="end",Ne=G.find(t=>t.id===V)??null,Eo=g&&Vs&&!de,Fo=g&&Ne!==null,[Ht,Gs]=o.useState(!1),Hs=o.useCallback(()=>{Gs(t=>!t)},[]),Mo=o.useCallback(t=>{!Ht||t.key!=="Escape"||(t.preventDefault(),t.stopPropagation(),Gs(!1))},[Ht]),Ve=f&&(f.data.kind==="prompt"||f.data.kind==="gate")?String(f.data.config?.prompt??Te?.effective[f.id]??(z?Tn(f.data.config):"")):"",Ut=f?Te?.defaults[f.id]:void 0,Us=f?Te?.stored[f.id]:void 0,Kt=Us!==void 0,Ks=Kt&&Ut!==void 0&&Us!==Ut,jt=!!f&&so===f.id,Nt=!!f&&(f.data.kind==="prompt"||f.data.kind==="gate")&&(!z||Ut!==void 0),Ys=o.useCallback(t=>{Nt&&$({config:{prompt:t}})},[Nt,$]),Js=o.useCallback(()=>{if(!z||!f||f.data.kind!=="prompt"&&f.data.kind!=="gate")return;const t=Te?.stored[f.id],l=Te?.defaults[f.id],n=Ve.trim()?Ve:"";t===void 0&&(l===void 0||n===l)||t===n||zs(f.id,Ve)},[z,f,Ve,Te,zs]),Xs=o.useCallback(()=>{f&&Ws(f.id)},[f,Ws]),Qs=o.useMemo(()=>{if(!Ne)return"readonly";const t=B.find(l=>l.id===Ne.source);return Ol(t?.data.kind)},[Ne,B]),Yt=o.useMemo(()=>{const t=S?.ir;return t&&t.version==="v2"&&Array.isArray(t.artifacts)?t.artifacts.map(l=>l.key):[]},[S]),[De,Jt]=o.useState([]),[ye,yt]=o.useState([]);o.useEffect(()=>{yt([])},[d]);const[Ge,Zs]=o.useState([]),[Po,Ao]=o.useState(zn);o.useEffect(()=>{let t=!1;return Promise.resolve(Ft()).then(l=>{!t&&l?.models&&Jt(l.models)}).catch(()=>{}),Promise.resolve(Et()).then(l=>{!t&&Array.isArray(l)&&yt(l)}).catch(()=>{}),Promise.resolve(ha(d)).then(l=>{!t&&Array.isArray(l)&&Zs(l)}).catch(()=>{}),()=>{t=!0}},[d]);const Xt=o.useMemo(()=>({models:De.map(t=>({provider:t.provider,id:t.id,name:t.name})),agents:ye.map(t=>({id:t.id,name:t.name})),skills:Ge.map(t=>({id:t.id,name:t.name}))}),[De,ye,Ge]),ea=o.useMemo(()=>{const t=qe.filter(n=>!we(n.id)&&n.data.kind!=="start").map(n=>({id:n.id,label:n.data.label||n.id,kind:n.data.kind})),l=new Map;for(const n of qe){if(we(n.id)||n.data.kind==="start"||n.data.kind==="end")continue;const p=t.filter(N=>N.id!==n.id);p.length>0&&l.set(n.id,p)}return l},[qe]),Io=o.useMemo(()=>{const t=l=>l.map(n=>({...n,connectionTargets:z?[]:ea.get(n.id)??[],children:t(n.children)}));return t(Ln(qe,G,Z,Xt,s))},[qe,G,Z,Xt,s,z,ea]),me=f?.data.config?.executor??"model",Oe=o.useMemo(()=>{const t=f?.data.column??(f?.parentId?B.find(n=>n.id===f.parentId)?.data.column:void 0);if(!t)return;const l=Z.find(n=>n.id===t);if(!(!l?.agent||l.agent.mode!=="override"))return l.agent},[f?.data.column,f?.parentId,B,Z]),Ro=o.useMemo(()=>Oe?ye.find(t=>t.id===Oe.agentId):void 0,[Oe,ye]);o.useEffect(()=>{if(me!=="cli-agent")return;let t=!1;return fetch("/api/cli-agents").then(l=>l.ok?l.json():null).then(l=>{t||!l?.adapters||Ao(l.adapters)}).catch(()=>{}),()=>{t=!0}},[me]),o.useEffect(()=>{if(f?.data.kind==="step-review"&&De.length===0){Ft().then(t=>Jt(t.models)).catch(t=>{r(le(t)||s("workflowEditor.modelsLoadFailed","Failed to load models"),"error")});return}!f||f.data.kind!=="prompt"&&f.data.kind!=="gate"||(me==="model"&&De.length===0?Ft().then(t=>Jt(t.models)).catch(t=>{r(le(t)||s("workflowEditor.modelsLoadFailed","Failed to load models"),"error")}):me==="agent"&&ye.length===0?Et(void 0,d).then(yt).catch(t=>{r(le(t)||s("workflowEditor.agentsLoadFailed","Failed to load agents"),"error")}):me==="skill"&&Ge.length===0&&ha(d).then(Zs).catch(t=>{r(le(t)||s("workflowEditor.skillsLoadFailed","Failed to load skills"),"error")}))},[me,f?.id,f?.data.kind,d,r,De.length,ye.length,Ge.length,s]);const Ct=o.useCallback(t=>{if(!it){t();return}ve({title:s("workflows.discardTitle","Discard unsaved changes?"),message:s("workflows.discardMessage","You have unsaved changes to this workflow. Discard them?"),confirmLabel:s("workflows.discardConfirm","Discard"),danger:!0}).then(l=>{l&&t()})},[it,ve,s]),Qt=o.useCallback(()=>{Ct(a)},[Ct,a]),Do=o.useCallback(t=>{if(t===E){c(!1);return}Ct(()=>{v(t),c(!1)})},[Ct,E]);o.useEffect(()=>{if(!Oe||ye.length>0)return;let t=!1;return Promise.resolve(Et(void 0,d)).then(l=>{t||yt(l??[])}).catch(l=>{t||r(le(l)||s("workflowEditor.agentsLoadFailed","Failed to load agents"),"error")}),()=>{t=!0}},[Oe,ye.length,d,r,s]);const Oo=Ja(Qt),Lo=Ht&&(f?.data.kind==="prompt"||f?.data.kind==="gate")?To.createPortal(e.jsxs("div",{className:"wf-prompt-editor wf-prompt-editor--fullscreen",onKeyDown:Mo,children:[e.jsxs("div",{className:"wf-prompt-fullscreen-header",children:[e.jsx("span",{children:s("workflowEditor.editingPrompt","Editing Prompt")}),e.jsx("button",{type:"button",className:"btn btn-sm wf-prompt-expand-btn",onClick:Hs,"aria-label":s("workflowEditor.collapsePrompt","Collapse prompt editor"),title:s("workflowEditor.collapsePrompt","Collapse prompt editor"),children:e.jsx(ga,{size:14})})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.prompt","Prompt")}),e.jsx("textarea",{rows:void 0,value:Ve,readOnly:!Nt,onChange:t=>Ys(t.target.value),onBlur:Js,autoFocus:!0})]}),z?e.jsxs("div",{className:"wf-prompt-override-actions wf-prompt-override-actions--fullscreen",children:[Ks?e.jsx("span",{className:"wf-prompt-override-badge","data-testid":"wf-prompt-overridden",children:s("workflowEditor.promptOverridden","Overridden")}):null,e.jsx("button",{type:"button",className:"btn btn-sm",onClick:Xs,disabled:!Kt||jt,children:jt?s("workflowEditor.promptSaving","Saving…"):s("workflowEditor.resetPromptDefault","Reset to default")})]}):null]}),document.body):null,ta=e.jsxs("div",{className:`modal wf-editor-modal${u?" wf-editor-modal--embedded":""}`,ref:A,onClick:t=>t.stopPropagation(),onKeyDown:t=>{if(t.key!=="Escape"||u||ct)return;const n=t.target.tagName;n==="INPUT"||n==="TEXTAREA"||n==="SELECT"||(t.stopPropagation(),Qt())},children:[e.jsxs("header",{className:"wf-editor-header",children:[e.jsxs("h2",{children:[e.jsx(ba,{size:20,"aria-hidden":"true"}),e.jsx("span",{children:s("workflows.title","Workflows")})]}),u?null:e.jsx("button",{className:"wf-editor-close",onClick:Qt,"aria-label":s("workflows.closeEditor","Close workflow editor"),children:e.jsx(ds,{size:18})})]}),mo?e.jsxs("div",{className:"wf-migration-notice",role:"status","data-testid":"wf-migration-notice",children:[e.jsx("span",{className:"wf-migration-notice-text",children:s("workflows.migrationNotice",'Your legacy workflow steps were converted — find them as templates in the palette and as the "Migrated steps" workflow.')}),e.jsx("button",{type:"button",className:"wf-migration-notice-dismiss","data-testid":"wf-migration-notice-dismiss",onClick:ho,"aria-label":s("common.dismiss","Dismiss"),children:e.jsx(ds,{size:14})})]}):null,e.jsxs("div",{className:`wf-editor-body${b?" wf-editor-body--list-stage":" wf-editor-body--editor-stage"}${ke?" wf-editor-body--simple-layout":""}${Eo?" wf-editor-body--mobile-node-detail":""}${Fo?" wf-editor-body--mobile-edge-detail":""}${st?" wf-editor-body--sidebar-collapsed":""}`,children:[e.jsxs("aside",{className:"wf-editor-sidebar",children:[e.jsxs("div",{className:"wf-editor-sidebar-head",children:[e.jsxs("button",{className:"wf-editor-new",ref:W,"data-testid":"wf-new-workflow",onClick:()=>m(!0),children:[e.jsx(Se,{size:14})," ",s("workflows.newWorkflow","New workflow")]}),!g&&e.jsx("button",{type:"button",className:"wf-sidebar-shell-toggle","data-testid":"wf-sidebar-collapse","aria-expanded":!st,"aria-label":s("workflows.collapseSidebar","Collapse workflow sidebar"),title:s("workflows.collapseSidebar","Collapse workflow sidebar"),onClick:()=>ks(!0),children:e.jsx(xa,{size:14,"aria-hidden":!0})})]}),e.jsxs("button",{type:"button",className:"wf-editor-import","data-testid":"wf-import",disabled:Ss,onClick:()=>wt.current?.click(),title:s("workflows.importTooltip","Import a workflow from a JSON file"),children:[Ss?e.jsx(Ie,{size:14,className:"wf-spin"}):e.jsx(Ql,{size:14})," ",s("workflows.import","Import")]}),e.jsx("input",{ref:wt,type:"file",accept:".json",className:"wf-editor-import-input","data-testid":"wf-import-input",style:{display:"none"},onChange:go}),Ns&&e.jsx("div",{className:"wf-editor-import-error",role:"alert","data-testid":"wf-import-error",children:Ns}),ys.length>0&&e.jsx("div",{className:"wf-editor-import-warnings","data-testid":"wf-import-warnings",children:ys.map((t,l)=>e.jsx("p",{className:"wf-editor-import-warning",children:t},l))}),g&&F.length>0&&!S?e.jsx("div",{className:"wf-editor-select-note","data-testid":"wf-mobile-select-note",children:s("workflows.mobileSelectNote","Select a workflow to edit.")}):null,y?e.jsxs("div",{className:"wf-editor-empty",children:[e.jsx(Ie,{size:16,className:"wf-spin"})," ",s("workflows.loading","Loading…")]}):F.length===0?e.jsx("div",{className:"wf-editor-empty",children:s("workflows.noneYet","No workflows yet.")}):e.jsx("ul",{className:"wf-editor-list",children:F.map(t=>e.jsx("li",{children:e.jsx("button",{className:`wf-editor-list-item${t.id===E?" active":""}`,onClick:()=>Do(t.id),children:t.name})},t.id))}),S&&!ke&&e.jsxs("div",{className:"wf-sidebar-panels",children:[e.jsxs("section",{className:"wf-sidebar-section","data-testid":"wf-sidebar-columns-section",children:[e.jsxs("button",{type:"button",className:"wf-sidebar-section-toggle","aria-expanded":!at,"data-testid":"wf-sidebar-columns-toggle",onClick:()=>co(t=>!t),children:[at?e.jsx(Ee,{size:13}):e.jsx(Ce,{size:13}),e.jsx("span",{children:s("workflowColumns.title","Columns")})]}),!at&&e.jsx(Fa,{columns:Z,onChange:Xe,violations:Bt,readOnly:z,projectId:d,addToast:r,columnAgentsEnabled:Ms})]}),e.jsxs("section",{className:"wf-sidebar-section","data-testid":"wf-sidebar-fields-section",children:[e.jsxs("button",{type:"button",className:"wf-sidebar-section-toggle","aria-expanded":!ot,"data-testid":"wf-sidebar-fields-toggle",onClick:()=>uo(t=>!t),children:[ot?e.jsx(Ee,{size:13}):e.jsx(Ce,{size:13}),e.jsx("span",{children:s("workflowFields.title","Fields")})]}),!ot&&e.jsx(Aa,{fields:Fe,onChange:Qe,readOnly:z,addToast:r})]}),e.jsxs("section",{className:"wf-sidebar-section","data-testid":"wf-sidebar-settings-section",children:[e.jsxs("button",{type:"button",className:"wf-sidebar-section-toggle","aria-expanded":!lt,"data-testid":"wf-sidebar-settings-toggle",onClick:()=>fo(t=>!t),children:[lt?e.jsx(Ee,{size:13}):e.jsx(Ce,{size:13}),e.jsx("span",{children:s("workflowSettings.title","Settings")})]}),!lt&&e.jsx("div",{ref:Pt,className:"wf-settings-panel-wrap",children:e.jsx(Oa,{workflowId:S.id,settings:Me,onChange:Ze,readOnly:z,projectId:d,addToast:r,initialTab:"values"})})]}),e.jsxs("section",{className:"wf-sidebar-section","data-testid":"wf-sidebar-optional-steps-section",children:[e.jsxs("button",{type:"button",className:"wf-sidebar-section-toggle","aria-expanded":!nt,"data-testid":"wf-sidebar-optional-steps-toggle",onClick:()=>po(t=>!t),children:[nt?e.jsx(Ee,{size:13}):e.jsx(Ce,{size:13}),e.jsx("span",{children:s("workflowOptionalSteps.title","Optional steps")})]}),!nt&&e.jsx(La,{optionalSteps:Pe,onChange:et,readOnly:z,pluginTemplates:tt.map(t=>t.template)})]})]})]}),e.jsxs("section",{className:"wf-editor-canvas-wrap",children:[e.jsxs("button",{type:"button",className:"wf-editor-mobile-back",onClick:()=>c(!0),"aria-label":s("workflows.backToWorkflowList","Back to workflows"),children:[e.jsx(xa,{size:16}),e.jsx("span",{children:s("common.back","Back")})]}),S?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"wf-name-strip",children:[st&&!g&&e.jsx("button",{type:"button",className:"wf-sidebar-shell-restore","data-testid":"wf-sidebar-restore","aria-expanded":"false","aria-label":s("workflows.showSidebar","Show workflow sidebar"),title:s("workflows.showSidebar","Show workflow sidebar"),onClick:()=>ks(!1),children:e.jsx(Ee,{size:14,"aria-hidden":!0})}),z?e.jsx("span",{className:"wf-workflow-name wf-workflow-name--readonly","data-testid":"wf-workflow-name",children:S.name}):se?e.jsx("input",{className:"wf-workflow-name-input","data-testid":"wf-workflow-name-input",autoFocus:!0,value:X,"aria-label":s("workflows.nameLabel","Workflow name"),onChange:t=>oe(t.target.value),onKeyDown:t=>{t.key==="Enter"?(t.preventDefault(),X.trim()||oe(S.name),fe(!1)):t.key==="Escape"&&(t.preventDefault(),oe(S.name),fe(!1))},onBlur:()=>{X.trim()||oe(S.name),fe(!1)}}):e.jsx("button",{type:"button",className:"wf-workflow-name","data-testid":"wf-workflow-name",onClick:()=>fe(!0),title:s("workflows.clickToRename","Click to rename"),children:X||S.name}),z?S.description?e.jsx("span",{className:"wf-workflow-description wf-workflow-description--readonly","data-testid":"wf-workflow-description",children:S.description}):null:to?e.jsx("input",{className:"wf-workflow-description-input","data-testid":"wf-workflow-description-input",autoFocus:!0,value:Y,"aria-label":s("workflows.descriptionLabel","Workflow description"),placeholder:s("workflows.descriptionPlaceholder","Add a description"),onChange:t=>ce(t.target.value),onKeyDown:t=>{t.key==="Enter"?(t.preventDefault(),Ye(!1)):t.key==="Escape"&&(t.preventDefault(),ce(S.description??""),Ye(!1))},onBlur:()=>Ye(!1)}):e.jsx("button",{type:"button",className:"wf-workflow-description","data-testid":"wf-workflow-description",onClick:()=>Ye(!0),title:s("workflows.clickToEditDescription","Click to edit description"),children:Y||s("workflows.descriptionPlaceholder","Add a description")}),!g&&e.jsxs("button",{type:"button",className:"wf-layout-toggle","data-testid":"wf-layout-toggle","aria-pressed":R,onClick:()=>K(t=>!t),children:[R?e.jsx(ts,{size:14}):e.jsx(Xa,{size:14}),e.jsx("span",{children:R?s("workflows.showCanvasEditor","Show canvas editor"):s("workflows.showSimpleEditor","Show simple editor")})]})]}),ke&&e.jsxs("div",{className:"wf-mobile-shell","data-testid":"wf-mobile-shell",children:[e.jsx("nav",{className:"wf-mobile-tabs","aria-label":s("workflows.mobileEditorNav","Workflow editor sections"),children:[["graph",s("workflowNodes.mobileGraph","Graph")],["add",s("workflowNodes.mobileAdd","Add")],["settings",s("workflowSettings.title","Settings")],["fields",s("workflowFields.title","Fields")],["optional-steps",s("workflowOptionalSteps.title","Optional steps")],["columns",s("workflowColumns.title","Columns")],["actions",s("workflowNodes.mobileActions","Actions")]].map(([t,l])=>e.jsx("button",{type:"button",className:`wf-mobile-tab${ae===t?" wf-mobile-tab--active":""}`,"aria-current":ae===t?"page":void 0,"data-testid":`wf-mobile-tab-${t}`,onClick:()=>ue(t),children:l},t))}),e.jsxs("div",{className:"wf-mobile-panel","data-testid":`wf-mobile-panel-${ae}`,children:[ae==="graph"&&e.jsx(An,{rows:Io,selectedNodeId:D,selectedEdgeId:V,onSelectNode:t=>{L(t),ee(null),re(!1)},onSelectEdge:t=>{ee(t),L(null)},onCreateConnection:z?void 0:xo,canReorder:!z,onMoveNode:ko}),ae==="add"&&e.jsx("div",{className:"wf-mobile-add",children:z?e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflows.readOnlyBuiltin","Built-in workflow: structure is read-only, prompts are editable.")}):e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"wf-mobile-add-section",children:[e.jsx("h3",{children:s("workflowNodes.mobileNodeKinds","Node types")}),e.jsx("div",{className:"wf-mobile-add-grid",children:Va.map(({kind:t,label:l,icon:n,presetConfig:p})=>e.jsxs("button",{type:"button",className:"wf-mobile-add-option","data-testid":`wf-mobile-add-${t}-${l.toLowerCase().replace(/[^a-z0-9]+/g,"-")}`,onClick:()=>{kt(t,l,p),ue("graph")},children:[e.jsx(n,{size:16,"aria-hidden":!0}),e.jsx("span",{children:l})]},l))})]}),Ps&&e.jsxs("section",{className:"wf-mobile-add-section",children:[e.jsx("h3",{children:s("workflowNodes.templatesSection","Templates")}),_t>8&&e.jsx("input",{type:"text",className:"wf-templates-filter wf-mobile-template-filter","data-testid":"wf-mobile-template-filter",value:ft,onChange:t=>ps(t.target.value),placeholder:s("workflowNodes.templateFilterPlaceholder","Filter templates"),"aria-label":s("workflowNodes.templateFilterLabel","Filter templates")}),pt&&e.jsx("div",{className:"wf-templates-conflict",role:"alert","data-testid":"wf-mobile-tpl-conflict",children:s("workflowNodes.templateSeamConflict",`This fragment duplicates the "{{seam}}" seam already on the canvas, so it can't be inserted.`,{seam:pt})}),pe.fragmentEntries.length>0&&e.jsxs("div",{className:"wf-mobile-template-group",children:[e.jsx("h4",{children:s("workflowNodes.templatesFragments","Fragments")}),pe.fragmentEntries.map(t=>e.jsx("button",{type:"button",className:"wf-mobile-template-option","data-testid":`wf-mobile-tpl-fragment-${t.id}`,onClick:()=>{Ds(t)&&ue("graph")},children:t.name},t.id))]}),pe.stepEntries.length>0&&e.jsxs("div",{className:"wf-mobile-template-group",children:[e.jsx("h4",{children:s("workflowNodes.templatesBuiltinSteps","Built-in steps")}),pe.stepEntries.map(t=>e.jsx("button",{type:"button",className:"wf-mobile-template-option","data-testid":`wf-mobile-tpl-step-${t.id}`,onClick:()=>{vt(t),ue("graph")},children:t.name},t.id))]}),pe.pluginEntries.length>0&&e.jsxs("div",{className:"wf-mobile-template-group",children:[e.jsx("h4",{children:s("workflowNodes.templatesPluginSteps","Plugin steps")}),pe.pluginEntries.map(({pluginId:t,template:l})=>e.jsxs("button",{type:"button",className:"wf-mobile-template-option","data-testid":`wf-mobile-tpl-plugin-${l.id}`,onClick:()=>{vt(l),ue("graph")},children:[e.jsx("span",{children:l.name}),e.jsx("span",{className:"wf-templates-badge",children:t})]},`${t}:${l.id}`))]})]})]})}),ae==="settings"&&S&&e.jsx("div",{ref:Pt,className:"wf-mobile-destination",children:e.jsx(Oa,{workflowId:S.id,settings:Me,onChange:Ze,readOnly:z,projectId:d,addToast:r,initialTab:"values"})}),ae==="fields"&&e.jsx("div",{className:"wf-mobile-destination",children:e.jsx(Aa,{fields:Fe,onChange:Qe,readOnly:z,addToast:r})}),ae==="optional-steps"&&e.jsx("div",{className:"wf-mobile-destination",children:e.jsx(La,{optionalSteps:Pe,onChange:et,readOnly:z,pluginTemplates:tt.map(t=>t.template)})}),ae==="columns"&&e.jsx("div",{className:"wf-mobile-destination",children:e.jsx(Fa,{columns:Z,onChange:Xe,violations:Bt,readOnly:z,projectId:d,addToast:r,columnAgentsEnabled:Ms})}),ae==="actions"&&e.jsx("div",{className:"wf-mobile-actions",children:z?e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflows.readOnlyBuiltin","Built-in workflow: structure is read-only, prompts are editable.")}),e.jsxs("button",{className:"wf-editor-action","data-testid":"wf-mobile-export",onClick:bt,children:[e.jsx(St,{size:15})," ",s("workflows.export","Export")]}),e.jsxs("button",{className:"wf-editor-save wf-editor-duplicate-primary","data-testid":"wf-mobile-duplicate",onClick:Bs,children:[e.jsx(Se,{size:15})," ",s("workflows.duplicateToCustomize","Duplicate to customize")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"wf-editor-save","data-testid":"wf-mobile-save",onClick:qs,disabled:O,children:[O?e.jsx(Ie,{size:15,className:"wf-spin"}):e.jsx(is,{size:15}),s("common.save","Save")]}),e.jsxs("button",{className:"wf-editor-action","data-testid":"wf-mobile-ai-edit",onClick:()=>Lt(t=>!t),children:[e.jsx(He,{size:15})," ",s("workflows.aiEdit","Design with AI")]}),Ot&&e.jsxs("div",{className:"wf-ai-panel wf-mobile-ai-panel","data-testid":"wf-mobile-ai-panel",role:"dialog","aria-busy":je,children:[e.jsx("textarea",{className:"wf-ai-prompt","data-testid":"wf-mobile-ai-edit-prompt",rows:4,value:ht,disabled:je,placeholder:s("workflows.aiPromptPlaceholder","e.g. Run lint and tests before merge, then post a changelog comment after merge"),onChange:t=>{Tt(t.target.value),$e&&_e(null)}}),$e&&e.jsx("p",{className:"wf-create-error",role:"alert","data-testid":"wf-mobile-ai-edit-error",children:$e}),e.jsxs("div",{className:"wf-ai-actions",children:[e.jsxs("button",{type:"button",className:"btn btn-primary wf-ai-submit","data-testid":"wf-mobile-ai-edit-submit",disabled:je,onClick:()=>void Ls(),children:[je?e.jsx(Ie,{size:13,className:"wf-spin"}):e.jsx(He,{size:13}),s("workflows.aiSubmit","Design with AI")]}),je&&e.jsx("button",{type:"button",className:"btn wf-ai-cancel",onClick:Ts,children:s("common.cancel","Cancel")})]})]}),e.jsxs("button",{className:"wf-editor-action","data-testid":"wf-mobile-auto-layout",onClick:Os,children:[e.jsx(ts,{size:15})," ",s("workflowNodes.autoLayout","Auto-layout")]}),e.jsxs("button",{className:"wf-editor-action","data-testid":"wf-mobile-export",onClick:bt,disabled:it,children:[e.jsx(St,{size:15})," ",s("workflows.export","Export")]}),e.jsxs("button",{className:"wf-editor-delete","data-testid":"wf-mobile-delete",onClick:_s,children:[e.jsx(be,{size:15})," ",s("common.delete","Delete")]})]})})]})]}),z?e.jsxs("div",{className:"wf-editor-readonly-banner",role:"status","data-testid":"wf-readonly-banner",children:[e.jsx("span",{className:"wf-editor-readonly-note",children:s("workflows.readOnlyBuiltin","Built-in workflow: structure is read-only, prompts are editable.")}),e.jsxs("button",{className:"wf-editor-action","data-testid":"wf-export",onClick:bt,title:s("workflows.exportTooltip","Download as JSON — contains your full prompt and command text"),children:[e.jsx(St,{size:13})," ",s("workflows.export","Export")]}),e.jsxs("button",{className:"wf-editor-save wf-editor-duplicate-primary",onClick:Bs,children:[e.jsx(Se,{size:13})," ",s("workflows.duplicateToCustomize","Duplicate to customize")]})]}):e.jsxs("div",{className:"wf-editor-toolbar",children:[e.jsx("div",{className:"wf-editor-palette",children:Va.map(({kind:t,label:l,icon:n,presetConfig:p})=>e.jsxs("button",{className:"wf-palette-btn",onClick:()=>kt(t,l,p),children:[e.jsx(n,{size:13})," ",l]},l))}),e.jsxs("div",{className:"wf-editor-actions",children:[e.jsxs("div",{className:"wf-ai-edit-wrap",children:[e.jsxs("button",{className:"wf-editor-action","data-testid":"wf-ai-edit","aria-expanded":Ot,onClick:()=>{Lt(t=>!t),_e(null)},children:[e.jsx(He,{size:13})," ",s("workflows.aiEdit","Design with AI")]}),Ot&&e.jsxs("div",{className:"wf-ai-panel","data-testid":"wf-ai-panel",role:"dialog","aria-busy":je,"aria-label":s("workflows.aiEdit","Design with AI"),children:[e.jsx("textarea",{className:"wf-ai-prompt","data-testid":"wf-ai-edit-prompt",rows:3,value:ht,disabled:je,placeholder:s("workflows.aiPromptPlaceholder","e.g. Run lint and tests before merge, then post a changelog comment after merge"),onChange:t=>{Tt(t.target.value),$e&&_e(null)}}),$e&&e.jsx("p",{className:"wf-create-error",role:"alert","data-testid":"wf-ai-edit-error",children:$e}),e.jsxs("div",{className:"wf-ai-actions",children:[e.jsxs("button",{type:"button",className:"btn btn-primary wf-ai-submit","data-testid":"wf-ai-edit-submit",disabled:je,onClick:()=>void Ls(),children:[je?e.jsx(Ie,{size:13,className:"wf-spin"}):e.jsx(He,{size:13})," ",s("workflows.aiSubmit","Design with AI")]}),je&&e.jsx("button",{type:"button",className:"btn wf-ai-cancel","data-testid":"wf-ai-edit-cancel",onClick:Ts,children:s("common.cancel","Cancel")})]})]})]}),e.jsxs("button",{className:"wf-editor-action",onClick:Os,"data-testid":"wf-auto-layout",children:[e.jsx(ts,{size:13})," ",s("workflowNodes.autoLayout","Auto-layout")]}),e.jsxs("button",{className:"wf-editor-action","data-testid":"wf-export",onClick:bt,disabled:it,title:it?s("workflows.exportDirtyTooltip","Save before exporting"):s("workflows.exportTooltip","Download as JSON — contains your full prompt and command text"),children:[e.jsx(St,{size:13})," ",s("workflows.export","Export")]}),e.jsxs("button",{className:"wf-editor-delete",onClick:_s,children:[e.jsx(be,{size:13})," ",s("common.delete","Delete")]}),e.jsxs("button",{className:"wf-editor-save",onClick:qs,disabled:O,children:[O?e.jsx(Ie,{size:13,className:"wf-spin"}):e.jsx(is,{size:13})," ",s("common.save","Save")]})]})]}),Ps&&e.jsxs("section",{className:"wf-templates","data-testid":"wf-palette-templates","aria-label":s("workflowNodes.templatesSection","Templates"),children:[e.jsxs("div",{className:"wf-templates-header",children:[e.jsxs("button",{type:"button",className:"wf-templates-toggle","aria-expanded":!We,"data-testid":"wf-templates-toggle",onClick:()=>ro(t=>!t),children:[We?e.jsx(Ee,{size:13}):e.jsx(Ce,{size:13}),e.jsx(en,{size:13})," ",s("workflowNodes.templatesSection","Templates")]}),!We&&_t>8&&e.jsx("input",{type:"text",className:"wf-templates-filter","data-testid":"wf-template-filter",value:ft,onChange:t=>ps(t.target.value),placeholder:s("workflowNodes.templateFilterPlaceholder","Filter templates"),"aria-label":s("workflowNodes.templateFilterLabel","Filter templates")})]}),!We&&e.jsxs("div",{className:"wf-templates-body",children:[pt&&e.jsx("div",{className:"wf-templates-conflict",role:"alert","data-testid":"wf-tpl-conflict",children:s("workflowNodes.templateSeamConflict",`This fragment duplicates the "{{seam}}" seam already on the canvas, so it can't be inserted.`,{seam:pt})}),pe.fragmentEntries.length>0&&e.jsxs("div",{className:"wf-templates-group",children:[e.jsx("h4",{className:"wf-templates-group-title",children:s("workflowNodes.templatesFragments","Fragments")}),e.jsx("div",{className:"wf-templates-entries",children:pe.fragmentEntries.map(t=>e.jsx("button",{type:"button",className:"wf-templates-entry","data-testid":`wf-tpl-fragment-${t.id}`,disabled:z,"aria-label":s("workflowNodes.insertTemplate","Insert template {{name}}",{name:t.name}),onClick:()=>Ds(t),children:t.name},t.id))})]}),pe.stepEntries.length>0&&e.jsxs("div",{className:"wf-templates-group",children:[e.jsx("h4",{className:"wf-templates-group-title",children:s("workflowNodes.templatesBuiltinSteps","Built-in steps")}),e.jsx("div",{className:"wf-templates-entries",children:pe.stepEntries.map(t=>e.jsx("button",{type:"button",className:"wf-templates-entry","data-testid":`wf-tpl-step-${t.id}`,disabled:z,"aria-label":s("workflowNodes.insertTemplate","Insert template {{name}}",{name:t.name}),onClick:()=>vt(t),children:t.name},t.id))})]}),pe.pluginEntries.length>0&&e.jsxs("div",{className:"wf-templates-group",children:[e.jsx("h4",{className:"wf-templates-group-title",children:s("workflowNodes.templatesPluginSteps","Plugin steps")}),e.jsx("div",{className:"wf-templates-entries",children:pe.pluginEntries.map(({pluginId:t,template:l})=>e.jsxs("button",{type:"button",className:"wf-templates-entry","data-testid":`wf-tpl-plugin-${l.id}`,disabled:z,"aria-label":s("workflowNodes.insertTemplate","Insert template {{name}}",{name:l.name}),onClick:()=>vt(l),children:[l.name,e.jsx("span",{className:"wf-templates-badge",children:t})]},`${t}:${l.id}`))})]})]})]}),T&&e.jsx("div",{className:"wf-editor-banner",role:"alert",children:T}),Q&&e.jsx("div",{className:"wf-editor-banner wf-editor-banner--info",role:"status","data-testid":"wf-interpreter-only-banner",children:s("workflowNodes.interpreterOnly","This workflow branches, so it runs on the graph interpreter — it can't compile to the linear step engine, but it will still run.")}),Re.length>0&&e.jsx("div",{className:"wf-editor-banner wf-editor-banner--warn",role:"alert","data-testid":"wf-unplaced-summary",children:s("workflowColumns.unplacedCount","{{count}} nodes not placed in a column",{count:Re.length})}),e.jsxs("div",{className:"wf-editor-canvas",ref:Rt,tabIndex:-1,children:[g&&de&&f&&f.data.kind!=="end"&&e.jsxs("button",{type:"button",className:"wf-inspector-toggle wf-inspector-toggle--collapsed","data-testid":"wf-inspector-toggle","aria-expanded":"false",onClick:()=>re(!1),children:[e.jsx(Ee,{size:13}),e.jsx("span",{children:s("workflowNodes.showInspector","Show node details")})]}),wo&&e.jsx("div",{className:"wf-trivial-hint",role:"status","data-testid":"wf-trivial-hint",children:s("workflowNodes.trivialGraphHint","This workflow only runs start → end. Add steps from the palette above to build it out.")}),e.jsx(Ul.Provider,{value:Xt,children:e.jsxs(Bo,{nodes:qe,edges:G,nodeTypes:Yl,onNodesChange:ne,onEdgesChange:C,onConnect:bo,onNodeDragStop:vo,deleteKeyCode:z?null:["Backspace","Delete"],onBeforeDelete:jo,onNodesDelete:No,onEdgesDelete:yo,onNodeClick:(t,l)=>{L(l.id),ee(null),re(!1)},onEdgeClick:(t,l)=>{ee(l.id),L(null)},onPaneClick:()=>{L(null),ee(null)},defaultEdgeOptions:{interactionWidth:Kl},defaultViewport:{x:0,y:0,zoom:1},children:[e.jsx(qo,{}),e.jsx(Vo,{}),e.jsxs("button",{type:"button",className:`wf-minimap-toggle nodrag nopan${U?" wf-minimap-toggle--collapsed":""}`,"aria-expanded":!U,"aria-controls":"wf-workflow-minimap","data-testid":"wf-minimap-toggle",onClick:()=>he(t=>!t),children:[U?e.jsx(va,{size:13,"aria-hidden":!0}):e.jsx(ga,{size:13,"aria-hidden":!0}),e.jsx("span",{children:U?s("workflowNodes.showMiniMap","Show mini map"):s("workflowNodes.hideMiniMap","Hide mini map")})]}),!U&&e.jsx(Go,{id:"wf-workflow-minimap",pannable:!0,zoomable:!0,nodeColor:Wn,nodeStrokeColor:$n,maskColor:"color-mix(in srgb, var(--surface) 70%, transparent)",bgColor:"var(--surface)"})]})})]})]}):e.jsxs("div",{className:"wf-editor-empty wf-editor-canvas-empty wf-editor-onboard",children:[e.jsx(ba,{className:"wf-editor-onboard-icon",size:40,"aria-hidden":!0}),e.jsx("h3",{className:"wf-editor-onboard-title",children:s("workflows.emptyTitle","No workflow selected")}),e.jsx("p",{className:"wf-editor-onboard-text",children:s("workflows.emptyDescription","Workflows orchestrate the steps and gates that run around task execution. Create one to start arranging that flow.")}),e.jsxs("button",{className:"wf-editor-save wf-editor-onboard-cta","data-testid":"wf-empty-create",onClick:()=>m(!0),children:[e.jsx(Se,{size:14})," ",s("workflows.newWorkflow","New workflow")]})]})]}),Vs&&!(g&&de)&&!(R&&!g)&&e.jsxs("aside",{className:"wf-editor-inspector","data-testid":"wf-node-inspector",children:[e.jsxs("div",{className:"wf-inspector-heading",children:[e.jsx("h3",{children:s("workflowNodes.nodeInspector","Node")}),g&&e.jsxs("button",{type:"button",className:"wf-inspector-toggle wf-inspector-toggle--expanded","data-testid":"wf-inspector-toggle","aria-expanded":"true",onClick:()=>{ke?L(null):re(!0)},children:[e.jsx(Ce,{size:13}),e.jsx("span",{children:s("workflowNodes.collapseInspector","Collapse")})]})]}),z&&e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowNodes.readOnlyDuplicateToEdit","Built-in structure is read-only — prompts on prompt and gate nodes can be edited here.")}),e.jsxs("fieldset",{className:"wf-inspector-fields",disabled:z,children:[f.data.kind!=="start"&&e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("common:labels.name","Name")}),e.jsx("input",{value:f.data.label,onChange:t=>$({label:t.target.value})})]}),f.data.kind==="start"&&e.jsxs("div",{"data-testid":"wf-start-inspector",children:[e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowNodes.startNote","The start node marks where a task enters the workflow.")}),Z.length>0&&e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.startEntryColumn","Entry column")}),e.jsxs("select",{"data-testid":"wf-start-entry-column",value:String(f.data.column??""),onChange:t=>$({column:t.target.value||void 0}),children:[e.jsx("option",{value:"",children:s("workflowNodes.startEntryColumnAuto","— Auto (first column)")}),Z.map(t=>e.jsx("option",{value:t.id,children:t.name},t.id))]})]})]})]}),f.data.kind==="prompt"||f.data.kind==="gate"?e.jsxs("div",{className:"wf-prompt-editor",children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.prompt","Prompt")}),e.jsx("textarea",{rows:5,value:Ve,readOnly:!Nt,onChange:t=>Ys(t.target.value),onBlur:Js})]}),e.jsxs("div",{className:"wf-prompt-override-actions",children:[z&&Ks?e.jsx("span",{className:"wf-prompt-override-badge","data-testid":"wf-prompt-overridden",children:s("workflowEditor.promptOverridden","Overridden")}):null,z?e.jsx("button",{type:"button",className:"btn btn-sm",onClick:Xs,disabled:!Kt||jt,children:jt?s("workflowEditor.promptSaving","Saving…"):s("workflowEditor.resetPromptDefault","Reset to default")}):null]}),e.jsx("button",{type:"button",className:"btn btn-sm wf-prompt-expand-btn wf-prompt-expand-btn--inline",onClick:Hs,"aria-label":s("workflowEditor.expandPrompt","Expand prompt editor"),title:s("workflowEditor.expandPrompt","Expand prompt editor"),children:e.jsx(va,{size:14})})]}):null,e.jsxs("fieldset",{className:"wf-inspector-fields",disabled:z,children:[f.data.kind==="prompt"?e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.executor","Executor")}),e.jsxs("select",{value:me,onChange:t=>$({config:{executor:t.target.value}}),children:[e.jsx("option",{value:"model",children:s("workflowEditor.model","Model")}),e.jsx("option",{value:"agent",children:s("workflowEditor.agent","Agent")}),e.jsx("option",{value:"skill",children:s("workflowEditor.skill","Skill")}),e.jsx("option",{value:"cli",children:s("workflowEditor.cliScript","CLI / script")}),e.jsx("option",{value:"cli-agent",children:s("workflowEditor.cliAgent.executorOption")})]})]}),Oe&&e.jsx("p",{className:"wf-inspector-note wf-inspector-note--warn","data-testid":"wf-node-overridden-by-column-agent",children:s("workflowColumns.overriddenByColumnAgent","Overridden by column agent {{name}} — this node's executor settings are superseded.",{name:Ro?.name??s("workflowColumns.agentNotFound","Agent not found — {{id}}",{id:Oe.agentId})})}),me==="model"&&e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.model","Model")}),e.jsx(rs,{label:s("workflowEditor.model","Model"),models:De,value:Wa(String(f.data.config?.modelProvider??""),String(f.data.config?.modelId??"")),onChange:t=>{const{provider:l,modelId:n}=$a(t);$({config:{modelProvider:l||void 0,modelId:n||void 0}})}})]}),me==="agent"&&(()=>{const t=String(f.data.config?.agentId??""),l=t!==""&&!ye.some(n=>n.id===t);return e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.agent","Agent")}),e.jsxs("select",{value:t,onChange:n=>$({config:{agentId:n.target.value||void 0}}),children:[e.jsx("option",{value:"",children:s("workflowEditor.selectAgent","— select agent —")}),l&&e.jsx("option",{value:t,children:s("workflowColumns.agentNotFound","Agent not found — {{id}}",{id:t})}),ye.map(n=>e.jsx("option",{value:n.id,children:n.name},n.id))]}),l&&e.jsx("p",{className:"wf-inspector-note wf-inspector-note--warn","data-testid":"wf-node-agent-stale",children:s("workflowColumns.agentNotFound","Agent not found — {{id}}",{id:t})})]})})(),me==="skill"&&(()=>{const t=String(f.data.config?.skillName??""),l=t?Ge.find(p=>ja(p.name)===ja(t)):void 0,n=l?l.name:t;return e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.skill","Skill")}),e.jsxs("select",{value:n,onChange:p=>$({config:{skillName:p.target.value||void 0}}),children:[e.jsx("option",{value:"",children:s("workflowEditor.selectSkill","— select skill —")}),Ge.map(p=>e.jsx("option",{value:p.name,children:p.name},p.id))]})]})})(),me==="cli"&&e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.cliMode","CLI mode")}),e.jsxs("select",{value:String(f.data.config?.cliMode??"command"),onChange:t=>$({config:{cliMode:t.target.value}}),children:[e.jsx("option",{value:"command",children:s("workflowEditor.command","Command")}),e.jsx("option",{value:"script",children:s("workflowEditor.namedScript","Named script")})]})]}),(f.data.config?.cliMode??"command")==="command"?e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.command","Command")}),e.jsx("textarea",{rows:3,placeholder:qn,value:String(f.data.config?.cliCommand??""),onChange:t=>$({config:{cliCommand:t.target.value}})}),e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowEditor.cliCommandNote","Runs an arbitrary command in the task worktree. The first time this exact command runs, the task pauses for your approval. The node prompt is passed via FUSION_NODE_PROMPT.")}),e.jsxs("label",{className:"wf-field wf-field--checkbox",children:[e.jsx("input",{type:"checkbox",checked:f.data.config?.cliSkipApproval===!0,onChange:t=>$({config:{cliSkipApproval:t.target.checked}})}),e.jsx("span",{children:s("workflowEditor.skipFirstRunApproval","Skip first-run approval (runs without pausing)")})]})]}):e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.scriptName","Script name")}),e.jsx("input",{value:String(f.data.config?.scriptName??""),onChange:t=>$({config:{scriptName:t.target.value}})}),e.jsx("span",{className:"wf-inspector-note",children:s("workflowEditor.namedScriptNote","Named script from project settings. The node prompt is passed via FUSION_NODE_PROMPT.")})]})]}),me==="cli-agent"&&e.jsxs("div",{"data-testid":"cli-agent-config",children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.cliAgent.adapterLabel")}),e.jsxs("select",{"data-testid":"cli-agent-adapter",value:String(f.data.config?.cliAdapterId??""),onChange:t=>$({config:{cliAdapterId:t.target.value||void 0}}),children:[e.jsx("option",{value:"",children:s("workflowEditor.cliAgent.adapterPlaceholder")}),Po.map(t=>e.jsxs("option",{value:t.id,children:[t.name," (",s(`workflowEditor.cliAgent.tier.${t.tier}`),")"]},t.id))]}),e.jsx("span",{className:"wf-inspector-note",children:s("workflowEditor.cliAgent.adapterNote")})]}),e.jsxs("label",{className:"wf-field wf-field--checkbox",children:[e.jsx("input",{type:"checkbox","data-testid":"cli-agent-autonomy",checked:!!f.data.config?.cliAutonomy?.autoApprove,onChange:t=>$({config:{cliAutonomy:{...f.data.config?.cliAutonomy??{},autoApprove:t.target.checked}}})}),e.jsx("span",{children:s("workflowEditor.cliAgent.autonomyLabel")})]}),!!f.data.config?.cliAutonomy?.autoApprove&&e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowEditor.cliAgent.autonomyNote")}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.cliAgent.notifyLabel")}),e.jsxs("select",{"data-testid":"cli-agent-notify",value:String(f.data.config?.cliNotify?.mode??"banner"),onChange:t=>$({config:{cliNotify:{mode:t.target.value}}}),children:[e.jsx("option",{value:"banner",children:s("workflowEditor.cliAgent.notify.banner")}),e.jsx("option",{value:"banner+notify",children:s("workflowEditor.cliAgent.notify.bannerNotify")})]}),e.jsx("span",{className:"wf-inspector-note",children:s("workflowEditor.cliAgent.notifyNote")})]})]}),e.jsxs("label",{className:"wf-field wf-field--checkbox",children:[e.jsx("input",{type:"checkbox",checked:!!f.data.config?.autoApprove,onChange:t=>$({config:{autoApprove:t.target.checked}})}),e.jsx("span",{children:s("workflowEditor.autoApproveRequests","Auto-approve requests")})]}),!!f.data.config?.autoApprove&&e.jsx("p",{className:"wf-inspector-note",children:s("workflowEditor.autoApproveRequestsNote","Runs without pausing for approval — e.g. a CLI command executes on its first run without waiting for your sign-off.")}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.maxRetries","Max retries")}),e.jsx("input",{type:"number",min:1,max:10,placeholder:"default",value:f.data.config?.maxRetries!=null?String(f.data.config.maxRetries):"",onChange:t=>{const l=t.target.value.trim();if(l==="")$({config:n=>{const p={...n};return delete p.maxRetries,p}});else{const n=parseInt(l,10);isNaN(n)||$({config:{maxRetries:n}})}}})]}),e.jsxs("label",{className:"wf-field wf-field--checkbox",children:[e.jsx("input",{type:"checkbox",checked:!!f.data.config?.awaitInput,onChange:t=>$({config:{awaitInput:t.target.checked}})}),e.jsx("span",{children:s("workflowEditor.waitForUserInput","Wait for user input")})]}),!!f.data.config?.awaitInput&&e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowEditor.waitForUserInputNote","This node pauses the task until you reply in the task's comments and unpause. The Prompt field above is shown to the user as the question.")})]}):null,f.data.kind==="script"?e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowEditor.scriptName","Script name")}),e.jsx("input",{value:String(f.data.config?.scriptName??""),onChange:t=>$({config:{scriptName:t.target.value}})})]}):null,f.data.kind==="hold"?e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.releaseCondition","Release condition")}),e.jsxs("select",{value:String(f.data.config?.release??"manual"),onChange:t=>$({config:{release:t.target.value}}),children:[e.jsx("option",{value:"manual",children:s("workflowNodes.releaseManual","Manual promote")}),e.jsx("option",{value:"timer",children:s("workflowNodes.releaseTimer","Timer")}),e.jsx("option",{value:"capacity",children:s("workflowNodes.releaseCapacity","Downstream capacity")}),e.jsx("option",{value:"dependency",children:s("workflowNodes.releaseDependency","Dependency complete")}),e.jsx("option",{value:"external-event",children:s("workflowNodes.releaseExternal","External event")})]})]}):null,f.data.kind==="join"?e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.joinMode","Join mode")}),e.jsxs("select",{value:(()=>{const t=f.data.config?.mode;return t&&typeof t=="object"&&"quorum"in t?"quorum":typeof t=="string"?t:"all"})(),onChange:t=>{const l=t.target.value;$(l==="quorum"?{config:{mode:{quorum:2}}}:{config:{mode:l}})},children:[e.jsx("option",{value:"all",children:s("workflowNodes.joinAll","All branches")}),e.jsx("option",{value:"any",children:s("workflowNodes.joinAny","Any branch")}),e.jsx("option",{value:"quorum",children:s("workflowNodes.joinQuorum","Quorum (n)")})]})]}),(()=>{const t=f.data.config?.mode;return t&&typeof t=="object"&&"quorum"in t})()&&e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.quorumN","Quorum count (n)")}),e.jsx("input",{type:"number",min:1,value:String(f.data.config?.mode?.quorum??2),onChange:t=>{const l=parseInt(t.target.value,10);isNaN(l)||$({config:{mode:{quorum:l}}})}})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.failurePolicy","On branch failure")}),e.jsxs("select",{value:String(f.data.config?.onBranchFailure??"collect"),onChange:t=>$({config:{onBranchFailure:t.target.value}}),children:[e.jsx("option",{value:"collect",children:s("workflowNodes.failureCollect","Collect (wait for all)")}),e.jsx("option",{value:"fail-fast",children:s("workflowNodes.failureFailFast","Fail-fast (cancel siblings)")})]})]})]}):null,f.data.kind==="split"?e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowNodes.splitNote","Branches run concurrently from this node. Execute and merge seams are not allowed inside a branch.")}):null,f.data.kind==="foreach"?(()=>{const t=String(f.data.config?.mode??"sequential"),l=t==="parallel";return e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.foreachMode","Mode")}),e.jsxs("select",{value:t,onChange:n=>{const p=n.target.value;$({config:N=>({...N,mode:p,...p==="parallel"&&N.isolation==="shared"?{isolation:"worktree"}:{}})})},children:[e.jsx("option",{value:"sequential",children:s("workflowNodes.foreachSequential","Sequential")}),e.jsx("option",{value:"parallel",children:s("workflowNodes.foreachParallel","Parallel")})]})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.foreachIsolation","Isolation")}),e.jsxs("select",{value:String(f.data.config?.isolation??(l?"worktree":"shared")),onChange:n=>$({config:{isolation:n.target.value}}),children:[e.jsx("option",{value:"shared",disabled:l,children:s("workflowNodes.foreachShared","Shared worktree")}),e.jsx("option",{value:"worktree",children:s("workflowNodes.foreachWorktree","Per-step worktree")})]})]}),l&&e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.foreachConcurrency","Concurrency")}),e.jsx("input",{type:"number",min:1,max:8,placeholder:"2",value:f.data.config?.concurrency!=null?String(f.data.config.concurrency):"",onChange:n=>{const p=n.target.value.trim();if(p==="")$({config:N=>{const _={...N};return delete _.concurrency,_}});else{const N=parseInt(p,10);isNaN(N)||$({config:{concurrency:N}})}}})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.foreachMaxRework","Max rework cycles")}),e.jsx("input",{type:"number",min:1,max:10,placeholder:"3",value:f.data.config?.maxReworkCycles!=null?String(f.data.config.maxReworkCycles):"",onChange:n=>{const p=n.target.value.trim();if(p==="")$({config:N=>{const _={...N};return delete _.maxReworkCycles,_}});else{const N=parseInt(p,10);isNaN(N)||$({config:{maxReworkCycles:N}})}}})]}),e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowNodes.foreachNote","Expands once per planned step. Drop a step-execute node (and optional step-review) into the region.")})]})})():null,f.data.kind==="loop"?(()=>{const t=f.data.config?.exitWhen&&typeof f.data.config.exitWhen=="object"?f.data.config.exitWhen:{type:"output-contains",value:"DONE"},l=String(t.type??"output-contains"),n=String(l==="output-matches"?t.pattern??"":t.value??"");return e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.loopExitType","Exit condition")}),e.jsxs("select",{value:l,onChange:p=>{const N=p.target.value;$({config:_=>{const I=_.exitWhen&&typeof _.exitWhen=="object"?_.exitWhen:{},H=String(N==="output-matches"?I.pattern??I.value??"":I.value??I.pattern??""),ge={...I,type:N};return delete ge.pattern,delete ge.value,{..._,exitWhen:N==="output-matches"?{...ge,pattern:H}:{...ge,value:H}}}})},children:[e.jsx("option",{value:"output-contains",children:s("workflowNodes.loopOutputContains","Output contains")}),e.jsx("option",{value:"output-matches",children:s("workflowNodes.loopOutputMatches","Output matches regex")})]})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:l==="output-matches"?s("workflowNodes.loopPattern","Pattern"):s("workflowNodes.loopValue","Value")}),e.jsx("input",{value:n,placeholder:l==="output-matches"?"DONE|COMPLETE":"DONE",onChange:p=>{const N=p.target.value;$({config:_=>{const I=_.exitWhen&&typeof _.exitWhen=="object"?_.exitWhen:{};return{..._,exitWhen:l==="output-matches"?{...I,type:l,pattern:N}:{...I,type:l,value:N}}}})}})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.loopNodeId","Watch node id (optional)")}),e.jsx("input",{value:String(t.nodeId??""),placeholder:s("workflowNodes.loopNodeIdPlaceholder","Template exit node"),onChange:p=>{const N=p.target.value.trim();$({config:_=>{const H={..._.exitWhen&&typeof _.exitWhen=="object"?_.exitWhen:{type:"output-contains",value:"DONE"}};return N?H.nodeId=N:delete H.nodeId,{..._,exitWhen:H}}})}})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.loopMaxIterations","Max iterations")}),e.jsx("input",{type:"number",min:1,max:50,placeholder:"3",value:f.data.config?.maxIterations!=null?String(f.data.config.maxIterations):"",onChange:p=>{const N=p.target.value.trim();$({config:_=>{const I={..._};if(N==="")delete I.maxIterations;else{const H=parseInt(N,10);isNaN(H)||(I.maxIterations=H)}return I}})}})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.loopTimeoutMs","Timeout (ms)")}),e.jsx("input",{type:"number",min:1,max:36e5,placeholder:"300000",value:f.data.config?.timeoutMs!=null?String(f.data.config.timeoutMs):"",onChange:p=>{const N=p.target.value.trim();$({config:_=>{const I={..._};if(N==="")delete I.timeoutMs;else{const H=parseInt(N,10);isNaN(H)||(I.timeoutMs=H)}return I}})}})]}),e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowNodes.loopNote","Repeats the template until the selected output matches, an iteration limit is reached, or the timeout expires.")})]})})():null,f.data.kind==="step-review"?e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.reviewType","Review type")}),e.jsxs("select",{value:String(f.data.config?.type??"code"),onChange:t=>$({config:{type:t.target.value}}),children:[e.jsx("option",{value:"plan",children:s("workflowNodes.reviewPlan","Plan review")}),e.jsx("option",{value:"code",children:s("workflowNodes.reviewCode","Code review")})]})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.reviewModel","Review model (optional)")}),e.jsx(rs,{label:s("workflowNodes.reviewModel","Review model (optional)"),models:De,value:Wa(String(f.data.config?.modelProvider??""),String(f.data.config?.modelId??"")),onChange:t=>{const{provider:l,modelId:n}=$a(t);$({config:{modelProvider:l||void 0,modelId:n||void 0,model:t||void 0}})}})]}),e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowNodes.reviewNote","Verdicts route as outcome edges. Click an outgoing edge to set its verdict and rework behavior.")})]}):null,f.data.kind==="parse-steps"?e.jsxs(e.Fragment,{children:[Yt.length>0?e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.parseArtifact","Artifact")}),e.jsx("select",{value:String(f.data.config?.artifact??Yt[0]),onChange:t=>$({config:{artifact:t.target.value}}),children:Yt.map(t=>e.jsx("option",{value:t,children:t},t))})]}):e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.parseArtifact","Artifact")}),e.jsx("input",{placeholder:"PROMPT.md",value:String(f.data.config?.artifact??"PROMPT.md"),onChange:t=>$({config:{artifact:t.target.value}})})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.parseParser","Parser")}),e.jsx("select",{value:String(f.data.config?.parser??"step-headings"),onChange:t=>$({config:{parser:t.target.value}}),children:Array.from(new Set([String(f.data.config?.parser??"step-headings"),...oo])).map(t=>e.jsx("option",{value:t,children:t},t))})]})]}):null,f.data.kind==="code"?e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.codeSource","Source (TypeScript)")}),e.jsx("textarea",{className:"wf-code-source",rows:8,spellCheck:!1,placeholder:Vn,value:String(f.data.config?.source??""),onChange:t=>$({config:{source:t.target.value}})})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.codeTimeout","Timeout (ms)")}),e.jsx("input",{type:"number",min:1,placeholder:"30000",value:f.data.config?.timeoutMs!=null?String(f.data.config.timeoutMs):"",onChange:t=>{const l=t.target.value.trim();if(l==="")$({config:n=>{const p={...n};return delete p.timeoutMs,p}});else{const n=parseInt(l,10);isNaN(n)||$({config:{timeoutMs:n}})}}})]}),e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowNodes.codeNote","Runs sandboxed TypeScript. Syntax is validated at save.")})]}):null,f.data.kind==="notify"?(()=>{const t=String(f.data.config?.event??"workflow-notify"),l=!qa.includes(t);return e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.notifyEvent","Event type")}),e.jsxs("select",{value:l?ls:t,onChange:n=>{const p=n.target.value;$({config:{event:p===ls?"custom-event":p}})},children:[qa.map(n=>e.jsx("option",{value:n,children:n},n)),e.jsx("option",{value:ls,children:s("workflowNodes.notifyCustom","Custom")})]})]}),l?e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.notifyCustomEvent","Custom event")}),e.jsx("input",{value:t,placeholder:"custom-event",onChange:n=>$({config:{event:n.target.value}})})]}):null,e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.notifyTitle","Title (optional)")}),e.jsx("input",{value:String(f.data.config?.title??"{{taskTitle}}"),placeholder:"{{taskTitle}}",onChange:n=>$({config:{title:n.target.value}})})]}),e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.notifyMessage","Message (optional)")}),e.jsx("textarea",{rows:4,value:String(f.data.config?.message??""),placeholder:Gn,onChange:n=>$({config:{message:n.target.value}})})]}),e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowNodes.notifyNote","Templates may use {{taskTitle}}, {{taskId}}, {{workflowName}}, and {{context:key}}.")})]})})():null,f.data.kind==="prompt"||f.data.kind==="gate"||f.data.kind==="script"?e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.gateMode","Gate mode")}),e.jsxs("select",{value:String(f.data.config?.gateMode??(f.data.kind==="prompt"?"advisory":"gate")),onChange:t=>$({config:{gateMode:t.target.value}}),children:[e.jsx("option",{value:"advisory",children:s("workflowNodes.advisory","Advisory")}),e.jsx("option",{value:"gate",children:s("workflowNodes.gateBlocks","Gate (blocks)")})]})]}):f.data.kind==="merge"?e.jsx("p",{className:"wf-inspector-note",children:s("workflowNodes.mergeBoundaryNote","Steps before this marker run pre-merge; steps after run post-merge.")}):null]}),!z&&e.jsxs("button",{type:"button",className:"wf-editor-delete wf-inspector-delete","data-testid":"wf-delete-node",onClick:()=>{$s([f.id]),L(null)},children:[e.jsx(be,{size:13})," ",s("workflowNodes.deleteNode","Delete node")]})]}),Ne&&e.jsxs("aside",{className:"wf-editor-inspector","data-testid":"wf-edge-inspector",children:[e.jsxs("div",{className:"wf-inspector-heading",children:[e.jsx("h3",{children:s("workflowNodes.edgeInspector","Edge")}),g&&e.jsxs("button",{type:"button",className:"wf-inspector-toggle wf-inspector-toggle--expanded","data-testid":"wf-edge-inspector-close","aria-expanded":"true",onClick:()=>ee(null),children:[e.jsx(Ce,{size:13}),e.jsx("span",{children:s("workflowNodes.collapseInspector","Collapse")})]})]}),e.jsx("fieldset",{className:"wf-inspector-fields",disabled:z,children:Qs==="verdicts"?e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.edgeVerdict","Review verdict")}),e.jsxs("select",{"data-testid":"wf-edge-verdict",value:(()=>{const t=String(Ne.data?.condition??"success");return t.startsWith("outcome:")?t.slice(8):""})(),onChange:t=>{const l=t.target.value;Gt({condition:l?`outcome:${l}`:"success"})},children:[e.jsx("option",{value:"",children:s("workflowNodes.edgeNoVerdict","— success (no verdict) —")}),Bn.map(t=>e.jsx("option",{value:t,children:t},t))]})]}),e.jsxs("label",{className:"wf-field wf-field--checkbox",children:[e.jsx("input",{type:"checkbox","data-testid":"wf-edge-rework",checked:Ne.data?.kind==="rework",onChange:t=>Gt({rework:t.target.checked})}),e.jsx("span",{children:s("workflowNodes.edgeRework","Rework edge (loop back, bounded)")})]}),e.jsx("p",{className:"wf-inspector-note wf-inspector-note--info",children:s("workflowNodes.edgeReworkNote","Rework edges are the only legal cycles — they loop back within the for-each step instance, bounded by Max rework cycles.")})]}):Qs==="conditions"?e.jsxs("label",{className:"wf-field",children:[e.jsx("span",{children:s("workflowNodes.edgeCondition","Condition")}),e.jsxs("select",{"data-testid":"wf-edge-condition",value:String(Ne.data?.condition??"success"),onChange:t=>Gt({condition:t.target.value}),children:[e.jsx("option",{value:"success",children:s("workflowNodes.conditionSuccess","success")}),e.jsx("option",{value:"failure",children:s("workflowNodes.conditionFailure","failure")})]})]}):e.jsx("p",{className:"wf-inspector-note",children:s("workflowNodes.edgeConditionLabel","Condition: {{condition}}",{condition:String(Ne.data?.condition??"success")})})}),!z&&e.jsxs("button",{type:"button",className:"wf-editor-delete wf-inspector-delete","data-testid":"wf-delete-edge",onClick:()=>{$s([Ne.id]),ee(null)},children:[e.jsx(be,{size:13})," ",s("workflowNodes.deleteEdge","Delete edge")]})]})]}),ct&&e.jsx(Kn,{workflows:F,onCreate:Co,onDesign:So,onClose:dt})]});return e.jsxs(e.Fragment,{children:[u?e.jsx("div",{className:"workflow-editor-embedded right-dock-embedded-view",children:ta}):e.jsx("div",{className:"modal-overlay open wf-editor-overlay",...Oo,children:ta}),Lo]})}function ai({isOpen:a,onClose:r,addToast:d,projectId:w,initialPanel:i,initialAction:h,initialWorkflowId:A,presentation:u="modal"}){const F=o.useRef(null),{isEmbedded:M,resizePersistEnabled:E}=dl(u);return rl(F,a&&E,"fusion:workflow-node-editor-size"),a?e.jsx(zo,{children:e.jsx(Yn,{onClose:r,addToast:d,projectId:w,initialPanel:i,initialAction:h,initialWorkflowId:A,modalRef:F,isEmbedded:M})}):null}export{ai as WorkflowNodeEditor};
@@ -0,0 +1 @@
1
+ .wf-editor-modal{--wf-editor-touch-target: calc(var(--space-xl) + var(--space-lg) + var(--space-xs));display:flex;flex-direction:column;width:min(1200px,95vw);height:min(820px,92vh);min-width:640px;min-height:480px;resize:both;overflow:hidden;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md)}.workflow-editor-embedded{display:flex;width:100%;height:100%;min-height:0}.wf-editor-modal--embedded{width:100%;height:100%;max-width:none;max-height:none;min-width:0;min-height:0;position:static;resize:none;box-shadow:none;border:none;border-radius:0}.wf-create-modal{--wf-editor-touch-target: calc(var(--space-xl) + var(--space-lg) + var(--space-xs))}.wf-editor-header{box-sizing:border-box;display:flex;flex-shrink:0;align-items:center;justify-content:space-between;gap:var(--space-sm);min-height:var(--view-header-min-height);padding:var(--space-lg) var(--space-xl);background:var(--surface);border-bottom:none}.wf-editor-header h2{display:flex;align-items:center;gap:var(--space-sm);min-width:0;margin:0;font-size:1.125rem;font-weight:600;color:var(--text)}.wf-editor-header h2 svg{flex-shrink:0;color:var(--todo)}.wf-editor-header h2 span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wf-editor-close{display:inline-flex;align-items:center;background:transparent;border:none;color:var(--text-muted);cursor:pointer}.wf-migration-notice{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);background:color-mix(in srgb,var(--accent) 12%,transparent);border-bottom:1px solid var(--border);color:var(--text);font-size:.85rem}.wf-migration-notice-text{flex:1}.wf-migration-notice-dismiss{display:inline-flex;align-items:center;background:transparent;border:none;color:var(--text-muted);cursor:pointer;flex-shrink:0}.wf-migration-notice-dismiss:hover,.wf-editor-close:hover{color:var(--text)}.wf-editor-body{display:flex;flex:1;min-width:0;min-height:0}.wf-editor-sidebar{display:flex;flex-direction:column;gap:var(--space-xs);width:300px;min-width:0;padding:var(--space-sm);border-right:1px solid var(--border);overflow-x:hidden;overflow-y:auto}.wf-editor-body--sidebar-collapsed .wf-editor-sidebar{display:none}.wf-editor-sidebar-head{display:flex;align-items:center;gap:var(--space-xs);min-width:0}.wf-editor-sidebar-head .wf-editor-new{flex:1 1 auto;justify-content:center}.wf-sidebar-shell-toggle,.wf-sidebar-shell-restore{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-xs);min-height:30px;padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);box-shadow:var(--shadow-sm);font:inherit;font-size:.72rem;font-weight:600;cursor:pointer;white-space:nowrap;transition:background var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.wf-sidebar-shell-toggle{flex:0 0 auto;width:30px;padding-inline:0}.wf-sidebar-shell-restore{flex:0 0 auto;width:30px;padding-inline:0;white-space:nowrap}.wf-sidebar-shell-toggle:hover,.wf-sidebar-shell-restore:hover{border-color:var(--accent);background:var(--surface-hover);color:var(--accent)}.wf-sidebar-shell-toggle:focus-visible,.wf-sidebar-shell-restore:focus-visible{outline:none;box-shadow:var(--focus-ring)}.wf-sidebar-panels{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0;margin-top:var(--space-sm);padding-top:var(--space-sm);border-top:1px solid var(--border)}.wf-sidebar-section{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.wf-sidebar-section-toggle{display:flex;align-items:center;gap:var(--space-xs);width:100%;min-width:0;padding:var(--space-xs) var(--space-sm);background:transparent;border:none;border-radius:var(--radius-sm);color:var(--text);font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;cursor:pointer}.wf-sidebar-section-toggle:hover{background:var(--bg-secondary)}.wf-sidebar-section .wf-column-panel,.wf-sidebar-section .wf-fields-panel{width:auto;min-width:0;padding:0 var(--space-xs) var(--space-xs);border-left:none;overflow-y:visible}.wf-sidebar-section .wf-column-panel-header h3,.wf-sidebar-section .wf-fields-panel-header h3{display:none}.wf-sidebar-section .wf-column-panel-header,.wf-sidebar-section .wf-fields-panel-header{justify-content:flex-end}.wf-editor-new{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);cursor:pointer}.wf-editor-new:hover{background:var(--bg-tertiary)}.wf-editor-import{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);cursor:pointer}.wf-editor-import:hover{background:var(--bg-tertiary)}.wf-editor-import:disabled{opacity:.6;cursor:default}.wf-editor-import-error{padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--ws-error) 8%,var(--bg-secondary));border:1px solid var(--ws-error);border-radius:var(--radius-sm);color:var(--ws-error);font-size:.8rem}.wf-editor-import-warnings{padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--ws-warning) 8%,var(--bg-secondary));border:1px solid var(--ws-warning);border-radius:var(--radius-sm);color:var(--ws-warning);font-size:.8rem}.wf-editor-import-warning{margin:0}.wf-editor-import-warning+.wf-editor-import-warning{margin-top:var(--space-xs)}.wf-editor-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px;min-width:0}.wf-editor-list li{min-width:0}.wf-editor-list-item{width:100%;min-width:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap;padding:var(--space-xs) var(--space-sm);background:transparent;border:1px solid transparent;border-radius:var(--radius-sm);color:var(--text);cursor:pointer}.wf-editor-list-item:hover{background:var(--bg-secondary)}.wf-editor-list-item.active{background:var(--bg-tertiary);border-color:var(--border)}.wf-editor-empty{display:flex;align-items:center;gap:var(--space-xs);padding:var(--space-md);color:var(--text-muted);font-size:.85rem}.wf-editor-select-note{padding:var(--space-sm) var(--space-md);background:color-mix(in srgb,var(--ws-info) 8%,var(--bg-secondary));border:1px solid var(--ws-info);border-radius:var(--radius-sm);color:var(--text);font-size:.85rem}.wf-editor-canvas-wrap{display:flex;flex-direction:column;flex:1;min-width:0;position:relative}.wf-editor-mobile-back{display:none}.wf-editor-canvas-empty{flex:1;justify-content:center}.wf-editor-onboard{flex-direction:column;text-align:center;gap:var(--space-sm);padding:var(--space-lg)}.wf-editor-onboard-icon{color:var(--text-muted)}.wf-editor-onboard-title{margin:0;font-size:1rem;color:var(--text)}.wf-editor-onboard-text{margin:0;max-width:36ch;color:var(--text-muted)}.wf-editor-onboard-cta{margin-top:var(--space-xs)}.wf-trivial-hint{position:absolute;top:var(--space-sm);left:50%;transform:translate(-50%);z-index:5;pointer-events:none;max-width:min(90%,42ch);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--ws-info) 8%,var(--bg-secondary));border:1px solid var(--ws-info);border-radius:var(--radius-sm);color:var(--ws-info);font-size:.8rem;text-align:center}.wf-editor-toolbar{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm);border-bottom:1px solid var(--border);flex-wrap:wrap}.wf-editor-palette{display:flex;gap:var(--space-xs);flex-wrap:wrap;min-width:0}.wf-palette-btn,.wf-editor-action,.wf-editor-delete,.wf-editor-save{display:inline-flex;align-items:center;gap:var(--space-xs);min-width:0;padding:var(--space-xs) var(--space-sm);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);cursor:pointer;overflow-wrap:anywhere;transition:background var(--transition-fast)}.wf-palette-btn:hover,.wf-editor-action:hover,.wf-editor-delete:hover{background:var(--bg-tertiary)}.wf-editor-action:disabled{opacity:.6;cursor:default}.wf-editor-actions{display:flex;align-items:center;gap:var(--space-xs)}.wf-editor-toolbar .wf-editor-action,.wf-editor-toolbar .wf-editor-delete,.wf-editor-toolbar .wf-editor-save,.wf-editor-readonly-banner .wf-editor-action,.wf-editor-readonly-banner .wf-editor-save{white-space:nowrap;overflow-wrap:normal}.wf-editor-readonly-note{font-size:.75rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.04em}.wf-templates{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border-bottom:1px solid var(--border)}.wf-templates-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.wf-templates-toggle{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:transparent;border:none;border-radius:var(--radius-sm);color:var(--text);font-weight:600;cursor:pointer}.wf-templates-toggle:hover{background:var(--bg-tertiary)}.wf-templates-filter{flex:0 1 220px;padding:var(--space-xs) var(--space-sm);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-size:.8rem}.wf-templates-body{display:flex;flex-direction:column;gap:var(--space-sm)}.wf-templates-conflict{padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--ws-error) 8%,var(--bg-secondary));border:1px solid var(--ws-error);border-radius:var(--radius-sm);color:var(--ws-error);font-size:.8rem}.wf-templates-group{display:flex;flex-direction:column;gap:var(--space-xs)}.wf-templates-group-title{margin:0;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim)}.wf-templates-entries{display:flex;flex-wrap:wrap;gap:var(--space-xs)}.wf-templates-entry{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-size:.8rem;cursor:pointer;transition:background var(--transition-fast)}.wf-templates-entry:hover{background:var(--bg-tertiary)}.wf-templates-entry:disabled{opacity:.6;cursor:default}.wf-templates-badge{padding:0 var(--space-xs);background:color-mix(in srgb,var(--accent) 12%,transparent);border-radius:var(--radius-sm);color:var(--text-muted);font-size:.7rem}.wf-inspector-fields{display:contents;border:none;margin:0;padding:0;min-inline-size:0}.wf-editor-save{background:var(--todo);border-color:var(--todo);color:var(--bg)}.wf-editor-save:disabled{opacity:.6;cursor:default}.wf-editor-delete{color:var(--ws-error)}.wf-inspector-delete{margin-top:var(--space-sm);justify-content:center}.wf-editor-banner{padding:var(--space-sm) var(--space-md);background:var(--bg-secondary);border-bottom:1px solid var(--ws-warning);color:var(--ws-warning);font-size:.85rem}.wf-editor-banner--info{border-bottom-color:var(--ws-info);color:var(--ws-info);background:color-mix(in srgb,var(--ws-info) 6%,var(--bg-secondary))}.wf-editor-canvas{flex:1;width:100%;min-width:0;min-height:0;overflow:hidden;position:relative}.wf-editor-canvas .react-flow__controls{background:var(--surface);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-sm);color:var(--text);overflow:hidden}.wf-editor-canvas .react-flow__controls-button{background:var(--surface);border:0;border-bottom:var(--btn-border-width) solid var(--border);color:var(--text);fill:currentColor}.wf-editor-canvas .react-flow__controls-button:hover{background:var(--surface-hover);color:var(--text)}.wf-editor-canvas .react-flow__controls-button svg{fill:currentColor;stroke:currentColor}.wf-editor-canvas .react-flow__minimap{background:var(--surface);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-sm)}.wf-editor-canvas .react-flow__minimap-node{stroke:var(--border-strong, var(--border))}.wf-editor-canvas .react-flow__minimap-mask{fill:color-mix(in srgb,var(--surface) 70%,transparent)}.wf-minimap-toggle{position:absolute;right:calc(200px + var(--space-sm));bottom:var(--space-sm);z-index:6;display:inline-flex;align-items:center;gap:var(--space-xs);min-height:28px;padding:var(--space-xs) var(--space-sm);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);font:inherit;font-size:.72rem;font-weight:600;cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.wf-minimap-toggle:hover{border-color:var(--accent);background:var(--surface-hover);color:var(--accent)}.wf-minimap-toggle:focus-visible{outline:none;box-shadow:var(--focus-ring)}.wf-minimap-toggle--collapsed{right:var(--space-sm)}.wf-mobile-shell{display:none}.wf-layout-toggle{display:inline-flex;align-items:center;gap:var(--space-xs);width:fit-content;min-height:30px;padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary);color:var(--text-muted);font:inherit;font-size:.8rem;cursor:pointer}.wf-layout-toggle:hover{background:var(--bg-tertiary);color:var(--text)}.wf-layout-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.wf-editor-body--simple-layout :where(.wf-editor-readonly-banner),.wf-editor-body--simple-layout :where(.wf-editor-toolbar),.wf-editor-body--simple-layout :where(.wf-templates),.wf-editor-body--simple-layout :where(.wf-editor-canvas){display:none}.wf-editor-body--simple-layout .wf-mobile-shell{display:flex;flex:1 1 auto;min-height:0;flex-direction:column;border-top:1px solid var(--border);overflow:hidden}.wf-mobile-tabs{display:flex;flex:0 0 auto;gap:var(--space-xs);padding:var(--space-sm);overflow-x:auto;overflow-y:visible;border-bottom:1px solid var(--border)}.wf-mobile-tab{flex:0 0 auto;min-height:var(--wf-editor-touch-target);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary);color:var(--text);cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast),box-shadow var(--transition-fast)}.wf-mobile-tab--active{border-color:var(--accent, var(--ws-info));background:var(--bg-tertiary)}.wf-mobile-tab:hover{background:var(--bg-tertiary)}.wf-mobile-tab:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.wf-mobile-tab:active{transform:scale(.97)}.wf-mobile-panel{flex:1 1 auto;min-height:0;overflow-y:auto}.wf-mobile-add,.wf-mobile-actions,.wf-mobile-destination{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-sm)}.wf-mobile-add-section{display:flex;flex-direction:column;gap:var(--space-sm)}.wf-mobile-add-section h3,.wf-mobile-template-group h4{margin:0;color:var(--text);font-size:.85rem}.wf-mobile-add-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-xs)}.wf-mobile-add-option,.wf-mobile-template-option{display:inline-flex;align-items:center;justify-content:flex-start;gap:var(--space-xs);min-width:0;min-height:var(--wf-editor-touch-target);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary);color:var(--text);cursor:pointer;text-align:left;overflow-wrap:anywhere;transition:background var(--transition-fast),transform var(--transition-fast),box-shadow var(--transition-fast)}.wf-mobile-add-option:hover,.wf-mobile-template-option:hover{background:var(--bg-tertiary)}.wf-mobile-add-option:focus-visible,.wf-mobile-template-option:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.wf-mobile-add-option:active,.wf-mobile-template-option:active{transform:scale(.97)}.wf-mobile-template-filter{width:100%}.wf-mobile-template-group{display:flex;flex-direction:column;gap:var(--space-xs)}.wf-mobile-actions .wf-editor-action,.wf-mobile-actions .wf-editor-delete,.wf-mobile-actions .wf-editor-save{justify-content:center;min-height:var(--wf-editor-touch-target)}.wf-mobile-ai-panel{position:static;inset:auto;width:100%;box-shadow:none}.wf-editor-inspector{display:flex;flex-direction:column;gap:var(--space-sm);width:280px;padding:var(--space-md);border-left:1px solid var(--border);overflow-y:auto}.wf-editor-inspector h3{margin:0;font-size:.9rem;color:var(--text)}.wf-inspector-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.wf-inspector-toggle{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary);color:var(--text);font:inherit;cursor:pointer}.wf-inspector-toggle:hover{background:var(--bg-tertiary)}.wf-inspector-toggle--collapsed{position:absolute;right:var(--space-sm);bottom:var(--space-sm);z-index:5;box-shadow:var(--shadow-sm)}.wf-field{display:flex;flex-direction:column;gap:var(--space-xs);font-size:.8rem;color:var(--text-muted)}.wf-field input,.wf-field textarea,.wf-field select{padding:var(--space-xs) var(--space-sm);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font:inherit}.wf-field input:focus,.wf-field textarea:focus,.wf-field select:focus{outline:none;box-shadow:var(--focus-ring)}.wf-prompt-editor{position:relative}.wf-prompt-editor--fullscreen{position:fixed;inset:0;z-index:10000;background:var(--surface);padding:max(var(--space-lg),env(safe-area-inset-top,0)) max(var(--space-lg),env(safe-area-inset-right,0)) max(var(--space-lg),env(safe-area-inset-bottom,0)) max(var(--space-lg),env(safe-area-inset-left,0));display:flex;flex-direction:column}.wf-prompt-editor--fullscreen .wf-field{flex:1;display:flex;flex-direction:column}.wf-prompt-editor--fullscreen textarea{flex:1;min-height:unset;resize:none;border-radius:var(--radius-md);font-size:.9375rem;line-height:1.6}.wf-prompt-fullscreen-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-md);font-size:.8125rem;font-weight:600;color:var(--text-muted)}.wf-prompt-expand-btn{display:inline-flex;align-items:center;gap:var(--space-xs)}.wf-prompt-expand-btn--inline{position:absolute;top:calc(var(--space-xs) + 1.2em + var(--space-xs));right:var(--space-xs);z-index:2;color:var(--text-muted);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:calc(var(--space-xs) / 2) var(--space-xs)}.wf-prompt-expand-btn--inline:hover{background:var(--bg-tertiary);color:var(--text)}.wf-prompt-editor:not(.wf-prompt-editor--fullscreen) textarea{padding-right:calc(var(--space-xl) + var(--space-md))}.wf-prompt-override-actions{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-sm);margin-top:var(--space-sm);padding-right:calc(var(--space-xl) + var(--space-md))}.wf-prompt-override-actions--fullscreen{justify-content:space-between;padding-right:0}.wf-prompt-override-badge{display:inline-flex;align-items:center;border:1px solid var(--color-warning);border-radius:var(--radius-pill);color:var(--color-warning);padding:calc(var(--space-xs) / 2) var(--space-sm);font-size:.75rem;font-weight:600}.wf-inspector-note{margin:0;font-size:.78rem;color:var(--text-dim)}.wf-inspector-note--info{color:var(--ws-warning)}.wf-field--checkbox{flex-direction:row;align-items:center;gap:var(--space-sm);cursor:pointer}.wf-field--checkbox input[type=checkbox]{width:auto;padding:0;margin:0;background:none;border:none;accent-color:var(--todo);cursor:pointer}.wf-node{display:flex;flex-direction:column;gap:2px;box-sizing:border-box;width:200px;max-width:240px;padding:var(--space-xs) var(--space-sm);background:var(--bg-secondary);border:1px solid var(--border);border-left:3px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-size:.8rem}.wf-node-header{display:flex;align-items:center;gap:var(--space-xs);min-width:0}.wf-node-summary{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.68rem;color:var(--text-muted)}.wf-node-start{border-left-color:var(--ws-success)}.wf-node-end{border-left-color:var(--text-muted)}.wf-node-prompt{border-left-color:var(--accent, var(--todo));background:color-mix(in srgb,var(--accent, var(--todo)) 5%,var(--bg-secondary))}.wf-node-script{border-left-color:var(--text-muted);font-family:var(--font-mono, monospace)}.wf-node-gate{border-left-color:var(--ws-warning);background:color-mix(in srgb,var(--ws-warning) 6%,var(--bg-secondary))}.wf-node-hold{border-left-color:var(--ws-warning)}.wf-node-split,.wf-node-join{border-left-color:var(--accent, var(--ws-info))}.wf-node-merge{border-left-color:var(--ws-info);border-style:dashed}.wf-node-step-execute{border-left-color:var(--accent, var(--ws-info));background:color-mix(in srgb,var(--accent, var(--ws-info)) 5%,var(--bg-secondary))}.wf-node-step-review{border-left-color:var(--ws-info);background:color-mix(in srgb,var(--ws-info) 6%,var(--bg-secondary))}.wf-node-parse-steps{border-left-color:var(--ws-info)}.wf-node-code{border-left-color:var(--text-muted);font-family:var(--font-mono, monospace)}.wf-foreach-group{width:100%;height:100%;box-sizing:border-box;border:1px dashed var(--accent, var(--ws-info));border-radius:var(--radius-md);background:color-mix(in srgb,var(--accent, var(--ws-info)) 6%,transparent);padding:var(--space-xs)}.wf-foreach-group.wf-node--error{border-color:var(--ws-error)}.wf-foreach-header{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:.8rem;color:var(--text)}.wf-foreach-empty{margin-top:var(--space-sm);padding:var(--space-sm);border:1px dashed var(--border);border-radius:var(--radius-sm);font-size:.7rem;color:var(--text-muted);text-align:center}.wf-edge-rework .react-flow__edge-path{stroke:var(--accent, var(--ws-info));stroke-dasharray:5 4;stroke-width:2}.react-flow__edge.wf-edge-failure .react-flow__edge-path{stroke:var(--ws-error);stroke-dasharray:2 4;stroke-width:2}.wf-code-source{font-family:var(--font-mono, monospace);font-size:.72rem;white-space:pre;overflow-x:auto}.wf-editor-sidebar .wf-code-source{overflow-x:hidden;overflow-wrap:anywhere;white-space:pre-wrap}.wf-node-icon{display:inline-flex;flex-shrink:0;color:var(--text-muted)}.wf-node-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wf-node-badge{flex-shrink:0;font-size:.65rem;text-transform:uppercase;padding:1px var(--space-xs);border-radius:var(--radius-sm);background:var(--ws-warning);color:var(--bg)}.wf-spin{animation:wf-spin 1s linear infinite}@keyframes wf-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.wf-column-band{border:1px dashed var(--border);background:color-mix(in srgb,var(--bg-secondary) 65%,transparent);border-radius:var(--radius-md);pointer-events:none}.wf-node--error{border-color:var(--ws-error);border-left-color:var(--ws-error)}.wf-node-error-badge{display:inline-flex;align-items:center;gap:var(--space-xs);flex-shrink:0;font-size:.65rem;padding:1px var(--space-xs);border-radius:var(--radius-sm);background:var(--ws-error);color:var(--bg)}.wf-editor-readonly-banner{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);padding:var(--space-sm) var(--space-md);background:var(--bg-tertiary);border-bottom:1px solid var(--border)}.wf-editor-duplicate-primary{font-weight:600}.wf-editor-banner--warn{background:var(--ws-warning);color:var(--bg)}.wf-name-strip{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-xs) var(--space-sm);border-bottom:1px solid var(--border);flex-wrap:wrap}.wf-workflow-name,.wf-workflow-name--readonly{font-size:.95rem;font-weight:600;color:var(--text);background:none;border:1px solid transparent;border-radius:var(--radius-sm);padding:2px var(--space-xs);cursor:pointer;text-align:left}.wf-workflow-name:hover{background:var(--bg-tertiary)}.wf-workflow-name--readonly{cursor:default}.wf-workflow-name-input{font-size:.95rem;font-weight:600;color:var(--text);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px var(--space-xs)}.wf-workflow-description,.wf-workflow-description--readonly{font-size:.78rem;color:var(--text-dim);background:none;border:1px solid transparent;border-radius:var(--radius-sm);padding:2px var(--space-xs);cursor:pointer;text-align:left}.wf-workflow-description:hover{background:var(--bg-tertiary)}.wf-workflow-description--readonly{cursor:default}.wf-workflow-description-input{font-size:.78rem;color:var(--text);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px var(--space-xs);min-width:220px}.wf-template-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:220px;overflow-y:auto;padding:var(--space-xs);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary)}.wf-template-section{margin:var(--space-xs) 0 var(--space-xs);font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim)}.wf-template-option{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);border:1px solid transparent;border-radius:var(--radius-sm);cursor:pointer;color:var(--text)}.wf-template-option:hover{background:var(--surface-hover)}.wf-template-option.selected{border-color:var(--accent);background:var(--surface-hover-strong)}.wf-template-option:focus-visible{outline:none;box-shadow:var(--focus-ring)}.wf-template-option-name{font-size:.85rem;font-weight:600}.wf-template-option-desc{font-size:.78rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wf-template-option-count{font-size:.72rem;color:var(--text-dim)}.wf-create-error{margin:var(--space-xs) 0 0;font-size:.8rem;color:var(--ws-error)}.wf-column-panel{display:flex;flex-direction:column;gap:var(--space-sm);width:280px;min-width:260px;padding:var(--space-md);border-left:1px solid var(--border);overflow-y:auto}.wf-column-panel-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.wf-column-add,.wf-column-move,.wf-column-remove{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-xs);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast),opacity var(--transition-fast)}.wf-column-add{flex:0 0 auto;padding:var(--space-xs) var(--space-sm);font-size:.72rem;font-weight:600;color:var(--accent)}.wf-column-move,.wf-column-remove{width:1.75rem;min-width:1.75rem;height:1.75rem;padding:0}.wf-column-add:hover:not(:disabled),.wf-column-move:hover:not(:disabled){border-color:var(--accent);background:var(--surface-hover);color:var(--accent)}.wf-column-remove:hover:not(:disabled){border-color:var(--ws-error);background:color-mix(in srgb,var(--ws-error) 12%,transparent);color:var(--ws-error)}.wf-column-add:focus-visible,.wf-column-move:focus-visible,.wf-column-remove:focus-visible{outline:none;box-shadow:var(--focus-ring)}.wf-column-add:disabled,.wf-column-move:disabled,.wf-column-remove:disabled{cursor:not-allowed;border-color:var(--border);background:var(--bg-tertiary);color:var(--text-dim)}.wf-column-panel-empty{font-size:.75rem;color:var(--text-muted);margin:0}.wf-column-panel-errors{display:flex;flex-direction:column;gap:var(--space-xs);margin:0;padding:var(--space-sm);border:1px solid var(--ws-error);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--ws-error) 10%,transparent)}.wf-column-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-sm)}.wf-column-item{border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-xs)}.wf-column-item--error{border-color:var(--ws-error)}.wf-column-item-head{display:flex;align-items:center;gap:var(--space-xs)}.wf-column-name{flex:1;min-width:0;padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);font:inherit;font-size:.78rem;transition:border-color var(--transition-fast),box-shadow var(--transition-fast),background var(--transition-fast)}.wf-column-name:hover:not(:disabled){border-color:var(--accent);background:var(--surface-hover)}.wf-column-name:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.wf-column-name:disabled{background:var(--bg-tertiary);color:var(--text-dim);cursor:not-allowed}.wf-column-item-actions{display:flex;gap:2px}.wf-column-violation{display:flex;align-items:center;gap:var(--space-xs);font-size:.7rem;color:var(--ws-error);margin:0}.wf-column-traits,.wf-column-agent{display:flex;flex-direction:column;gap:var(--space-xs);padding-top:var(--space-xs);border-top:1px dashed var(--border)}.wf-column-trait-options{display:flex;flex-wrap:wrap;gap:var(--space-xs)}.wf-column-trait{display:inline-flex;align-items:center;gap:2px;font-size:.7rem;color:var(--text-muted)}.wf-column-trait input[type=checkbox]{accent-color:var(--todo)}.wf-column-trait input[type=checkbox],.wf-column-agent-mode-option input[type=radio]{margin:0;accent-color:var(--todo)}.wf-column-trait input[type=checkbox]:disabled,.wf-column-agent-mode-option input[type=radio]:disabled{cursor:not-allowed}.wf-column-traits-label,.wf-column-agent-label{font-size:.65rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim)}.wf-column-agent-select{width:100%;min-width:0;padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);font-size:.72rem;transition:border-color var(--transition-fast),box-shadow var(--transition-fast),background var(--transition-fast)}.wf-column-agent-select:hover:not(:disabled){border-color:var(--accent);background:var(--surface-hover)}.wf-column-agent-select:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.wf-column-agent-select:disabled{background:var(--bg-tertiary);color:var(--text-dim);cursor:not-allowed}.wf-column-agent-badge{display:inline-flex;align-items:center;gap:var(--space-xs);flex:0 1 auto;min-width:0;max-width:100%;padding:1px var(--space-xs);border:1px solid color-mix(in srgb,var(--accent) 45%,var(--border));border-radius:var(--radius-sm);background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent);font-size:.65rem;font-weight:600}.wf-column-agent-badge--stale{border-color:color-mix(in srgb,var(--ws-warning) 55%,var(--border));background:color-mix(in srgb,var(--ws-warning) 12%,transparent);color:var(--ws-warning)}.wf-column-agent-error,.wf-column-agent-stale{display:flex;align-items:center;gap:var(--space-xs);margin:0;font-size:.68rem}.wf-column-agent-error{color:var(--ws-error)}.wf-column-agent-stale{color:var(--ws-warning)}.wf-column-agent-mode{display:flex;flex-wrap:wrap;gap:var(--space-xs)}.wf-column-agent-mode-option{display:inline-flex;align-items:center;gap:var(--space-xs);padding:1px var(--space-xs);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary);color:var(--text-muted);font-size:.68rem}.wf-column-agent-mode-option:has(input:checked){border-color:color-mix(in srgb,var(--accent) 55%,var(--border));background:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--text)}.wf-column-agent-mode-option:has(input:disabled){background:var(--bg-tertiary);color:var(--text-dim);cursor:not-allowed}.wf-ai-create{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary)}.wf-ai-toggle{display:inline-flex;align-items:center;gap:var(--space-xs);align-self:flex-start;padding:var(--space-xs) var(--space-xs);background:transparent;border:none;border-radius:var(--radius-sm);color:var(--accent);font-size:.82rem;font-weight:600;cursor:pointer}.wf-ai-toggle:hover{background:var(--surface-hover)}.wf-ai-create-body{display:flex;flex-direction:column;gap:var(--space-xs)}.wf-ai-prompt{width:100%;resize:vertical;padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg);color:var(--text);font-size:.85rem}.wf-ai-prompt:focus-visible{outline:none;box-shadow:var(--focus-ring)}.wf-ai-actions{display:flex;gap:var(--space-xs)}.wf-ai-edit-wrap{position:relative}.wf-ai-panel{position:absolute;top:calc(100% + var(--space-xs));right:0;z-index:20;width:320px;display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);box-shadow:var(--shadow-md)}@media(max-width:768px){.wf-prompt-editor--fullscreen{padding:var(--space-sm)}.wf-prompt-override-actions{align-items:stretch;flex-direction:column;padding-right:0}.modal-overlay:has(.wf-editor-modal:not(.wf-editor-modal--embedded)),.modal-overlay:has(.wf-create-modal){padding-top:0;align-items:stretch;justify-content:stretch}.wf-editor-modal:not(.wf-editor-modal--embedded),.wf-create-modal{width:100vw;min-width:0;max-width:100vw;height:100vh;height:100dvh;min-height:0;max-height:100dvh;margin:0;border:none;border-radius:0;resize:none;flex:1 1 auto}.wf-editor-header,.wf-migration-notice,.wf-editor-readonly-banner{flex-wrap:wrap}.wf-migration-notice,.wf-editor-readonly-banner{gap:var(--space-sm)}.wf-editor-body{flex-direction:column;width:100%;min-width:0;overflow-x:hidden}.wf-editor-body--list-stage .wf-editor-sidebar{display:flex;width:100%;min-width:0;flex:1 1 auto;max-height:none;border-right:none;border-bottom:none;overflow-x:hidden;overflow-y:auto}.wf-editor-body--list-stage .wf-editor-canvas-wrap,.wf-editor-body--list-stage .wf-editor-inspector,.wf-editor-body--editor-stage .wf-editor-sidebar{display:none}.wf-editor-body--editor-stage .wf-editor-canvas-wrap{display:flex;flex:0 1 auto;width:100%;min-width:0;min-height:0;overflow:hidden}.wf-editor-body--editor-stage .wf-editor-canvas{flex:1 1 auto;min-height:0}.wf-editor-body--editor-stage .wf-editor-inspector{width:100%;min-width:0;max-height:none;flex:1 1 auto;min-height:0;border-left:none;border-top:1px solid var(--border);overflow-y:auto}.wf-editor-mobile-back{display:inline-flex;align-items:center;align-self:flex-start;gap:var(--space-xs);min-height:var(--wf-editor-touch-target);margin:var(--space-sm) var(--space-sm) 0;padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);font-size:.8rem;cursor:pointer}.wf-editor-sidebar .wf-column-panel{width:100%;min-width:0;border-left:none;border-top:1px solid var(--border)}.wf-editor-body .wf-settings-panel{width:100%;min-width:0;max-height:50vh;border-left:none;border-top:1px solid var(--border);overflow-y:auto}.wf-editor-canvas-wrap{flex:1 1 auto;width:100%;min-width:0;min-height:0}.wf-editor-canvas{width:100%;min-width:0;max-width:100%;overflow:hidden}.wf-editor-body--editor-stage :where(.wf-editor-readonly-banner),.wf-editor-body--editor-stage :where(.wf-editor-toolbar),.wf-editor-body--editor-stage :where(.wf-templates),.wf-editor-body--editor-stage :where(.wf-editor-canvas){display:none}.wf-mobile-shell{display:flex;flex:1 1 auto;min-height:0;flex-direction:column;border-top:1px solid var(--border);overflow:hidden}.wf-editor-canvas .react-flow,.wf-editor-canvas .react-flow__renderer,.wf-editor-canvas .react-flow__pane,.wf-editor-canvas .react-flow__viewport{width:100%;min-width:0;max-width:100%;height:100%}.wf-editor-list-item,.wf-editor-new,.wf-editor-import,.wf-sidebar-section-toggle,.wf-palette-btn,.wf-editor-action,.wf-editor-delete,.wf-editor-save,.wf-templates-toggle,.wf-templates-entry,.wf-template-option,.wf-ai-toggle,.wf-workflow-name,.wf-workflow-name-input,.wf-column-panel button,.wf-fields-panel button,.wf-settings-panel button{min-height:var(--wf-editor-touch-target)}.wf-editor-list-item,.wf-editor-new,.wf-editor-import,.wf-palette-btn,.wf-editor-action,.wf-editor-delete,.wf-editor-save,.wf-templates-toggle,.wf-templates-entry,.wf-ai-toggle{padding:var(--space-sm) var(--space-md)}.wf-field input,.wf-field textarea,.wf-field select,.wf-column-name,.wf-column-agent-select,.wf-templates-filter,.wf-ai-prompt{min-height:var(--wf-editor-touch-target);padding:var(--space-sm) var(--space-md)}.wf-template-list{max-height:40vh}.wf-editor-toolbar{flex-wrap:nowrap;overflow-x:auto}.wf-editor-palette,.wf-editor-actions{flex:0 0 auto;flex-wrap:nowrap}.wf-templates{flex:0 0 auto}.wf-templates-header{flex-wrap:nowrap}.wf-templates-toggle{flex:0 0 auto}.wf-inspector-toggle{min-height:var(--wf-editor-touch-target);padding:var(--space-sm) var(--space-md)}.wf-ai-panel{position:fixed;inset:var(--space-sm);top:auto;right:auto;z-index:30;width:auto}.wf-editor-inspector{width:100%;max-height:40vh;border-left:none;border-top:1px solid var(--border);overflow-y:auto}.wf-editor-body--mobile-node-detail .wf-editor-canvas-wrap{display:none;min-height:0}.wf-editor-body--mobile-node-detail .wf-editor-inspector{display:flex;flex:1 1 auto;width:100%;min-width:0;min-height:0;max-height:none;border-left:none;border-top:none;overflow-y:auto}.wf-editor-body--mobile-edge-detail .wf-editor-canvas-wrap{display:none;min-height:0}.wf-editor-body--mobile-edge-detail .wf-editor-inspector{display:flex;flex:1 1 auto;width:100%;min-width:0;min-height:0;max-height:none;border-left:none;border-top:none;overflow-y:auto}}.wf-fields-panel{display:flex;flex-direction:column;gap:var(--space-sm);width:300px;min-width:280px;padding:var(--space-md);border-left:1px solid var(--border);overflow-y:auto}.wf-fields-panel-header{display:flex;align-items:center;justify-content:space-between}.wf-fields-add{display:inline-flex;align-items:center;gap:4px}.wf-fields-panel-empty{font-size:.75rem;color:var(--text-muted);margin:0}.wf-fields-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-sm)}.wf-field-item{border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-xs)}.wf-field-item-head{display:flex;align-items:center;gap:var(--space-xs)}.wf-field-name{flex:1;min-width:0}.wf-field-id-row{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-xs)}.wf-field-id-static{font-family:var(--font-mono, monospace);font-size:.7rem;color:var(--text-dim);background:var(--surface-2, color-mix(in srgb, #ffffff 4%, transparent));padding:1px 6px;border-radius:var(--radius-sm)}.wf-field-id-edit{font-size:.65rem;background:none;border:none;color:var(--accent, #4f7cff);cursor:pointer;padding:0}.wf-field-id-warn{display:flex;align-items:center;gap:4px;width:100%;margin:0;font-size:.65rem;color:var(--ws-warning, #f59e0b)}.wf-field-row{display:flex;align-items:flex-end;gap:var(--space-sm)}.wf-field-sub{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0;font-size:.7rem;color:var(--text-muted)}.wf-field-sub>span{font-size:.65rem;text-transform:uppercase;color:var(--text-dim)}.wf-field--checkbox{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;color:var(--text-muted)}.wf-field--checkbox input[type=checkbox]{accent-color:var(--todo)}.wf-field-required{flex:0 0 auto;white-space:nowrap}.wf-field-options{display:flex;flex-direction:column;gap:var(--space-xs);padding-top:var(--space-xs);border-top:1px dashed var(--border)}.wf-field-options-label{font-size:.65rem;text-transform:uppercase;color:var(--text-dim)}.wf-field-option-row{display:flex;align-items:center;gap:4px}.wf-field-option-value,.wf-field-option-label{flex:1;min-width:0}.wf-field-option-colors{display:inline-flex;gap:2px}.wf-field-color-swatch{width:14px;height:14px;border-radius:50%;border:1px solid var(--border);padding:0;cursor:pointer}.wf-field-color-swatch.is-active{outline:2px solid var(--text);outline-offset:1px}.wf-field-option-add{display:inline-flex;align-items:center;gap:4px;align-self:flex-start;font-size:.7rem}.wf-field-render{display:flex;flex-direction:column;gap:var(--space-xs);padding-top:var(--space-xs);border-top:1px dashed var(--border)}.wf-field-preview{padding-top:var(--space-xs)}@media(max-width:768px){.wf-fields-panel{width:100%;min-width:0;padding:var(--space-sm);border-left:none;border-top:1px solid var(--border)}.wf-field-row,.wf-field-option-row{flex-wrap:wrap}}.settings-field-row{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm) 0}.settings-field-row.is-disabled{opacity:.6}.settings-field-row-head{display:flex;align-items:center;gap:var(--space-xs);flex-wrap:wrap}.settings-field-row-label{font-size:.8rem;font-weight:500;color:var(--text)}.settings-field-row-scope{font-size:.6rem;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);background:var(--surface-muted, color-mix(in srgb, #ffffff 4%, transparent));border:1px solid var(--border);border-radius:var(--radius-sm);padding:1px 6px}.settings-field-row-scope--global{color:var(--accent, #7c5cbf);border-color:var(--accent, #7c5cbf)}.settings-field-row-control{display:flex;align-items:center;gap:var(--space-xs)}.settings-field-row-control>input:not([type=checkbox]),.settings-field-row-control>select,.settings-field-row-control>textarea{flex:1;min-width:0}.settings-field-row-clear{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;background:none;border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-muted);cursor:pointer;padding:2px;transition:color var(--duration-fast) ease,border-color var(--duration-fast) ease}.settings-field-row-clear:hover:not(:disabled){color:var(--text);border-color:var(--text-muted)}.settings-field-row-clear:disabled{cursor:default;opacity:.5}.settings-field-row-help{margin:0;font-size:.7rem;color:var(--text-muted)}.settings-field-row-error{margin:0;font-size:.7rem;color:var(--color-error, #f85149)}.settings-toggle{display:inline-flex;align-items:center}.settings-toggle>input[type=checkbox]{cursor:pointer}.settings-toggle>input[type=checkbox]:disabled{cursor:default}.settings-number,.settings-select,.settings-text{width:100%}.settings-textarea{width:100%;resize:vertical;font-family:inherit}.settings-section{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md) 0;border-bottom:1px solid var(--border)}.settings-section:last-child{border-bottom:none}.settings-section-head{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-section-title{margin:0;font-size:.9rem;font-weight:600;color:var(--text)}.settings-section-desc{margin:0;font-size:.75rem;color:var(--text-muted)}.settings-section-body{display:flex;flex-direction:column;gap:var(--space-xs)}.wf-settings-panel-wrap{display:flex;min-height:0}.wf-settings-panel{display:flex;flex-direction:column;gap:var(--space-sm);width:320px;min-width:300px;padding:var(--space-md);border-left:1px solid var(--border);overflow-y:auto;color:var(--text)}.wf-settings-panel-header{display:flex;align-items:center;justify-content:space-between}.wf-settings-tabs{display:flex;gap:2px;border-bottom:1px solid var(--border)}.wf-settings-tab{flex:1;padding:6px 8px;font-size:.72rem;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;transition:color var(--duration-fast) ease,border-color var(--duration-fast) ease}.wf-settings-tab.is-active{color:var(--text);border-bottom-color:var(--accent, #4f7cff)}.wf-settings-tabpanel{display:flex;flex-direction:column;gap:var(--space-sm)}.wf-settings-tabpanel-head{display:flex;align-items:center;justify-content:flex-end}.wf-settings-add,.wf-settings-save-values,.wf-settings-option-add{display:inline-flex;align-items:center;gap:4px}.wf-settings-empty{font-size:.75rem;color:var(--text-muted);margin:0}.wf-settings-note{display:flex;align-items:center;gap:4px;margin:0;font-size:.7rem}.wf-settings-note--info,.wf-settings-note--muted{color:var(--text-muted)}.wf-settings-note--warn{color:var(--ws-warning, #f59e0b)}.wf-settings-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-sm)}.wf-setting-item{border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-xs)}.wf-setting-item-head{display:flex;align-items:center;gap:var(--space-xs)}.wf-setting-name{flex:1;min-width:0}.wf-setting-id-row{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-xs)}.wf-setting-id-static{font-family:var(--font-mono, monospace);font-size:.7rem;color:var(--text-muted);background:var(--surface-2, color-mix(in srgb, #ffffff 4%, transparent));padding:1px 6px;border-radius:var(--radius-sm)}.wf-setting-id-edit{font-size:.65rem;background:none;border:none;color:var(--accent, #4f7cff);cursor:pointer;padding:0}.wf-setting-id-warn{display:flex;align-items:center;gap:4px;width:100%;margin:0;font-size:.65rem;color:var(--ws-warning, #f59e0b)}.wf-setting-row{display:flex;align-items:flex-end;gap:var(--space-sm)}.wf-setting-sub{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0;font-size:.7rem;color:var(--text-muted)}.wf-setting-sub>span{font-size:.65rem;text-transform:uppercase;color:var(--text-muted)}.wf-setting--checkbox{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;color:var(--text-muted)}.wf-setting--checkbox input[type=checkbox]{accent-color:var(--todo)}.wf-setting-options{display:flex;flex-direction:column;gap:var(--space-xs);padding-top:var(--space-xs);border-top:1px dashed var(--border)}.wf-setting-options-label{font-size:.65rem;text-transform:uppercase;color:var(--text-muted)}.wf-setting-option-row{display:flex;align-items:center;gap:4px}.wf-setting-option-value,.wf-setting-option-label{flex:1;min-width:0}.wf-setting-option-colors{display:inline-flex;gap:2px}.wf-setting-color-swatch{width:14px;height:14px;border-radius:50%;border:1px solid var(--border);padding:0;cursor:pointer}.wf-setting-color-swatch.is-active{outline:2px solid var(--text);outline-offset:1px}.wf-settings-values-head{display:flex;align-items:center;justify-content:flex-end}.wf-settings-values-list{display:flex;flex-direction:column;gap:var(--space-md)}.wf-settings-value-group{display:flex;flex-direction:column;gap:var(--space-xs)}.wf-settings-value-group-title{margin:0;font-size:.72rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:0}.wf-settings-value-item{position:relative;display:flex;flex-direction:column;gap:2px}.wf-settings-customized{align-self:flex-start;font-size:.6rem;text-transform:uppercase;letter-spacing:.04em;color:var(--accent, #4f7cff)}.wf-settings-reset-hint{display:flex;align-items:center;gap:4px;margin:0;font-size:.65rem;color:var(--text-muted)}.wf-settings-orphaned{border-top:1px dashed var(--border);padding-top:var(--space-xs)}.wf-settings-orphaned-toggle{display:inline-flex;align-items:center;gap:4px;background:none;border:none;color:var(--text-muted);font-size:.72rem;cursor:pointer;padding:0}.wf-settings-orphaned-body{display:flex;flex-direction:column;gap:var(--space-xs);padding-top:var(--space-xs)}.wf-settings-orphaned-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.wf-settings-orphaned-row{display:flex;align-items:center;gap:var(--space-xs)}.wf-settings-orphan-id{font-family:var(--font-mono, monospace);font-size:.7rem;color:var(--text-muted)}.wf-settings-orphan-value{flex:1;min-width:0;font-size:.7rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wf-settings-orphan-delete{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:0}@media(max-width:768px){.wf-settings-panel-wrap{flex-direction:column}.wf-settings-panel{width:100%;min-width:0;padding:var(--space-sm);border-left:none;border-top:1px solid var(--border)}.wf-setting-row,.wf-setting-option-row,.wf-settings-orphaned-row{flex-wrap:wrap}}.wf-optional-steps-panel{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md)}.wf-optional-steps-header h3{margin:0}.wf-optional-steps-hint,.wf-optional-steps-empty{font-size:.75rem;color:var(--text-muted);margin:0}.wf-optional-steps-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-sm)}.wf-optional-step-item{display:flex;flex-direction:column;gap:4px;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm, 6px)}.wf-optional-step-item.is-unknown{opacity:.6}.wf-optional-step-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.wf-optional-step-title{display:inline-flex;align-items:center;gap:6px;min-width:0}.wf-optional-step-name{font-weight:600;font-size:.8rem}.wf-optional-step-name--unknown{font-style:italic;font-weight:400}.wf-optional-step-description{font-size:.72rem;color:var(--text-muted);margin:0}.wf-optional-step-default{display:inline-flex;align-items:center;gap:6px;font-size:.75rem}.wf-optional-step-remove{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;color:var(--text-muted);cursor:pointer}.wf-optional-step-remove:hover:not(:disabled){color:var(--color-error)}.wf-optional-steps-add{display:flex;flex-direction:column;gap:4px}.wf-optional-steps-add-label{display:inline-flex;align-items:center;gap:4px;font-size:.75rem;color:var(--text-muted)}.mobile-wf-graph{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-sm);overflow-y:auto}.mobile-wf-node-group{display:flex;flex-direction:column;gap:var(--space-xs)}.mobile-wf-node-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-xs);padding-left:calc(var(--mobile-wf-depth, 0) * var(--space-md))}.mobile-wf-node-actions{display:inline-flex;align-items:stretch;gap:var(--space-xs)}.mobile-wf-node-actions--connect{justify-content:flex-end;padding-left:calc((var(--mobile-wf-depth, 0) * var(--space-md)) + var(--space-xs))}.mobile-wf-node-main{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--space-sm);min-width:0;min-height:var(--wf-editor-touch-target);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary);color:var(--text);text-align:left;cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast),box-shadow var(--transition-fast)}.mobile-wf-node-main:hover{background:var(--bg-tertiary)}.mobile-wf-node-main:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.mobile-wf-node-main:active{transform:scale(.97)}.mobile-wf-node-row--selected .mobile-wf-node-main{border-color:var(--accent, var(--ws-info));box-shadow:var(--focus-ring)}.mobile-wf-node-kind{min-width:4.5rem;max-width:6rem;padding:calc(var(--space-xs) / 2) var(--space-xs);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-muted);font-size:.7rem;text-align:center;overflow-wrap:anywhere}.mobile-wf-node-text{display:flex;flex-direction:column;min-width:0;gap:calc(var(--space-xs) / 2)}.mobile-wf-node-title,.mobile-wf-node-summary,.mobile-wf-edge-target{min-width:0;overflow-wrap:anywhere}.mobile-wf-node-title{color:var(--text);font-size:.9rem;font-weight:600}.mobile-wf-node-summary{color:var(--text-muted);font-size:.78rem}.mobile-wf-node-expand,.mobile-wf-node-move,.mobile-wf-connect-button{display:inline-flex;align-items:center;justify-content:center;min-height:var(--wf-editor-touch-target);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary);color:var(--text);cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast),box-shadow var(--transition-fast)}.mobile-wf-node-expand,.mobile-wf-node-move{width:var(--wf-editor-touch-target)}.mobile-wf-node-move:disabled{cursor:not-allowed;opacity:var(--opacity-disabled, .5);transform:none}.mobile-wf-connect-button{gap:var(--space-xs);padding:var(--space-xs) var(--space-sm)}.mobile-wf-node-expand:hover,.mobile-wf-node-move:not(:disabled):hover,.mobile-wf-connect-button:hover{background:var(--bg-tertiary)}.mobile-wf-node-expand:focus-visible,.mobile-wf-node-move:focus-visible,.mobile-wf-connect-button:focus-visible,.mobile-wf-connect-select:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.mobile-wf-node-expand:active,.mobile-wf-node-move:not(:disabled):active,.mobile-wf-connect-button:active{transform:scale(.97)}.mobile-wf-connect-picker{display:grid;gap:var(--space-xs);padding-left:calc((var(--mobile-wf-depth, 0) * var(--space-md)) + var(--space-xs))}.mobile-wf-connect-label{color:var(--text-muted);font-size:.875rem}.mobile-wf-connect-select{width:100%}@media(max-width:768px){.mobile-wf-node-row{grid-template-columns:minmax(0,1fr)}.mobile-wf-node-actions{justify-content:flex-end}.mobile-wf-connect-button{flex:1}}.mobile-wf-node-meta{display:flex;flex-wrap:wrap;gap:var(--space-xs);padding-left:calc((var(--mobile-wf-depth, 0) * var(--space-md)) + var(--space-xs))}.mobile-wf-column-chip,.mobile-wf-edge-chip{display:inline-flex;align-items:center;gap:var(--space-xs);min-height:34px;max-width:100%;padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg);color:var(--text-muted);font-size:.75rem}.mobile-wf-edge-chip{color:var(--text);cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast),box-shadow var(--transition-fast)}.mobile-wf-edge-chip:hover{background:var(--bg-secondary)}.mobile-wf-edge-chip:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.mobile-wf-edge-chip:active{transform:scale(.97)}.mobile-wf-edge-chip--selected{border-color:var(--accent, var(--ws-info))}.mobile-wf-edge-target{color:var(--text-muted)}.mobile-wf-node-children{display:flex;flex-direction:column;gap:var(--space-sm)}.mobile-wf-graph-empty{padding:var(--space-lg);color:var(--text-muted);text-align:center}
@@ -1 +1 @@
1
- import{g}from"./vendor-react-BTgM5bbZ.js";function _(i,s){for(var o=0;o<s.length;o++){const t=s[o];if(typeof t!="string"&&!Array.isArray(t)){for(const e in t)if(e!=="default"&&!(e in i)){const r=Object.getOwnPropertyDescriptor(t,e);r&&Object.defineProperty(i,e,r.get?r:{enumerable:!0,get:()=>t[e]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}var a={exports:{}},d;function y(){return d||(d=1,(function(i,s){(function(o,t){i.exports=t()})(self,(()=>(()=>{var o={};return(()=>{var t=o;Object.defineProperty(t,"__esModule",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const r=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(r._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,r=e._renderService.dimensions;if(r.css.cell.width===0||r.css.cell.height===0)return;const c=this._terminal.options.scrollback===0?0:e.viewport.scrollBarWidth,l=window.getComputedStyle(this._terminal.element.parentElement),m=parseInt(l.getPropertyValue("height")),u=Math.max(0,parseInt(l.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),h=m-(parseInt(n.getPropertyValue("padding-top"))+parseInt(n.getPropertyValue("padding-bottom"))),f=u-(parseInt(n.getPropertyValue("padding-right"))+parseInt(n.getPropertyValue("padding-left")))-c;return{cols:Math.max(2,Math.floor(f/r.css.cell.width)),rows:Math.max(1,Math.floor(h/r.css.cell.height))}}}})(),o})()))})(a)),a.exports}var p=y();const w=g(p),x=_({__proto__:null,default:w},[p]);export{x as a};
1
+ import{g}from"./vendor-react-SZ_qB27O.js";function _(i,s){for(var o=0;o<s.length;o++){const t=s[o];if(typeof t!="string"&&!Array.isArray(t)){for(const e in t)if(e!=="default"&&!(e in i)){const r=Object.getOwnPropertyDescriptor(t,e);r&&Object.defineProperty(i,e,r.get?r:{enumerable:!0,get:()=>t[e]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}var a={exports:{}},d;function y(){return d||(d=1,(function(i,s){(function(o,t){i.exports=t()})(self,(()=>(()=>{var o={};return(()=>{var t=o;Object.defineProperty(t,"__esModule",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const r=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(r._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,r=e._renderService.dimensions;if(r.css.cell.width===0||r.css.cell.height===0)return;const c=this._terminal.options.scrollback===0?0:e.viewport.scrollBarWidth,l=window.getComputedStyle(this._terminal.element.parentElement),m=parseInt(l.getPropertyValue("height")),u=Math.max(0,parseInt(l.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),h=m-(parseInt(n.getPropertyValue("padding-top"))+parseInt(n.getPropertyValue("padding-bottom"))),f=u-(parseInt(n.getPropertyValue("padding-right"))+parseInt(n.getPropertyValue("padding-left")))-c;return{cols:Math.max(2,Math.floor(f/r.css.cell.width)),rows:Math.max(1,Math.floor(h/r.css.cell.height))}}}})(),o})()))})(a)),a.exports}var p=y();const w=g(p),x=_({__proto__:null,default:w},[p]);export{x as a};