claude-code-workflow 7.2.6 → 7.2.7

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 (206) hide show
  1. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -1
  2. package/ccw/dist/core/routes/codexlens/config-handlers.js +4 -0
  3. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -1
  4. package/ccw/dist/mcp-server/index.js +85 -8
  5. package/ccw/dist/mcp-server/index.js.map +1 -1
  6. package/ccw/dist/tools/smart-search.d.ts +72 -1
  7. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  8. package/ccw/dist/tools/smart-search.js +726 -117
  9. package/ccw/dist/tools/smart-search.js.map +1 -1
  10. package/ccw/frontend/dist/assets/{AlertDialog-BMFUcfv_.js → AlertDialog-CSZq4WHZ.js} +2 -2
  11. package/ccw/frontend/dist/assets/{AlertDialog-BMFUcfv_.js.map → AlertDialog-CSZq4WHZ.js.map} +1 -1
  12. package/ccw/frontend/dist/assets/{AnalysisPage-Bxa333tD.js → AnalysisPage-DVDvLHqI.js} +2 -2
  13. package/ccw/frontend/dist/assets/{AnalysisPage-Bxa333tD.js.map → AnalysisPage-DVDvLHqI.js.map} +1 -1
  14. package/ccw/frontend/dist/assets/{ApiSettingsPage-BFVU-wcR.js → ApiSettingsPage-D69j8mI6.js} +2 -2
  15. package/ccw/frontend/dist/assets/{ApiSettingsPage-BFVU-wcR.js.map → ApiSettingsPage-D69j8mI6.js.map} +1 -1
  16. package/ccw/frontend/dist/assets/{CliModeToggle-MDoFAJPL.js → CliModeToggle-fF9xHeGR.js} +2 -2
  17. package/ccw/frontend/dist/assets/{CliModeToggle-MDoFAJPL.js.map → CliModeToggle-fF9xHeGR.js.map} +1 -1
  18. package/ccw/frontend/dist/assets/{CliSessionSharePage-DkRmLiNN.js → CliSessionSharePage-Ce8tOQNx.js} +2 -2
  19. package/ccw/frontend/dist/assets/{CliSessionSharePage-DkRmLiNN.js.map → CliSessionSharePage-Ce8tOQNx.js.map} +1 -1
  20. package/ccw/frontend/dist/assets/{CliViewerPage-DN8jWddy.js → CliViewerPage-Bsp1zmfD.js} +2 -2
  21. package/ccw/frontend/dist/assets/{CliViewerPage-DN8jWddy.js.map → CliViewerPage-Bsp1zmfD.js.map} +1 -1
  22. package/ccw/frontend/dist/assets/{CodexLensManagerPage-Du_VAJtC.js → CodexLensManagerPage-DUMzbrr9.js} +9 -9
  23. package/ccw/frontend/dist/assets/CodexLensManagerPage-DUMzbrr9.js.map +1 -0
  24. package/ccw/frontend/dist/assets/{Collapsible-CF5bSyzt.js → Collapsible-I5pixbHb.js} +2 -2
  25. package/ccw/frontend/dist/assets/{Collapsible-CF5bSyzt.js.map → Collapsible-I5pixbHb.js.map} +1 -1
  26. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bm_P9I76.js → CommandsManagerPage-BH2xukdx.js} +2 -2
  27. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bm_P9I76.js.map → CommandsManagerPage-BH2xukdx.js.map} +1 -1
  28. package/ccw/frontend/dist/assets/{DeepWikiPage-2YIlfWhz.js → DeepWikiPage-D41ccWzY.js} +2 -2
  29. package/ccw/frontend/dist/assets/{DeepWikiPage-2YIlfWhz.js.map → DeepWikiPage-D41ccWzY.js.map} +1 -1
  30. package/ccw/frontend/dist/assets/{EndpointsPage-CMVNz5PY.js → EndpointsPage-5a8jfEWN.js} +2 -2
  31. package/ccw/frontend/dist/assets/{EndpointsPage-CMVNz5PY.js.map → EndpointsPage-5a8jfEWN.js.map} +1 -1
  32. package/ccw/frontend/dist/assets/{ExplorerPage-C-KFz8YU.js → ExplorerPage-YCqIOu1v.js} +2 -2
  33. package/ccw/frontend/dist/assets/{ExplorerPage-C-KFz8YU.js.map → ExplorerPage-YCqIOu1v.js.map} +1 -1
  34. package/ccw/frontend/dist/assets/{FixSessionPage-CdKND69l.js → FixSessionPage-wK1s4kbo.js} +2 -2
  35. package/ccw/frontend/dist/assets/{FixSessionPage-CdKND69l.js.map → FixSessionPage-wK1s4kbo.js.map} +1 -1
  36. package/ccw/frontend/dist/assets/{FloatingFileBrowser-Bf4iqOSd.js → FloatingFileBrowser-B1U6uk_5.js} +2 -2
  37. package/ccw/frontend/dist/assets/{FloatingFileBrowser-Bf4iqOSd.js.map → FloatingFileBrowser-B1U6uk_5.js.map} +1 -1
  38. package/ccw/frontend/dist/assets/{FloatingPanel-CJbvABPb.js → FloatingPanel-D51p5jNy.js} +2 -2
  39. package/ccw/frontend/dist/assets/{FloatingPanel-CJbvABPb.js.map → FloatingPanel-D51p5jNy.js.map} +1 -1
  40. package/ccw/frontend/dist/assets/{GraphExplorerPage-DPoozRTR.js → GraphExplorerPage-DpIWrpWH.js} +2 -2
  41. package/ccw/frontend/dist/assets/{GraphExplorerPage-DPoozRTR.js.map → GraphExplorerPage-DpIWrpWH.js.map} +1 -1
  42. package/ccw/frontend/dist/assets/{HistoryPage-DOMa9gJX.js → HistoryPage-C09lyJGN.js} +2 -2
  43. package/ccw/frontend/dist/assets/{HistoryPage-DOMa9gJX.js.map → HistoryPage-C09lyJGN.js.map} +1 -1
  44. package/ccw/frontend/dist/assets/{HookManagerPage-Cfn2UEyy.js → HookManagerPage-CFBe8F_G.js} +2 -2
  45. package/ccw/frontend/dist/assets/{HookManagerPage-Cfn2UEyy.js.map → HookManagerPage-CFBe8F_G.js.map} +1 -1
  46. package/ccw/frontend/dist/assets/{InstallationsPage-qngOxLvm.js → InstallationsPage-qt7NxnsB.js} +2 -2
  47. package/ccw/frontend/dist/assets/{InstallationsPage-qngOxLvm.js.map → InstallationsPage-qt7NxnsB.js.map} +1 -1
  48. package/ccw/frontend/dist/assets/{IssueHubPage-Cvf7tH8p.js → IssueHubPage-CHol1-Ap.js} +2 -2
  49. package/ccw/frontend/dist/assets/{IssueHubPage-Cvf7tH8p.js.map → IssueHubPage-CHol1-Ap.js.map} +1 -1
  50. package/ccw/frontend/dist/assets/{LiteTasksPage-D20smVCY.js → LiteTasksPage-jH00SLnZ.js} +2 -2
  51. package/ccw/frontend/dist/assets/{LiteTasksPage-D20smVCY.js.map → LiteTasksPage-jH00SLnZ.js.map} +1 -1
  52. package/ccw/frontend/dist/assets/{McpManagerPage-Bld27yu4.js → McpManagerPage-BS-HgeQJ.js} +11 -11
  53. package/ccw/frontend/dist/assets/McpManagerPage-BS-HgeQJ.js.map +1 -0
  54. package/ccw/frontend/dist/assets/{MemoryPage-DmknNdBh.js → MemoryPage-1UahrmRX.js} +2 -2
  55. package/ccw/frontend/dist/assets/{MemoryPage-DmknNdBh.js.map → MemoryPage-1UahrmRX.js.map} +1 -1
  56. package/ccw/frontend/dist/assets/{NotFoundPage-DdwPN1xU.js → NotFoundPage-5FVm_IkS.js} +2 -2
  57. package/ccw/frontend/dist/assets/{NotFoundPage-DdwPN1xU.js.map → NotFoundPage-5FVm_IkS.js.map} +1 -1
  58. package/ccw/frontend/dist/assets/{OrchestratorPage-CgDdmvBg.js → OrchestratorPage-ThBG24Gg.js} +2 -2
  59. package/ccw/frontend/dist/assets/{OrchestratorPage-CgDdmvBg.js.map → OrchestratorPage-ThBG24Gg.js.map} +1 -1
  60. package/ccw/frontend/dist/assets/{ProjectOverviewPage-9Ze9quxh.js → ProjectOverviewPage-CrmW0IxI.js} +2 -2
  61. package/ccw/frontend/dist/assets/{ProjectOverviewPage-9Ze9quxh.js.map → ProjectOverviewPage-CrmW0IxI.js.map} +1 -1
  62. package/ccw/frontend/dist/assets/{PromptHistoryPage-YRkBppOx.js → PromptHistoryPage-1cCGwS3s.js} +2 -2
  63. package/ccw/frontend/dist/assets/{PromptHistoryPage-YRkBppOx.js.map → PromptHistoryPage-1cCGwS3s.js.map} +1 -1
  64. package/ccw/frontend/dist/assets/{ReviewSessionPage-DSaeHw83.js → ReviewSessionPage-DxiEc9HK.js} +2 -2
  65. package/ccw/frontend/dist/assets/{ReviewSessionPage-DSaeHw83.js.map → ReviewSessionPage-DxiEc9HK.js.map} +1 -1
  66. package/ccw/frontend/dist/assets/{RulesManagerPage-BpGwS_jB.js → RulesManagerPage-BpplliZF.js} +2 -2
  67. package/ccw/frontend/dist/assets/{RulesManagerPage-BpGwS_jB.js.map → RulesManagerPage-BpplliZF.js.map} +1 -1
  68. package/ccw/frontend/dist/assets/{SessionDetailPage-B_YHME7k.js → SessionDetailPage-crDIiysh.js} +2 -2
  69. package/ccw/frontend/dist/assets/{SessionDetailPage-B_YHME7k.js.map → SessionDetailPage-crDIiysh.js.map} +1 -1
  70. package/ccw/frontend/dist/assets/{SessionsPage-bW6kEEib.js → SessionsPage-DThweYY8.js} +2 -2
  71. package/ccw/frontend/dist/assets/{SessionsPage-bW6kEEib.js.map → SessionsPage-DThweYY8.js.map} +1 -1
  72. package/ccw/frontend/dist/assets/{SettingsPage-CSwUd2Bw.js → SettingsPage-OCdOz5-z.js} +4 -4
  73. package/ccw/frontend/dist/assets/{SettingsPage-CSwUd2Bw.js.map → SettingsPage-OCdOz5-z.js.map} +1 -1
  74. package/ccw/frontend/dist/assets/{SkillsManagerPage-CyqKvFUi.js → SkillsManagerPage-BJd3bK1G.js} +2 -2
  75. package/ccw/frontend/dist/assets/{SkillsManagerPage-CyqKvFUi.js.map → SkillsManagerPage-BJd3bK1G.js.map} +1 -1
  76. package/ccw/frontend/dist/assets/{SpecsSettingsPage-DHqQNW_y.js → SpecsSettingsPage-BAWL2cpO.js} +2 -2
  77. package/ccw/frontend/dist/assets/{SpecsSettingsPage-DHqQNW_y.js.map → SpecsSettingsPage-BAWL2cpO.js.map} +1 -1
  78. package/ccw/frontend/dist/assets/{Switch-s_-xzEWF.js → Switch-w0I3JCcC.js} +2 -2
  79. package/ccw/frontend/dist/assets/{Switch-s_-xzEWF.js.map → Switch-w0I3JCcC.js.map} +1 -1
  80. package/ccw/frontend/dist/assets/{TabsNavigation-CU50UxOb.js → TabsNavigation-jhUge9YV.js} +2 -2
  81. package/ccw/frontend/dist/assets/{TabsNavigation-CU50UxOb.js.map → TabsNavigation-jhUge9YV.js.map} +1 -1
  82. package/ccw/frontend/dist/assets/{TaskDrawer-128XISsA.js → TaskDrawer-APWpZulm.js} +2 -2
  83. package/ccw/frontend/dist/assets/{TaskDrawer-128XISsA.js.map → TaskDrawer-APWpZulm.js.map} +1 -1
  84. package/ccw/frontend/dist/assets/{TeamPage-Bg_KII8B.js → TeamPage-8OnLsAfJ.js} +2 -2
  85. package/ccw/frontend/dist/assets/{TeamPage-Bg_KII8B.js.map → TeamPage-8OnLsAfJ.js.map} +1 -1
  86. package/ccw/frontend/dist/assets/{TerminalDashboardPage-CQ9K2zwB.js → TerminalDashboardPage-Be1hcN4p.js} +2 -2
  87. package/ccw/frontend/dist/assets/{TerminalDashboardPage-CQ9K2zwB.js.map → TerminalDashboardPage-Be1hcN4p.js.map} +1 -1
  88. package/ccw/frontend/dist/assets/{archive--nR2vYUk.js → archive-Bo1tC9yo.js} +2 -2
  89. package/ccw/frontend/dist/assets/{archive--nR2vYUk.js.map → archive-Bo1tC9yo.js.map} +1 -1
  90. package/ccw/frontend/dist/assets/{archive-restore-CZ7graO0.js → archive-restore-DYx41yLJ.js} +2 -2
  91. package/ccw/frontend/dist/assets/{archive-restore-CZ7graO0.js.map → archive-restore-DYx41yLJ.js.map} +1 -1
  92. package/ccw/frontend/dist/assets/{arrow-right-ChKhpVhq.js → arrow-right-C6pOqWF1.js} +2 -2
  93. package/ccw/frontend/dist/assets/{arrow-right-ChKhpVhq.js.map → arrow-right-C6pOqWF1.js.map} +1 -1
  94. package/ccw/frontend/dist/assets/{bookmark-plus-X-JcgObI.js → bookmark-plus-4Qpa6hMJ.js} +2 -2
  95. package/ccw/frontend/dist/assets/{bookmark-plus-X-JcgObI.js.map → bookmark-plus-4Qpa6hMJ.js.map} +1 -1
  96. package/ccw/frontend/dist/assets/{bot-C3uo7Fkg.js → bot-HXJTmx8r.js} +2 -2
  97. package/ccw/frontend/dist/assets/{bot-C3uo7Fkg.js.map → bot-HXJTmx8r.js.map} +1 -1
  98. package/ccw/frontend/dist/assets/{braces-5wZupwrA.js → braces-Dj2IdY7I.js} +2 -2
  99. package/ccw/frontend/dist/assets/{braces-5wZupwrA.js.map → braces-Dj2IdY7I.js.map} +1 -1
  100. package/ccw/frontend/dist/assets/{circle-stop-DZ5hLKjQ.js → circle-stop-M29TJKHc.js} +2 -2
  101. package/ccw/frontend/dist/assets/{circle-stop-DZ5hLKjQ.js.map → circle-stop-M29TJKHc.js.map} +1 -1
  102. package/ccw/frontend/dist/assets/{cpu-Dc8IS79i.js → cpu-DX15mzMT.js} +2 -2
  103. package/ccw/frontend/dist/assets/{cpu-Dc8IS79i.js.map → cpu-DX15mzMT.js.map} +1 -1
  104. package/ccw/frontend/dist/assets/{ellipsis-vertical-B4pqbrsR.js → ellipsis-vertical-Fs6bysWx.js} +2 -2
  105. package/ccw/frontend/dist/assets/{ellipsis-vertical-B4pqbrsR.js.map → ellipsis-vertical-Fs6bysWx.js.map} +1 -1
  106. package/ccw/frontend/dist/assets/{eye-BwniwXnu.js → eye-D6BRlJ1r.js} +2 -2
  107. package/ccw/frontend/dist/assets/{eye-BwniwXnu.js.map → eye-D6BRlJ1r.js.map} +1 -1
  108. package/ccw/frontend/dist/assets/{eye-off-BWntEdln.js → eye-off-DjbIj5iN.js} +2 -2
  109. package/ccw/frontend/dist/assets/{eye-off-BWntEdln.js.map → eye-off-DjbIj5iN.js.map} +1 -1
  110. package/ccw/frontend/dist/assets/{file-json-BDcmkaVn.js → file-json-kg4Lid-H.js} +2 -2
  111. package/ccw/frontend/dist/assets/{file-json-BDcmkaVn.js.map → file-json-kg4Lid-H.js.map} +1 -1
  112. package/ccw/frontend/dist/assets/{file-text-DsqI3R_g.js → file-text-BMy5pXNV.js} +2 -2
  113. package/ccw/frontend/dist/assets/{file-text-DsqI3R_g.js.map → file-text-BMy5pXNV.js.map} +1 -1
  114. package/ccw/frontend/dist/assets/{filter-CQMcD8RT.js → filter-BTN-lUUb.js} +2 -2
  115. package/ccw/frontend/dist/assets/{filter-CQMcD8RT.js.map → filter-BTN-lUUb.js.map} +1 -1
  116. package/ccw/frontend/dist/assets/{folder-jX77-MUi.js → folder-ChYtty7V.js} +2 -2
  117. package/ccw/frontend/dist/assets/{folder-jX77-MUi.js.map → folder-ChYtty7V.js.map} +1 -1
  118. package/ccw/frontend/dist/assets/{gauge-yQjRXM3o.js → gauge-C0VJbjRb.js} +2 -2
  119. package/ccw/frontend/dist/assets/{gauge-yQjRXM3o.js.map → gauge-C0VJbjRb.js.map} +1 -1
  120. package/ccw/frontend/dist/assets/{globe-BecpCHYI.js → globe-DbNfDXnv.js} +2 -2
  121. package/ccw/frontend/dist/assets/{globe-BecpCHYI.js.map → globe-DbNfDXnv.js.map} +1 -1
  122. package/ccw/frontend/dist/assets/{grid-3x3-BrvzDFqU.js → grid-3x3-xWcpBNxo.js} +2 -2
  123. package/ccw/frontend/dist/assets/{grid-3x3-BrvzDFqU.js.map → grid-3x3-xWcpBNxo.js.map} +1 -1
  124. package/ccw/frontend/dist/assets/{hard-drive-B0cynodE.js → hard-drive-BTACzgUO.js} +2 -2
  125. package/ccw/frontend/dist/assets/{hard-drive-B0cynodE.js.map → hard-drive-BTACzgUO.js.map} +1 -1
  126. package/ccw/frontend/dist/assets/{hash-xOrTLxBg.js → hash-B0dYlmyB.js} +2 -2
  127. package/ccw/frontend/dist/assets/{hash-xOrTLxBg.js.map → hash-B0dYlmyB.js.map} +1 -1
  128. package/ccw/frontend/dist/assets/{history-BzXwj8RL.js → history-CRRLu6ck.js} +2 -2
  129. package/ccw/frontend/dist/assets/{history-BzXwj8RL.js.map → history-CRRLu6ck.js.map} +1 -1
  130. package/ccw/frontend/dist/assets/{index-BNZGm_Ur.js → index-BJIIo0B3.js} +2 -2
  131. package/ccw/frontend/dist/assets/{index-BNZGm_Ur.js.map → index-BJIIo0B3.js.map} +1 -1
  132. package/ccw/frontend/dist/assets/{index-osmL8__2.js → index-BP-D3Wv6.js} +2 -2
  133. package/ccw/frontend/dist/assets/{index-osmL8__2.js.map → index-BP-D3Wv6.js.map} +1 -1
  134. package/ccw/frontend/dist/assets/{index-DflI9CwB.js → index-B_QzEioU.js} +2 -2
  135. package/ccw/frontend/dist/assets/{index-DflI9CwB.js.map → index-B_QzEioU.js.map} +1 -1
  136. package/ccw/frontend/dist/assets/{index-B9aFbBPN.js → index-BpoRYgiq.js} +2 -2
  137. package/ccw/frontend/dist/assets/{index-B9aFbBPN.js.map → index-BpoRYgiq.js.map} +1 -1
  138. package/ccw/frontend/dist/assets/{index-Dy0tUf1F.js → index-CeESlrZb.js} +8 -8
  139. package/ccw/frontend/dist/assets/{index-Dy0tUf1F.js.map → index-CeESlrZb.js.map} +1 -1
  140. package/ccw/frontend/dist/assets/{index-D3uMibtZ.js → index-DzTbMyaS.js} +4 -4
  141. package/ccw/frontend/dist/assets/{index-D3uMibtZ.js.map → index-DzTbMyaS.js.map} +1 -1
  142. package/ccw/frontend/dist/assets/{layout-grid-CWFZqQWu.js → layout-grid-ZN26YcTM.js} +2 -2
  143. package/ccw/frontend/dist/assets/{layout-grid-CWFZqQWu.js.map → layout-grid-ZN26YcTM.js.map} +1 -1
  144. package/ccw/frontend/dist/assets/{lightbulb-BRLgsWe3.js → lightbulb-BHrwx9j6.js} +2 -2
  145. package/ccw/frontend/dist/assets/{lightbulb-BRLgsWe3.js.map → lightbulb-BHrwx9j6.js.map} +1 -1
  146. package/ccw/frontend/dist/assets/{link-2-BpKdq14u.js → link-2-zZRu2j4G.js} +2 -2
  147. package/ccw/frontend/dist/assets/{link-2-BpKdq14u.js.map → link-2-zZRu2j4G.js.map} +1 -1
  148. package/ccw/frontend/dist/assets/{link-BxUCReDi.js → link-8lz-HgnZ.js} +2 -2
  149. package/ccw/frontend/dist/assets/{link-BxUCReDi.js.map → link-8lz-HgnZ.js.map} +1 -1
  150. package/ccw/frontend/dist/assets/{list-Ce9EsAg8.js → list-DlablIjt.js} +2 -2
  151. package/ccw/frontend/dist/assets/{list-Ce9EsAg8.js.map → list-DlablIjt.js.map} +1 -1
  152. package/ccw/frontend/dist/assets/{map-pin-CxzQV1hS.js → map-pin-JAsCUplr.js} +2 -2
  153. package/ccw/frontend/dist/assets/{map-pin-CxzQV1hS.js.map → map-pin-JAsCUplr.js.map} +1 -1
  154. package/ccw/frontend/dist/assets/{messages-square-Dyodk79r.js → messages-square-D0iSFb2Y.js} +2 -2
  155. package/ccw/frontend/dist/assets/{messages-square-Dyodk79r.js.map → messages-square-D0iSFb2Y.js.map} +1 -1
  156. package/ccw/frontend/dist/assets/{minimize-2-s0009UK9.js → minimize-2-BJmkU9CE.js} +2 -2
  157. package/ccw/frontend/dist/assets/{minimize-2-s0009UK9.js.map → minimize-2-BJmkU9CE.js.map} +1 -1
  158. package/ccw/frontend/dist/assets/{package-C69biuJL.js → package-DYrbBCxk.js} +2 -2
  159. package/ccw/frontend/dist/assets/{package-C69biuJL.js.map → package-DYrbBCxk.js.map} +1 -1
  160. package/ccw/frontend/dist/assets/{plug-DERl-wQd.js → plug-VG7-23M-.js} +2 -2
  161. package/ccw/frontend/dist/assets/{plug-DERl-wQd.js.map → plug-VG7-23M-.js.map} +1 -1
  162. package/ccw/frontend/dist/assets/{power-CdvaDgTh.js → power-zPFYNx7u.js} +2 -2
  163. package/ccw/frontend/dist/assets/{power-CdvaDgTh.js.map → power-zPFYNx7u.js.map} +1 -1
  164. package/ccw/frontend/dist/assets/{save-C_Uot2e4.js → save-D4XQY9i9.js} +2 -2
  165. package/ccw/frontend/dist/assets/{save-C_Uot2e4.js.map → save-D4XQY9i9.js.map} +1 -1
  166. package/ccw/frontend/dist/assets/{send-R1XtAXeP.js → send-ClSnDjj-.js} +2 -2
  167. package/ccw/frontend/dist/assets/{send-R1XtAXeP.js.map → send-ClSnDjj-.js.map} +1 -1
  168. package/ccw/frontend/dist/assets/{square-check-big-Cyqi4INj.js → square-check-big-Bffh_MFc.js} +2 -2
  169. package/ccw/frontend/dist/assets/{square-check-big-Cyqi4INj.js.map → square-check-big-Bffh_MFc.js.map} +1 -1
  170. package/ccw/frontend/dist/assets/{square-pen-BmLNjUUw.js → square-pen-DsOvAvME.js} +2 -2
  171. package/ccw/frontend/dist/assets/{square-pen-BmLNjUUw.js.map → square-pen-DsOvAvME.js.map} +1 -1
  172. package/ccw/frontend/dist/assets/{star-CakKtIYu.js → star-TLJjvoy2.js} +2 -2
  173. package/ccw/frontend/dist/assets/{star-CakKtIYu.js.map → star-TLJjvoy2.js.map} +1 -1
  174. package/ccw/frontend/dist/assets/{style-DdNmehyz.js → style-BXKXgpOY.js} +2 -2
  175. package/ccw/frontend/dist/assets/{style-DdNmehyz.js.map → style-BXKXgpOY.js.map} +1 -1
  176. package/ccw/frontend/dist/assets/{target-CUvfwM3S.js → target-FDuAB6SF.js} +2 -2
  177. package/ccw/frontend/dist/assets/{target-CUvfwM3S.js.map → target-FDuAB6SF.js.map} +1 -1
  178. package/ccw/frontend/dist/assets/{test-tube-BVwrOGiZ.js → test-tube-B9vj-Im8.js} +2 -2
  179. package/ccw/frontend/dist/assets/{test-tube-BVwrOGiZ.js.map → test-tube-B9vj-Im8.js.map} +1 -1
  180. package/ccw/frontend/dist/assets/{upload-CY1NwcDw.js → upload-CHgTrVN5.js} +2 -2
  181. package/ccw/frontend/dist/assets/{upload-CY1NwcDw.js.map → upload-CHgTrVN5.js.map} +1 -1
  182. package/ccw/frontend/dist/assets/{useApiSettings-9JuzUfPE.js → useApiSettings-XsHrqf-L.js} +2 -2
  183. package/ccw/frontend/dist/assets/{useApiSettings-9JuzUfPE.js.map → useApiSettings-XsHrqf-L.js.map} +1 -1
  184. package/ccw/frontend/dist/assets/{useCli-Bb7Zo-OI.js → useCli-DOlWtux5.js} +2 -2
  185. package/ccw/frontend/dist/assets/{useCli-Bb7Zo-OI.js.map → useCli-DOlWtux5.js.map} +1 -1
  186. package/ccw/frontend/dist/assets/{useCommands-BUu-hUYI.js → useCommands-DazCajiX.js} +2 -2
  187. package/ccw/frontend/dist/assets/{useCommands-BUu-hUYI.js.map → useCommands-DazCajiX.js.map} +1 -1
  188. package/ccw/frontend/dist/assets/{useDebounce-CptXgLBn.js → useDebounce-Cah-bua6.js} +2 -2
  189. package/ccw/frontend/dist/assets/{useDebounce-CptXgLBn.js.map → useDebounce-Cah-bua6.js.map} +1 -1
  190. package/ccw/frontend/dist/assets/{useFileExplorer-B7dN8VT1.js → useFileExplorer-B9SCPhhl.js} +2 -2
  191. package/ccw/frontend/dist/assets/{useFileExplorer-B7dN8VT1.js.map → useFileExplorer-B9SCPhhl.js.map} +1 -1
  192. package/ccw/frontend/dist/assets/{useLocale-D6USNXOr.js → useLocale-CmG6pxZe.js} +2 -2
  193. package/ccw/frontend/dist/assets/{useLocale-D6USNXOr.js.map → useLocale-CmG6pxZe.js.map} +1 -1
  194. package/ccw/frontend/dist/assets/{useSkills-r8yfiQ-u.js → useSkills-DvEJ0JOv.js} +3 -3
  195. package/ccw/frontend/dist/assets/{useSkills-r8yfiQ-u.js.map → useSkills-DvEJ0JOv.js.map} +1 -1
  196. package/ccw/frontend/dist/assets/{useSystemSettings-BVWDQLMy.js → useSystemSettings-BDpwSa04.js} +2 -2
  197. package/ccw/frontend/dist/assets/{useSystemSettings-BVWDQLMy.js.map → useSystemSettings-BDpwSa04.js.map} +1 -1
  198. package/ccw/frontend/dist/assets/{wand-sparkles-Zdaej5bR.js → wand-sparkles-T2KGCRiy.js} +2 -2
  199. package/ccw/frontend/dist/assets/{wand-sparkles-Zdaej5bR.js.map → wand-sparkles-T2KGCRiy.js.map} +1 -1
  200. package/ccw/frontend/dist/index.html +1 -1
  201. package/codex-lens/src/codexlens/cli/commands.py +12 -1
  202. package/codex-lens/src/codexlens/config.py +12 -0
  203. package/codex-lens/src/codexlens/env_config.py +1 -0
  204. package/package.json +1 -1
  205. package/ccw/frontend/dist/assets/CodexLensManagerPage-Du_VAJtC.js.map +0 -1
  206. package/ccw/frontend/dist/assets/McpManagerPage-Bld27yu4.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"OrchestratorPage-CgDdmvBg.js","sources":["../../../../node_modules/lucide-react/dist/esm/icons/grip-vertical.js","../../../../node_modules/lucide-react/dist/esm/icons/hand.js","../../../../node_modules/lucide-react/dist/esm/icons/library.js","../../../../node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.js","../../src/pages/orchestrator/nodes/NodeWrapper.tsx","../../src/pages/orchestrator/nodes/PromptTemplateNode.tsx","../../src/pages/orchestrator/nodes/index.ts","../../src/pages/orchestrator/InteractionModeToggle.tsx","../../src/pages/orchestrator/FlowCanvas.tsx","../../src/pages/orchestrator/NodeLibrary.tsx","../../src/hooks/useTemplates.ts","../../src/pages/orchestrator/InlineTemplatePanel.tsx","../../src/pages/orchestrator/useResizablePanel.ts","../../src/pages/orchestrator/ResizeHandle.tsx","../../src/pages/orchestrator/LeftSidebar.tsx","../../src/components/ui/CommandCombobox.tsx","../../src/pages/orchestrator/PropertyPanel.tsx","../../src/pages/orchestrator/FlowToolbar.tsx","../../src/pages/orchestrator/TemplateLibrary.tsx","../../src/pages/orchestrator/OrchestratorPage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GripVertical = createLucideIcon(\"GripVertical\", [\n [\"circle\", { cx: \"9\", cy: \"12\", r: \"1\", key: \"1vctgf\" }],\n [\"circle\", { cx: \"9\", cy: \"5\", r: \"1\", key: \"hp0tcf\" }],\n [\"circle\", { cx: \"9\", cy: \"19\", r: \"1\", key: \"fkjjf6\" }],\n [\"circle\", { cx: \"15\", cy: \"12\", r: \"1\", key: \"1tmaij\" }],\n [\"circle\", { cx: \"15\", cy: \"5\", r: \"1\", key: \"19l28e\" }],\n [\"circle\", { cx: \"15\", cy: \"19\", r: \"1\", key: \"f4zoj3\" }]\n]);\n\nexport { GripVertical as default };\n//# sourceMappingURL=grip-vertical.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Hand = createLucideIcon(\"Hand\", [\n [\"path\", { d: \"M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2\", key: \"1fvzgz\" }],\n [\"path\", { d: \"M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2\", key: \"1kc0my\" }],\n [\"path\", { d: \"M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8\", key: \"10h0bg\" }],\n [\n \"path\",\n {\n d: \"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\",\n key: \"1s1gnw\"\n }\n ]\n]);\n\nexport { Hand as default };\n//# sourceMappingURL=hand.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Library = createLucideIcon(\"Library\", [\n [\"path\", { d: \"m16 6 4 14\", key: \"ji33uf\" }],\n [\"path\", { d: \"M12 6v14\", key: \"1n7gus\" }],\n [\"path\", { d: \"M8 8v12\", key: \"1gg7y9\" }],\n [\"path\", { d: \"M4 4v16\", key: \"6qkkli\" }]\n]);\n\nexport { Library as default };\n//# sourceMappingURL=library.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst MousePointerClick = createLucideIcon(\"MousePointerClick\", [\n [\"path\", { d: \"M14 4.1 12 6\", key: \"ita8i4\" }],\n [\"path\", { d: \"m5.1 8-2.9-.8\", key: \"1go3kf\" }],\n [\"path\", { d: \"m6 12-1.9 2\", key: \"mnht97\" }],\n [\"path\", { d: \"M7.2 2.2 8 5.1\", key: \"1cfko1\" }],\n [\n \"path\",\n {\n d: \"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z\",\n key: \"s0h3yz\"\n }\n ]\n]);\n\nexport { MousePointerClick as default };\n//# sourceMappingURL=mouse-pointer-click.js.map\n","// ========================================\r\n// Node Wrapper Component\r\n// ========================================\r\n// Shared wrapper for all custom nodes with execution status styling\r\n\r\nimport { ReactNode } from 'react';\r\nimport {\r\n Circle,\r\n Loader2,\r\n CheckCircle2,\r\n XCircle,\r\n} from 'lucide-react';\r\nimport type { ExecutionStatus } from '@/types/flow';\r\nimport { cn } from '@/lib/utils';\r\n\r\ninterface NodeWrapperProps {\r\n children: ReactNode;\r\n status?: ExecutionStatus;\r\n selected?: boolean;\r\n accentColor: string;\r\n className?: string;\r\n}\r\n\r\n// Status styling configuration\r\nconst STATUS_STYLES: Record<ExecutionStatus, string> = {\r\n pending: 'border-muted bg-card',\r\n running: 'border-primary bg-primary/10 animate-pulse',\r\n completed: 'border-green-500 bg-green-500/10',\r\n failed: 'border-destructive bg-destructive/10',\r\n};\r\n\r\n// Selection ring styles per accent color\r\nconst SELECTION_STYLES: Record<string, string> = {\r\n blue: 'ring-2 ring-blue-500/20 border-blue-500',\r\n green: 'ring-2 ring-green-500/20 border-green-500',\r\n amber: 'ring-2 ring-amber-500/20 border-amber-500',\r\n purple: 'ring-2 ring-purple-500/20 border-purple-500',\r\n sky: 'ring-2 ring-sky-500/20 border-sky-500',\r\n cyan: 'ring-2 ring-cyan-500/20 border-cyan-500',\r\n teal: 'ring-2 ring-teal-500/20 border-teal-500',\r\n orange: 'ring-2 ring-orange-500/20 border-orange-500',\r\n indigo: 'ring-2 ring-indigo-500/20 border-indigo-500',\r\n};\r\n\r\n// Status icons\r\nfunction StatusIcon({ status }: { status: ExecutionStatus }) {\r\n switch (status) {\r\n case 'pending':\r\n return <Circle className=\"w-3 h-3 text-muted-foreground\" />;\r\n case 'running':\r\n return <Loader2 className=\"w-3 h-3 text-primary animate-spin\" />;\r\n case 'completed':\r\n return <CheckCircle2 className=\"w-3 h-3 text-green-500\" />;\r\n case 'failed':\r\n return <XCircle className=\"w-3 h-3 text-destructive\" />;\r\n }\r\n}\r\n\r\nexport function NodeWrapper({\r\n children,\r\n status = 'pending',\r\n selected = false,\r\n accentColor,\r\n className,\r\n}: NodeWrapperProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'relative min-w-[180px] rounded-lg border-2 shadow-md transition-all',\r\n STATUS_STYLES[status],\r\n selected && SELECTION_STYLES[accentColor],\r\n className\r\n )}\r\n >\r\n {/* Status indicator */}\r\n <div className=\"absolute -top-2 -right-2 z-10 bg-background rounded-full p-0.5 shadow-sm border border-border\">\r\n <StatusIcon status={status} />\r\n </div>\r\n\r\n {/* Node content (includes handles, header, body) */}\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nNodeWrapper.displayName = 'NodeWrapper';\r\n","// ========================================\n// Prompt Template Node Component\n// ========================================\n// Unified node component for all workflow steps\n// Replaces: SlashCommandNode, CliCommandNode, PromptNode,\n// FileOperationNode, ConditionalNode, ParallelNode\n\nimport { memo } from 'react';\nimport { Handle, Position } from '@xyflow/react';\nimport { MessageSquare, Link2, Terminal } from 'lucide-react';\nimport type { PromptTemplateNodeData } from '@/types/flow';\nimport { NodeWrapper } from './NodeWrapper';\nimport { cn } from '@/lib/utils';\n\ninterface PromptTemplateNodeProps {\n data: PromptTemplateNodeData;\n selected?: boolean;\n}\n\n// Mode badge styling\nconst MODE_STYLES: Record<string, string> = {\n analysis: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n write: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',\n mainprocess: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n async: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n};\n\n// Tool badge styling\nconst TOOL_STYLES: Record<string, string> = {\n gemini: 'bg-blue-50 text-blue-600 dark:bg-blue-900/20 dark:text-blue-400',\n qwen: 'bg-green-50 text-green-600 dark:bg-green-900/20 dark:text-green-400',\n codex: 'bg-purple-50 text-purple-600 dark:bg-purple-900/20 dark:text-purple-400',\n claude: 'bg-amber-50 text-amber-600 dark:bg-amber-900/20 dark:text-amber-400',\n};\n\n// Phase color strip mapping\nconst PHASE_COLORS: Record<string, string> = {\n session: 'bg-sky-500',\n context: 'bg-cyan-500',\n plan: 'bg-amber-500',\n execute: 'bg-green-500',\n review: 'bg-purple-500',\n};\n\n// Phase-based node theme: header bg, handle color, accent for selection ring\nconst PHASE_THEME: Record<string, { header: string; handle: string; accent: string }> = {\n session: { header: 'bg-sky-500', handle: '!bg-sky-500', accent: 'sky' },\n context: { header: 'bg-cyan-500', handle: '!bg-cyan-500', accent: 'cyan' },\n plan: { header: 'bg-amber-500', handle: '!bg-amber-500', accent: 'amber' },\n execute: { header: 'bg-green-500', handle: '!bg-green-500', accent: 'green' },\n review: { header: 'bg-purple-500', handle: '!bg-purple-500', accent: 'purple' },\n};\n\n// nodeCategory-based fallback theme (when no phase set)\nconst CATEGORY_THEME: Record<string, { header: string; handle: string; accent: string }> = {\n tool: { header: 'bg-teal-500', handle: '!bg-teal-500', accent: 'teal' },\n command: { header: 'bg-blue-500', handle: '!bg-blue-500', accent: 'blue' },\n};\n\nconst DEFAULT_THEME = { header: 'bg-blue-500', handle: '!bg-blue-500', accent: 'blue' };\n\n// Execution status indicators\nconst STATUS_INDICATORS: Record<string, { color: string; label: string }> = {\n pending: { color: 'text-slate-400', label: 'Ready' },\n running: { color: 'text-amber-500', label: 'Running' },\n completed: { color: 'text-emerald-500', label: 'Done' },\n failed: { color: 'text-red-500', label: 'Failed' },\n};\n\nexport const PromptTemplateNode = memo(({ data, selected }: PromptTemplateNodeProps) => {\n // Truncate instruction for display (max 50 chars)\n const displayInstruction = data.instruction\n ? data.instruction.length > 50\n ? data.instruction.slice(0, 47) + '...'\n : data.instruction\n : 'No instruction';\n\n const hasContextRefs = data.contextRefs && data.contextRefs.length > 0;\n const hasPhase = data.phase && PHASE_COLORS[data.phase];\n const statusInfo = data.executionStatus ? STATUS_INDICATORS[data.executionStatus] : null;\n const hasArtifacts = data.artifacts && data.artifacts.length > 0;\n const hasTags = data.tags && data.tags.length > 0;\n\n // Resolve node theme based on phase → nodeCategory → default\n const theme = (data.phase && PHASE_THEME[data.phase])\n || (data.nodeCategory && CATEGORY_THEME[data.nodeCategory])\n || DEFAULT_THEME;\n\n return (\n <NodeWrapper\n status={data.executionStatus}\n selected={selected}\n accentColor={theme.accent}\n >\n {/* Phase color strip + content layout */}\n <div className=\"flex\">\n {/* Phase color strip (left border) */}\n {hasPhase && (\n <div className={cn('w-1 rounded-l-md flex-shrink-0', PHASE_COLORS[data.phase!])} />\n )}\n\n <div className=\"flex-1 min-w-0\">\n {/* Input Handle */}\n <Handle\n type=\"target\"\n position={Position.Top}\n className={cn('!w-3 !h-3 !border-2 !border-background', theme.handle)}\n />\n\n {/* Node Header */}\n <div className={cn(\n 'flex items-center gap-2 px-3 py-2 text-white',\n theme.header,\n hasPhase ? 'rounded-tr-md' : 'rounded-t-md'\n )}>\n <MessageSquare className=\"w-4 h-4 shrink-0\" />\n <span className=\"text-sm font-medium truncate flex-1\">\n {data.label || 'Step'}\n </span>\n {/* Execution status indicator */}\n {statusInfo && (\n <span className={cn('flex items-center gap-1 text-[10px] font-medium', statusInfo.color)}>\n <span className={cn('inline-block w-1.5 h-1.5 rounded-full bg-current')} />\n {statusInfo.label}\n </span>\n )}\n {/* Mode badge in header */}\n {data.mode && (\n <span className={cn('text-[10px] font-medium px-1.5 py-0.5 rounded', MODE_STYLES[data.mode])}>\n {data.mode}\n </span>\n )}\n </div>\n\n {/* Node Content */}\n <div className=\"px-3 py-2 space-y-1.5\">\n {/* Slash command badge or instruction preview */}\n {data.slashCommand ? (\n <div\n className=\"flex items-center gap-1.5 font-mono text-xs bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-400 px-2 py-1 rounded truncate\"\n title={`/${data.slashCommand}${data.slashArgs ? ' ' + data.slashArgs : ''}`}\n >\n <Terminal className=\"w-3 h-3 shrink-0\" />\n <span className=\"truncate\">/{data.slashCommand}</span>\n </div>\n ) : (\n <div\n className=\"font-mono text-xs bg-muted px-2 py-1 rounded text-foreground/90 truncate\"\n title={data.instruction}\n >\n {displayInstruction}\n </div>\n )}\n\n {/* Tags display */}\n {hasTags && (\n <div className=\"flex items-center gap-1 flex-wrap\">\n {data.tags!.slice(0, 2).map((tag) => (\n <span\n key={tag}\n className=\"text-[10px] px-1.5 py-0.5 rounded bg-muted text-muted-foreground border border-border\"\n >\n {tag}\n </span>\n ))}\n {data.tags!.length > 2 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{data.tags!.length - 2}\n </span>\n )}\n </div>\n )}\n\n {/* Tool and output badges row */}\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n {/* Tool badge */}\n {data.tool && (\n <span className={cn('text-[10px] font-medium px-1.5 py-0.5 rounded border', TOOL_STYLES[data.tool])}>\n {data.tool}\n </span>\n )}\n\n {/* Output name badge */}\n {data.outputName && (\n <span\n className=\"text-[10px] px-1.5 py-0.5 rounded bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400 truncate max-w-[80px]\"\n title={data.outputName}\n >\n -&gt; {data.outputName}\n </span>\n )}\n </div>\n\n {/* Context refs indicator */}\n {hasContextRefs && (\n <div className=\"flex items-center gap-1 text-[10px] text-muted-foreground\">\n <Link2 className=\"w-3 h-3\" />\n <span>{data.contextRefs!.length} ref{data.contextRefs!.length !== 1 ? 's' : ''}</span>\n </div>\n )}\n\n {/* Execution error message */}\n {data.executionStatus === 'failed' && data.executionError && (\n <div\n className=\"text-[10px] text-destructive truncate max-w-[160px]\"\n title={data.executionError}\n >\n {data.executionError}\n </div>\n )}\n\n {/* Artifacts display */}\n {hasArtifacts && (\n <div className=\"pt-0.5 border-t border-border/50 space-y-0.5\">\n {data.artifacts!.map((artifact) => (\n <div\n key={artifact}\n className=\"text-xs text-muted-foreground truncate\"\n title={artifact}\n >\n &rarr; {artifact}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Output Handle */}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n className={cn('!w-3 !h-3 !border-2 !border-background', theme.handle)}\n />\n </div>\n </div>\n </NodeWrapper>\n );\n});\n\nPromptTemplateNode.displayName = 'PromptTemplateNode';\n","// ========================================\n// Node Components Barrel Export\n// ========================================\n// Unified PromptTemplate node system\n\n// Shared wrapper component\nexport { NodeWrapper } from './NodeWrapper';\n\n// Unified prompt template node component\nexport { PromptTemplateNode } from './PromptTemplateNode';\n\n// Node types map for React Flow registration\nimport { PromptTemplateNode } from './PromptTemplateNode';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const nodeTypes: Record<string, any> = {\n 'prompt-template': PromptTemplateNode,\n};\n","// ========================================\r\n// Interaction Mode Toggle Component\r\n// ========================================\r\n// Pan/Selection mode toggle for the orchestrator canvas\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { Hand, MousePointerClick } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { useFlowStore } from '@/stores';\r\n\r\ninterface InteractionModeToggleProps {\r\n disabled?: boolean;\r\n}\r\n\r\nexport function InteractionModeToggle({ disabled = false }: InteractionModeToggleProps) {\r\n const { formatMessage } = useIntl();\r\n const interactionMode = useFlowStore((state) => state.interactionMode);\r\n const toggleInteractionMode = useFlowStore((state) => state.toggleInteractionMode);\r\n\r\n return (\r\n <div className={cn(\r\n 'flex items-center gap-1 bg-card/90 backdrop-blur-sm border border-border rounded-lg p-1 shadow-sm',\r\n disabled && 'opacity-50 pointer-events-none'\r\n )}>\r\n <button\r\n onClick={() => { if (interactionMode !== 'pan') toggleInteractionMode(); }}\r\n className={cn(\r\n 'flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors',\r\n interactionMode === 'pan'\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n title={formatMessage({ id: 'orchestrator.canvas.panMode', defaultMessage: 'Pan mode (drag to move canvas)' })}\r\n >\r\n <Hand className=\"w-3.5 h-3.5\" />\r\n </button>\r\n <button\r\n onClick={() => { if (interactionMode !== 'selection') toggleInteractionMode(); }}\r\n className={cn(\r\n 'flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors',\r\n interactionMode === 'selection'\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n title={formatMessage({ id: 'orchestrator.canvas.selectionMode', defaultMessage: 'Selection mode (drag to select nodes)' })}\r\n >\r\n <MousePointerClick className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// Flow Canvas Component\r\n// ========================================\r\n// React Flow canvas with minimap, controls, and background\r\n\r\nimport { useCallback, useRef, useState, useEffect, DragEvent } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n ReactFlow,\r\n MiniMap,\r\n Controls,\r\n Background,\r\n BackgroundVariant,\r\n Connection,\r\n NodeChange,\r\n EdgeChange,\r\n applyNodeChanges,\r\n applyEdgeChanges,\r\n Node,\r\n Edge,\r\n ReactFlowProvider,\r\n useReactFlow,\r\n Panel,\r\n} from '@xyflow/react';\r\nimport '@xyflow/react/dist/style.css';\r\n\r\nimport { useFlowStore } from '@/stores';\r\nimport { useExecutionStore, selectIsExecuting } from '@/stores/executionStore';\r\nimport type { FlowNode, FlowEdge } from '@/types/flow';\r\n\r\n// Custom node types (enhanced with execution status in IMPL-A8)\r\nimport { nodeTypes } from './nodes';\r\nimport { InteractionModeToggle } from './InteractionModeToggle';\r\n\r\ninterface FlowCanvasProps {\r\n className?: string;\r\n}\r\n\r\nfunction FlowCanvasInner({ className }: FlowCanvasProps) {\r\n const reactFlowWrapper = useRef<HTMLDivElement>(null);\r\n const { screenToFlowPosition } = useReactFlow();\r\n const { formatMessage } = useIntl();\r\n\r\n // Execution state - lock canvas during execution\r\n const isExecuting = useExecutionStore(selectIsExecuting);\r\n\r\n // Get state and actions from store\r\n const nodes = useFlowStore((state) => state.nodes);\r\n const edges = useFlowStore((state) => state.edges);\r\n const setNodes = useFlowStore((state) => state.setNodes);\r\n const setEdges = useFlowStore((state) => state.setEdges);\r\n const addNode = useFlowStore((state) => state.addNode);\r\n const addNodeFromTemplate = useFlowStore((state) => state.addNodeFromTemplate);\r\n const setSelectedNodeId = useFlowStore((state) => state.setSelectedNodeId);\r\n const setSelectedEdgeId = useFlowStore((state) => state.setSelectedEdgeId);\r\n const markModified = useFlowStore((state) => state.markModified);\r\n\r\n // Interaction mode from store\r\n const interactionMode = useFlowStore((state) => state.interactionMode);\r\n\r\n // Ctrl key state for temporary mode reversal\r\n const [isCtrlPressed, setIsCtrlPressed] = useState(false);\r\n\r\n // Listen for Ctrl/Meta key press for temporary mode reversal\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Control' || e.key === 'Meta') {\r\n setIsCtrlPressed(true);\r\n }\r\n };\r\n const handleKeyUp = (e: KeyboardEvent) => {\r\n if (e.key === 'Control' || e.key === 'Meta') {\r\n setIsCtrlPressed(false);\r\n }\r\n };\r\n // Reset on blur (user switches window)\r\n const handleBlur = () => setIsCtrlPressed(false);\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n window.addEventListener('keyup', handleKeyUp);\r\n window.addEventListener('blur', handleBlur);\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n window.removeEventListener('keyup', handleKeyUp);\r\n window.removeEventListener('blur', handleBlur);\r\n };\r\n }, []);\r\n\r\n // Calculate effective mode (Ctrl reverses the current mode)\r\n const effectiveMode = isCtrlPressed\r\n ? (interactionMode === 'pan' ? 'selection' : 'pan')\r\n : interactionMode;\r\n\r\n // Handle node changes (position, selection, etc.)\r\n const onNodesChange = useCallback(\r\n (changes: NodeChange[]) => {\r\n const updatedNodes = applyNodeChanges(changes, nodes as Node[]);\r\n setNodes(updatedNodes as FlowNode[]);\r\n },\r\n [nodes, setNodes]\r\n );\r\n\r\n // Handle edge changes\r\n const onEdgesChange = useCallback(\r\n (changes: EdgeChange[]) => {\r\n const updatedEdges = applyEdgeChanges(changes, edges as Edge[]);\r\n setEdges(updatedEdges as FlowEdge[]);\r\n },\r\n [edges, setEdges]\r\n );\r\n\r\n // Handle new edge connections\r\n const onConnect = useCallback(\r\n (connection: Connection) => {\r\n if (isExecuting) return;\r\n if (connection.source && connection.target) {\r\n const newEdge: FlowEdge = {\r\n id: `edge-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\r\n source: connection.source,\r\n target: connection.target,\r\n sourceHandle: connection.sourceHandle ?? undefined,\r\n targetHandle: connection.targetHandle ?? undefined,\r\n };\r\n setEdges([...edges, newEdge]);\r\n markModified();\r\n }\r\n },\r\n [edges, setEdges, markModified, isExecuting]\r\n );\r\n\r\n // Handle node selection\r\n const onNodeClick = useCallback(\r\n (_event: React.MouseEvent, node: Node) => {\r\n setSelectedNodeId(node.id);\r\n },\r\n [setSelectedNodeId]\r\n );\r\n\r\n // Handle edge selection\r\n const onEdgeClick = useCallback(\r\n (_event: React.MouseEvent, edge: Edge) => {\r\n setSelectedEdgeId(edge.id);\r\n },\r\n [setSelectedEdgeId]\r\n );\r\n\r\n // Handle canvas click (deselect)\r\n const onPaneClick = useCallback(() => {\r\n setSelectedNodeId(null);\r\n setSelectedEdgeId(null);\r\n }, [setSelectedNodeId, setSelectedEdgeId]);\r\n\r\n // Handle drag over for node palette drop\r\n const onDragOver = useCallback((event: DragEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n event.dataTransfer.dropEffect = 'move';\r\n }, []);\r\n\r\n // Handle drop from node palette\r\n const onDrop = useCallback(\r\n (event: DragEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n if (isExecuting) return;\r\n\r\n // Verify the drop is from node palette\r\n const nodeType = event.dataTransfer.getData('application/reactflow-node-type');\r\n if (!nodeType) {\r\n return;\r\n }\r\n\r\n // Get drop position in flow coordinates\r\n const position = screenToFlowPosition({\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n\r\n // Check if a template ID is provided\r\n const templateId = event.dataTransfer.getData('application/reactflow-template-id');\r\n if (templateId) {\r\n // Use quick template\r\n addNodeFromTemplate(templateId, position);\r\n } else {\r\n // Use basic empty node\r\n addNode(position);\r\n }\r\n },\r\n [screenToFlowPosition, addNode, addNodeFromTemplate, isExecuting]\r\n );\r\n\r\n return (\r\n <div ref={reactFlowWrapper} className={`w-full h-full ${className || ''}`}>\r\n <ReactFlow\r\n nodes={nodes as Node[]}\r\n edges={edges as Edge[]}\r\n onNodesChange={onNodesChange}\r\n onEdgesChange={onEdgesChange}\r\n onConnect={onConnect}\r\n onNodeClick={onNodeClick}\r\n onEdgeClick={onEdgeClick}\r\n onPaneClick={onPaneClick}\r\n onDragOver={onDragOver}\r\n onDrop={onDrop}\r\n nodeTypes={nodeTypes}\r\n panOnDrag={effectiveMode === 'pan'}\r\n selectionOnDrag={effectiveMode === 'selection'}\r\n nodesDraggable={!isExecuting}\r\n nodesConnectable={!isExecuting}\r\n elementsSelectable={!isExecuting}\r\n deleteKeyCode={isExecuting ? null : ['Backspace', 'Delete']}\r\n fitView\r\n snapToGrid\r\n snapGrid={[15, 15]}\r\n className=\"bg-background\"\r\n >\r\n <Panel position=\"top-left\" className=\"m-2\">\r\n <InteractionModeToggle disabled={isExecuting} />\r\n </Panel>\r\n <Controls\r\n className=\"bg-card border border-border rounded-md shadow-sm\"\r\n showZoom={true}\r\n showFitView={true}\r\n showInteractive={true}\r\n />\r\n <MiniMap\r\n className=\"bg-card border border-border rounded-md shadow-sm\"\r\n nodeColor={() => '#3b82f6'}\r\n maskColor=\"rgba(0, 0, 0, 0.1)\"\r\n />\r\n <Background\r\n variant={BackgroundVariant.Dots}\r\n gap={20}\r\n size={1}\r\n className=\"bg-muted/20\"\r\n />\r\n </ReactFlow>\r\n\r\n {/* Execution lock overlay */}\r\n {isExecuting && (\r\n <div className=\"absolute top-3 left-1/2 -translate-x-1/2 z-10 px-3 py-1.5 bg-primary/90 text-primary-foreground rounded-full text-xs font-medium shadow-lg flex items-center gap-2\">\r\n <span className=\"h-2 w-2 rounded-full bg-primary-foreground animate-pulse\" />\r\n {formatMessage({ id: 'orchestrator.execution.inProgress' })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport function FlowCanvas(props: FlowCanvasProps) {\r\n return (\r\n <ReactFlowProvider>\r\n <FlowCanvasInner {...props} />\r\n </ReactFlowProvider>\r\n );\r\n}\r\n\r\nexport default FlowCanvas;\r\n","// ========================================\n// Node Library Component\n// ========================================\n// Displays built-in and custom node templates\n// Supports creating, saving, and deleting custom templates with color selection\n\nimport { DragEvent, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n MessageSquare, ChevronDown, ChevronRight, GripVertical,\n Terminal, Plus, Trash2, X,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useFlowStore } from '@/stores';\nimport { QUICK_TEMPLATES } from '@/types/flow';\nimport type { QuickTemplate } from '@/types/flow';\n\n// ========== Icon Mapping ==========\n\nconst TEMPLATE_ICONS: Record<string, React.ElementType> = {\n 'slash-command-main': Terminal,\n 'slash-command-async': Terminal,\n};\n\n// ========== I18n Key Mapping for Built-in Templates ==========\n\nconst TEMPLATE_I18N: Record<string, { labelKey: string; descKey: string }> = {\n 'prompt-template': {\n labelKey: 'orchestrator.nodeLibrary.promptTemplateLabel',\n descKey: 'orchestrator.nodeLibrary.promptTemplateDesc',\n },\n 'slash-command-main': {\n labelKey: 'orchestrator.nodeLibrary.slashCommandLabel',\n descKey: 'orchestrator.nodeLibrary.slashCommandDesc',\n },\n 'slash-command-async': {\n labelKey: 'orchestrator.nodeLibrary.slashCommandAsyncLabel',\n descKey: 'orchestrator.nodeLibrary.slashCommandAsyncDesc',\n },\n};\n\n// ========== Color Palette for custom templates ==========\n\nconst COLOR_OPTIONS = [\n { value: 'bg-blue-500', label: 'Blue' },\n { value: 'bg-green-500', label: 'Green' },\n { value: 'bg-purple-500', label: 'Purple' },\n { value: 'bg-rose-500', label: 'Rose' },\n { value: 'bg-amber-500', label: 'Amber' },\n { value: 'bg-cyan-500', label: 'Cyan' },\n { value: 'bg-teal-500', label: 'Teal' },\n { value: 'bg-orange-500', label: 'Orange' },\n { value: 'bg-indigo-500', label: 'Indigo' },\n { value: 'bg-pink-500', label: 'Pink' },\n];\n\n// ========== Sub-Components ==========\n\n/**\n * Collapsible category section with optional action button\n */\nfunction TemplateCategory({\n title,\n children,\n defaultExpanded = true,\n action,\n}: {\n title: string;\n children: React.ReactNode;\n defaultExpanded?: boolean;\n action?: React.ReactNode;\n}) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n return (\n <div>\n <div className=\"flex items-center gap-1 mb-2\">\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex items-center gap-2 flex-1 text-left text-xs font-semibold text-muted-foreground uppercase tracking-wider hover:text-foreground transition-colors\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-3 h-3\" />\n ) : (\n <ChevronRight className=\"w-3 h-3\" />\n )}\n {title}\n </button>\n {action}\n </div>\n\n {isExpanded && <div className=\"space-y-2\">{children}</div>}\n </div>\n );\n}\n\n/**\n * Draggable card for a quick template\n */\nfunction QuickTemplateCard({\n template,\n onDelete,\n}: {\n template: QuickTemplate;\n onDelete?: () => void;\n}) {\n const { formatMessage } = useIntl();\n const Icon = TEMPLATE_ICONS[template.id] || MessageSquare;\n const i18n = TEMPLATE_I18N[template.id];\n const displayLabel = i18n ? formatMessage({ id: i18n.labelKey }) : template.label;\n const displayDesc = i18n ? formatMessage({ id: i18n.descKey }) : template.description;\n\n const onDragStart = (event: DragEvent<HTMLDivElement>) => {\n event.dataTransfer.setData('application/reactflow-node-type', 'prompt-template');\n event.dataTransfer.setData('application/reactflow-template-id', template.id);\n event.dataTransfer.effectAllowed = 'move';\n };\n\n const onDoubleClick = () => {\n useFlowStore.getState().addNodeFromTemplate(template.id, { x: 250, y: 200 });\n };\n\n return (\n <div\n draggable\n onDragStart={onDragStart}\n onDoubleClick={onDoubleClick}\n className={cn(\n 'group flex items-center gap-3 p-3 rounded-lg border bg-card cursor-grab transition-all',\n 'hover:shadow-md hover:scale-[1.02] active:cursor-grabbing active:scale-[0.98]',\n )}\n >\n <div className={cn('p-2 rounded-md text-white shrink-0', template.color)}>\n <Icon className=\"w-4 h-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">{displayLabel}</div>\n <div className=\"text-xs text-muted-foreground truncate\">{displayDesc}</div>\n </div>\n {onDelete ? (\n <button\n onClick={(e) => { e.stopPropagation(); onDelete(); }}\n className=\"w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity hover:text-destructive\"\n title={formatMessage({ id: 'orchestrator.nodeLibrary.deleteTemplate' })}\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n ) : (\n <GripVertical className=\"w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\" />\n )}\n </div>\n );\n}\n\n/**\n * Basic empty prompt template card\n */\nfunction BasicTemplateCard() {\n const { formatMessage } = useIntl();\n const i18n = TEMPLATE_I18N['prompt-template'];\n\n const onDragStart = (event: DragEvent<HTMLDivElement>) => {\n event.dataTransfer.setData('application/reactflow-node-type', 'prompt-template');\n event.dataTransfer.effectAllowed = 'move';\n };\n\n const onDoubleClick = () => {\n useFlowStore.getState().addNode({ x: 250, y: 200 });\n };\n\n return (\n <div\n draggable\n onDragStart={onDragStart}\n onDoubleClick={onDoubleClick}\n className={cn(\n 'group flex items-center gap-3 p-3 rounded-lg border bg-card cursor-grab transition-all',\n 'hover:shadow-md hover:scale-[1.02] active:cursor-grabbing active:scale-[0.98]',\n 'border-dashed border-muted-foreground/50 hover:border-primary',\n )}\n >\n <div className=\"p-2 rounded-md text-white bg-blue-500 hover:bg-blue-600\">\n <Plus className=\"w-4 h-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">{formatMessage({ id: i18n.labelKey })}</div>\n <div className=\"text-xs text-muted-foreground truncate\">{formatMessage({ id: i18n.descKey })}</div>\n </div>\n <GripVertical className=\"w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n );\n}\n\n/**\n * Inline form for creating a new custom template\n */\nfunction CreateTemplateForm({ onClose }: { onClose: () => void }) {\n const { formatMessage } = useIntl();\n const [label, setLabel] = useState('');\n const [description, setDescription] = useState('');\n const [instruction, setInstruction] = useState('');\n const [color, setColor] = useState('bg-blue-500');\n const addCustomTemplate = useFlowStore((s) => s.addCustomTemplate);\n\n const handleSubmit = () => {\n if (!label.trim()) return;\n\n const template: QuickTemplate = {\n id: `custom-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n label: label.trim(),\n description: description.trim() || label.trim(),\n icon: 'MessageSquare',\n color,\n category: 'command',\n data: {\n label: label.trim(),\n instruction: instruction.trim(),\n contextRefs: [],\n },\n };\n\n addCustomTemplate(template);\n onClose();\n };\n\n return (\n <div className=\"p-3 rounded-lg border border-primary/50 bg-muted/50 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground\">{formatMessage({ id: 'orchestrator.nodeLibrary.newCustomNode' })}</span>\n <button onClick={onClose} className=\"text-muted-foreground hover:text-foreground\">\n <X className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n <input\n type=\"text\"\n placeholder={formatMessage({ id: 'orchestrator.nodeLibrary.nodeName' })}\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n className=\"w-full text-sm px-2 py-1.5 rounded border border-border bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary\"\n autoFocus\n />\n\n <input\n type=\"text\"\n placeholder={formatMessage({ id: 'orchestrator.nodeLibrary.descriptionOptional' })}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full text-sm px-2 py-1.5 rounded border border-border bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary\"\n />\n\n <textarea\n placeholder={formatMessage({ id: 'orchestrator.nodeLibrary.defaultInstructionOptional' })}\n value={instruction}\n onChange={(e) => setInstruction(e.target.value)}\n rows={2}\n className=\"w-full text-sm px-2 py-1.5 rounded border border-border bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary resize-none\"\n />\n\n {/* Color picker */}\n <div>\n <div className=\"text-xs text-muted-foreground mb-1.5\">{formatMessage({ id: 'orchestrator.nodeLibrary.color' })}</div>\n <div className=\"flex flex-wrap gap-1.5\">\n {COLOR_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n onClick={() => setColor(opt.value)}\n className={cn(\n 'w-6 h-6 rounded-full transition-all',\n opt.value,\n color === opt.value\n ? 'ring-2 ring-offset-2 ring-offset-background ring-primary scale-110'\n : 'hover:scale-110',\n )}\n title={opt.label}\n />\n ))}\n </div>\n </div>\n\n <button\n onClick={handleSubmit}\n disabled={!label.trim()}\n className={cn(\n 'w-full text-sm font-medium py-1.5 rounded transition-colors',\n label.trim()\n ? 'bg-primary text-primary-foreground hover:bg-primary/90'\n : 'bg-muted text-muted-foreground cursor-not-allowed',\n )}\n >\n {formatMessage({ id: 'orchestrator.nodeLibrary.save' })}\n </button>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\ninterface NodeLibraryProps {\n className?: string;\n}\n\n/**\n * Node library panel displaying built-in and custom node templates.\n * Built-in: Slash Command, Slash Command (Async), Prompt Template\n * Custom: User-created templates persisted to localStorage\n */\nexport function NodeLibrary({ className }: NodeLibraryProps) {\n const { formatMessage } = useIntl();\n const [isCreating, setIsCreating] = useState(false);\n const customTemplates = useFlowStore((s) => s.customTemplates);\n const removeCustomTemplate = useFlowStore((s) => s.removeCustomTemplate);\n\n return (\n <div className={cn('flex-1 overflow-y-auto p-4 space-y-4', className)}>\n {/* Built-in templates */}\n <TemplateCategory title={formatMessage({ id: 'orchestrator.nodeLibrary.builtIn' })} defaultExpanded>\n <BasicTemplateCard />\n {QUICK_TEMPLATES.map((template) => (\n <QuickTemplateCard key={template.id} template={template} />\n ))}\n </TemplateCategory>\n\n {/* Custom templates */}\n <TemplateCategory\n title={formatMessage({ id: 'orchestrator.nodeLibrary.custom' }, { count: customTemplates.length })}\n defaultExpanded\n action={\n <button\n onClick={() => setIsCreating(true)}\n className=\"p-0.5 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors\"\n title={formatMessage({ id: 'orchestrator.nodeLibrary.createCustomNode' })}\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n }\n >\n {isCreating && <CreateTemplateForm onClose={() => setIsCreating(false)} />}\n {customTemplates.map((template) => (\n <QuickTemplateCard\n key={template.id}\n template={template}\n onDelete={() => removeCustomTemplate(template.id)}\n />\n ))}\n {customTemplates.length === 0 && !isCreating && (\n <div className=\"text-xs text-muted-foreground text-center py-3\">\n {formatMessage({ id: 'orchestrator.nodeLibrary.noCustomNodes' })}\n </div>\n )}\n </TemplateCategory>\n </div>\n );\n}\n\nexport default NodeLibrary;\n","// ========================================\r\n// useTemplates Hook\r\n// ========================================\r\n// TanStack Query hooks for template API operations\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport type { FlowTemplate, TemplateInstallRequest, TemplateExportRequest } from '../types/execution';\r\nimport type { Flow } from '../types/flow';\r\n\r\n// API base URL\r\nconst API_BASE = '/api/orchestrator';\r\n\r\n// Query keys\r\nexport const templateKeys = {\r\n all: ['templates'] as const,\r\n lists: () => [...templateKeys.all, 'list'] as const,\r\n list: (filters?: Record<string, unknown>) => [...templateKeys.lists(), filters] as const,\r\n details: () => [...templateKeys.all, 'detail'] as const,\r\n detail: (id: string) => [...templateKeys.details(), id] as const,\r\n categories: () => [...templateKeys.all, 'categories'] as const,\r\n};\r\n\r\n// API response types\r\ninterface TemplatesListResponse {\n templates: FlowTemplate[];\n total: number;\n categories: string[];\n}\n\r\ninterface TemplateDetailResponse extends FlowTemplate {\n flow: Flow;\n}\n\r\ninterface InstallTemplateResponse {\n flow: Flow;\n message: string;\n}\n\r\ninterface ExportTemplateResponse {\n template: FlowTemplate;\n message: string;\n}\n\n// ========== Fetch Functions ==========\n\nfunction toFlowTemplate(raw: any): FlowTemplate {\n const meta = raw?.template_metadata ?? {};\n const nodes = Array.isArray(raw?.nodes) ? raw.nodes : [];\n const edges = Array.isArray(raw?.edges) ? raw.edges : [];\n\n return {\n id: String(raw?.id ?? ''),\n name: String(raw?.name ?? ''),\n description: (typeof meta.description === 'string' ? meta.description : raw?.description) || undefined,\n category: typeof meta.category === 'string' ? meta.category : undefined,\n tags: Array.isArray(meta.tags) ? meta.tags : undefined,\n author: typeof meta.author === 'string' ? meta.author : undefined,\n version: String(meta.version ?? raw?.version ?? '1.0.0'),\n created_at: String(raw?.created_at ?? new Date().toISOString()),\n updated_at: String(raw?.updated_at ?? new Date().toISOString()),\n nodeCount: nodes.length,\n edgeCount: edges.length,\n };\n}\n\nfunction toFlowFromTemplate(raw: any): Flow {\n const meta = raw?.template_metadata ?? {};\n const now = new Date().toISOString();\n return {\n id: `flow-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`,\n name: String(raw?.name ?? 'Template Flow'),\n description: (typeof meta.description === 'string' ? meta.description : raw?.description) || undefined,\n version: String(meta.version ?? raw?.version ?? '1.0.0'),\n created_at: String(raw?.created_at ?? now),\n updated_at: String(raw?.updated_at ?? now),\n nodes: Array.isArray(raw?.nodes) ? raw.nodes : [],\n edges: Array.isArray(raw?.edges) ? raw.edges : [],\n variables: typeof raw?.variables === 'object' && raw.variables ? raw.variables : {},\n metadata: {\n source: 'template',\n templateId: typeof raw?.id === 'string' ? raw.id : undefined,\n tags: Array.isArray(meta.tags) ? meta.tags : undefined,\n category: typeof meta.category === 'string' ? meta.category : undefined,\n },\n };\n}\n\nasync function fetchTemplates(category?: string): Promise<TemplatesListResponse> {\n const url = category\n ? `${API_BASE}/templates?category=${encodeURIComponent(category)}`\n : `${API_BASE}/templates`;\n const response = await fetch(url, { credentials: 'same-origin' });\n if (!response.ok) {\n throw new Error(`Failed to fetch templates: ${response.statusText}`);\n }\n const json = await response.json();\n const rawTemplates: any[] = Array.isArray(json?.data) ? json.data : (json?.templates || []);\n const templates: FlowTemplate[] = rawTemplates.map(toFlowTemplate);\n const total = typeof json?.total === 'number' ? json.total : templates.length;\n const categories = Array.from(new Set(\n templates\n .map((t) => t.category)\n .filter((c): c is string => typeof c === 'string' && c.trim().length > 0)\n ));\n return { templates, total, categories };\n}\n\nasync function fetchTemplate(id: string): Promise<TemplateDetailResponse> {\n const response = await fetch(`${API_BASE}/templates/${id}`);\n if (!response.ok) {\n throw new Error(`Failed to fetch template: ${response.statusText}`);\n }\n return response.json();\n}\n\nasync function installTemplate(request: TemplateInstallRequest): Promise<InstallTemplateResponse> {\n const response = await fetch(`${API_BASE}/templates/install`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n credentials: 'same-origin',\n });\n if (!response.ok) {\n throw new Error(`Failed to install template: ${response.statusText}`);\n }\n const json = await response.json();\n const template = (json && typeof json === 'object' && 'data' in json) ? json.data : json;\n return { flow: toFlowFromTemplate(template), message: json?.message || 'Template installed' };\n}\n\nasync function exportTemplate(request: TemplateExportRequest): Promise<ExportTemplateResponse> {\n const response = await fetch(`${API_BASE}/templates/export`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n credentials: 'same-origin',\n });\n if (!response.ok) {\n throw new Error(`Failed to export template: ${response.statusText}`);\n }\n const json = await response.json();\n const template = (json && typeof json === 'object' && 'data' in json) ? json.data : json;\n return { template: toFlowTemplate(template), message: json?.message || 'Template exported' };\n}\n\nasync function deleteTemplate(id: string): Promise<void> {\n const response = await fetch(`${API_BASE}/templates/${id}`, {\n method: 'DELETE',\n credentials: 'same-origin',\n });\n if (!response.ok) {\n throw new Error(`Failed to delete template: ${response.statusText}`);\n }\n}\n\r\n// ========== Query Hooks ==========\r\n\r\n/**\r\n * Fetch all templates\r\n */\r\nexport function useTemplates(category?: string) {\r\n return useQuery({\r\n queryKey: templateKeys.list({ category }),\r\n queryFn: () => fetchTemplates(category),\r\n staleTime: 60000, // 1 minute\r\n });\r\n}\r\n\r\n/**\r\n * Fetch a single template by ID\r\n */\r\nexport function useTemplate(id: string | null) {\r\n return useQuery({\r\n queryKey: templateKeys.detail(id ?? ''),\r\n queryFn: () => fetchTemplate(id!),\r\n enabled: !!id,\r\n staleTime: 60000,\r\n });\r\n}\r\n\r\n// ========== Mutation Hooks ==========\r\n\r\n/**\r\n * Install a template as a new flow\r\n */\r\nexport function useInstallTemplate() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: installTemplate,\r\n onSuccess: () => {\r\n // Invalidate flows list to show the new flow\r\n queryClient.invalidateQueries({ queryKey: ['flows'] });\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Export a flow as a template\r\n */\r\nexport function useExportTemplate() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: exportTemplate,\r\n onSuccess: (result) => {\r\n // Add to templates list\r\n queryClient.setQueryData<TemplatesListResponse>(templateKeys.lists(), (old) => {\r\n if (!old) return { templates: [result.template], total: 1, categories: [] };\r\n return {\r\n ...old,\r\n templates: [...old.templates, result.template],\r\n total: old.total + 1,\r\n };\r\n });\r\n queryClient.invalidateQueries({ queryKey: templateKeys.lists() });\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Delete a template\r\n */\r\nexport function useDeleteTemplate() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: deleteTemplate,\r\n onSuccess: (_, deletedId) => {\r\n // Remove from cache\r\n queryClient.removeQueries({ queryKey: templateKeys.detail(deletedId) });\r\n queryClient.setQueryData<TemplatesListResponse>(templateKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n ...old,\r\n templates: old.templates.filter((t) => t.id !== deletedId),\r\n total: old.total - 1,\r\n };\r\n });\r\n },\r\n });\r\n}\r\n","// ========================================\n// Inline Template Panel Component\n// ========================================\n// Compact template list for the left sidebar, uses useTemplates hook\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Search, Loader2, FileText, Download, GitBranch } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { useTemplates, useInstallTemplate } from '@/hooks/useTemplates';\nimport { useFlowStore } from '@/stores';\nimport type { FlowTemplate } from '@/types/execution';\n\n// ========== Sub-Components ==========\n\ninterface TemplateItemProps {\n template: FlowTemplate;\n onInstall: (template: FlowTemplate) => void;\n isInstalling: boolean;\n}\n\nfunction TemplateItem({ template, onInstall, isInstalling }: TemplateItemProps) {\n const { formatMessage } = useIntl();\n\n return (\n <button\n onClick={() => onInstall(template)}\n disabled={isInstalling}\n className={cn(\n 'w-full flex items-center gap-3 px-3 py-2.5 rounded-md text-left transition-colors',\n 'hover:bg-muted/60 active:bg-muted',\n isInstalling && 'opacity-50 cursor-wait'\n )}\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground truncate\">\n {template.name}\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <GitBranch className=\"w-3 h-3\" />\n {template.nodeCount} {formatMessage({ id: 'orchestrator.inlineTemplates.nodes' })}\n </span>\n {template.category && (\n <Badge variant=\"secondary\" className=\"text-[10px] px-1.5 py-0\">\n {template.category}\n </Badge>\n )}\n </div>\n </div>\n {isInstalling ? (\n <Loader2 className=\"w-4 h-4 animate-spin text-muted-foreground shrink-0\" />\n ) : (\n <Download className=\"w-4 h-4 text-muted-foreground shrink-0 opacity-0 group-hover:opacity-100\" />\n )}\n </button>\n );\n}\n\n// ========== Main Component ==========\n\ninterface InlineTemplatePanelProps {\n className?: string;\n}\n\n/**\n * Compact template browser for the left sidebar.\n * Loads templates via the useTemplates API hook and displays them in a searchable list.\n * Clicking a template installs it as the current flow.\n */\nexport function InlineTemplatePanel({ className }: InlineTemplatePanelProps) {\n const { formatMessage } = useIntl();\n const [searchQuery, setSearchQuery] = useState('');\n const [installingId, setInstallingId] = useState<string | null>(null);\n\n const setCurrentFlow = useFlowStore((state) => state.setCurrentFlow);\n\n const { data, isLoading, error } = useTemplates();\n const installTemplate = useInstallTemplate();\n\n // Filter templates by search query\n const filteredTemplates = useMemo(() => {\n if (!data?.templates) return [];\n if (!searchQuery.trim()) return data.templates;\n\n const query = searchQuery.toLowerCase();\n return data.templates.filter(\n (t) =>\n t.name.toLowerCase().includes(query) ||\n t.description?.toLowerCase().includes(query) ||\n t.category?.toLowerCase().includes(query) ||\n t.tags?.some((tag) => tag.toLowerCase().includes(query))\n );\n }, [data?.templates, searchQuery]);\n\n // Handle install - load template as current flow\n const handleInstall = useCallback(\n async (template: FlowTemplate) => {\n setInstallingId(template.id);\n try {\n const result = await installTemplate.mutateAsync({\n templateId: template.id,\n });\n setCurrentFlow(result.flow);\n } catch (err) {\n console.error('Failed to install template:', err);\n } finally {\n setInstallingId(null);\n }\n },\n [installTemplate, setCurrentFlow]\n );\n\n return (\n <div className={cn('flex-1 flex flex-col overflow-hidden', className)}>\n {/* Search */}\n <div className=\"px-3 py-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <Input\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.inlineTemplates.searchPlaceholder' })}\n className=\"pl-8 h-8 text-sm\"\n />\n </div>\n </div>\n\n {/* Template List */}\n <div className=\"flex-1 overflow-y-auto px-1\">\n {isLoading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n ) : error ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-muted-foreground px-4\">\n <FileText className=\"h-8 w-8 mb-2 opacity-50\" />\n <p className=\"text-xs text-center\">\n {formatMessage({ id: 'orchestrator.inlineTemplates.loadFailed' })}\n </p>\n </div>\n ) : filteredTemplates.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-muted-foreground px-4\">\n <FileText className=\"h-8 w-8 mb-2 opacity-50\" />\n <p className=\"text-xs text-center\">\n {searchQuery ? formatMessage({ id: 'orchestrator.inlineTemplates.noMatches' }) : formatMessage({ id: 'orchestrator.inlineTemplates.noTemplates' })}\n </p>\n </div>\n ) : (\n <div className=\"space-y-0.5\">\n {filteredTemplates.map((template) => (\n <TemplateItem\n key={template.id}\n template={template}\n onInstall={handleInstall}\n isInstalling={installingId === template.id}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default InlineTemplatePanel;\n","// ========================================\n// useResizablePanel Hook\n// ========================================\n// Provides drag-to-resize functionality for sidebar panels.\n// Adapted from cc-wf-studio with Tailwind-friendly approach.\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nconst DEFAULT_MIN_WIDTH = 200;\nconst DEFAULT_MAX_WIDTH = 600;\nconst DEFAULT_WIDTH = 300;\nconst DEFAULT_STORAGE_KEY = 'ccw-orchestrator.panelWidth';\n\ninterface UseResizablePanelOptions {\n minWidth?: number;\n maxWidth?: number;\n defaultWidth?: number;\n storageKey?: string;\n /** Direction of drag relative to panel growth. 'left' means dragging left grows the panel (right-side panel). */\n direction?: 'left' | 'right';\n}\n\ninterface UseResizablePanelReturn {\n width: number;\n isResizing: boolean;\n handleMouseDown: (e: React.MouseEvent) => void;\n}\n\n/**\n * Custom hook for resizable panel functionality.\n *\n * Features:\n * - Drag-to-resize with mouse events\n * - Configurable min/max width constraints\n * - localStorage persistence\n * - Prevents text selection during drag\n */\nexport function useResizablePanel(options?: UseResizablePanelOptions): UseResizablePanelReturn {\n const minWidth = options?.minWidth ?? DEFAULT_MIN_WIDTH;\n const maxWidth = options?.maxWidth ?? DEFAULT_MAX_WIDTH;\n const defaultWidth = options?.defaultWidth ?? DEFAULT_WIDTH;\n const storageKey = options?.storageKey ?? DEFAULT_STORAGE_KEY;\n const direction = options?.direction ?? 'right';\n\n // Initialize width from localStorage or use default\n const [width, setWidth] = useState<number>(() => {\n try {\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n const parsed = Number.parseInt(saved, 10);\n if (!Number.isNaN(parsed) && parsed >= minWidth && parsed <= maxWidth) {\n return parsed;\n }\n }\n } catch {\n // localStorage unavailable\n }\n return defaultWidth;\n });\n\n const [isResizing, setIsResizing] = useState(false);\n const startXRef = useRef<number>(0);\n const startWidthRef = useRef<number>(0);\n\n // Handle mouse move during resize\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n const deltaX = e.clientX - startXRef.current;\n // For 'right' direction (left panel), dragging right grows the panel\n // For 'left' direction (right panel), dragging left grows the panel\n const newWidth = direction === 'right'\n ? startWidthRef.current + deltaX\n : startWidthRef.current - deltaX;\n\n const constrainedWidth = Math.max(minWidth, Math.min(maxWidth, newWidth));\n setWidth(constrainedWidth);\n },\n [minWidth, maxWidth, direction]\n );\n\n // Handle mouse up to end resize\n const handleMouseUp = useCallback(() => {\n setIsResizing(false);\n }, []);\n\n // Handle mouse down to start resize\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n setIsResizing(true);\n startXRef.current = e.clientX;\n startWidthRef.current = width;\n },\n [width]\n );\n\n // Set up global mouse event listeners\n useEffect(() => {\n if (isResizing) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n // Prevent text selection during drag\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'ew-resize';\n } else {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n };\n }, [isResizing, handleMouseMove, handleMouseUp]);\n\n // Persist width to localStorage whenever it changes\n useEffect(() => {\n try {\n localStorage.setItem(storageKey, width.toString());\n } catch {\n // localStorage unavailable\n }\n }, [width, storageKey]);\n\n return {\n width,\n isResizing,\n handleMouseDown,\n };\n}\n","// ========================================\n// ResizeHandle Component\n// ========================================\n// Draggable vertical bar for resizing sidebar panels.\n// Uses Tailwind CSS for styling.\n\nimport type React from 'react';\nimport { cn } from '@/lib/utils';\n\ninterface ResizeHandleProps {\n onMouseDown: (e: React.MouseEvent) => void;\n className?: string;\n /** Position of the handle relative to the panel. Default: 'right' */\n position?: 'left' | 'right';\n}\n\n/**\n * ResizeHandle Component\n *\n * A 4px-wide transparent drag bar that highlights on hover.\n * Placed on the edge of a sidebar panel for drag-to-resize.\n */\nexport function ResizeHandle({ onMouseDown, className, position = 'right' }: ResizeHandleProps) {\n return (\n <div\n onMouseDown={onMouseDown}\n className={cn(\n 'absolute top-0 bottom-0 w-1 cursor-ew-resize z-10',\n 'bg-transparent hover:bg-primary transition-colors duration-200',\n position === 'right' ? 'right-0' : 'left-0',\n className,\n )}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize panel\"\n tabIndex={0}\n />\n );\n}\n","// ========================================\n// Left Sidebar Component\n// ========================================\n// Container with tab switching between NodeLibrary and InlineTemplatePanel\n\nimport { useIntl } from 'react-intl';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { useFlowStore } from '@/stores';\nimport { NodeLibrary } from './NodeLibrary';\nimport { InlineTemplatePanel } from './InlineTemplatePanel';\nimport { useResizablePanel } from './useResizablePanel';\nimport { ResizeHandle } from './ResizeHandle';\n\n// ========== Tab Configuration ==========\n\nconst TABS: Array<{ key: 'templates' | 'nodes'; labelKey: string }> = [\n { key: 'templates', labelKey: 'orchestrator.leftSidebar.tabTemplates' },\n { key: 'nodes', labelKey: 'orchestrator.leftSidebar.tabNodes' },\n];\n\n// ========== Main Component ==========\n\ninterface LeftSidebarProps {\n className?: string;\n}\n\n/**\n * Left sidebar container with collapsible panel and tab switching.\n * Renders either InlineTemplatePanel or NodeLibrary based on active tab.\n */\nexport function LeftSidebar({ className }: LeftSidebarProps) {\n const { formatMessage } = useIntl();\n const setIsPaletteOpen = useFlowStore((state) => state.setIsPaletteOpen);\n const leftPanelTab = useFlowStore((state) => state.leftPanelTab);\n const setLeftPanelTab = useFlowStore((state) => state.setLeftPanelTab);\n\n const { width, isResizing, handleMouseDown } = useResizablePanel({\n minWidth: 200,\n maxWidth: 400,\n defaultWidth: 288, // w-72 = 18rem = 288px\n storageKey: 'ccw-orchestrator.leftSidebar.width',\n direction: 'right',\n });\n\n return (\n <div\n className={cn(\n 'h-full bg-card border-r border-border flex flex-col relative',\n isResizing && 'select-none',\n className\n )}\n style={{ width }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\n <h3 className=\"font-semibold text-foreground\">{formatMessage({ id: 'orchestrator.leftSidebar.workbench' })}</h3>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => setIsPaletteOpen(false)}\n title={formatMessage({ id: 'orchestrator.leftSidebar.collapse' })}\n >\n <ChevronDown className=\"w-4 h-4\" />\n </Button>\n </div>\n\n {/* Tab Bar */}\n <div className=\"flex border-b border-border\">\n {TABS.map((tab) => (\n <button\n key={tab.key}\n onClick={() => setLeftPanelTab(tab.key)}\n className={cn(\n 'flex-1 px-3 py-2 text-sm font-medium text-center transition-colors',\n 'hover:text-foreground',\n leftPanelTab === tab.key\n ? 'text-foreground border-b-2 border-primary'\n : 'text-muted-foreground'\n )}\n >\n {formatMessage({ id: tab.labelKey })}\n </button>\n ))}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {leftPanelTab === 'templates' ? (\n <InlineTemplatePanel />\n ) : (\n <NodeLibrary />\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-4 py-3 border-t border-border bg-muted/30\">\n <div className=\"text-xs text-muted-foreground\">\n <span className=\"font-medium\">{formatMessage({ id: 'orchestrator.leftSidebar.tipLabel' })}</span> {formatMessage({ id: 'orchestrator.leftSidebar.dragOrDoubleClick' })}\n </div>\n </div>\n\n {/* Resize handle on right edge */}\n <ResizeHandle onMouseDown={handleMouseDown} position=\"right\" />\n </div>\n );\n}\n\nexport default LeftSidebar;\n","// ========================================\r\n// Command Combobox Component\r\n// ========================================\r\n// Searchable dropdown for selecting slash commands (commands + skills)\r\n\r\nimport { useState, useRef, useEffect, useCallback, useMemo } from 'react';\r\nimport { ChevronDown, Search } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { useCommands } from '@/hooks/useCommands';\r\nimport { useSkills } from '@/hooks/useSkills';\r\n\r\nexport interface CommandSelectDetails {\r\n name: string;\r\n argumentHint?: string;\r\n description?: string;\r\n source: 'command' | 'skill';\r\n}\r\n\r\ninterface UnifiedItem {\r\n name: string;\r\n description: string;\r\n group: string;\r\n argumentHint?: string;\r\n source: 'command' | 'skill';\r\n}\r\n\r\ninterface CommandComboboxProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n onSelectDetails?: (details: CommandSelectDetails) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport function CommandCombobox({ value, onChange, onSelectDetails, placeholder, className }: CommandComboboxProps) {\r\n const [open, setOpen] = useState(false);\r\n const [search, setSearch] = useState('');\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const { commands, isLoading: commandsLoading } = useCommands({\r\n filter: { showDisabled: false },\r\n });\r\n\r\n const { skills, isLoading: skillsLoading } = useSkills({\r\n filter: { enabledOnly: true },\r\n });\r\n\r\n const isLoading = commandsLoading || skillsLoading;\r\n\r\n // Merge commands and skills into unified items\r\n const unifiedItems = useMemo<UnifiedItem[]>(() => {\r\n const items: UnifiedItem[] = [];\r\n\r\n for (const cmd of commands) {\r\n items.push({\r\n name: cmd.name,\r\n description: cmd.description,\r\n group: cmd.group || 'other',\r\n argumentHint: cmd.argumentHint,\r\n source: 'command',\r\n });\r\n }\r\n\r\n for (const skill of skills) {\r\n items.push({\r\n name: skill.name,\r\n description: skill.description,\r\n group: 'skills',\r\n source: 'skill',\r\n });\r\n }\r\n\r\n return items;\r\n }, [commands, skills]);\r\n\r\n // Group and filter items\r\n const groupedFiltered = useMemo(() => {\r\n const filtered = search\r\n ? unifiedItems.filter(\r\n (item) =>\r\n item.name.toLowerCase().includes(search.toLowerCase()) ||\r\n item.description.toLowerCase().includes(search.toLowerCase())\r\n )\r\n : unifiedItems;\r\n\r\n const groups: Record<string, UnifiedItem[]> = {};\r\n for (const item of filtered) {\r\n if (!groups[item.group]) groups[item.group] = [];\r\n groups[item.group].push(item);\r\n }\r\n return groups;\r\n }, [unifiedItems, search]);\r\n\r\n const totalFiltered = useMemo(\r\n () => Object.values(groupedFiltered).reduce((sum, items) => sum + items.length, 0),\r\n [groupedFiltered]\r\n );\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n function handleClickOutside(e: MouseEvent) {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n }\r\n if (open) {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }\r\n }, [open]);\r\n\r\n const handleSelect = useCallback(\r\n (item: UnifiedItem) => {\r\n onChange(item.name);\r\n onSelectDetails?.({\r\n name: item.name,\r\n argumentHint: item.argumentHint,\r\n description: item.description,\r\n source: item.source,\r\n });\r\n setOpen(false);\r\n setSearch('');\r\n },\r\n [onChange, onSelectDetails]\r\n );\r\n\r\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSearch(e.target.value);\r\n if (!open) setOpen(true);\r\n }, [open]);\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n setOpen(false);\r\n setSearch('');\r\n }\r\n },\r\n []\r\n );\r\n\r\n // Display label for current value\r\n const selectedItem = unifiedItems.find((item) => item.name === value);\r\n const displayValue = value\r\n ? `/${selectedItem?.name || value}`\r\n : '';\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n {/* Trigger button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setOpen(!open);\r\n if (!open) {\r\n setTimeout(() => inputRef.current?.focus(), 0);\r\n }\r\n }}\r\n className={cn(\r\n 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\r\n !value && 'text-muted-foreground',\r\n className\r\n )}\r\n >\r\n <span className={cn('truncate font-mono', !value && 'text-muted-foreground')}>\r\n {displayValue || placeholder || '/command-name'}\r\n </span>\r\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\r\n </button>\r\n\r\n {/* Dropdown */}\r\n {open && (\r\n <div className=\"absolute z-50 mt-1 w-full rounded-md border border-border bg-card shadow-md\">\r\n {/* Search input */}\r\n <div className=\"flex items-center border-b border-border px-3\">\r\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\r\n <input\r\n ref={inputRef}\r\n value={search}\r\n onChange={handleInputChange}\r\n onKeyDown={handleKeyDown}\r\n placeholder={placeholder || '/command-name'}\r\n className=\"flex h-9 w-full bg-transparent py-2 text-sm outline-none placeholder:text-muted-foreground font-mono\"\r\n />\r\n </div>\r\n\r\n {/* Items list */}\r\n <div className=\"max-h-64 overflow-y-auto p-1\">\r\n {isLoading ? (\r\n <div className=\"py-4 text-center text-sm text-muted-foreground\">Loading...</div>\r\n ) : totalFiltered === 0 ? (\r\n <div className=\"py-4 text-center text-sm text-muted-foreground\">\r\n No commands found\r\n </div>\r\n ) : (\r\n Object.entries(groupedFiltered)\r\n .sort(([a], [b]) => {\r\n // Skills group last\r\n if (a === 'skills') return 1;\r\n if (b === 'skills') return -1;\r\n return a.localeCompare(b);\r\n })\r\n .map(([group, items]) => (\r\n <div key={group}>\r\n <div className=\"px-2 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\r\n {group}\r\n </div>\r\n {items.map((item) => (\r\n <button\r\n key={`${item.source}-${item.name}`}\r\n type=\"button\"\r\n onClick={() => handleSelect(item)}\r\n className={cn(\r\n 'flex w-full flex-col items-start rounded-sm px-2 py-1.5 text-sm cursor-pointer hover:bg-accent hover:text-accent-foreground',\r\n value === item.name && 'bg-accent/50'\r\n )}\r\n >\r\n <span className=\"font-mono text-foreground\">/{item.name}</span>\r\n {item.description && (\r\n <span className=\"text-xs text-muted-foreground truncate w-full text-left\">\r\n {item.description}\r\n </span>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\n// Property Panel Component\n// ========================================\n// Dynamic property editor for unified PromptTemplate nodes\n\nimport { useCallback, useMemo, useState, useEffect, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Settings, X, MessageSquare, Trash2, AlertCircle, CheckCircle2, Plus, Save, ChevronDown, ChevronRight, BookmarkPlus } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { CommandCombobox, type CommandSelectDetails } from '@/components/ui/CommandCombobox';\nimport { useFlowStore } from '@/stores';\nimport { useCommands } from '@/hooks/useCommands';\nimport type { PromptTemplateNodeData, ExecutionMode } from '@/types/flow';\n\n// ========== Tag-based Instruction Editor ==========\n\n/**\n * Built-in template definitions\n */\ninterface TemplateItem {\n id: string;\n label: string;\n color: 'emerald' | 'sky' | 'amber' | 'rose' | 'violet' | 'slate' | 'cyan' | 'indigo';\n content: string;\n hasInput?: boolean;\n inputLabel?: string;\n inputDefault?: string;\n isCustom?: boolean;\n}\n\nconst BUILTIN_TEMPLATES: TemplateItem[] = [\n // Output variable\n {\n id: 'output-var',\n label: '输出变量',\n color: 'emerald',\n content: '将结果记为 {{$INPUT}} 变量,供后面节点引用。',\n hasInput: true,\n inputLabel: '变量名',\n inputDefault: 'result',\n },\n // File operations\n {\n id: 'file-read',\n label: '读取文件',\n color: 'sky',\n content: '读取文件 $INPUT 的内容。',\n hasInput: true,\n inputLabel: '文件路径',\n inputDefault: './path/to/file',\n },\n {\n id: 'file-write',\n label: '写入文件',\n color: 'sky',\n content: '将结果写入到文件 $INPUT。',\n hasInput: true,\n inputLabel: '文件路径',\n inputDefault: './output/result.md',\n },\n // Conditional\n {\n id: 'condition-if',\n label: '条件判断',\n color: 'amber',\n content: '如果 $INPUT,则继续执行;否则停止并报告。',\n hasInput: true,\n inputLabel: '条件',\n inputDefault: '结果成功',\n },\n // CLI Analysis Tools\n {\n id: 'cli-gemini',\n label: 'Gemini分析',\n color: 'cyan',\n content: '使用 Gemini 分析:$INPUT\\n\\n分析要点:\\n- 代码结构和架构\\n- 潜在问题和改进建议\\n- 最佳实践对比',\n hasInput: true,\n inputLabel: '分析目标',\n inputDefault: '当前模块的代码质量',\n },\n {\n id: 'cli-codex',\n label: 'Codex执行',\n color: 'indigo',\n content: '使用 Codex 执行:$INPUT\\n\\n执行要求:\\n- 遵循现有代码风格\\n- 确保类型安全\\n- 添加必要注释',\n hasInput: true,\n inputLabel: '执行任务',\n inputDefault: '实现指定功能',\n },\n // Git commits\n {\n id: 'git-feat',\n label: 'feat',\n color: 'violet',\n content: 'feat: $INPUT',\n hasInput: true,\n inputLabel: '功能描述',\n inputDefault: '新功能',\n },\n {\n id: 'git-fix',\n label: 'fix',\n color: 'rose',\n content: 'fix: $INPUT',\n hasInput: true,\n inputLabel: 'Bug描述',\n inputDefault: '修复问题',\n },\n {\n id: 'git-refactor',\n label: 'refactor',\n color: 'slate',\n content: 'refactor: $INPUT',\n hasInput: true,\n inputLabel: '重构描述',\n inputDefault: '代码重构',\n },\n];\n\nconst TEMPLATE_COLORS = {\n emerald: 'bg-emerald-100 text-emerald-700 hover:bg-emerald-200 dark:bg-emerald-900/50 dark:text-emerald-300',\n sky: 'bg-sky-100 text-sky-700 hover:bg-sky-200 dark:bg-sky-900/50 dark:text-sky-300',\n amber: 'bg-amber-100 text-amber-700 hover:bg-amber-200 dark:bg-amber-900/50 dark:text-amber-300',\n rose: 'bg-rose-100 text-rose-700 hover:bg-rose-200 dark:bg-rose-900/50 dark:text-rose-300',\n violet: 'bg-violet-100 text-violet-700 hover:bg-violet-200 dark:bg-violet-900/50 dark:text-violet-300',\n slate: 'bg-slate-100 text-slate-700 hover:bg-slate-200 dark:bg-slate-900/50 dark:text-slate-300',\n cyan: 'bg-cyan-100 text-cyan-700 hover:bg-cyan-200 dark:bg-cyan-900/50 dark:text-cyan-300',\n indigo: 'bg-indigo-100 text-indigo-700 hover:bg-indigo-200 dark:bg-indigo-900/50 dark:text-indigo-300',\n};\n\nconst COLOR_OPTIONS: Array<{ value: TemplateItem['color']; label: string }> = [\n { value: 'emerald', label: '绿色' },\n { value: 'sky', label: '天蓝' },\n { value: 'cyan', label: '青色' },\n { value: 'indigo', label: '靛蓝' },\n { value: 'amber', label: '黄色' },\n { value: 'rose', label: '红色' },\n { value: 'violet', label: '紫色' },\n { value: 'slate', label: '灰色' },\n];\n\n// Local storage key for custom templates\nconst CUSTOM_TEMPLATES_KEY = 'orchestrator-custom-templates';\n\n/**\n * Load custom templates from localStorage\n */\nfunction loadCustomTemplates(): TemplateItem[] {\n try {\n const stored = localStorage.getItem(CUSTOM_TEMPLATES_KEY);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Save custom templates to localStorage\n */\nfunction saveCustomTemplates(templates: TemplateItem[]): void {\n localStorage.setItem(CUSTOM_TEMPLATES_KEY, JSON.stringify(templates));\n}\n\n// ========== Custom Template Modal ==========\n\ninterface TemplateModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave: (template: TemplateItem) => void;\n}\n\nfunction TemplateModal({ isOpen, onClose, onSave }: TemplateModalProps) {\n const { formatMessage } = useIntl();\n const [label, setLabel] = useState('');\n const [content, setContent] = useState('');\n const [color, setColor] = useState<TemplateItem['color']>('slate');\n const [hasInput, setHasInput] = useState(false);\n const [inputLabel, setInputLabel] = useState('');\n const [inputDefault, setInputDefault] = useState('');\n\n const handleSave = useCallback(() => {\n if (!label.trim() || !content.trim()) return;\n\n const template: TemplateItem = {\n id: `custom-${Date.now()}`,\n label: label.trim(),\n content: content.trim(),\n color,\n isCustom: true,\n ...(hasInput && {\n hasInput: true,\n inputLabel: inputLabel.trim() || '输入',\n inputDefault: inputDefault.trim(),\n }),\n };\n\n onSave(template);\n // Reset form\n setLabel('');\n setContent('');\n setColor('slate');\n setHasInput(false);\n setInputLabel('');\n setInputDefault('');\n onClose();\n }, [label, content, color, hasInput, inputLabel, inputDefault, onSave, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-black/50\" onClick={onClose} />\n\n {/* Modal */}\n <div className=\"relative bg-card border border-border rounded-lg shadow-xl w-full max-w-md mx-4 p-4 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-lg font-semibold text-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.createCustomTemplate' })}</h3>\n <button onClick={onClose} className=\"text-muted-foreground hover:text-foreground\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Template name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.templateNameLabel' })}</label>\n <Input\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"例如:代码审查\"\n className=\"text-sm\"\n />\n </div>\n\n {/* Template content */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.templateContent' })}\n <span className=\"text-muted-foreground font-normal ml-1\">{formatMessage({ id: 'orchestrator.propertyPanel.templateContentHint' })}</span>\n </label>\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder=\"例如:请审查以下代码:$INPUT\"\n rows={3}\n className=\"w-full px-3 py-2 rounded-md border border-border bg-background text-foreground text-sm resize-none\"\n />\n </div>\n\n {/* Color selection */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.tagColor' })}</label>\n <div className=\"flex flex-wrap gap-2\">\n {COLOR_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => setColor(opt.value)}\n className={cn(\n 'px-3 py-1 rounded text-xs font-medium transition-all',\n TEMPLATE_COLORS[opt.value],\n color === opt.value && 'ring-2 ring-primary ring-offset-1'\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Has input toggle */}\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"has-input\"\n checked={hasInput}\n onChange={(e) => setHasInput(e.target.checked)}\n className=\"rounded border-border\"\n />\n <label htmlFor=\"has-input\" className=\"text-sm text-foreground\">\n {formatMessage({ id: 'orchestrator.propertyPanel.requiresInput' })}\n </label>\n </div>\n\n {/* Input configuration */}\n {hasInput && (\n <div className=\"grid grid-cols-2 gap-2 pl-6\">\n <div>\n <label className=\"block text-xs text-muted-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.inputPrompt' })}</label>\n <Input\n value={inputLabel}\n onChange={(e) => setInputLabel(e.target.value)}\n placeholder=\"请输入...\"\n className=\"h-8 text-xs\"\n />\n </div>\n <div>\n <label className=\"block text-xs text-muted-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.defaultValue' })}</label>\n <Input\n value={inputDefault}\n onChange={(e) => setInputDefault(e.target.value)}\n placeholder=\"默认值\"\n className=\"h-8 text-xs\"\n />\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex justify-end gap-2 pt-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>\n {formatMessage({ id: 'orchestrator.propertyPanel.cancel' })}\n </Button>\n <Button\n size=\"sm\"\n onClick={handleSave}\n disabled={!label.trim() || !content.trim()}\n className=\"gap-1\"\n >\n <Save className=\"w-4 h-4\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.saveTemplate' })}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\ninterface TagEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n availableVariables: string[];\n minHeight?: number;\n}\n\n/**\n * Token types for the editor\n */\ntype TokenType = 'text' | 'variable' | 'artifact';\n\ninterface Token {\n type: TokenType;\n value: string;\n isValid?: boolean;\n}\n\n/**\n * Parse text into tokens (text segments, {{variables}}, and [[artifacts]])\n */\nfunction tokenize(text: string): Token[] {\n const tokens: Token[] = [];\n // Match both {{variable}} and [[artifact]] patterns\n const regex = /\\{\\{([^}]+)\\}\\}|\\[\\[([^\\]]+)\\]\\]/g;\n let lastIndex = 0;\n let match;\n\n while ((match = regex.exec(text)) !== null) {\n // Add text before token\n if (match.index > lastIndex) {\n tokens.push({ type: 'text', value: text.slice(lastIndex, match.index) });\n }\n if (match[1] !== undefined) {\n // {{variable}} match\n tokens.push({ type: 'variable', value: match[1].trim() });\n } else if (match[2] !== undefined) {\n // [[artifact]] match\n tokens.push({ type: 'artifact', value: match[2].trim() });\n }\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text\n if (lastIndex < text.length) {\n tokens.push({ type: 'text', value: text.slice(lastIndex) });\n }\n\n return tokens;\n}\n\n/**\n * Extract unique variable names from text\n */\nfunction extractVariables(text: string): string[] {\n const matches = text.match(/\\{\\{([^}]+)\\}\\}/g) || [];\n return [...new Set(matches.map(m => m.slice(2, -2).trim()))];\n}\n\n/**\n * Extract unique artifact names from text\n */\nfunction extractArtifacts(text: string): string[] {\n const matches = text.match(/\\[\\[([^\\]]+)\\]\\]/g) || [];\n return [...new Set(matches.map(m => m.slice(2, -2).trim()))];\n}\n\n/**\n * Tag-based instruction editor with inline variable tags\n */\nfunction TagEditor({ value, onChange, placeholder, availableVariables, minHeight = 120 }: TagEditorProps) {\n const { formatMessage } = useIntl();\n const editorRef = useRef<HTMLDivElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n const [newVarName, setNewVarName] = useState('');\n const [newArtifactName, setNewArtifactName] = useState('');\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [customTemplates, setCustomTemplates] = useState<TemplateItem[]>(() => loadCustomTemplates());\n\n const tokens = useMemo(() => tokenize(value || ''), [value]);\n const detectedVars = useMemo(() => extractVariables(value || ''), [value]);\n const detectedArtifacts = useMemo(() => extractArtifacts(value || ''), [value]);\n const hasContent = (value || '').length > 0;\n\n // All templates (builtin + custom)\n const allTemplates = useMemo(() => [...BUILTIN_TEMPLATES, ...customTemplates], [customTemplates]);\n\n // Save custom template\n const handleSaveTemplate = useCallback((template: TemplateItem) => {\n const updated = [...customTemplates, template];\n setCustomTemplates(updated);\n saveCustomTemplates(updated);\n }, [customTemplates]);\n\n // Delete custom template\n const handleDeleteTemplate = useCallback((templateId: string) => {\n const updated = customTemplates.filter(t => t.id !== templateId);\n setCustomTemplates(updated);\n saveCustomTemplates(updated);\n }, [customTemplates]);\n\n // Handle content changes from contenteditable\n // Convert tag elements back to {{variable}} / [[artifact]] format for storage\n const handleInput = useCallback(() => {\n if (editorRef.current) {\n // Clone the content to avoid modifying the actual DOM\n const clone = editorRef.current.cloneNode(true) as HTMLElement;\n\n // Convert variable tags back to {{variable}} format\n const varTags = clone.querySelectorAll('[data-var]');\n varTags.forEach((tag) => {\n const varName = tag.getAttribute('data-var');\n if (varName) {\n tag.replaceWith(`{{${varName}}}`);\n }\n });\n\n // Convert artifact tags back to [[artifact]] format\n const artTags = clone.querySelectorAll('[data-artifact]');\n artTags.forEach((tag) => {\n const artName = tag.getAttribute('data-artifact');\n if (artName) {\n tag.replaceWith(`[[${artName}]]`);\n }\n });\n\n // Convert <br> to newlines\n clone.querySelectorAll('br').forEach((br) => br.replaceWith('\\n'));\n\n // Get the text content\n const content = clone.textContent || '';\n onChange(content);\n }\n }, [onChange]);\n\n // Handle paste - convert to plain text\n const handlePaste = useCallback((e: React.ClipboardEvent) => {\n e.preventDefault();\n const text = e.clipboardData.getData('text/plain');\n document.execCommand('insertText', false, text);\n }, []);\n\n // Insert variable at cursor position\n const insertVariable = useCallback((varName: string) => {\n if (editorRef.current) {\n editorRef.current.focus();\n const varText = `{{${varName}}}`;\n document.execCommand('insertText', false, varText);\n }\n }, []);\n\n // Insert artifact at cursor position\n const insertArtifact = useCallback((artName: string) => {\n if (editorRef.current) {\n editorRef.current.focus();\n const artText = `[[${artName}]]`;\n document.execCommand('insertText', false, artText);\n }\n }, []);\n\n // Insert text at cursor position (or append if no focus)\n const insertText = useCallback((text: string) => {\n if (editorRef.current) {\n editorRef.current.focus();\n document.execCommand('insertText', false, text);\n }\n }, []);\n\n // Add new variable\n const handleAddVariable = useCallback(() => {\n if (newVarName.trim()) {\n insertVariable(newVarName.trim());\n setNewVarName('');\n }\n }, [newVarName, insertVariable]);\n\n // Add new artifact\n const handleAddArtifact = useCallback(() => {\n if (newArtifactName.trim()) {\n insertArtifact(newArtifactName.trim());\n setNewArtifactName('');\n }\n }, [newArtifactName, insertArtifact]);\n\n // Handle key press in new variable input\n const handleVarInputKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddVariable();\n }\n }, [handleAddVariable]);\n\n // Render tokens as HTML - variables show as green tags, artifacts as blue tags\n const renderContent = useMemo(() => {\n if (!hasContent) return '';\n\n return tokens.map((token) => {\n if (token.type === 'variable') {\n const isValid = availableVariables.includes(token.value) || token.value.includes('.');\n return `<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 rounded text-xs font-semibold align-baseline cursor-default select-none ${\n isValid\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/50 dark:text-emerald-300'\n : 'bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300'\n }\" contenteditable=\"false\" data-var=\"${token.value}\">${token.value}</span>`;\n }\n if (token.type === 'artifact') {\n return `<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 rounded text-xs font-semibold align-baseline cursor-default select-none bg-sky-100 text-sky-700 dark:bg-sky-900/50 dark:text-sky-300\" contenteditable=\"false\" data-artifact=\"${token.value}\">\\u2192 ${token.value}</span>`;\n }\n // Escape HTML in text and preserve whitespace\n return token.value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\n/g, '<br>');\n }).join('');\n }, [tokens, availableVariables, hasContent]);\n\n // Sync content when value changes externally\n useEffect(() => {\n if (editorRef.current && !isFocused) {\n editorRef.current.innerHTML = renderContent;\n }\n }, [renderContent, isFocused]);\n\n return (\n <div className=\"space-y-2\">\n {/* Main editor */}\n <div\n className={cn(\n 'relative rounded-md border transition-colors',\n isFocused ? 'border-primary ring-2 ring-primary/20' : 'border-border'\n )}\n >\n <div\n ref={editorRef}\n contentEditable\n onInput={handleInput}\n onPaste={handlePaste}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n data-placeholder={placeholder}\n className={cn(\n 'w-full px-3 py-2 text-sm font-mono leading-relaxed',\n 'focus:outline-none',\n 'whitespace-pre-wrap break-words',\n '[&:empty]:before:content-[attr(data-placeholder)] [&:empty]:before:text-muted-foreground'\n )}\n style={{ minHeight }}\n dangerouslySetInnerHTML={{ __html: renderContent }}\n />\n </div>\n\n {/* Variable & Artifact toolbar */}\n <div className=\"flex flex-wrap items-center gap-2 p-2 rounded-md bg-muted/30 border border-border\">\n {/* Add new variable input */}\n <div className=\"flex items-center gap-1\">\n <Input\n value={newVarName}\n onChange={(e) => setNewVarName(e.target.value)}\n onKeyDown={handleVarInputKeyDown}\n placeholder=\"{{变量}}\"\n className=\"h-7 w-20 text-xs font-mono\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleAddVariable}\n disabled={!newVarName.trim()}\n className=\"h-7 px-2\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </Button>\n </div>\n\n <div className=\"w-px h-5 bg-border\" />\n\n {/* Add new artifact input */}\n <div className=\"flex items-center gap-1\">\n <Input\n value={newArtifactName}\n onChange={(e) => setNewArtifactName(e.target.value)}\n onKeyDown={(e: KeyboardEvent<HTMLInputElement>) => { if (e.key === 'Enter') { e.preventDefault(); handleAddArtifact(); } }}\n placeholder=\"[[产物]]\"\n className=\"h-7 w-20 text-xs font-mono\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleAddArtifact}\n disabled={!newArtifactName.trim()}\n className=\"h-7 px-2\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </Button>\n </div>\n\n {/* Quick insert available variables */}\n {availableVariables.length > 0 && (\n <>\n <div className=\"w-px h-5 bg-border\" />\n <span className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.available' })}</span>\n {availableVariables.slice(0, 5).map((varName) => (\n <button\n key={varName}\n type=\"button\"\n onClick={() => insertVariable(varName)}\n className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-mono bg-emerald-100 text-emerald-700 hover:bg-emerald-200 dark:bg-emerald-900/50 dark:text-emerald-300 dark:hover:bg-emerald-900/70 transition-colors\"\n >\n {varName}\n </button>\n ))}\n </>\n )}\n\n {/* Detected variables summary */}\n {detectedVars.length > 0 && (\n <>\n <div className=\"w-px h-5 bg-border\" />\n <span className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.variables' })}</span>\n {detectedVars.map((varName) => {\n const isValid = availableVariables.includes(varName) || varName.includes('.');\n return (\n <span\n key={varName}\n className={cn(\n 'inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-mono',\n isValid\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/50 dark:text-emerald-300'\n : 'bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300'\n )}\n >\n {isValid ? <CheckCircle2 className=\"w-3 h-3\" /> : <AlertCircle className=\"w-3 h-3\" />}\n {varName}\n </span>\n );\n })}\n </>\n )}\n\n {/* Detected artifacts summary */}\n {detectedArtifacts.length > 0 && (\n <>\n <div className=\"w-px h-5 bg-border\" />\n <span className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.artifactsLabel' })}</span>\n {detectedArtifacts.map((artName) => (\n <span\n key={artName}\n className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-mono bg-sky-100 text-sky-700 dark:bg-sky-900/50 dark:text-sky-300\"\n >\n {'\\u2192'} {artName}\n </span>\n ))}\n </>\n )}\n </div>\n\n {/* Templates - categorized */}\n <div className=\"space-y-2\">\n {/* Template buttons by category */}\n <div className=\"flex flex-wrap items-center gap-2 p-2 rounded-md bg-muted/30 border border-border\">\n <span className=\"text-xs text-muted-foreground shrink-0\">{formatMessage({ id: 'orchestrator.propertyPanel.templateLabel' })}</span>\n\n {allTemplates.map((template) => (\n <div key={template.id} className=\"relative group\">\n <button\n type=\"button\"\n onClick={() => {\n if (template.hasInput) {\n const inputValue = prompt(template.inputLabel + ':', template.inputDefault);\n if (inputValue !== null) {\n const content = template.content.replace(/\\$INPUT/g, inputValue);\n insertText('\\n\\n' + content);\n }\n } else {\n insertText('\\n\\n' + template.content);\n }\n }}\n className={cn(\n 'inline-flex items-center px-2 py-1 rounded text-xs font-medium transition-colors',\n TEMPLATE_COLORS[template.color]\n )}\n >\n {template.label}\n </button>\n {/* Delete button for custom templates */}\n {template.isCustom && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n if (confirm(formatMessage({ id: 'orchestrator.propertyPanel.confirmDeleteTemplate' }, { name: template.label }))) {\n handleDeleteTemplate(template.id);\n }\n }}\n className=\"absolute -top-1 -right-1 w-4 h-4 rounded-full bg-destructive text-destructive-foreground items-center justify-center text-xs hidden group-hover:flex\"\n >\n ×\n </button>\n )}\n </div>\n ))}\n\n {/* Add custom template button */}\n <button\n type=\"button\"\n onClick={() => setIsModalOpen(true)}\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium border border-dashed border-border text-muted-foreground hover:text-foreground hover:border-foreground transition-colors\"\n >\n <Plus className=\"w-3 h-3\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.newTemplate' })}\n </button>\n </div>\n </div>\n\n {/* Custom Template Modal */}\n <TemplateModal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n onSave={handleSaveTemplate}\n />\n </div>\n );\n}\n\n// ========== Form Field Components ==========\n\ninterface LabelInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction LabelInput({ value, onChange }: LabelInputProps) {\n const { formatMessage } = useIntl();\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.label' })}\n </label>\n <Input\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.placeholders.nodeLabel' })}\n />\n </div>\n );\n}\n\n// ========== Slash Command Section ==========\n\ninterface SlashCommandSectionProps {\n data: PromptTemplateNodeData;\n onChange: (updates: Partial<PromptTemplateNodeData>) => void;\n availableVariables: string[];\n}\n\nfunction SlashCommandSection({ data, onChange, availableVariables }: SlashCommandSectionProps) {\n const { formatMessage } = useIntl();\n const [argumentHint, setArgumentHint] = useState<string>('');\n\n // Look up argumentHint from loaded commands when mounting with pre-selected command\n const { commands } = useCommands({ filter: { showDisabled: false } });\n useEffect(() => {\n if (data.slashCommand && commands.length > 0) {\n const cmd = commands.find((c) => c.name === data.slashCommand);\n if (cmd?.argumentHint) {\n setArgumentHint(cmd.argumentHint);\n }\n }\n }, [data.slashCommand, commands]);\n\n const handleCommandSelect = useCallback(\n (name: string) => {\n const updates: Partial<PromptTemplateNodeData> = { slashCommand: name };\n // Auto-set label if still default\n if (!data.label || data.label === 'Slash Command' || data.label === 'Slash Command (Async)' || data.label === 'New Step') {\n updates.label = `/${name}`;\n }\n onChange(updates);\n },\n [data.label, onChange]\n );\n\n const handleSelectDetails = useCallback(\n (details: CommandSelectDetails) => {\n setArgumentHint(details.argumentHint || '');\n },\n []\n );\n\n return (\n <div className=\"space-y-3\">\n {/* Slash Command Picker */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.slashCommand' })}\n </label>\n <CommandCombobox\n value={data.slashCommand || ''}\n onChange={handleCommandSelect}\n onSelectDetails={handleSelectDetails}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.placeholders.slashCommand' })}\n />\n </div>\n\n {/* Args Input */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.slashArgs' })}\n </label>\n <Input\n value={data.slashArgs || ''}\n onChange={(e) => onChange({ slashArgs: e.target.value })}\n placeholder={argumentHint || formatMessage({ id: 'orchestrator.propertyPanel.placeholders.slashArgs' })}\n className=\"font-mono\"\n />\n {argumentHint && (\n <p className=\"text-xs text-muted-foreground mt-1 font-mono truncate\" title={argumentHint}>\n {argumentHint}\n </p>\n )}\n </div>\n\n {/* Additional instruction for context */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.additionalInstruction' })}\n </label>\n <TagEditor\n value={data.instruction || ''}\n onChange={(value) => onChange({ instruction: value })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.placeholders.additionalInstruction' })}\n minHeight={80}\n availableVariables={availableVariables}\n />\n </div>\n </div>\n );\n}\n\n// ========== Collapsible Section ==========\n\nfunction CollapsibleSection({\n title,\n defaultExpanded = false,\n children,\n}: {\n title: string;\n defaultExpanded?: boolean;\n children: React.ReactNode;\n}) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n return (\n <div className=\"border-t border-border pt-3\">\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex items-center gap-2 w-full text-left text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2 hover:text-foreground transition-colors\"\n >\n {isExpanded ? <ChevronDown className=\"w-3 h-3\" /> : <ChevronRight className=\"w-3 h-3\" />}\n {title}\n </button>\n {isExpanded && <div className=\"space-y-3\">{children}</div>}\n </div>\n );\n}\n\n// ========== Tags Input ==========\n\nfunction TagsInput({ tags, onChange }: { tags: string[]; onChange: (tags: string[]) => void }) {\n const { formatMessage } = useIntl();\n const [input, setInput] = useState('');\n\n const handleAdd = () => {\n if (input.trim() && !tags.includes(input.trim())) {\n onChange([...tags, input.trim()]);\n setInput('');\n }\n };\n\n const handleRemove = (tag: string) => {\n onChange(tags.filter(t => t !== tag));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAdd();\n }\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1\">\n {tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-primary/10 text-primary\">\n {tag}\n <button onClick={() => handleRemove(tag)} className=\"hover:text-destructive\">\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n </div>\n <div className=\"flex gap-1\">\n <Input\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.addTag' })}\n className=\"h-7 text-xs\"\n />\n <Button variant=\"ghost\" size=\"sm\" onClick={handleAdd} disabled={!input.trim()} className=\"h-7 px-2\">\n <Plus className=\"w-3 h-3\" />\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Artifacts List ==========\n\nfunction ArtifactsList({ artifacts, onChange }: { artifacts: string[]; onChange: (artifacts: string[]) => void }) {\n const [input, setInput] = useState('');\n\n const handleAdd = () => {\n if (input.trim()) {\n onChange([...artifacts, input.trim()]);\n setInput('');\n }\n };\n\n const handleRemove = (index: number) => {\n onChange(artifacts.filter((_, i) => i !== index));\n };\n\n return (\n <div className=\"space-y-2\">\n {artifacts.map((artifact, i) => (\n <div key={i} className=\"flex items-center gap-2 text-xs\">\n <span className=\"text-muted-foreground\">{'->'}</span>\n <span className=\"flex-1 font-mono truncate\">{artifact}</span>\n <button onClick={() => handleRemove(i)} className=\"text-muted-foreground hover:text-destructive\">\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n <div className=\"flex gap-1\">\n <Input\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); handleAdd(); } }}\n placeholder=\"output-file.json\"\n className=\"h-7 text-xs font-mono\"\n />\n <Button variant=\"ghost\" size=\"sm\" onClick={handleAdd} disabled={!input.trim()} className=\"h-7 px-2\">\n <Plus className=\"w-3 h-3\" />\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Unified PromptTemplate Property Editor ==========\n\ninterface PromptTemplatePropertiesProps {\n data: PromptTemplateNodeData;\n onChange: (updates: Partial<PromptTemplateNodeData>) => void;\n}\n\nfunction PromptTemplateProperties({ data, onChange }: PromptTemplatePropertiesProps) {\n const { formatMessage } = useIntl();\n const nodes = useFlowStore((state) => state.nodes);\n const selectedNodeId = useFlowStore((state) => state.selectedNodeId);\n\n const isSlashCommandMode = data.mode === 'mainprocess' || data.mode === 'async';\n\n // Build available outputNames from other nodes for contextRefs picker\n const availableOutputNames = useMemo(() => {\n return nodes\n .filter((n) => n.id !== selectedNodeId && n.data?.outputName)\n .map((n) => ({\n id: n.data.outputName as string,\n label: n.data.label || n.id,\n }));\n }, [nodes, selectedNodeId]);\n\n // Extract variable names for VariableTextarea validation\n const availableVariables = useMemo(() => {\n return availableOutputNames.map((n) => n.id);\n }, [availableOutputNames]);\n\n return (\n <div className=\"space-y-4\">\n {/* Label */}\n <LabelInput value={data.label} onChange={(value) => onChange({ label: value })} />\n\n {/* Mode Select - different options for Slash Commands vs CLI Tools */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.mode' })}\n </label>\n <select\n value={data.mode || 'mainprocess'}\n onChange={(e) => {\n const newMode = e.target.value as ExecutionMode;\n const updates: Partial<PromptTemplateNodeData> = { mode: newMode };\n // Clear slash command fields when switching to CLI mode\n if (newMode === 'analysis' || newMode === 'write') {\n updates.slashCommand = '';\n updates.slashArgs = '';\n }\n onChange(updates);\n }}\n className=\"w-full h-10 px-3 rounded-md border border-border bg-background text-foreground text-sm\"\n >\n <optgroup label={formatMessage({ id: 'orchestrator.propertyPanel.slashCommandsGroup' })}>\n <option value=\"mainprocess\">{formatMessage({ id: 'orchestrator.propertyPanel.options.modeMainprocess' })}</option>\n <option value=\"async\">{formatMessage({ id: 'orchestrator.propertyPanel.options.modeAsync' })}</option>\n </optgroup>\n <optgroup label={formatMessage({ id: 'orchestrator.propertyPanel.cliToolsGroup' })}>\n <option value=\"analysis\">{formatMessage({ id: 'orchestrator.propertyPanel.options.modeAnalysis' })}</option>\n <option value=\"write\">{formatMessage({ id: 'orchestrator.propertyPanel.options.modeWrite' })}</option>\n </optgroup>\n </select>\n </div>\n\n {/* Conditional: Slash Command Section vs Instruction textarea */}\n {isSlashCommandMode ? (\n <SlashCommandSection data={data} onChange={onChange} availableVariables={availableVariables} />\n ) : (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.instruction' })}\n </label>\n <TagEditor\n value={data.instruction || ''}\n onChange={(value) => {\n // Auto-extract [[artifact]] names and sync to artifacts field\n const arts = extractArtifacts(value);\n onChange({ instruction: value, artifacts: arts.length > 0 ? arts : undefined });\n }}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.placeholders.instruction' })}\n minHeight={120}\n availableVariables={availableVariables}\n />\n </div>\n )}\n\n {/* Classification Section */}\n <CollapsibleSection title={formatMessage({ id: 'orchestrator.propertyPanel.classificationSection' })} defaultExpanded={false}>\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.description' })}</label>\n <textarea\n value={data.description || ''}\n onChange={(e) => onChange({ description: e.target.value })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.descriptionPlaceholder' })}\n rows={2}\n className=\"w-full px-3 py-2 rounded-md border border-border bg-background text-foreground text-sm resize-none\"\n />\n </div>\n\n {/* Tags */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.tags' })}</label>\n <TagsInput\n tags={data.tags || []}\n onChange={(tags) => onChange({ tags })}\n />\n </div>\n </CollapsibleSection>\n\n {/* Execution Section */}\n <CollapsibleSection title={formatMessage({ id: 'orchestrator.propertyPanel.executionSection' })} defaultExpanded={false}>\n {/* Condition */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.condition' })}</label>\n <Input\n value={data.condition || ''}\n onChange={(e) => onChange({ condition: e.target.value || undefined })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.conditionPlaceholder' })}\n className=\"font-mono text-sm\"\n />\n </div>\n\n {/* Artifacts */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.artifacts' })}</label>\n <ArtifactsList\n artifacts={data.artifacts || []}\n onChange={(artifacts) => onChange({ artifacts })}\n />\n </div>\n\n {/* CLI Session Routing (tmux-like) */}\n {!isSlashCommandMode && (\n <>\n {/* Instruction Type for native CLI sessions */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n Instruction Type\n </label>\n <select\n value={data.instructionType || 'prompt'}\n onChange={(e) => {\n const next = e.target.value as 'prompt' | 'skill' | 'command';\n const updates: Partial<PromptTemplateNodeData> = { instructionType: next };\n if (next !== 'skill') {\n updates.skillName = undefined;\n }\n onChange(updates);\n }}\n className=\"w-full h-10 px-3 rounded-md border border-border bg-background text-foreground text-sm\"\n >\n <option value=\"prompt\">Prompt (direct text)</option>\n <option value=\"skill\">Skill (CLI-specific prefix)</option>\n <option value=\"command\">Command (CLI native)</option>\n </select>\n </div>\n\n {/* Skill Name - shown when instructionType is 'skill' */}\n {(data.instructionType === 'skill') && (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n Skill Name\n {data.tool && (\n <span className=\"ml-2 text-xs text-muted-foreground font-normal\">\n {data.tool === 'claude' ? 'prefix: /' : data.tool === 'codex' ? 'prefix: $' : 'no prefix'}\n </span>\n )}\n </label>\n <Input\n value={data.skillName || ''}\n onChange={(e) => onChange({ skillName: e.target.value || undefined })}\n placeholder={data.tool === 'claude' ? 'e.g. review-code' : data.tool === 'codex' ? 'e.g. fix' : 'skill name'}\n className=\"font-mono text-sm\"\n />\n </div>\n )}\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.delivery' })}\n </label>\n <select\n value={(data.delivery as string) || 'newExecution'}\n onChange={(e) => {\n const next = e.target.value as 'newExecution' | 'sendToSession';\n const updates: Partial<PromptTemplateNodeData> = { delivery: next };\n if (next !== 'sendToSession') {\n updates.targetSessionKey = undefined;\n updates.resumeKey = undefined;\n updates.resumeStrategy = undefined;\n }\n onChange(updates);\n }}\n className=\"w-full h-10 px-3 rounded-md border border-border bg-background text-foreground text-sm\"\n >\n <option value=\"newExecution\">\n {formatMessage({ id: 'orchestrator.propertyPanel.options.deliveryNewExecution' })}\n </option>\n <option value=\"sendToSession\">\n {formatMessage({ id: 'orchestrator.propertyPanel.options.deliverySendToSession' })}\n </option>\n </select>\n </div>\n\n {((data.delivery as string) || 'newExecution') === 'sendToSession' && (\n <>\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.targetSessionKey' })}\n </label>\n <Input\n value={(data.targetSessionKey as string) || ''}\n onChange={(e) => onChange({ targetSessionKey: e.target.value || undefined })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.targetSessionKeyPlaceholder' })}\n className=\"font-mono text-sm\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.resumeKey' })}\n </label>\n <Input\n value={(data.resumeKey as string) || ''}\n onChange={(e) => onChange({ resumeKey: e.target.value || undefined })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.resumeKeyPlaceholder' })}\n className=\"font-mono text-sm\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.resumeStrategy' })}\n </label>\n <select\n value={(data.resumeStrategy as string) || 'nativeResume'}\n onChange={(e) => onChange({ resumeStrategy: e.target.value as any })}\n className=\"w-full h-10 px-3 rounded-md border border-border bg-background text-foreground text-sm\"\n >\n <option value=\"nativeResume\">\n {formatMessage({ id: 'orchestrator.propertyPanel.options.resumeStrategyNative' })}\n </option>\n <option value=\"promptConcat\">\n {formatMessage({ id: 'orchestrator.propertyPanel.options.resumeStrategyPromptConcat' })}\n </option>\n </select>\n </div>\n </>\n )}\n </>\n )}\n </CollapsibleSection>\n </div>\n );\n}\n\n// ========== Save As Template Button ==========\n\nconst SAVE_COLOR_OPTIONS = [\n { value: 'bg-blue-500', label: 'Blue' },\n { value: 'bg-green-500', label: 'Green' },\n { value: 'bg-purple-500', label: 'Purple' },\n { value: 'bg-rose-500', label: 'Rose' },\n { value: 'bg-amber-500', label: 'Amber' },\n { value: 'bg-cyan-500', label: 'Cyan' },\n { value: 'bg-teal-500', label: 'Teal' },\n { value: 'bg-orange-500', label: 'Orange' },\n];\n\nfunction SaveAsTemplateButton({ nodeId, nodeLabel }: { nodeId: string; nodeLabel: string }) {\n const { formatMessage } = useIntl();\n const [isOpen, setIsOpen] = useState(false);\n const [name, setName] = useState('');\n const [desc, setDesc] = useState('');\n const [color, setColor] = useState('bg-blue-500');\n const addCustomTemplate = useFlowStore((s) => s.addCustomTemplate);\n const nodes = useFlowStore((s) => s.nodes);\n\n const handleSave = () => {\n const node = nodes.find((n) => n.id === nodeId);\n if (!node || !name.trim()) return;\n\n const { executionStatus, executionError, executionResult, ...templateData } = node.data;\n addCustomTemplate({\n id: `custom-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n label: name.trim(),\n description: desc.trim() || name.trim(),\n icon: 'MessageSquare',\n color,\n category: 'command',\n data: { ...templateData, label: name.trim() },\n });\n\n setIsOpen(false);\n setName('');\n setDesc('');\n setColor('bg-blue-500');\n };\n\n if (!isOpen) {\n return (\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => { setName(nodeLabel); setIsOpen(true); }}\n >\n <BookmarkPlus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.saveToLibrary' })}\n </Button>\n );\n }\n\n return (\n <div className=\"p-2 rounded-md border border-primary/50 bg-muted/50 space-y-2\">\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.templateName' })}\n className=\"h-8 text-sm\"\n autoFocus\n />\n <Input\n value={desc}\n onChange={(e) => setDesc(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.descriptionOptional' })}\n className=\"h-8 text-sm\"\n />\n <div className=\"flex flex-wrap gap-1\">\n {SAVE_COLOR_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n onClick={() => setColor(opt.value)}\n className={cn(\n 'w-5 h-5 rounded-full transition-all',\n opt.value,\n color === opt.value ? 'ring-2 ring-offset-1 ring-offset-background ring-primary' : '',\n )}\n title={opt.label}\n />\n ))}\n </div>\n <div className=\"flex gap-1\">\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1\" onClick={() => setIsOpen(false)}>\n {formatMessage({ id: 'orchestrator.propertyPanel.cancel' })}\n </Button>\n <Button size=\"sm\" className=\"flex-1\" onClick={handleSave} disabled={!name.trim()}>\n <Save className=\"w-3.5 h-3.5 mr-1\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.save' })}\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Main PropertyPanel Component ==========\n\ninterface PropertyPanelProps {\n className?: string;\n}\n\nexport function PropertyPanel({ className }: PropertyPanelProps) {\n const { formatMessage } = useIntl();\n const selectedNodeId = useFlowStore((state) => state.selectedNodeId);\n const nodes = useFlowStore((state) => state.nodes);\n const updateNode = useFlowStore((state) => state.updateNode);\n const removeNode = useFlowStore((state) => state.removeNode);\n const setIsPropertyPanelOpen = useFlowStore((state) => state.setIsPropertyPanelOpen);\n\n const selectedNode = nodes.find((n) => n.id === selectedNodeId);\n\n const handleChange = useCallback(\n (updates: Partial<PromptTemplateNodeData>) => {\n if (selectedNodeId) {\n updateNode(selectedNodeId, updates);\n }\n },\n [selectedNodeId, updateNode]\n );\n\n const handleDelete = useCallback(() => {\n if (selectedNodeId) {\n removeNode(selectedNodeId);\n }\n }, [selectedNodeId, removeNode]);\n\n // No node selected\n if (!selectedNode) {\n return (\n <div className={cn('w-72 bg-card/95 backdrop-blur-sm border border-border rounded-lg shadow-xl flex flex-col', className)}>\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\n <h3 className=\"font-semibold text-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.title' })}</h3>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => setIsPropertyPanelOpen(false)}\n title={formatMessage({ id: 'orchestrator.propertyPanel.close' })}\n >\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n <div className=\"flex-1 flex items-center justify-center p-4\">\n <div className=\"text-center text-muted-foreground\">\n <Settings className=\"w-12 h-12 mx-auto mb-2 opacity-50\" />\n <p className=\"text-sm\">{formatMessage({ id: 'orchestrator.propertyPanel.selectNode' })}</p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn('w-72 bg-card/95 backdrop-blur-sm border border-border rounded-lg shadow-xl flex flex-col', className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\n <div className=\"flex items-center gap-2\">\n <MessageSquare className=\"w-4 h-4 text-primary\" />\n <h3 className=\"font-semibold text-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.title' })}</h3>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => setIsPropertyPanelOpen(false)}\n title={formatMessage({ id: 'orchestrator.propertyPanel.close' })}\n >\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n\n {/* Node Type Badge */}\n <div className=\"px-4 py-2 border-b border-border bg-muted/30\">\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {formatMessage({ id: 'orchestrator.propertyPanel.nodeType' })}\n </span>\n </div>\n\n {/* Properties Form - unified for all nodes */}\n <div className=\"flex-1 overflow-y-auto p-4\">\n <PromptTemplateProperties\n data={selectedNode.data as PromptTemplateNodeData}\n onChange={handleChange}\n />\n </div>\n\n {/* Footer Actions */}\n <div className=\"px-4 py-3 border-t border-border space-y-2\">\n <SaveAsTemplateButton nodeId={selectedNodeId!} nodeLabel={selectedNode.data.label} />\n <Button variant=\"destructive\" className=\"w-full\" onClick={handleDelete}>\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.deleteNode' })}\n </Button>\n </div>\n </div>\n );\n}\n\nexport default PropertyPanel;\n","// ========================================\n// Flow Toolbar Component\n// ========================================\n// Toolbar for flow operations: Save, Load, Import Template, Export, Send to Terminal\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Save,\n FolderOpen,\n Download,\n Trash2,\n Copy,\n Workflow,\n Loader2,\n ChevronDown,\n Library,\n Terminal,\n Maximize2,\n Minimize2,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { useFlowStore, toast } from '@/stores';\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\nimport type { Flow } from '@/types/flow';\n\ninterface FlowToolbarProps {\n className?: string;\n onOpenTemplateLibrary?: () => void;\n}\n\nexport function FlowToolbar({ className, onOpenTemplateLibrary }: FlowToolbarProps) {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const [isFlowListOpen, setIsFlowListOpen] = useState(false);\n const [flowName, setFlowName] = useState('');\n const [isSaving, setIsSaving] = useState(false);\n\n // Immersive mode state\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\n\n // Flow store\n const currentFlow = useFlowStore((state) => state.currentFlow);\n const isModified = useFlowStore((state) => state.isModified);\n const flows = useFlowStore((state) => state.flows);\n const isLoadingFlows = useFlowStore((state) => state.isLoadingFlows);\n const saveFlow = useFlowStore((state) => state.saveFlow);\n const loadFlow = useFlowStore((state) => state.loadFlow);\n const deleteFlow = useFlowStore((state) => state.deleteFlow);\n const duplicateFlow = useFlowStore((state) => state.duplicateFlow);\n const fetchFlows = useFlowStore((state) => state.fetchFlows);\n\n // Load flows on mount\n useEffect(() => {\n fetchFlows();\n }, [fetchFlows]);\n\n // Sync flow name with current flow\n useEffect(() => {\n setFlowName(currentFlow?.name || '');\n }, [currentFlow?.name]);\n\n // Handle save\n const handleSave = useCallback(async () => {\n setIsSaving(true);\n try {\n const name = flowName.trim() || formatMessage({ id: 'orchestrator.toolbar.placeholder' });\n\n // Auto-create a new flow if none exists\n if (!currentFlow) {\n const now = new Date().toISOString();\n const newFlow: Flow = {\n id: `flow-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n name,\n version: 1,\n created_at: now,\n updated_at: now,\n nodes: useFlowStore.getState().nodes,\n edges: useFlowStore.getState().edges,\n variables: {},\n metadata: {},\n };\n useFlowStore.setState({ currentFlow: newFlow });\n } else if (flowName && flowName !== currentFlow.name) {\n // Update flow name if changed\n useFlowStore.setState((state) => ({\n currentFlow: state.currentFlow\n ? { ...state.currentFlow, name }\n : null,\n }));\n }\n\n const saved = await saveFlow();\n if (saved) {\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowSaved' }), formatMessage({ id: 'orchestrator.notifications.savedSuccessfully' }, { name }));\n } else {\n toast.error(formatMessage({ id: 'orchestrator.notifications.saveFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotSave' }));\n }\n } catch (err) {\n toast.error(formatMessage({ id: 'orchestrator.notifications.saveFailed' }), formatMessage({ id: 'orchestrator.notifications.saveError' }));\n } finally {\n setIsSaving(false);\n }\n }, [currentFlow, flowName, saveFlow, formatMessage]);\n\n // Handle load\n const handleLoad = useCallback(\n async (flow: Flow) => {\n const loaded = await loadFlow(flow.id);\n if (loaded) {\n setIsFlowListOpen(false);\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowLoaded' }), formatMessage({ id: 'orchestrator.notifications.loadedSuccessfully' }, { name: flow.name }));\n } else {\n toast.error(formatMessage({ id: 'orchestrator.notifications.loadFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotLoad' }));\n }\n },\n [loadFlow]\n );\n\n // Handle delete\n const handleDelete = useCallback(\n async (flow: Flow, e: React.MouseEvent) => {\n e.stopPropagation();\n if (!confirm(formatMessage({ id: 'orchestrator.notifications.confirmDelete' }, { name: flow.name }))) return;\n\n const deleted = await deleteFlow(flow.id);\n if (deleted) {\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowDeleted' }), formatMessage({ id: 'orchestrator.notifications.deletedSuccessfully' }, { name: flow.name }));\n } else {\n toast.error(formatMessage({ id: 'orchestrator.notifications.deleteFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotDelete' }));\n }\n },\n [deleteFlow]\n );\n\n // Handle duplicate\n const handleDuplicate = useCallback(\n async (flow: Flow, e: React.MouseEvent) => {\n e.stopPropagation();\n const duplicated = await duplicateFlow(flow.id);\n if (duplicated) {\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowDuplicated' }), formatMessage({ id: 'orchestrator.notifications.duplicatedSuccessfully' }, { name: duplicated.name }));\n } else {\n toast.error(formatMessage({ id: 'orchestrator.notifications.duplicateFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotDuplicate' }));\n }\n },\n [duplicateFlow]\n );\n\n // Handle export\n const handleExport = useCallback(() => {\n if (!currentFlow) {\n toast.error(formatMessage({ id: 'orchestrator.notifications.noFlow' }), formatMessage({ id: 'orchestrator.notifications.noFlowToExport' }));\n return;\n }\n\n const nodes = useFlowStore.getState().nodes;\n const edges = useFlowStore.getState().edges;\n const exportData = {\n ...currentFlow,\n nodes,\n edges,\n };\n\n const blob = new Blob([JSON.stringify(exportData, null, 2)], {\n type: 'application/json',\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${currentFlow.name.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowExported' }), formatMessage({ id: 'orchestrator.notifications.flowExported' }));\n }, [currentFlow]);\n\n // Handle send to terminal execution\n const handleSendToTerminal = useCallback(async () => {\n if (!currentFlow) {\n toast.error(formatMessage({ id: 'orchestrator.notifications.noFlow' }), formatMessage({ id: 'orchestrator.notifications.saveBeforeExecute' }));\n return;\n }\n\n // Save flow first if modified\n if (isModified) {\n const saved = await saveFlow();\n if (!saved) {\n toast.error(formatMessage({ id: 'orchestrator.notifications.saveFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotSave' }));\n return;\n }\n }\n\n // Navigate to terminal dashboard with flow execution request\n navigate(`/terminal?executeFlow=${currentFlow.id}`);\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowSent' }), formatMessage({ id: 'orchestrator.notifications.sentToTerminal' }, { name: currentFlow.name }));\n }, [currentFlow, isModified, saveFlow, navigate, formatMessage]);\n\n return (\n <div className={cn('flex items-center gap-3 p-3 bg-card border-b border-border', className)}>\n {/* Flow Icon and Name */}\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <Workflow className=\"w-5 h-5 text-primary flex-shrink-0\" />\n <Input\n value={flowName}\n onChange={(e) => setFlowName(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.toolbar.placeholder' })}\n className=\"max-w-[200px] h-8 text-sm\"\n />\n {isModified && (\n <span className=\"text-xs text-amber-500 flex-shrink-0\">{formatMessage({ id: 'orchestrator.toolbar.unsavedChanges' })}</span>\n )}\n </div>\n\n {/* Action Buttons */}\n <div className=\"flex items-center gap-2\">\n {/* Save & Load Group */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleSave}\n disabled={isSaving}\n >\n {isSaving ? (\n <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" />\n ) : (\n <Save className=\"w-4 h-4 mr-1\" />\n )}\n {formatMessage({ id: 'orchestrator.toolbar.save' })}\n </Button>\n\n {/* Flow List Dropdown */}\n <div className=\"relative\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsFlowListOpen(!isFlowListOpen)}\n >\n <FolderOpen className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'orchestrator.toolbar.load' })}\n <ChevronDown className=\"w-3 h-3 ml-1\" />\n </Button>\n\n {isFlowListOpen && (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setIsFlowListOpen(false)}\n />\n\n {/* Dropdown */}\n <div className=\"absolute top-full right-0 mt-1 w-72 bg-card border border-border rounded-lg shadow-lg z-50 overflow-hidden\">\n <div className=\"px-3 py-2 border-b border-border bg-muted/50\">\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {formatMessage({ id: 'orchestrator.toolbar.savedFlows' }, { count: flows.length })}\n </span>\n </div>\n\n <div className=\"max-h-64 overflow-y-auto\">\n {isLoadingFlows ? (\n <div className=\"p-4 text-center text-muted-foreground\">\n <Loader2 className=\"w-5 h-5 animate-spin mx-auto mb-2\" />\n {formatMessage({ id: 'orchestrator.toolbar.loading' })}\n </div>\n ) : flows.length === 0 ? (\n <div className=\"p-4 text-center text-muted-foreground\">\n {formatMessage({ id: 'orchestrator.toolbar.noSavedFlows' })}\n </div>\n ) : (\n flows.map((flow) => (\n <div\n key={flow.id}\n onClick={() => handleLoad(flow)}\n className={cn(\n 'flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-muted/50 transition-colors',\n currentFlow?.id === flow.id && 'bg-primary/10'\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-medium text-foreground truncate\">\n {flow.name}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {new Date(flow.updated_at).toLocaleDateString()}\n </div>\n </div>\n <div className=\"flex items-center gap-1 ml-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={(e) => handleDuplicate(flow, e)}\n title={formatMessage({ id: 'orchestrator.toolbar.duplicate' })}\n >\n <Copy className=\"w-3 h-3\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 text-destructive hover:text-destructive\"\n onClick={(e) => handleDelete(flow, e)}\n title={formatMessage({ id: 'orchestrator.toolbar.delete' })}\n >\n <Trash2 className=\"w-3 h-3\" />\n </Button>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </>\n )}\n </div>\n\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Import & Export Group */}\n <Button variant=\"outline\" size=\"sm\" onClick={onOpenTemplateLibrary}>\n <Library className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'orchestrator.toolbar.importTemplate' })}\n </Button>\n\n <Button variant=\"outline\" size=\"sm\" onClick={handleExport} disabled={!currentFlow}>\n <Download className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'orchestrator.toolbar.export' })}\n </Button>\n\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Execute in Terminal */}\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleSendToTerminal}\n disabled={!currentFlow}\n >\n <Terminal className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'orchestrator.toolbar.sendToTerminal' })}\n </Button>\n\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Fullscreen Toggle */}\n <button\n onClick={toggleImmersiveMode}\n className={cn(\n 'p-2 rounded-md transition-colors',\n isImmersiveMode\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\n )}\n title={isImmersiveMode ? 'Exit Fullscreen' : 'Fullscreen'}\n >\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\n </button>\n </div>\n </div>\n );\n}\n\nexport default FlowToolbar;\n","// ========================================\n// Template Library\n// ========================================\n// Template browser with import/export functionality\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Library,\n Search,\n Download,\n Upload,\n Grid,\n List,\n Tag,\n Calendar,\n FileText,\n GitBranch,\n Loader2,\n Trash2,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from '@/components/ui/Dialog';\nimport { useTemplates, useInstallTemplate, useExportTemplate, useDeleteTemplate } from '@/hooks/useTemplates';\nimport { useFlowStore } from '@/stores';\nimport type { FlowTemplate } from '@/types/execution';\n\n// ========== Helper Functions ==========\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\n// ========== Template Card Component ==========\n\ninterface TemplateCardProps {\n template: FlowTemplate;\n viewMode: 'grid' | 'list';\n onInstall: (template: FlowTemplate) => void;\n onDelete: (template: FlowTemplate) => void;\n isInstalling: boolean;\n isDeleting: boolean;\n}\n\nfunction TemplateCard({\n template,\n viewMode,\n onInstall,\n onDelete,\n isInstalling,\n isDeleting,\n}: TemplateCardProps) {\n const { formatMessage } = useIntl();\n const isGrid = viewMode === 'grid';\n\n return (\n <Card\n className={cn(\n 'hover:border-primary/50 transition-colors',\n isGrid ? '' : 'flex items-center'\n )}\n >\n {isGrid ? (\n <>\n {/* Grid view */}\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-start justify-between\">\n <CardTitle className=\"text-base truncate\" title={template.name}>\n {template.name}\n </CardTitle>\n {template.category && (\n <Badge variant=\"secondary\" className=\"text-xs shrink-0\">\n {template.category}\n </Badge>\n )}\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {template.description && (\n <p className=\"text-sm text-muted-foreground line-clamp-2\">\n {template.description}\n </p>\n )}\n\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <GitBranch className=\"h-3 w-3\" />\n {template.nodeCount} {formatMessage({ id: 'orchestrator.templateLibrary.card.nodes' })}\n </span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatDate(template.updated_at)}\n </span>\n </div>\n\n {template.tags && template.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {template.tags.slice(0, 3).map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n <Tag className=\"h-2 w-2 mr-1\" />\n {tag}\n </Badge>\n ))}\n {template.tags.length > 3 && (\n <span className=\"text-xs text-muted-foreground\">\n +{template.tags.length - 3}\n </span>\n )}\n </div>\n )}\n\n <div className=\"flex items-center gap-2 pt-2\">\n <Button\n size=\"sm\"\n variant=\"default\"\n className=\"flex-1\"\n onClick={() => onInstall(template)}\n disabled={isInstalling}\n >\n {isInstalling ? (\n <Loader2 className=\"h-4 w-4 animate-spin mr-1\" />\n ) : (\n <Download className=\"h-4 w-4 mr-1\" />\n )}\n Import\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onDelete(template)}\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </CardContent>\n </>\n ) : (\n <>\n {/* List view */}\n <div className=\"flex-1 flex items-center gap-4 p-4\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium truncate\">{template.name}</span>\n {template.category && (\n <Badge variant=\"secondary\" className=\"text-xs shrink-0\">\n {template.category}\n </Badge>\n )}\n </div>\n {template.description && (\n <p className=\"text-sm text-muted-foreground truncate\">\n {template.description}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground shrink-0\">\n <span className=\"flex items-center gap-1\">\n <GitBranch className=\"h-3 w-3\" />\n {template.nodeCount}\n </span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatDate(template.updated_at)}\n </span>\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n <Button\n size=\"sm\"\n variant=\"default\"\n onClick={() => onInstall(template)}\n disabled={isInstalling}\n >\n {isInstalling ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Download className=\"h-4 w-4\" />\n )}\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onDelete(template)}\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </div>\n </>\n )}\n </Card>\n );\n}\n\n// ========== Export Dialog Component ==========\n\ninterface ExportDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onExport: (name: string, description: string, category: string, tags: string[]) => void;\n isExporting: boolean;\n flowName: string;\n}\n\nfunction ExportDialog({\n open,\n onOpenChange,\n onExport,\n isExporting,\n flowName,\n}: ExportDialogProps) {\n const { formatMessage } = useIntl();\n const [name, setName] = useState(flowName);\n const [description, setDescription] = useState('');\n const [category, setCategory] = useState('');\n const [tagsInput, setTagsInput] = useState('');\n\n const handleExport = useCallback(() => {\n const tags = tagsInput\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n onExport(name, description, category, tags);\n }, [name, description, category, tagsInput, onExport]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.title' })}</DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.description' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.name' })}</label>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.namePlaceholder' })}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.description' })}</label>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.descriptionPlaceholder' })}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.category' })}</label>\n <Input\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.categoryPlaceholder' })}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.tags' })}</label>\n <Input\n value={tagsInput}\n onChange={(e) => setTagsInput(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.tagsPlaceholder' })}\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={handleExport} disabled={!name.trim() || isExporting}>\n {isExporting ? (\n <Loader2 className=\"h-4 w-4 animate-spin mr-1\" />\n ) : (\n <Upload className=\"h-4 w-4 mr-1\" />\n )}\n Export\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ========== Main Component ==========\n\ninterface TemplateLibraryProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport function TemplateLibrary({ open, onOpenChange }: TemplateLibraryProps) {\n const { formatMessage } = useIntl();\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid');\n const [exportDialogOpen, setExportDialogOpen] = useState(false);\n const [installingId, setInstallingId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n\n // Flow store\n const currentFlow = useFlowStore((state) => state.currentFlow);\n const setCurrentFlow = useFlowStore((state) => state.setCurrentFlow);\n\n // Query hooks\n const { data, isLoading, error } = useTemplates(selectedCategory ?? undefined);\n\n // Mutation hooks\n const installTemplate = useInstallTemplate();\n const exportTemplate = useExportTemplate();\n const deleteTemplate = useDeleteTemplate();\n\n // Filter templates by search query\n const filteredTemplates = useMemo(() => {\n if (!data?.templates) return [];\n if (!searchQuery.trim()) return data.templates;\n\n const query = searchQuery.toLowerCase();\n return data.templates.filter(\n (t) =>\n t.name.toLowerCase().includes(query) ||\n t.description?.toLowerCase().includes(query) ||\n t.tags?.some((tag) => tag.toLowerCase().includes(query))\n );\n }, [data?.templates, searchQuery]);\n\n // Handle install\n const handleInstall = useCallback(\n async (template: FlowTemplate) => {\n setInstallingId(template.id);\n try {\n const result = await installTemplate.mutateAsync({\n templateId: template.id,\n });\n // Set the installed flow as current\n setCurrentFlow(result.flow);\n onOpenChange(false);\n } catch (error) {\n console.error('Failed to install template:', error);\n } finally {\n setInstallingId(null);\n }\n },\n [installTemplate, setCurrentFlow, onOpenChange]\n );\n\n // Handle export\n const handleExport = useCallback(\n async (name: string, description: string, category: string, tags: string[]) => {\n if (!currentFlow) return;\n\n try {\n await exportTemplate.mutateAsync({\n flowId: currentFlow.id,\n name,\n description,\n category,\n tags,\n });\n setExportDialogOpen(false);\n } catch (error) {\n console.error('Failed to export template:', error);\n }\n },\n [currentFlow, exportTemplate]\n );\n\n // Handle delete\n const handleDelete = useCallback(\n async (template: FlowTemplate) => {\n setDeletingId(template.id);\n try {\n await deleteTemplate.mutateAsync(template.id);\n } catch (error) {\n console.error('Failed to delete template:', error);\n } finally {\n setDeletingId(null);\n }\n },\n [deleteTemplate]\n );\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-4xl max-h-[80vh] flex flex-col\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Library className=\"h-5 w-5\" />\n Template Library\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'orchestrator.templateLibrary.description' })}\n </DialogDescription>\n </DialogHeader>\n\n {/* Toolbar */}\n <div className=\"flex items-center gap-4 py-2\">\n {/* Search */}\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.searchPlaceholder' })}\n className=\"pl-9\"\n />\n </div>\n\n {/* Category filter */}\n {data?.categories && data.categories.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <Button\n variant={selectedCategory === null ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedCategory(null)}\n >\n All\n </Button>\n {data.categories.slice(0, 4).map((cat) => (\n <Button\n key={cat}\n variant={selectedCategory === cat ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedCategory(cat)}\n >\n {cat}\n </Button>\n ))}\n </div>\n )}\n\n {/* View mode toggle */}\n <div className=\"flex items-center border border-border rounded-md\">\n <Button\n variant={viewMode === 'grid' ? 'secondary' : 'ghost'}\n size=\"sm\"\n className=\"rounded-r-none\"\n onClick={() => setViewMode('grid')}\n >\n <Grid className=\"h-4 w-4\" />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'secondary' : 'ghost'}\n size=\"sm\"\n className=\"rounded-l-none\"\n onClick={() => setViewMode('list')}\n >\n <List className=\"h-4 w-4\" />\n </Button>\n </div>\n\n {/* Export button */}\n {currentFlow && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setExportDialogOpen(true)}\n >\n <Upload className=\"h-4 w-4 mr-1\" />\n Export Current\n </Button>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto min-h-0\">\n {isLoading ? (\n <div className=\"flex items-center justify-center h-48\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n ) : error ? (\n <div className=\"flex flex-col items-center justify-center h-48 text-muted-foreground\">\n <FileText className=\"h-12 w-12 mb-2\" />\n <p>{formatMessage({ id: 'orchestrator.templateLibrary.errors.loadFailed' })}</p>\n <p className=\"text-sm\">{(error as Error).message}</p>\n </div>\n ) : filteredTemplates.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-48 text-muted-foreground\">\n <Library className=\"h-12 w-12 mb-2\" />\n <p>{formatMessage({ id: 'orchestrator.templateLibrary.emptyState.title' })}</p>\n {searchQuery && (\n <p className=\"text-sm\">{formatMessage({ id: 'orchestrator.templateLibrary.emptyState.searchSuggestion' })}</p>\n )}\n </div>\n ) : (\n <div\n className={cn(\n viewMode === 'grid'\n ? 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4'\n : 'space-y-2'\n )}\n >\n {filteredTemplates.map((template) => (\n <TemplateCard\n key={template.id}\n template={template}\n viewMode={viewMode}\n onInstall={handleInstall}\n onDelete={handleDelete}\n isInstalling={installingId === template.id}\n isDeleting={deletingId === template.id}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <DialogFooter className=\"border-t border-border pt-4\">\n <div className=\"flex items-center justify-between w-full\">\n <span className=\"text-sm text-muted-foreground\">\n {formatMessage(\n { id: 'orchestrator.templateLibrary.footer.templateCount' },\n { count: filteredTemplates.length }\n )}\n </span>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Close\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Export Dialog */}\n {currentFlow && (\n <ExportDialog\n open={exportDialogOpen}\n onOpenChange={setExportDialogOpen}\n onExport={handleExport}\n isExporting={exportTemplate.isPending}\n flowName={currentFlow.name}\n />\n )}\n </>\n );\n}\n\nexport default TemplateLibrary;\n","// ========================================\r\n// Orchestrator Page\r\n// ========================================\r\n// Visual workflow template editor with React Flow, drag-drop node palette, and property panel\r\n// Execution functionality moved to Terminal Dashboard\r\n\r\nimport { useEffect, useState, useCallback } from 'react';\r\nimport * as Collapsible from '@radix-ui/react-collapsible';\r\nimport { ChevronRight } from 'lucide-react';\r\nimport { useFlowStore } from '@/stores';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { FlowCanvas } from './FlowCanvas';\r\nimport { LeftSidebar } from './LeftSidebar';\r\nimport { PropertyPanel } from './PropertyPanel';\r\nimport { FlowToolbar } from './FlowToolbar';\r\nimport { TemplateLibrary } from './TemplateLibrary';\r\n\r\nexport function OrchestratorPage() {\r\n const fetchFlows = useFlowStore((state) => state.fetchFlows);\r\n const isPaletteOpen = useFlowStore((state) => state.isPaletteOpen);\r\n const setIsPaletteOpen = useFlowStore((state) => state.setIsPaletteOpen);\r\n const isPropertyPanelOpen = useFlowStore((state) => state.isPropertyPanelOpen);\r\n const [isTemplateLibraryOpen, setIsTemplateLibraryOpen] = useState(false);\r\n\r\n // Load flows on mount\r\n useEffect(() => {\r\n fetchFlows();\r\n }, [fetchFlows]);\r\n\r\n // Handle open template library\r\n const handleOpenTemplateLibrary = useCallback(() => {\r\n setIsTemplateLibraryOpen(true);\r\n }, []);\r\n\r\n return (\r\n <div className=\"h-[calc(100%+2rem)] md:h-[calc(100%+3rem)] flex flex-col -m-4 md:-m-6\">\r\n {/* Toolbar */}\r\n <FlowToolbar onOpenTemplateLibrary={handleOpenTemplateLibrary} />\r\n\r\n {/* Main Content Area */}\r\n <div className=\"flex-1 flex overflow-hidden\">\r\n {/* Left Sidebar with collapse toggle */}\r\n {!isPaletteOpen && (\r\n <div className=\"w-10 bg-card border-r border-border flex flex-col items-center py-4\">\r\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setIsPaletteOpen(true)} title=\"Expand\">\r\n <ChevronRight className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n )}\r\n <Collapsible.Root open={isPaletteOpen} onOpenChange={setIsPaletteOpen} className=\"h-full\">\r\n <Collapsible.Content className=\"h-full overflow-hidden data-[state=open]:animate-collapsible-slide-down data-[state=closed]:animate-collapsible-slide-up\">\r\n <LeftSidebar />\r\n </Collapsible.Content>\r\n </Collapsible.Root>\r\n\r\n {/* Flow Canvas (Center) + PropertyPanel Overlay */}\r\n <div className=\"flex-1 relative\">\r\n <FlowCanvas className=\"absolute inset-0\" />\r\n\r\n {/* Property Panel as overlay - only shown when a node is selected */}\r\n {isPropertyPanelOpen && (\r\n <div className=\"absolute top-2 right-2 bottom-2 z-10\">\r\n <PropertyPanel className=\"h-full\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Template Library Dialog */}\r\n <TemplateLibrary\r\n open={isTemplateLibraryOpen}\r\n onOpenChange={setIsTemplateLibraryOpen}\r\n />\r\n </div>\r\n );\r\n}\r\n"],"names":["GripVertical","createLucideIcon","Hand","Library","MousePointerClick","STATUS_STYLES","SELECTION_STYLES","StatusIcon","status","jsx","Circle","Loader2","CheckCircle2","XCircle","NodeWrapper","children","selected","accentColor","className","jsxs","cn","MODE_STYLES","TOOL_STYLES","PHASE_COLORS","PHASE_THEME","CATEGORY_THEME","DEFAULT_THEME","STATUS_INDICATORS","PromptTemplateNode","memo","data","displayInstruction","hasContextRefs","hasPhase","statusInfo","hasArtifacts","hasTags","theme","Handle","Position","MessageSquare","Terminal","tag","Link2","artifact","nodeTypes","InteractionModeToggle","disabled","formatMessage","useIntl","interactionMode","useFlowStore","state","toggleInteractionMode","FlowCanvasInner","reactFlowWrapper","useRef","screenToFlowPosition","useReactFlow","isExecuting","useExecutionStore","selectIsExecuting","nodes","edges","setNodes","setEdges","addNode","addNodeFromTemplate","setSelectedNodeId","setSelectedEdgeId","markModified","isCtrlPressed","setIsCtrlPressed","useState","useEffect","handleKeyDown","e","handleKeyUp","handleBlur","effectiveMode","onNodesChange","useCallback","changes","updatedNodes","applyNodeChanges","onEdgesChange","updatedEdges","applyEdgeChanges","onConnect","connection","newEdge","onNodeClick","_event","node","onEdgeClick","edge","onPaneClick","onDragOver","event","onDrop","position","templateId","ReactFlow","Panel","Controls","MiniMap","Background","BackgroundVariant","FlowCanvas","props","ReactFlowProvider","TEMPLATE_ICONS","TEMPLATE_I18N","COLOR_OPTIONS","TemplateCategory","title","defaultExpanded","action","isExpanded","setIsExpanded","ChevronDown","ChevronRight","QuickTemplateCard","template","onDelete","Icon","i18n","displayLabel","displayDesc","onDragStart","onDoubleClick","Trash2","BasicTemplateCard","Plus","CreateTemplateForm","onClose","label","setLabel","description","setDescription","instruction","setInstruction","color","setColor","addCustomTemplate","s","handleSubmit","X","opt","NodeLibrary","isCreating","setIsCreating","customTemplates","removeCustomTemplate","QUICK_TEMPLATES","API_BASE","templateKeys","filters","id","toFlowTemplate","raw","meta","toFlowFromTemplate","now","fetchTemplates","category","url","response","json","templates","total","categories","t","c","installTemplate","request","exportTemplate","deleteTemplate","useTemplates","useQuery","useInstallTemplate","queryClient","useQueryClient","useMutation","useExportTemplate","result","old","useDeleteTemplate","_","deletedId","TemplateItem","onInstall","isInstalling","GitBranch","Badge","Download","InlineTemplatePanel","searchQuery","setSearchQuery","installingId","setInstallingId","setCurrentFlow","isLoading","error","filteredTemplates","useMemo","query","_a","_b","_c","handleInstall","err","Search","Input","FileText","useResizablePanel","options","minWidth","maxWidth","defaultWidth","storageKey","direction","width","setWidth","saved","parsed","isResizing","setIsResizing","startXRef","startWidthRef","handleMouseMove","deltaX","newWidth","constrainedWidth","handleMouseUp","handleMouseDown","ResizeHandle","onMouseDown","TABS","LeftSidebar","setIsPaletteOpen","leftPanelTab","setLeftPanelTab","Button","tab","CommandCombobox","value","onChange","onSelectDetails","placeholder","open","setOpen","search","setSearch","containerRef","inputRef","commands","commandsLoading","useCommands","skills","skillsLoading","useSkills","unifiedItems","items","cmd","skill","groupedFiltered","filtered","item","groups","totalFiltered","sum","handleClickOutside","handleSelect","handleInputChange","selectedItem","displayValue","a","b","group","BUILTIN_TEMPLATES","TEMPLATE_COLORS","CUSTOM_TEMPLATES_KEY","loadCustomTemplates","stored","saveCustomTemplates","TemplateModal","isOpen","onSave","content","setContent","hasInput","setHasInput","inputLabel","setInputLabel","inputDefault","setInputDefault","handleSave","Save","tokenize","text","tokens","regex","lastIndex","match","extractVariables","matches","m","extractArtifacts","TagEditor","availableVariables","minHeight","editorRef","isFocused","setIsFocused","newVarName","setNewVarName","newArtifactName","setNewArtifactName","isModalOpen","setIsModalOpen","setCustomTemplates","detectedVars","detectedArtifacts","hasContent","allTemplates","handleSaveTemplate","updated","handleDeleteTemplate","handleInput","clone","varName","artName","br","handlePaste","insertVariable","varText","insertArtifact","artText","insertText","handleAddVariable","handleAddArtifact","handleVarInputKeyDown","renderContent","token","Fragment","isValid","AlertCircle","inputValue","LabelInput","SlashCommandSection","argumentHint","setArgumentHint","handleCommandSelect","name","updates","handleSelectDetails","details","CollapsibleSection","TagsInput","tags","input","setInput","handleAdd","handleRemove","ArtifactsList","artifacts","index","i","PromptTemplateProperties","selectedNodeId","isSlashCommandMode","availableOutputNames","n","newMode","arts","next","SAVE_COLOR_OPTIONS","SaveAsTemplateButton","nodeId","nodeLabel","setIsOpen","setName","desc","setDesc","executionStatus","executionError","executionResult","templateData","BookmarkPlus","PropertyPanel","updateNode","removeNode","setIsPropertyPanelOpen","selectedNode","handleChange","handleDelete","Settings","FlowToolbar","onOpenTemplateLibrary","navigate","useNavigate","isFlowListOpen","setIsFlowListOpen","flowName","setFlowName","isSaving","setIsSaving","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","currentFlow","isModified","flows","isLoadingFlows","saveFlow","loadFlow","deleteFlow","duplicateFlow","fetchFlows","newFlow","toast","handleLoad","flow","handleDuplicate","duplicated","handleExport","exportData","blob","handleSendToTerminal","Workflow","FolderOpen","Copy","Minimize2","Maximize2","formatDate","dateString","TemplateCard","viewMode","isDeleting","isGrid","Card","CardHeader","CardTitle","CardContent","Calendar","Tag","ExportDialog","onOpenChange","onExport","isExporting","setCategory","tagsInput","setTagsInput","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","Upload","TemplateLibrary","selectedCategory","setSelectedCategory","setViewMode","exportDialogOpen","setExportDialogOpen","deletingId","setDeletingId","cat","Grid","List","OrchestratorPage","isPaletteOpen","isPropertyPanelOpen","isTemplateLibraryOpen","setIsTemplateLibraryOpen","handleOpenTemplateLibrary","Collapsible.Root","Collapsible.Content"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
1
+ {"version":3,"file":"OrchestratorPage-ThBG24Gg.js","sources":["../../../../node_modules/lucide-react/dist/esm/icons/grip-vertical.js","../../../../node_modules/lucide-react/dist/esm/icons/hand.js","../../../../node_modules/lucide-react/dist/esm/icons/library.js","../../../../node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.js","../../src/pages/orchestrator/nodes/NodeWrapper.tsx","../../src/pages/orchestrator/nodes/PromptTemplateNode.tsx","../../src/pages/orchestrator/nodes/index.ts","../../src/pages/orchestrator/InteractionModeToggle.tsx","../../src/pages/orchestrator/FlowCanvas.tsx","../../src/pages/orchestrator/NodeLibrary.tsx","../../src/hooks/useTemplates.ts","../../src/pages/orchestrator/InlineTemplatePanel.tsx","../../src/pages/orchestrator/useResizablePanel.ts","../../src/pages/orchestrator/ResizeHandle.tsx","../../src/pages/orchestrator/LeftSidebar.tsx","../../src/components/ui/CommandCombobox.tsx","../../src/pages/orchestrator/PropertyPanel.tsx","../../src/pages/orchestrator/FlowToolbar.tsx","../../src/pages/orchestrator/TemplateLibrary.tsx","../../src/pages/orchestrator/OrchestratorPage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GripVertical = createLucideIcon(\"GripVertical\", [\n [\"circle\", { cx: \"9\", cy: \"12\", r: \"1\", key: \"1vctgf\" }],\n [\"circle\", { cx: \"9\", cy: \"5\", r: \"1\", key: \"hp0tcf\" }],\n [\"circle\", { cx: \"9\", cy: \"19\", r: \"1\", key: \"fkjjf6\" }],\n [\"circle\", { cx: \"15\", cy: \"12\", r: \"1\", key: \"1tmaij\" }],\n [\"circle\", { cx: \"15\", cy: \"5\", r: \"1\", key: \"19l28e\" }],\n [\"circle\", { cx: \"15\", cy: \"19\", r: \"1\", key: \"f4zoj3\" }]\n]);\n\nexport { GripVertical as default };\n//# sourceMappingURL=grip-vertical.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Hand = createLucideIcon(\"Hand\", [\n [\"path\", { d: \"M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2\", key: \"1fvzgz\" }],\n [\"path\", { d: \"M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2\", key: \"1kc0my\" }],\n [\"path\", { d: \"M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8\", key: \"10h0bg\" }],\n [\n \"path\",\n {\n d: \"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\",\n key: \"1s1gnw\"\n }\n ]\n]);\n\nexport { Hand as default };\n//# sourceMappingURL=hand.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Library = createLucideIcon(\"Library\", [\n [\"path\", { d: \"m16 6 4 14\", key: \"ji33uf\" }],\n [\"path\", { d: \"M12 6v14\", key: \"1n7gus\" }],\n [\"path\", { d: \"M8 8v12\", key: \"1gg7y9\" }],\n [\"path\", { d: \"M4 4v16\", key: \"6qkkli\" }]\n]);\n\nexport { Library as default };\n//# sourceMappingURL=library.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst MousePointerClick = createLucideIcon(\"MousePointerClick\", [\n [\"path\", { d: \"M14 4.1 12 6\", key: \"ita8i4\" }],\n [\"path\", { d: \"m5.1 8-2.9-.8\", key: \"1go3kf\" }],\n [\"path\", { d: \"m6 12-1.9 2\", key: \"mnht97\" }],\n [\"path\", { d: \"M7.2 2.2 8 5.1\", key: \"1cfko1\" }],\n [\n \"path\",\n {\n d: \"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z\",\n key: \"s0h3yz\"\n }\n ]\n]);\n\nexport { MousePointerClick as default };\n//# sourceMappingURL=mouse-pointer-click.js.map\n","// ========================================\r\n// Node Wrapper Component\r\n// ========================================\r\n// Shared wrapper for all custom nodes with execution status styling\r\n\r\nimport { ReactNode } from 'react';\r\nimport {\r\n Circle,\r\n Loader2,\r\n CheckCircle2,\r\n XCircle,\r\n} from 'lucide-react';\r\nimport type { ExecutionStatus } from '@/types/flow';\r\nimport { cn } from '@/lib/utils';\r\n\r\ninterface NodeWrapperProps {\r\n children: ReactNode;\r\n status?: ExecutionStatus;\r\n selected?: boolean;\r\n accentColor: string;\r\n className?: string;\r\n}\r\n\r\n// Status styling configuration\r\nconst STATUS_STYLES: Record<ExecutionStatus, string> = {\r\n pending: 'border-muted bg-card',\r\n running: 'border-primary bg-primary/10 animate-pulse',\r\n completed: 'border-green-500 bg-green-500/10',\r\n failed: 'border-destructive bg-destructive/10',\r\n};\r\n\r\n// Selection ring styles per accent color\r\nconst SELECTION_STYLES: Record<string, string> = {\r\n blue: 'ring-2 ring-blue-500/20 border-blue-500',\r\n green: 'ring-2 ring-green-500/20 border-green-500',\r\n amber: 'ring-2 ring-amber-500/20 border-amber-500',\r\n purple: 'ring-2 ring-purple-500/20 border-purple-500',\r\n sky: 'ring-2 ring-sky-500/20 border-sky-500',\r\n cyan: 'ring-2 ring-cyan-500/20 border-cyan-500',\r\n teal: 'ring-2 ring-teal-500/20 border-teal-500',\r\n orange: 'ring-2 ring-orange-500/20 border-orange-500',\r\n indigo: 'ring-2 ring-indigo-500/20 border-indigo-500',\r\n};\r\n\r\n// Status icons\r\nfunction StatusIcon({ status }: { status: ExecutionStatus }) {\r\n switch (status) {\r\n case 'pending':\r\n return <Circle className=\"w-3 h-3 text-muted-foreground\" />;\r\n case 'running':\r\n return <Loader2 className=\"w-3 h-3 text-primary animate-spin\" />;\r\n case 'completed':\r\n return <CheckCircle2 className=\"w-3 h-3 text-green-500\" />;\r\n case 'failed':\r\n return <XCircle className=\"w-3 h-3 text-destructive\" />;\r\n }\r\n}\r\n\r\nexport function NodeWrapper({\r\n children,\r\n status = 'pending',\r\n selected = false,\r\n accentColor,\r\n className,\r\n}: NodeWrapperProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'relative min-w-[180px] rounded-lg border-2 shadow-md transition-all',\r\n STATUS_STYLES[status],\r\n selected && SELECTION_STYLES[accentColor],\r\n className\r\n )}\r\n >\r\n {/* Status indicator */}\r\n <div className=\"absolute -top-2 -right-2 z-10 bg-background rounded-full p-0.5 shadow-sm border border-border\">\r\n <StatusIcon status={status} />\r\n </div>\r\n\r\n {/* Node content (includes handles, header, body) */}\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nNodeWrapper.displayName = 'NodeWrapper';\r\n","// ========================================\n// Prompt Template Node Component\n// ========================================\n// Unified node component for all workflow steps\n// Replaces: SlashCommandNode, CliCommandNode, PromptNode,\n// FileOperationNode, ConditionalNode, ParallelNode\n\nimport { memo } from 'react';\nimport { Handle, Position } from '@xyflow/react';\nimport { MessageSquare, Link2, Terminal } from 'lucide-react';\nimport type { PromptTemplateNodeData } from '@/types/flow';\nimport { NodeWrapper } from './NodeWrapper';\nimport { cn } from '@/lib/utils';\n\ninterface PromptTemplateNodeProps {\n data: PromptTemplateNodeData;\n selected?: boolean;\n}\n\n// Mode badge styling\nconst MODE_STYLES: Record<string, string> = {\n analysis: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n write: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',\n mainprocess: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n async: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n};\n\n// Tool badge styling\nconst TOOL_STYLES: Record<string, string> = {\n gemini: 'bg-blue-50 text-blue-600 dark:bg-blue-900/20 dark:text-blue-400',\n qwen: 'bg-green-50 text-green-600 dark:bg-green-900/20 dark:text-green-400',\n codex: 'bg-purple-50 text-purple-600 dark:bg-purple-900/20 dark:text-purple-400',\n claude: 'bg-amber-50 text-amber-600 dark:bg-amber-900/20 dark:text-amber-400',\n};\n\n// Phase color strip mapping\nconst PHASE_COLORS: Record<string, string> = {\n session: 'bg-sky-500',\n context: 'bg-cyan-500',\n plan: 'bg-amber-500',\n execute: 'bg-green-500',\n review: 'bg-purple-500',\n};\n\n// Phase-based node theme: header bg, handle color, accent for selection ring\nconst PHASE_THEME: Record<string, { header: string; handle: string; accent: string }> = {\n session: { header: 'bg-sky-500', handle: '!bg-sky-500', accent: 'sky' },\n context: { header: 'bg-cyan-500', handle: '!bg-cyan-500', accent: 'cyan' },\n plan: { header: 'bg-amber-500', handle: '!bg-amber-500', accent: 'amber' },\n execute: { header: 'bg-green-500', handle: '!bg-green-500', accent: 'green' },\n review: { header: 'bg-purple-500', handle: '!bg-purple-500', accent: 'purple' },\n};\n\n// nodeCategory-based fallback theme (when no phase set)\nconst CATEGORY_THEME: Record<string, { header: string; handle: string; accent: string }> = {\n tool: { header: 'bg-teal-500', handle: '!bg-teal-500', accent: 'teal' },\n command: { header: 'bg-blue-500', handle: '!bg-blue-500', accent: 'blue' },\n};\n\nconst DEFAULT_THEME = { header: 'bg-blue-500', handle: '!bg-blue-500', accent: 'blue' };\n\n// Execution status indicators\nconst STATUS_INDICATORS: Record<string, { color: string; label: string }> = {\n pending: { color: 'text-slate-400', label: 'Ready' },\n running: { color: 'text-amber-500', label: 'Running' },\n completed: { color: 'text-emerald-500', label: 'Done' },\n failed: { color: 'text-red-500', label: 'Failed' },\n};\n\nexport const PromptTemplateNode = memo(({ data, selected }: PromptTemplateNodeProps) => {\n // Truncate instruction for display (max 50 chars)\n const displayInstruction = data.instruction\n ? data.instruction.length > 50\n ? data.instruction.slice(0, 47) + '...'\n : data.instruction\n : 'No instruction';\n\n const hasContextRefs = data.contextRefs && data.contextRefs.length > 0;\n const hasPhase = data.phase && PHASE_COLORS[data.phase];\n const statusInfo = data.executionStatus ? STATUS_INDICATORS[data.executionStatus] : null;\n const hasArtifacts = data.artifacts && data.artifacts.length > 0;\n const hasTags = data.tags && data.tags.length > 0;\n\n // Resolve node theme based on phase → nodeCategory → default\n const theme = (data.phase && PHASE_THEME[data.phase])\n || (data.nodeCategory && CATEGORY_THEME[data.nodeCategory])\n || DEFAULT_THEME;\n\n return (\n <NodeWrapper\n status={data.executionStatus}\n selected={selected}\n accentColor={theme.accent}\n >\n {/* Phase color strip + content layout */}\n <div className=\"flex\">\n {/* Phase color strip (left border) */}\n {hasPhase && (\n <div className={cn('w-1 rounded-l-md flex-shrink-0', PHASE_COLORS[data.phase!])} />\n )}\n\n <div className=\"flex-1 min-w-0\">\n {/* Input Handle */}\n <Handle\n type=\"target\"\n position={Position.Top}\n className={cn('!w-3 !h-3 !border-2 !border-background', theme.handle)}\n />\n\n {/* Node Header */}\n <div className={cn(\n 'flex items-center gap-2 px-3 py-2 text-white',\n theme.header,\n hasPhase ? 'rounded-tr-md' : 'rounded-t-md'\n )}>\n <MessageSquare className=\"w-4 h-4 shrink-0\" />\n <span className=\"text-sm font-medium truncate flex-1\">\n {data.label || 'Step'}\n </span>\n {/* Execution status indicator */}\n {statusInfo && (\n <span className={cn('flex items-center gap-1 text-[10px] font-medium', statusInfo.color)}>\n <span className={cn('inline-block w-1.5 h-1.5 rounded-full bg-current')} />\n {statusInfo.label}\n </span>\n )}\n {/* Mode badge in header */}\n {data.mode && (\n <span className={cn('text-[10px] font-medium px-1.5 py-0.5 rounded', MODE_STYLES[data.mode])}>\n {data.mode}\n </span>\n )}\n </div>\n\n {/* Node Content */}\n <div className=\"px-3 py-2 space-y-1.5\">\n {/* Slash command badge or instruction preview */}\n {data.slashCommand ? (\n <div\n className=\"flex items-center gap-1.5 font-mono text-xs bg-rose-100 dark:bg-rose-900/30 text-rose-700 dark:text-rose-400 px-2 py-1 rounded truncate\"\n title={`/${data.slashCommand}${data.slashArgs ? ' ' + data.slashArgs : ''}`}\n >\n <Terminal className=\"w-3 h-3 shrink-0\" />\n <span className=\"truncate\">/{data.slashCommand}</span>\n </div>\n ) : (\n <div\n className=\"font-mono text-xs bg-muted px-2 py-1 rounded text-foreground/90 truncate\"\n title={data.instruction}\n >\n {displayInstruction}\n </div>\n )}\n\n {/* Tags display */}\n {hasTags && (\n <div className=\"flex items-center gap-1 flex-wrap\">\n {data.tags!.slice(0, 2).map((tag) => (\n <span\n key={tag}\n className=\"text-[10px] px-1.5 py-0.5 rounded bg-muted text-muted-foreground border border-border\"\n >\n {tag}\n </span>\n ))}\n {data.tags!.length > 2 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{data.tags!.length - 2}\n </span>\n )}\n </div>\n )}\n\n {/* Tool and output badges row */}\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n {/* Tool badge */}\n {data.tool && (\n <span className={cn('text-[10px] font-medium px-1.5 py-0.5 rounded border', TOOL_STYLES[data.tool])}>\n {data.tool}\n </span>\n )}\n\n {/* Output name badge */}\n {data.outputName && (\n <span\n className=\"text-[10px] px-1.5 py-0.5 rounded bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400 truncate max-w-[80px]\"\n title={data.outputName}\n >\n -&gt; {data.outputName}\n </span>\n )}\n </div>\n\n {/* Context refs indicator */}\n {hasContextRefs && (\n <div className=\"flex items-center gap-1 text-[10px] text-muted-foreground\">\n <Link2 className=\"w-3 h-3\" />\n <span>{data.contextRefs!.length} ref{data.contextRefs!.length !== 1 ? 's' : ''}</span>\n </div>\n )}\n\n {/* Execution error message */}\n {data.executionStatus === 'failed' && data.executionError && (\n <div\n className=\"text-[10px] text-destructive truncate max-w-[160px]\"\n title={data.executionError}\n >\n {data.executionError}\n </div>\n )}\n\n {/* Artifacts display */}\n {hasArtifacts && (\n <div className=\"pt-0.5 border-t border-border/50 space-y-0.5\">\n {data.artifacts!.map((artifact) => (\n <div\n key={artifact}\n className=\"text-xs text-muted-foreground truncate\"\n title={artifact}\n >\n &rarr; {artifact}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Output Handle */}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n className={cn('!w-3 !h-3 !border-2 !border-background', theme.handle)}\n />\n </div>\n </div>\n </NodeWrapper>\n );\n});\n\nPromptTemplateNode.displayName = 'PromptTemplateNode';\n","// ========================================\n// Node Components Barrel Export\n// ========================================\n// Unified PromptTemplate node system\n\n// Shared wrapper component\nexport { NodeWrapper } from './NodeWrapper';\n\n// Unified prompt template node component\nexport { PromptTemplateNode } from './PromptTemplateNode';\n\n// Node types map for React Flow registration\nimport { PromptTemplateNode } from './PromptTemplateNode';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const nodeTypes: Record<string, any> = {\n 'prompt-template': PromptTemplateNode,\n};\n","// ========================================\r\n// Interaction Mode Toggle Component\r\n// ========================================\r\n// Pan/Selection mode toggle for the orchestrator canvas\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { Hand, MousePointerClick } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { useFlowStore } from '@/stores';\r\n\r\ninterface InteractionModeToggleProps {\r\n disabled?: boolean;\r\n}\r\n\r\nexport function InteractionModeToggle({ disabled = false }: InteractionModeToggleProps) {\r\n const { formatMessage } = useIntl();\r\n const interactionMode = useFlowStore((state) => state.interactionMode);\r\n const toggleInteractionMode = useFlowStore((state) => state.toggleInteractionMode);\r\n\r\n return (\r\n <div className={cn(\r\n 'flex items-center gap-1 bg-card/90 backdrop-blur-sm border border-border rounded-lg p-1 shadow-sm',\r\n disabled && 'opacity-50 pointer-events-none'\r\n )}>\r\n <button\r\n onClick={() => { if (interactionMode !== 'pan') toggleInteractionMode(); }}\r\n className={cn(\r\n 'flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors',\r\n interactionMode === 'pan'\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n title={formatMessage({ id: 'orchestrator.canvas.panMode', defaultMessage: 'Pan mode (drag to move canvas)' })}\r\n >\r\n <Hand className=\"w-3.5 h-3.5\" />\r\n </button>\r\n <button\r\n onClick={() => { if (interactionMode !== 'selection') toggleInteractionMode(); }}\r\n className={cn(\r\n 'flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors',\r\n interactionMode === 'selection'\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n title={formatMessage({ id: 'orchestrator.canvas.selectionMode', defaultMessage: 'Selection mode (drag to select nodes)' })}\r\n >\r\n <MousePointerClick className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// Flow Canvas Component\r\n// ========================================\r\n// React Flow canvas with minimap, controls, and background\r\n\r\nimport { useCallback, useRef, useState, useEffect, DragEvent } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n ReactFlow,\r\n MiniMap,\r\n Controls,\r\n Background,\r\n BackgroundVariant,\r\n Connection,\r\n NodeChange,\r\n EdgeChange,\r\n applyNodeChanges,\r\n applyEdgeChanges,\r\n Node,\r\n Edge,\r\n ReactFlowProvider,\r\n useReactFlow,\r\n Panel,\r\n} from '@xyflow/react';\r\nimport '@xyflow/react/dist/style.css';\r\n\r\nimport { useFlowStore } from '@/stores';\r\nimport { useExecutionStore, selectIsExecuting } from '@/stores/executionStore';\r\nimport type { FlowNode, FlowEdge } from '@/types/flow';\r\n\r\n// Custom node types (enhanced with execution status in IMPL-A8)\r\nimport { nodeTypes } from './nodes';\r\nimport { InteractionModeToggle } from './InteractionModeToggle';\r\n\r\ninterface FlowCanvasProps {\r\n className?: string;\r\n}\r\n\r\nfunction FlowCanvasInner({ className }: FlowCanvasProps) {\r\n const reactFlowWrapper = useRef<HTMLDivElement>(null);\r\n const { screenToFlowPosition } = useReactFlow();\r\n const { formatMessage } = useIntl();\r\n\r\n // Execution state - lock canvas during execution\r\n const isExecuting = useExecutionStore(selectIsExecuting);\r\n\r\n // Get state and actions from store\r\n const nodes = useFlowStore((state) => state.nodes);\r\n const edges = useFlowStore((state) => state.edges);\r\n const setNodes = useFlowStore((state) => state.setNodes);\r\n const setEdges = useFlowStore((state) => state.setEdges);\r\n const addNode = useFlowStore((state) => state.addNode);\r\n const addNodeFromTemplate = useFlowStore((state) => state.addNodeFromTemplate);\r\n const setSelectedNodeId = useFlowStore((state) => state.setSelectedNodeId);\r\n const setSelectedEdgeId = useFlowStore((state) => state.setSelectedEdgeId);\r\n const markModified = useFlowStore((state) => state.markModified);\r\n\r\n // Interaction mode from store\r\n const interactionMode = useFlowStore((state) => state.interactionMode);\r\n\r\n // Ctrl key state for temporary mode reversal\r\n const [isCtrlPressed, setIsCtrlPressed] = useState(false);\r\n\r\n // Listen for Ctrl/Meta key press for temporary mode reversal\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Control' || e.key === 'Meta') {\r\n setIsCtrlPressed(true);\r\n }\r\n };\r\n const handleKeyUp = (e: KeyboardEvent) => {\r\n if (e.key === 'Control' || e.key === 'Meta') {\r\n setIsCtrlPressed(false);\r\n }\r\n };\r\n // Reset on blur (user switches window)\r\n const handleBlur = () => setIsCtrlPressed(false);\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n window.addEventListener('keyup', handleKeyUp);\r\n window.addEventListener('blur', handleBlur);\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n window.removeEventListener('keyup', handleKeyUp);\r\n window.removeEventListener('blur', handleBlur);\r\n };\r\n }, []);\r\n\r\n // Calculate effective mode (Ctrl reverses the current mode)\r\n const effectiveMode = isCtrlPressed\r\n ? (interactionMode === 'pan' ? 'selection' : 'pan')\r\n : interactionMode;\r\n\r\n // Handle node changes (position, selection, etc.)\r\n const onNodesChange = useCallback(\r\n (changes: NodeChange[]) => {\r\n const updatedNodes = applyNodeChanges(changes, nodes as Node[]);\r\n setNodes(updatedNodes as FlowNode[]);\r\n },\r\n [nodes, setNodes]\r\n );\r\n\r\n // Handle edge changes\r\n const onEdgesChange = useCallback(\r\n (changes: EdgeChange[]) => {\r\n const updatedEdges = applyEdgeChanges(changes, edges as Edge[]);\r\n setEdges(updatedEdges as FlowEdge[]);\r\n },\r\n [edges, setEdges]\r\n );\r\n\r\n // Handle new edge connections\r\n const onConnect = useCallback(\r\n (connection: Connection) => {\r\n if (isExecuting) return;\r\n if (connection.source && connection.target) {\r\n const newEdge: FlowEdge = {\r\n id: `edge-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\r\n source: connection.source,\r\n target: connection.target,\r\n sourceHandle: connection.sourceHandle ?? undefined,\r\n targetHandle: connection.targetHandle ?? undefined,\r\n };\r\n setEdges([...edges, newEdge]);\r\n markModified();\r\n }\r\n },\r\n [edges, setEdges, markModified, isExecuting]\r\n );\r\n\r\n // Handle node selection\r\n const onNodeClick = useCallback(\r\n (_event: React.MouseEvent, node: Node) => {\r\n setSelectedNodeId(node.id);\r\n },\r\n [setSelectedNodeId]\r\n );\r\n\r\n // Handle edge selection\r\n const onEdgeClick = useCallback(\r\n (_event: React.MouseEvent, edge: Edge) => {\r\n setSelectedEdgeId(edge.id);\r\n },\r\n [setSelectedEdgeId]\r\n );\r\n\r\n // Handle canvas click (deselect)\r\n const onPaneClick = useCallback(() => {\r\n setSelectedNodeId(null);\r\n setSelectedEdgeId(null);\r\n }, [setSelectedNodeId, setSelectedEdgeId]);\r\n\r\n // Handle drag over for node palette drop\r\n const onDragOver = useCallback((event: DragEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n event.dataTransfer.dropEffect = 'move';\r\n }, []);\r\n\r\n // Handle drop from node palette\r\n const onDrop = useCallback(\r\n (event: DragEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n if (isExecuting) return;\r\n\r\n // Verify the drop is from node palette\r\n const nodeType = event.dataTransfer.getData('application/reactflow-node-type');\r\n if (!nodeType) {\r\n return;\r\n }\r\n\r\n // Get drop position in flow coordinates\r\n const position = screenToFlowPosition({\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n\r\n // Check if a template ID is provided\r\n const templateId = event.dataTransfer.getData('application/reactflow-template-id');\r\n if (templateId) {\r\n // Use quick template\r\n addNodeFromTemplate(templateId, position);\r\n } else {\r\n // Use basic empty node\r\n addNode(position);\r\n }\r\n },\r\n [screenToFlowPosition, addNode, addNodeFromTemplate, isExecuting]\r\n );\r\n\r\n return (\r\n <div ref={reactFlowWrapper} className={`w-full h-full ${className || ''}`}>\r\n <ReactFlow\r\n nodes={nodes as Node[]}\r\n edges={edges as Edge[]}\r\n onNodesChange={onNodesChange}\r\n onEdgesChange={onEdgesChange}\r\n onConnect={onConnect}\r\n onNodeClick={onNodeClick}\r\n onEdgeClick={onEdgeClick}\r\n onPaneClick={onPaneClick}\r\n onDragOver={onDragOver}\r\n onDrop={onDrop}\r\n nodeTypes={nodeTypes}\r\n panOnDrag={effectiveMode === 'pan'}\r\n selectionOnDrag={effectiveMode === 'selection'}\r\n nodesDraggable={!isExecuting}\r\n nodesConnectable={!isExecuting}\r\n elementsSelectable={!isExecuting}\r\n deleteKeyCode={isExecuting ? null : ['Backspace', 'Delete']}\r\n fitView\r\n snapToGrid\r\n snapGrid={[15, 15]}\r\n className=\"bg-background\"\r\n >\r\n <Panel position=\"top-left\" className=\"m-2\">\r\n <InteractionModeToggle disabled={isExecuting} />\r\n </Panel>\r\n <Controls\r\n className=\"bg-card border border-border rounded-md shadow-sm\"\r\n showZoom={true}\r\n showFitView={true}\r\n showInteractive={true}\r\n />\r\n <MiniMap\r\n className=\"bg-card border border-border rounded-md shadow-sm\"\r\n nodeColor={() => '#3b82f6'}\r\n maskColor=\"rgba(0, 0, 0, 0.1)\"\r\n />\r\n <Background\r\n variant={BackgroundVariant.Dots}\r\n gap={20}\r\n size={1}\r\n className=\"bg-muted/20\"\r\n />\r\n </ReactFlow>\r\n\r\n {/* Execution lock overlay */}\r\n {isExecuting && (\r\n <div className=\"absolute top-3 left-1/2 -translate-x-1/2 z-10 px-3 py-1.5 bg-primary/90 text-primary-foreground rounded-full text-xs font-medium shadow-lg flex items-center gap-2\">\r\n <span className=\"h-2 w-2 rounded-full bg-primary-foreground animate-pulse\" />\r\n {formatMessage({ id: 'orchestrator.execution.inProgress' })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport function FlowCanvas(props: FlowCanvasProps) {\r\n return (\r\n <ReactFlowProvider>\r\n <FlowCanvasInner {...props} />\r\n </ReactFlowProvider>\r\n );\r\n}\r\n\r\nexport default FlowCanvas;\r\n","// ========================================\n// Node Library Component\n// ========================================\n// Displays built-in and custom node templates\n// Supports creating, saving, and deleting custom templates with color selection\n\nimport { DragEvent, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n MessageSquare, ChevronDown, ChevronRight, GripVertical,\n Terminal, Plus, Trash2, X,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useFlowStore } from '@/stores';\nimport { QUICK_TEMPLATES } from '@/types/flow';\nimport type { QuickTemplate } from '@/types/flow';\n\n// ========== Icon Mapping ==========\n\nconst TEMPLATE_ICONS: Record<string, React.ElementType> = {\n 'slash-command-main': Terminal,\n 'slash-command-async': Terminal,\n};\n\n// ========== I18n Key Mapping for Built-in Templates ==========\n\nconst TEMPLATE_I18N: Record<string, { labelKey: string; descKey: string }> = {\n 'prompt-template': {\n labelKey: 'orchestrator.nodeLibrary.promptTemplateLabel',\n descKey: 'orchestrator.nodeLibrary.promptTemplateDesc',\n },\n 'slash-command-main': {\n labelKey: 'orchestrator.nodeLibrary.slashCommandLabel',\n descKey: 'orchestrator.nodeLibrary.slashCommandDesc',\n },\n 'slash-command-async': {\n labelKey: 'orchestrator.nodeLibrary.slashCommandAsyncLabel',\n descKey: 'orchestrator.nodeLibrary.slashCommandAsyncDesc',\n },\n};\n\n// ========== Color Palette for custom templates ==========\n\nconst COLOR_OPTIONS = [\n { value: 'bg-blue-500', label: 'Blue' },\n { value: 'bg-green-500', label: 'Green' },\n { value: 'bg-purple-500', label: 'Purple' },\n { value: 'bg-rose-500', label: 'Rose' },\n { value: 'bg-amber-500', label: 'Amber' },\n { value: 'bg-cyan-500', label: 'Cyan' },\n { value: 'bg-teal-500', label: 'Teal' },\n { value: 'bg-orange-500', label: 'Orange' },\n { value: 'bg-indigo-500', label: 'Indigo' },\n { value: 'bg-pink-500', label: 'Pink' },\n];\n\n// ========== Sub-Components ==========\n\n/**\n * Collapsible category section with optional action button\n */\nfunction TemplateCategory({\n title,\n children,\n defaultExpanded = true,\n action,\n}: {\n title: string;\n children: React.ReactNode;\n defaultExpanded?: boolean;\n action?: React.ReactNode;\n}) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n return (\n <div>\n <div className=\"flex items-center gap-1 mb-2\">\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex items-center gap-2 flex-1 text-left text-xs font-semibold text-muted-foreground uppercase tracking-wider hover:text-foreground transition-colors\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-3 h-3\" />\n ) : (\n <ChevronRight className=\"w-3 h-3\" />\n )}\n {title}\n </button>\n {action}\n </div>\n\n {isExpanded && <div className=\"space-y-2\">{children}</div>}\n </div>\n );\n}\n\n/**\n * Draggable card for a quick template\n */\nfunction QuickTemplateCard({\n template,\n onDelete,\n}: {\n template: QuickTemplate;\n onDelete?: () => void;\n}) {\n const { formatMessage } = useIntl();\n const Icon = TEMPLATE_ICONS[template.id] || MessageSquare;\n const i18n = TEMPLATE_I18N[template.id];\n const displayLabel = i18n ? formatMessage({ id: i18n.labelKey }) : template.label;\n const displayDesc = i18n ? formatMessage({ id: i18n.descKey }) : template.description;\n\n const onDragStart = (event: DragEvent<HTMLDivElement>) => {\n event.dataTransfer.setData('application/reactflow-node-type', 'prompt-template');\n event.dataTransfer.setData('application/reactflow-template-id', template.id);\n event.dataTransfer.effectAllowed = 'move';\n };\n\n const onDoubleClick = () => {\n useFlowStore.getState().addNodeFromTemplate(template.id, { x: 250, y: 200 });\n };\n\n return (\n <div\n draggable\n onDragStart={onDragStart}\n onDoubleClick={onDoubleClick}\n className={cn(\n 'group flex items-center gap-3 p-3 rounded-lg border bg-card cursor-grab transition-all',\n 'hover:shadow-md hover:scale-[1.02] active:cursor-grabbing active:scale-[0.98]',\n )}\n >\n <div className={cn('p-2 rounded-md text-white shrink-0', template.color)}>\n <Icon className=\"w-4 h-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">{displayLabel}</div>\n <div className=\"text-xs text-muted-foreground truncate\">{displayDesc}</div>\n </div>\n {onDelete ? (\n <button\n onClick={(e) => { e.stopPropagation(); onDelete(); }}\n className=\"w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity hover:text-destructive\"\n title={formatMessage({ id: 'orchestrator.nodeLibrary.deleteTemplate' })}\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n ) : (\n <GripVertical className=\"w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\" />\n )}\n </div>\n );\n}\n\n/**\n * Basic empty prompt template card\n */\nfunction BasicTemplateCard() {\n const { formatMessage } = useIntl();\n const i18n = TEMPLATE_I18N['prompt-template'];\n\n const onDragStart = (event: DragEvent<HTMLDivElement>) => {\n event.dataTransfer.setData('application/reactflow-node-type', 'prompt-template');\n event.dataTransfer.effectAllowed = 'move';\n };\n\n const onDoubleClick = () => {\n useFlowStore.getState().addNode({ x: 250, y: 200 });\n };\n\n return (\n <div\n draggable\n onDragStart={onDragStart}\n onDoubleClick={onDoubleClick}\n className={cn(\n 'group flex items-center gap-3 p-3 rounded-lg border bg-card cursor-grab transition-all',\n 'hover:shadow-md hover:scale-[1.02] active:cursor-grabbing active:scale-[0.98]',\n 'border-dashed border-muted-foreground/50 hover:border-primary',\n )}\n >\n <div className=\"p-2 rounded-md text-white bg-blue-500 hover:bg-blue-600\">\n <Plus className=\"w-4 h-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">{formatMessage({ id: i18n.labelKey })}</div>\n <div className=\"text-xs text-muted-foreground truncate\">{formatMessage({ id: i18n.descKey })}</div>\n </div>\n <GripVertical className=\"w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n );\n}\n\n/**\n * Inline form for creating a new custom template\n */\nfunction CreateTemplateForm({ onClose }: { onClose: () => void }) {\n const { formatMessage } = useIntl();\n const [label, setLabel] = useState('');\n const [description, setDescription] = useState('');\n const [instruction, setInstruction] = useState('');\n const [color, setColor] = useState('bg-blue-500');\n const addCustomTemplate = useFlowStore((s) => s.addCustomTemplate);\n\n const handleSubmit = () => {\n if (!label.trim()) return;\n\n const template: QuickTemplate = {\n id: `custom-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n label: label.trim(),\n description: description.trim() || label.trim(),\n icon: 'MessageSquare',\n color,\n category: 'command',\n data: {\n label: label.trim(),\n instruction: instruction.trim(),\n contextRefs: [],\n },\n };\n\n addCustomTemplate(template);\n onClose();\n };\n\n return (\n <div className=\"p-3 rounded-lg border border-primary/50 bg-muted/50 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground\">{formatMessage({ id: 'orchestrator.nodeLibrary.newCustomNode' })}</span>\n <button onClick={onClose} className=\"text-muted-foreground hover:text-foreground\">\n <X className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n <input\n type=\"text\"\n placeholder={formatMessage({ id: 'orchestrator.nodeLibrary.nodeName' })}\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n className=\"w-full text-sm px-2 py-1.5 rounded border border-border bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary\"\n autoFocus\n />\n\n <input\n type=\"text\"\n placeholder={formatMessage({ id: 'orchestrator.nodeLibrary.descriptionOptional' })}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full text-sm px-2 py-1.5 rounded border border-border bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary\"\n />\n\n <textarea\n placeholder={formatMessage({ id: 'orchestrator.nodeLibrary.defaultInstructionOptional' })}\n value={instruction}\n onChange={(e) => setInstruction(e.target.value)}\n rows={2}\n className=\"w-full text-sm px-2 py-1.5 rounded border border-border bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary resize-none\"\n />\n\n {/* Color picker */}\n <div>\n <div className=\"text-xs text-muted-foreground mb-1.5\">{formatMessage({ id: 'orchestrator.nodeLibrary.color' })}</div>\n <div className=\"flex flex-wrap gap-1.5\">\n {COLOR_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n onClick={() => setColor(opt.value)}\n className={cn(\n 'w-6 h-6 rounded-full transition-all',\n opt.value,\n color === opt.value\n ? 'ring-2 ring-offset-2 ring-offset-background ring-primary scale-110'\n : 'hover:scale-110',\n )}\n title={opt.label}\n />\n ))}\n </div>\n </div>\n\n <button\n onClick={handleSubmit}\n disabled={!label.trim()}\n className={cn(\n 'w-full text-sm font-medium py-1.5 rounded transition-colors',\n label.trim()\n ? 'bg-primary text-primary-foreground hover:bg-primary/90'\n : 'bg-muted text-muted-foreground cursor-not-allowed',\n )}\n >\n {formatMessage({ id: 'orchestrator.nodeLibrary.save' })}\n </button>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\ninterface NodeLibraryProps {\n className?: string;\n}\n\n/**\n * Node library panel displaying built-in and custom node templates.\n * Built-in: Slash Command, Slash Command (Async), Prompt Template\n * Custom: User-created templates persisted to localStorage\n */\nexport function NodeLibrary({ className }: NodeLibraryProps) {\n const { formatMessage } = useIntl();\n const [isCreating, setIsCreating] = useState(false);\n const customTemplates = useFlowStore((s) => s.customTemplates);\n const removeCustomTemplate = useFlowStore((s) => s.removeCustomTemplate);\n\n return (\n <div className={cn('flex-1 overflow-y-auto p-4 space-y-4', className)}>\n {/* Built-in templates */}\n <TemplateCategory title={formatMessage({ id: 'orchestrator.nodeLibrary.builtIn' })} defaultExpanded>\n <BasicTemplateCard />\n {QUICK_TEMPLATES.map((template) => (\n <QuickTemplateCard key={template.id} template={template} />\n ))}\n </TemplateCategory>\n\n {/* Custom templates */}\n <TemplateCategory\n title={formatMessage({ id: 'orchestrator.nodeLibrary.custom' }, { count: customTemplates.length })}\n defaultExpanded\n action={\n <button\n onClick={() => setIsCreating(true)}\n className=\"p-0.5 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors\"\n title={formatMessage({ id: 'orchestrator.nodeLibrary.createCustomNode' })}\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n }\n >\n {isCreating && <CreateTemplateForm onClose={() => setIsCreating(false)} />}\n {customTemplates.map((template) => (\n <QuickTemplateCard\n key={template.id}\n template={template}\n onDelete={() => removeCustomTemplate(template.id)}\n />\n ))}\n {customTemplates.length === 0 && !isCreating && (\n <div className=\"text-xs text-muted-foreground text-center py-3\">\n {formatMessage({ id: 'orchestrator.nodeLibrary.noCustomNodes' })}\n </div>\n )}\n </TemplateCategory>\n </div>\n );\n}\n\nexport default NodeLibrary;\n","// ========================================\r\n// useTemplates Hook\r\n// ========================================\r\n// TanStack Query hooks for template API operations\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport type { FlowTemplate, TemplateInstallRequest, TemplateExportRequest } from '../types/execution';\r\nimport type { Flow } from '../types/flow';\r\n\r\n// API base URL\r\nconst API_BASE = '/api/orchestrator';\r\n\r\n// Query keys\r\nexport const templateKeys = {\r\n all: ['templates'] as const,\r\n lists: () => [...templateKeys.all, 'list'] as const,\r\n list: (filters?: Record<string, unknown>) => [...templateKeys.lists(), filters] as const,\r\n details: () => [...templateKeys.all, 'detail'] as const,\r\n detail: (id: string) => [...templateKeys.details(), id] as const,\r\n categories: () => [...templateKeys.all, 'categories'] as const,\r\n};\r\n\r\n// API response types\r\ninterface TemplatesListResponse {\n templates: FlowTemplate[];\n total: number;\n categories: string[];\n}\n\r\ninterface TemplateDetailResponse extends FlowTemplate {\n flow: Flow;\n}\n\r\ninterface InstallTemplateResponse {\n flow: Flow;\n message: string;\n}\n\r\ninterface ExportTemplateResponse {\n template: FlowTemplate;\n message: string;\n}\n\n// ========== Fetch Functions ==========\n\nfunction toFlowTemplate(raw: any): FlowTemplate {\n const meta = raw?.template_metadata ?? {};\n const nodes = Array.isArray(raw?.nodes) ? raw.nodes : [];\n const edges = Array.isArray(raw?.edges) ? raw.edges : [];\n\n return {\n id: String(raw?.id ?? ''),\n name: String(raw?.name ?? ''),\n description: (typeof meta.description === 'string' ? meta.description : raw?.description) || undefined,\n category: typeof meta.category === 'string' ? meta.category : undefined,\n tags: Array.isArray(meta.tags) ? meta.tags : undefined,\n author: typeof meta.author === 'string' ? meta.author : undefined,\n version: String(meta.version ?? raw?.version ?? '1.0.0'),\n created_at: String(raw?.created_at ?? new Date().toISOString()),\n updated_at: String(raw?.updated_at ?? new Date().toISOString()),\n nodeCount: nodes.length,\n edgeCount: edges.length,\n };\n}\n\nfunction toFlowFromTemplate(raw: any): Flow {\n const meta = raw?.template_metadata ?? {};\n const now = new Date().toISOString();\n return {\n id: `flow-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`,\n name: String(raw?.name ?? 'Template Flow'),\n description: (typeof meta.description === 'string' ? meta.description : raw?.description) || undefined,\n version: String(meta.version ?? raw?.version ?? '1.0.0'),\n created_at: String(raw?.created_at ?? now),\n updated_at: String(raw?.updated_at ?? now),\n nodes: Array.isArray(raw?.nodes) ? raw.nodes : [],\n edges: Array.isArray(raw?.edges) ? raw.edges : [],\n variables: typeof raw?.variables === 'object' && raw.variables ? raw.variables : {},\n metadata: {\n source: 'template',\n templateId: typeof raw?.id === 'string' ? raw.id : undefined,\n tags: Array.isArray(meta.tags) ? meta.tags : undefined,\n category: typeof meta.category === 'string' ? meta.category : undefined,\n },\n };\n}\n\nasync function fetchTemplates(category?: string): Promise<TemplatesListResponse> {\n const url = category\n ? `${API_BASE}/templates?category=${encodeURIComponent(category)}`\n : `${API_BASE}/templates`;\n const response = await fetch(url, { credentials: 'same-origin' });\n if (!response.ok) {\n throw new Error(`Failed to fetch templates: ${response.statusText}`);\n }\n const json = await response.json();\n const rawTemplates: any[] = Array.isArray(json?.data) ? json.data : (json?.templates || []);\n const templates: FlowTemplate[] = rawTemplates.map(toFlowTemplate);\n const total = typeof json?.total === 'number' ? json.total : templates.length;\n const categories = Array.from(new Set(\n templates\n .map((t) => t.category)\n .filter((c): c is string => typeof c === 'string' && c.trim().length > 0)\n ));\n return { templates, total, categories };\n}\n\nasync function fetchTemplate(id: string): Promise<TemplateDetailResponse> {\n const response = await fetch(`${API_BASE}/templates/${id}`);\n if (!response.ok) {\n throw new Error(`Failed to fetch template: ${response.statusText}`);\n }\n return response.json();\n}\n\nasync function installTemplate(request: TemplateInstallRequest): Promise<InstallTemplateResponse> {\n const response = await fetch(`${API_BASE}/templates/install`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n credentials: 'same-origin',\n });\n if (!response.ok) {\n throw new Error(`Failed to install template: ${response.statusText}`);\n }\n const json = await response.json();\n const template = (json && typeof json === 'object' && 'data' in json) ? json.data : json;\n return { flow: toFlowFromTemplate(template), message: json?.message || 'Template installed' };\n}\n\nasync function exportTemplate(request: TemplateExportRequest): Promise<ExportTemplateResponse> {\n const response = await fetch(`${API_BASE}/templates/export`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n credentials: 'same-origin',\n });\n if (!response.ok) {\n throw new Error(`Failed to export template: ${response.statusText}`);\n }\n const json = await response.json();\n const template = (json && typeof json === 'object' && 'data' in json) ? json.data : json;\n return { template: toFlowTemplate(template), message: json?.message || 'Template exported' };\n}\n\nasync function deleteTemplate(id: string): Promise<void> {\n const response = await fetch(`${API_BASE}/templates/${id}`, {\n method: 'DELETE',\n credentials: 'same-origin',\n });\n if (!response.ok) {\n throw new Error(`Failed to delete template: ${response.statusText}`);\n }\n}\n\r\n// ========== Query Hooks ==========\r\n\r\n/**\r\n * Fetch all templates\r\n */\r\nexport function useTemplates(category?: string) {\r\n return useQuery({\r\n queryKey: templateKeys.list({ category }),\r\n queryFn: () => fetchTemplates(category),\r\n staleTime: 60000, // 1 minute\r\n });\r\n}\r\n\r\n/**\r\n * Fetch a single template by ID\r\n */\r\nexport function useTemplate(id: string | null) {\r\n return useQuery({\r\n queryKey: templateKeys.detail(id ?? ''),\r\n queryFn: () => fetchTemplate(id!),\r\n enabled: !!id,\r\n staleTime: 60000,\r\n });\r\n}\r\n\r\n// ========== Mutation Hooks ==========\r\n\r\n/**\r\n * Install a template as a new flow\r\n */\r\nexport function useInstallTemplate() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: installTemplate,\r\n onSuccess: () => {\r\n // Invalidate flows list to show the new flow\r\n queryClient.invalidateQueries({ queryKey: ['flows'] });\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Export a flow as a template\r\n */\r\nexport function useExportTemplate() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: exportTemplate,\r\n onSuccess: (result) => {\r\n // Add to templates list\r\n queryClient.setQueryData<TemplatesListResponse>(templateKeys.lists(), (old) => {\r\n if (!old) return { templates: [result.template], total: 1, categories: [] };\r\n return {\r\n ...old,\r\n templates: [...old.templates, result.template],\r\n total: old.total + 1,\r\n };\r\n });\r\n queryClient.invalidateQueries({ queryKey: templateKeys.lists() });\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Delete a template\r\n */\r\nexport function useDeleteTemplate() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: deleteTemplate,\r\n onSuccess: (_, deletedId) => {\r\n // Remove from cache\r\n queryClient.removeQueries({ queryKey: templateKeys.detail(deletedId) });\r\n queryClient.setQueryData<TemplatesListResponse>(templateKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n ...old,\r\n templates: old.templates.filter((t) => t.id !== deletedId),\r\n total: old.total - 1,\r\n };\r\n });\r\n },\r\n });\r\n}\r\n","// ========================================\n// Inline Template Panel Component\n// ========================================\n// Compact template list for the left sidebar, uses useTemplates hook\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Search, Loader2, FileText, Download, GitBranch } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { useTemplates, useInstallTemplate } from '@/hooks/useTemplates';\nimport { useFlowStore } from '@/stores';\nimport type { FlowTemplate } from '@/types/execution';\n\n// ========== Sub-Components ==========\n\ninterface TemplateItemProps {\n template: FlowTemplate;\n onInstall: (template: FlowTemplate) => void;\n isInstalling: boolean;\n}\n\nfunction TemplateItem({ template, onInstall, isInstalling }: TemplateItemProps) {\n const { formatMessage } = useIntl();\n\n return (\n <button\n onClick={() => onInstall(template)}\n disabled={isInstalling}\n className={cn(\n 'w-full flex items-center gap-3 px-3 py-2.5 rounded-md text-left transition-colors',\n 'hover:bg-muted/60 active:bg-muted',\n isInstalling && 'opacity-50 cursor-wait'\n )}\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground truncate\">\n {template.name}\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <GitBranch className=\"w-3 h-3\" />\n {template.nodeCount} {formatMessage({ id: 'orchestrator.inlineTemplates.nodes' })}\n </span>\n {template.category && (\n <Badge variant=\"secondary\" className=\"text-[10px] px-1.5 py-0\">\n {template.category}\n </Badge>\n )}\n </div>\n </div>\n {isInstalling ? (\n <Loader2 className=\"w-4 h-4 animate-spin text-muted-foreground shrink-0\" />\n ) : (\n <Download className=\"w-4 h-4 text-muted-foreground shrink-0 opacity-0 group-hover:opacity-100\" />\n )}\n </button>\n );\n}\n\n// ========== Main Component ==========\n\ninterface InlineTemplatePanelProps {\n className?: string;\n}\n\n/**\n * Compact template browser for the left sidebar.\n * Loads templates via the useTemplates API hook and displays them in a searchable list.\n * Clicking a template installs it as the current flow.\n */\nexport function InlineTemplatePanel({ className }: InlineTemplatePanelProps) {\n const { formatMessage } = useIntl();\n const [searchQuery, setSearchQuery] = useState('');\n const [installingId, setInstallingId] = useState<string | null>(null);\n\n const setCurrentFlow = useFlowStore((state) => state.setCurrentFlow);\n\n const { data, isLoading, error } = useTemplates();\n const installTemplate = useInstallTemplate();\n\n // Filter templates by search query\n const filteredTemplates = useMemo(() => {\n if (!data?.templates) return [];\n if (!searchQuery.trim()) return data.templates;\n\n const query = searchQuery.toLowerCase();\n return data.templates.filter(\n (t) =>\n t.name.toLowerCase().includes(query) ||\n t.description?.toLowerCase().includes(query) ||\n t.category?.toLowerCase().includes(query) ||\n t.tags?.some((tag) => tag.toLowerCase().includes(query))\n );\n }, [data?.templates, searchQuery]);\n\n // Handle install - load template as current flow\n const handleInstall = useCallback(\n async (template: FlowTemplate) => {\n setInstallingId(template.id);\n try {\n const result = await installTemplate.mutateAsync({\n templateId: template.id,\n });\n setCurrentFlow(result.flow);\n } catch (err) {\n console.error('Failed to install template:', err);\n } finally {\n setInstallingId(null);\n }\n },\n [installTemplate, setCurrentFlow]\n );\n\n return (\n <div className={cn('flex-1 flex flex-col overflow-hidden', className)}>\n {/* Search */}\n <div className=\"px-3 py-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <Input\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.inlineTemplates.searchPlaceholder' })}\n className=\"pl-8 h-8 text-sm\"\n />\n </div>\n </div>\n\n {/* Template List */}\n <div className=\"flex-1 overflow-y-auto px-1\">\n {isLoading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n ) : error ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-muted-foreground px-4\">\n <FileText className=\"h-8 w-8 mb-2 opacity-50\" />\n <p className=\"text-xs text-center\">\n {formatMessage({ id: 'orchestrator.inlineTemplates.loadFailed' })}\n </p>\n </div>\n ) : filteredTemplates.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-muted-foreground px-4\">\n <FileText className=\"h-8 w-8 mb-2 opacity-50\" />\n <p className=\"text-xs text-center\">\n {searchQuery ? formatMessage({ id: 'orchestrator.inlineTemplates.noMatches' }) : formatMessage({ id: 'orchestrator.inlineTemplates.noTemplates' })}\n </p>\n </div>\n ) : (\n <div className=\"space-y-0.5\">\n {filteredTemplates.map((template) => (\n <TemplateItem\n key={template.id}\n template={template}\n onInstall={handleInstall}\n isInstalling={installingId === template.id}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default InlineTemplatePanel;\n","// ========================================\n// useResizablePanel Hook\n// ========================================\n// Provides drag-to-resize functionality for sidebar panels.\n// Adapted from cc-wf-studio with Tailwind-friendly approach.\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nconst DEFAULT_MIN_WIDTH = 200;\nconst DEFAULT_MAX_WIDTH = 600;\nconst DEFAULT_WIDTH = 300;\nconst DEFAULT_STORAGE_KEY = 'ccw-orchestrator.panelWidth';\n\ninterface UseResizablePanelOptions {\n minWidth?: number;\n maxWidth?: number;\n defaultWidth?: number;\n storageKey?: string;\n /** Direction of drag relative to panel growth. 'left' means dragging left grows the panel (right-side panel). */\n direction?: 'left' | 'right';\n}\n\ninterface UseResizablePanelReturn {\n width: number;\n isResizing: boolean;\n handleMouseDown: (e: React.MouseEvent) => void;\n}\n\n/**\n * Custom hook for resizable panel functionality.\n *\n * Features:\n * - Drag-to-resize with mouse events\n * - Configurable min/max width constraints\n * - localStorage persistence\n * - Prevents text selection during drag\n */\nexport function useResizablePanel(options?: UseResizablePanelOptions): UseResizablePanelReturn {\n const minWidth = options?.minWidth ?? DEFAULT_MIN_WIDTH;\n const maxWidth = options?.maxWidth ?? DEFAULT_MAX_WIDTH;\n const defaultWidth = options?.defaultWidth ?? DEFAULT_WIDTH;\n const storageKey = options?.storageKey ?? DEFAULT_STORAGE_KEY;\n const direction = options?.direction ?? 'right';\n\n // Initialize width from localStorage or use default\n const [width, setWidth] = useState<number>(() => {\n try {\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n const parsed = Number.parseInt(saved, 10);\n if (!Number.isNaN(parsed) && parsed >= minWidth && parsed <= maxWidth) {\n return parsed;\n }\n }\n } catch {\n // localStorage unavailable\n }\n return defaultWidth;\n });\n\n const [isResizing, setIsResizing] = useState(false);\n const startXRef = useRef<number>(0);\n const startWidthRef = useRef<number>(0);\n\n // Handle mouse move during resize\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n const deltaX = e.clientX - startXRef.current;\n // For 'right' direction (left panel), dragging right grows the panel\n // For 'left' direction (right panel), dragging left grows the panel\n const newWidth = direction === 'right'\n ? startWidthRef.current + deltaX\n : startWidthRef.current - deltaX;\n\n const constrainedWidth = Math.max(minWidth, Math.min(maxWidth, newWidth));\n setWidth(constrainedWidth);\n },\n [minWidth, maxWidth, direction]\n );\n\n // Handle mouse up to end resize\n const handleMouseUp = useCallback(() => {\n setIsResizing(false);\n }, []);\n\n // Handle mouse down to start resize\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n setIsResizing(true);\n startXRef.current = e.clientX;\n startWidthRef.current = width;\n },\n [width]\n );\n\n // Set up global mouse event listeners\n useEffect(() => {\n if (isResizing) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n // Prevent text selection during drag\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'ew-resize';\n } else {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n };\n }, [isResizing, handleMouseMove, handleMouseUp]);\n\n // Persist width to localStorage whenever it changes\n useEffect(() => {\n try {\n localStorage.setItem(storageKey, width.toString());\n } catch {\n // localStorage unavailable\n }\n }, [width, storageKey]);\n\n return {\n width,\n isResizing,\n handleMouseDown,\n };\n}\n","// ========================================\n// ResizeHandle Component\n// ========================================\n// Draggable vertical bar for resizing sidebar panels.\n// Uses Tailwind CSS for styling.\n\nimport type React from 'react';\nimport { cn } from '@/lib/utils';\n\ninterface ResizeHandleProps {\n onMouseDown: (e: React.MouseEvent) => void;\n className?: string;\n /** Position of the handle relative to the panel. Default: 'right' */\n position?: 'left' | 'right';\n}\n\n/**\n * ResizeHandle Component\n *\n * A 4px-wide transparent drag bar that highlights on hover.\n * Placed on the edge of a sidebar panel for drag-to-resize.\n */\nexport function ResizeHandle({ onMouseDown, className, position = 'right' }: ResizeHandleProps) {\n return (\n <div\n onMouseDown={onMouseDown}\n className={cn(\n 'absolute top-0 bottom-0 w-1 cursor-ew-resize z-10',\n 'bg-transparent hover:bg-primary transition-colors duration-200',\n position === 'right' ? 'right-0' : 'left-0',\n className,\n )}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize panel\"\n tabIndex={0}\n />\n );\n}\n","// ========================================\n// Left Sidebar Component\n// ========================================\n// Container with tab switching between NodeLibrary and InlineTemplatePanel\n\nimport { useIntl } from 'react-intl';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { useFlowStore } from '@/stores';\nimport { NodeLibrary } from './NodeLibrary';\nimport { InlineTemplatePanel } from './InlineTemplatePanel';\nimport { useResizablePanel } from './useResizablePanel';\nimport { ResizeHandle } from './ResizeHandle';\n\n// ========== Tab Configuration ==========\n\nconst TABS: Array<{ key: 'templates' | 'nodes'; labelKey: string }> = [\n { key: 'templates', labelKey: 'orchestrator.leftSidebar.tabTemplates' },\n { key: 'nodes', labelKey: 'orchestrator.leftSidebar.tabNodes' },\n];\n\n// ========== Main Component ==========\n\ninterface LeftSidebarProps {\n className?: string;\n}\n\n/**\n * Left sidebar container with collapsible panel and tab switching.\n * Renders either InlineTemplatePanel or NodeLibrary based on active tab.\n */\nexport function LeftSidebar({ className }: LeftSidebarProps) {\n const { formatMessage } = useIntl();\n const setIsPaletteOpen = useFlowStore((state) => state.setIsPaletteOpen);\n const leftPanelTab = useFlowStore((state) => state.leftPanelTab);\n const setLeftPanelTab = useFlowStore((state) => state.setLeftPanelTab);\n\n const { width, isResizing, handleMouseDown } = useResizablePanel({\n minWidth: 200,\n maxWidth: 400,\n defaultWidth: 288, // w-72 = 18rem = 288px\n storageKey: 'ccw-orchestrator.leftSidebar.width',\n direction: 'right',\n });\n\n return (\n <div\n className={cn(\n 'h-full bg-card border-r border-border flex flex-col relative',\n isResizing && 'select-none',\n className\n )}\n style={{ width }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\n <h3 className=\"font-semibold text-foreground\">{formatMessage({ id: 'orchestrator.leftSidebar.workbench' })}</h3>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => setIsPaletteOpen(false)}\n title={formatMessage({ id: 'orchestrator.leftSidebar.collapse' })}\n >\n <ChevronDown className=\"w-4 h-4\" />\n </Button>\n </div>\n\n {/* Tab Bar */}\n <div className=\"flex border-b border-border\">\n {TABS.map((tab) => (\n <button\n key={tab.key}\n onClick={() => setLeftPanelTab(tab.key)}\n className={cn(\n 'flex-1 px-3 py-2 text-sm font-medium text-center transition-colors',\n 'hover:text-foreground',\n leftPanelTab === tab.key\n ? 'text-foreground border-b-2 border-primary'\n : 'text-muted-foreground'\n )}\n >\n {formatMessage({ id: tab.labelKey })}\n </button>\n ))}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {leftPanelTab === 'templates' ? (\n <InlineTemplatePanel />\n ) : (\n <NodeLibrary />\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-4 py-3 border-t border-border bg-muted/30\">\n <div className=\"text-xs text-muted-foreground\">\n <span className=\"font-medium\">{formatMessage({ id: 'orchestrator.leftSidebar.tipLabel' })}</span> {formatMessage({ id: 'orchestrator.leftSidebar.dragOrDoubleClick' })}\n </div>\n </div>\n\n {/* Resize handle on right edge */}\n <ResizeHandle onMouseDown={handleMouseDown} position=\"right\" />\n </div>\n );\n}\n\nexport default LeftSidebar;\n","// ========================================\r\n// Command Combobox Component\r\n// ========================================\r\n// Searchable dropdown for selecting slash commands (commands + skills)\r\n\r\nimport { useState, useRef, useEffect, useCallback, useMemo } from 'react';\r\nimport { ChevronDown, Search } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { useCommands } from '@/hooks/useCommands';\r\nimport { useSkills } from '@/hooks/useSkills';\r\n\r\nexport interface CommandSelectDetails {\r\n name: string;\r\n argumentHint?: string;\r\n description?: string;\r\n source: 'command' | 'skill';\r\n}\r\n\r\ninterface UnifiedItem {\r\n name: string;\r\n description: string;\r\n group: string;\r\n argumentHint?: string;\r\n source: 'command' | 'skill';\r\n}\r\n\r\ninterface CommandComboboxProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n onSelectDetails?: (details: CommandSelectDetails) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport function CommandCombobox({ value, onChange, onSelectDetails, placeholder, className }: CommandComboboxProps) {\r\n const [open, setOpen] = useState(false);\r\n const [search, setSearch] = useState('');\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const { commands, isLoading: commandsLoading } = useCommands({\r\n filter: { showDisabled: false },\r\n });\r\n\r\n const { skills, isLoading: skillsLoading } = useSkills({\r\n filter: { enabledOnly: true },\r\n });\r\n\r\n const isLoading = commandsLoading || skillsLoading;\r\n\r\n // Merge commands and skills into unified items\r\n const unifiedItems = useMemo<UnifiedItem[]>(() => {\r\n const items: UnifiedItem[] = [];\r\n\r\n for (const cmd of commands) {\r\n items.push({\r\n name: cmd.name,\r\n description: cmd.description,\r\n group: cmd.group || 'other',\r\n argumentHint: cmd.argumentHint,\r\n source: 'command',\r\n });\r\n }\r\n\r\n for (const skill of skills) {\r\n items.push({\r\n name: skill.name,\r\n description: skill.description,\r\n group: 'skills',\r\n source: 'skill',\r\n });\r\n }\r\n\r\n return items;\r\n }, [commands, skills]);\r\n\r\n // Group and filter items\r\n const groupedFiltered = useMemo(() => {\r\n const filtered = search\r\n ? unifiedItems.filter(\r\n (item) =>\r\n item.name.toLowerCase().includes(search.toLowerCase()) ||\r\n item.description.toLowerCase().includes(search.toLowerCase())\r\n )\r\n : unifiedItems;\r\n\r\n const groups: Record<string, UnifiedItem[]> = {};\r\n for (const item of filtered) {\r\n if (!groups[item.group]) groups[item.group] = [];\r\n groups[item.group].push(item);\r\n }\r\n return groups;\r\n }, [unifiedItems, search]);\r\n\r\n const totalFiltered = useMemo(\r\n () => Object.values(groupedFiltered).reduce((sum, items) => sum + items.length, 0),\r\n [groupedFiltered]\r\n );\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n function handleClickOutside(e: MouseEvent) {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n }\r\n if (open) {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }\r\n }, [open]);\r\n\r\n const handleSelect = useCallback(\r\n (item: UnifiedItem) => {\r\n onChange(item.name);\r\n onSelectDetails?.({\r\n name: item.name,\r\n argumentHint: item.argumentHint,\r\n description: item.description,\r\n source: item.source,\r\n });\r\n setOpen(false);\r\n setSearch('');\r\n },\r\n [onChange, onSelectDetails]\r\n );\r\n\r\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSearch(e.target.value);\r\n if (!open) setOpen(true);\r\n }, [open]);\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n setOpen(false);\r\n setSearch('');\r\n }\r\n },\r\n []\r\n );\r\n\r\n // Display label for current value\r\n const selectedItem = unifiedItems.find((item) => item.name === value);\r\n const displayValue = value\r\n ? `/${selectedItem?.name || value}`\r\n : '';\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n {/* Trigger button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setOpen(!open);\r\n if (!open) {\r\n setTimeout(() => inputRef.current?.focus(), 0);\r\n }\r\n }}\r\n className={cn(\r\n 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\r\n !value && 'text-muted-foreground',\r\n className\r\n )}\r\n >\r\n <span className={cn('truncate font-mono', !value && 'text-muted-foreground')}>\r\n {displayValue || placeholder || '/command-name'}\r\n </span>\r\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\r\n </button>\r\n\r\n {/* Dropdown */}\r\n {open && (\r\n <div className=\"absolute z-50 mt-1 w-full rounded-md border border-border bg-card shadow-md\">\r\n {/* Search input */}\r\n <div className=\"flex items-center border-b border-border px-3\">\r\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\r\n <input\r\n ref={inputRef}\r\n value={search}\r\n onChange={handleInputChange}\r\n onKeyDown={handleKeyDown}\r\n placeholder={placeholder || '/command-name'}\r\n className=\"flex h-9 w-full bg-transparent py-2 text-sm outline-none placeholder:text-muted-foreground font-mono\"\r\n />\r\n </div>\r\n\r\n {/* Items list */}\r\n <div className=\"max-h-64 overflow-y-auto p-1\">\r\n {isLoading ? (\r\n <div className=\"py-4 text-center text-sm text-muted-foreground\">Loading...</div>\r\n ) : totalFiltered === 0 ? (\r\n <div className=\"py-4 text-center text-sm text-muted-foreground\">\r\n No commands found\r\n </div>\r\n ) : (\r\n Object.entries(groupedFiltered)\r\n .sort(([a], [b]) => {\r\n // Skills group last\r\n if (a === 'skills') return 1;\r\n if (b === 'skills') return -1;\r\n return a.localeCompare(b);\r\n })\r\n .map(([group, items]) => (\r\n <div key={group}>\r\n <div className=\"px-2 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\r\n {group}\r\n </div>\r\n {items.map((item) => (\r\n <button\r\n key={`${item.source}-${item.name}`}\r\n type=\"button\"\r\n onClick={() => handleSelect(item)}\r\n className={cn(\r\n 'flex w-full flex-col items-start rounded-sm px-2 py-1.5 text-sm cursor-pointer hover:bg-accent hover:text-accent-foreground',\r\n value === item.name && 'bg-accent/50'\r\n )}\r\n >\r\n <span className=\"font-mono text-foreground\">/{item.name}</span>\r\n {item.description && (\r\n <span className=\"text-xs text-muted-foreground truncate w-full text-left\">\r\n {item.description}\r\n </span>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\n// Property Panel Component\n// ========================================\n// Dynamic property editor for unified PromptTemplate nodes\n\nimport { useCallback, useMemo, useState, useEffect, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Settings, X, MessageSquare, Trash2, AlertCircle, CheckCircle2, Plus, Save, ChevronDown, ChevronRight, BookmarkPlus } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { CommandCombobox, type CommandSelectDetails } from '@/components/ui/CommandCombobox';\nimport { useFlowStore } from '@/stores';\nimport { useCommands } from '@/hooks/useCommands';\nimport type { PromptTemplateNodeData, ExecutionMode } from '@/types/flow';\n\n// ========== Tag-based Instruction Editor ==========\n\n/**\n * Built-in template definitions\n */\ninterface TemplateItem {\n id: string;\n label: string;\n color: 'emerald' | 'sky' | 'amber' | 'rose' | 'violet' | 'slate' | 'cyan' | 'indigo';\n content: string;\n hasInput?: boolean;\n inputLabel?: string;\n inputDefault?: string;\n isCustom?: boolean;\n}\n\nconst BUILTIN_TEMPLATES: TemplateItem[] = [\n // Output variable\n {\n id: 'output-var',\n label: '输出变量',\n color: 'emerald',\n content: '将结果记为 {{$INPUT}} 变量,供后面节点引用。',\n hasInput: true,\n inputLabel: '变量名',\n inputDefault: 'result',\n },\n // File operations\n {\n id: 'file-read',\n label: '读取文件',\n color: 'sky',\n content: '读取文件 $INPUT 的内容。',\n hasInput: true,\n inputLabel: '文件路径',\n inputDefault: './path/to/file',\n },\n {\n id: 'file-write',\n label: '写入文件',\n color: 'sky',\n content: '将结果写入到文件 $INPUT。',\n hasInput: true,\n inputLabel: '文件路径',\n inputDefault: './output/result.md',\n },\n // Conditional\n {\n id: 'condition-if',\n label: '条件判断',\n color: 'amber',\n content: '如果 $INPUT,则继续执行;否则停止并报告。',\n hasInput: true,\n inputLabel: '条件',\n inputDefault: '结果成功',\n },\n // CLI Analysis Tools\n {\n id: 'cli-gemini',\n label: 'Gemini分析',\n color: 'cyan',\n content: '使用 Gemini 分析:$INPUT\\n\\n分析要点:\\n- 代码结构和架构\\n- 潜在问题和改进建议\\n- 最佳实践对比',\n hasInput: true,\n inputLabel: '分析目标',\n inputDefault: '当前模块的代码质量',\n },\n {\n id: 'cli-codex',\n label: 'Codex执行',\n color: 'indigo',\n content: '使用 Codex 执行:$INPUT\\n\\n执行要求:\\n- 遵循现有代码风格\\n- 确保类型安全\\n- 添加必要注释',\n hasInput: true,\n inputLabel: '执行任务',\n inputDefault: '实现指定功能',\n },\n // Git commits\n {\n id: 'git-feat',\n label: 'feat',\n color: 'violet',\n content: 'feat: $INPUT',\n hasInput: true,\n inputLabel: '功能描述',\n inputDefault: '新功能',\n },\n {\n id: 'git-fix',\n label: 'fix',\n color: 'rose',\n content: 'fix: $INPUT',\n hasInput: true,\n inputLabel: 'Bug描述',\n inputDefault: '修复问题',\n },\n {\n id: 'git-refactor',\n label: 'refactor',\n color: 'slate',\n content: 'refactor: $INPUT',\n hasInput: true,\n inputLabel: '重构描述',\n inputDefault: '代码重构',\n },\n];\n\nconst TEMPLATE_COLORS = {\n emerald: 'bg-emerald-100 text-emerald-700 hover:bg-emerald-200 dark:bg-emerald-900/50 dark:text-emerald-300',\n sky: 'bg-sky-100 text-sky-700 hover:bg-sky-200 dark:bg-sky-900/50 dark:text-sky-300',\n amber: 'bg-amber-100 text-amber-700 hover:bg-amber-200 dark:bg-amber-900/50 dark:text-amber-300',\n rose: 'bg-rose-100 text-rose-700 hover:bg-rose-200 dark:bg-rose-900/50 dark:text-rose-300',\n violet: 'bg-violet-100 text-violet-700 hover:bg-violet-200 dark:bg-violet-900/50 dark:text-violet-300',\n slate: 'bg-slate-100 text-slate-700 hover:bg-slate-200 dark:bg-slate-900/50 dark:text-slate-300',\n cyan: 'bg-cyan-100 text-cyan-700 hover:bg-cyan-200 dark:bg-cyan-900/50 dark:text-cyan-300',\n indigo: 'bg-indigo-100 text-indigo-700 hover:bg-indigo-200 dark:bg-indigo-900/50 dark:text-indigo-300',\n};\n\nconst COLOR_OPTIONS: Array<{ value: TemplateItem['color']; label: string }> = [\n { value: 'emerald', label: '绿色' },\n { value: 'sky', label: '天蓝' },\n { value: 'cyan', label: '青色' },\n { value: 'indigo', label: '靛蓝' },\n { value: 'amber', label: '黄色' },\n { value: 'rose', label: '红色' },\n { value: 'violet', label: '紫色' },\n { value: 'slate', label: '灰色' },\n];\n\n// Local storage key for custom templates\nconst CUSTOM_TEMPLATES_KEY = 'orchestrator-custom-templates';\n\n/**\n * Load custom templates from localStorage\n */\nfunction loadCustomTemplates(): TemplateItem[] {\n try {\n const stored = localStorage.getItem(CUSTOM_TEMPLATES_KEY);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Save custom templates to localStorage\n */\nfunction saveCustomTemplates(templates: TemplateItem[]): void {\n localStorage.setItem(CUSTOM_TEMPLATES_KEY, JSON.stringify(templates));\n}\n\n// ========== Custom Template Modal ==========\n\ninterface TemplateModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave: (template: TemplateItem) => void;\n}\n\nfunction TemplateModal({ isOpen, onClose, onSave }: TemplateModalProps) {\n const { formatMessage } = useIntl();\n const [label, setLabel] = useState('');\n const [content, setContent] = useState('');\n const [color, setColor] = useState<TemplateItem['color']>('slate');\n const [hasInput, setHasInput] = useState(false);\n const [inputLabel, setInputLabel] = useState('');\n const [inputDefault, setInputDefault] = useState('');\n\n const handleSave = useCallback(() => {\n if (!label.trim() || !content.trim()) return;\n\n const template: TemplateItem = {\n id: `custom-${Date.now()}`,\n label: label.trim(),\n content: content.trim(),\n color,\n isCustom: true,\n ...(hasInput && {\n hasInput: true,\n inputLabel: inputLabel.trim() || '输入',\n inputDefault: inputDefault.trim(),\n }),\n };\n\n onSave(template);\n // Reset form\n setLabel('');\n setContent('');\n setColor('slate');\n setHasInput(false);\n setInputLabel('');\n setInputDefault('');\n onClose();\n }, [label, content, color, hasInput, inputLabel, inputDefault, onSave, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-black/50\" onClick={onClose} />\n\n {/* Modal */}\n <div className=\"relative bg-card border border-border rounded-lg shadow-xl w-full max-w-md mx-4 p-4 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-lg font-semibold text-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.createCustomTemplate' })}</h3>\n <button onClick={onClose} className=\"text-muted-foreground hover:text-foreground\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Template name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.templateNameLabel' })}</label>\n <Input\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"例如:代码审查\"\n className=\"text-sm\"\n />\n </div>\n\n {/* Template content */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.templateContent' })}\n <span className=\"text-muted-foreground font-normal ml-1\">{formatMessage({ id: 'orchestrator.propertyPanel.templateContentHint' })}</span>\n </label>\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder=\"例如:请审查以下代码:$INPUT\"\n rows={3}\n className=\"w-full px-3 py-2 rounded-md border border-border bg-background text-foreground text-sm resize-none\"\n />\n </div>\n\n {/* Color selection */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.tagColor' })}</label>\n <div className=\"flex flex-wrap gap-2\">\n {COLOR_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => setColor(opt.value)}\n className={cn(\n 'px-3 py-1 rounded text-xs font-medium transition-all',\n TEMPLATE_COLORS[opt.value],\n color === opt.value && 'ring-2 ring-primary ring-offset-1'\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Has input toggle */}\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"has-input\"\n checked={hasInput}\n onChange={(e) => setHasInput(e.target.checked)}\n className=\"rounded border-border\"\n />\n <label htmlFor=\"has-input\" className=\"text-sm text-foreground\">\n {formatMessage({ id: 'orchestrator.propertyPanel.requiresInput' })}\n </label>\n </div>\n\n {/* Input configuration */}\n {hasInput && (\n <div className=\"grid grid-cols-2 gap-2 pl-6\">\n <div>\n <label className=\"block text-xs text-muted-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.inputPrompt' })}</label>\n <Input\n value={inputLabel}\n onChange={(e) => setInputLabel(e.target.value)}\n placeholder=\"请输入...\"\n className=\"h-8 text-xs\"\n />\n </div>\n <div>\n <label className=\"block text-xs text-muted-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.defaultValue' })}</label>\n <Input\n value={inputDefault}\n onChange={(e) => setInputDefault(e.target.value)}\n placeholder=\"默认值\"\n className=\"h-8 text-xs\"\n />\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex justify-end gap-2 pt-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>\n {formatMessage({ id: 'orchestrator.propertyPanel.cancel' })}\n </Button>\n <Button\n size=\"sm\"\n onClick={handleSave}\n disabled={!label.trim() || !content.trim()}\n className=\"gap-1\"\n >\n <Save className=\"w-4 h-4\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.saveTemplate' })}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\ninterface TagEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n availableVariables: string[];\n minHeight?: number;\n}\n\n/**\n * Token types for the editor\n */\ntype TokenType = 'text' | 'variable' | 'artifact';\n\ninterface Token {\n type: TokenType;\n value: string;\n isValid?: boolean;\n}\n\n/**\n * Parse text into tokens (text segments, {{variables}}, and [[artifacts]])\n */\nfunction tokenize(text: string): Token[] {\n const tokens: Token[] = [];\n // Match both {{variable}} and [[artifact]] patterns\n const regex = /\\{\\{([^}]+)\\}\\}|\\[\\[([^\\]]+)\\]\\]/g;\n let lastIndex = 0;\n let match;\n\n while ((match = regex.exec(text)) !== null) {\n // Add text before token\n if (match.index > lastIndex) {\n tokens.push({ type: 'text', value: text.slice(lastIndex, match.index) });\n }\n if (match[1] !== undefined) {\n // {{variable}} match\n tokens.push({ type: 'variable', value: match[1].trim() });\n } else if (match[2] !== undefined) {\n // [[artifact]] match\n tokens.push({ type: 'artifact', value: match[2].trim() });\n }\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text\n if (lastIndex < text.length) {\n tokens.push({ type: 'text', value: text.slice(lastIndex) });\n }\n\n return tokens;\n}\n\n/**\n * Extract unique variable names from text\n */\nfunction extractVariables(text: string): string[] {\n const matches = text.match(/\\{\\{([^}]+)\\}\\}/g) || [];\n return [...new Set(matches.map(m => m.slice(2, -2).trim()))];\n}\n\n/**\n * Extract unique artifact names from text\n */\nfunction extractArtifacts(text: string): string[] {\n const matches = text.match(/\\[\\[([^\\]]+)\\]\\]/g) || [];\n return [...new Set(matches.map(m => m.slice(2, -2).trim()))];\n}\n\n/**\n * Tag-based instruction editor with inline variable tags\n */\nfunction TagEditor({ value, onChange, placeholder, availableVariables, minHeight = 120 }: TagEditorProps) {\n const { formatMessage } = useIntl();\n const editorRef = useRef<HTMLDivElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n const [newVarName, setNewVarName] = useState('');\n const [newArtifactName, setNewArtifactName] = useState('');\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [customTemplates, setCustomTemplates] = useState<TemplateItem[]>(() => loadCustomTemplates());\n\n const tokens = useMemo(() => tokenize(value || ''), [value]);\n const detectedVars = useMemo(() => extractVariables(value || ''), [value]);\n const detectedArtifacts = useMemo(() => extractArtifacts(value || ''), [value]);\n const hasContent = (value || '').length > 0;\n\n // All templates (builtin + custom)\n const allTemplates = useMemo(() => [...BUILTIN_TEMPLATES, ...customTemplates], [customTemplates]);\n\n // Save custom template\n const handleSaveTemplate = useCallback((template: TemplateItem) => {\n const updated = [...customTemplates, template];\n setCustomTemplates(updated);\n saveCustomTemplates(updated);\n }, [customTemplates]);\n\n // Delete custom template\n const handleDeleteTemplate = useCallback((templateId: string) => {\n const updated = customTemplates.filter(t => t.id !== templateId);\n setCustomTemplates(updated);\n saveCustomTemplates(updated);\n }, [customTemplates]);\n\n // Handle content changes from contenteditable\n // Convert tag elements back to {{variable}} / [[artifact]] format for storage\n const handleInput = useCallback(() => {\n if (editorRef.current) {\n // Clone the content to avoid modifying the actual DOM\n const clone = editorRef.current.cloneNode(true) as HTMLElement;\n\n // Convert variable tags back to {{variable}} format\n const varTags = clone.querySelectorAll('[data-var]');\n varTags.forEach((tag) => {\n const varName = tag.getAttribute('data-var');\n if (varName) {\n tag.replaceWith(`{{${varName}}}`);\n }\n });\n\n // Convert artifact tags back to [[artifact]] format\n const artTags = clone.querySelectorAll('[data-artifact]');\n artTags.forEach((tag) => {\n const artName = tag.getAttribute('data-artifact');\n if (artName) {\n tag.replaceWith(`[[${artName}]]`);\n }\n });\n\n // Convert <br> to newlines\n clone.querySelectorAll('br').forEach((br) => br.replaceWith('\\n'));\n\n // Get the text content\n const content = clone.textContent || '';\n onChange(content);\n }\n }, [onChange]);\n\n // Handle paste - convert to plain text\n const handlePaste = useCallback((e: React.ClipboardEvent) => {\n e.preventDefault();\n const text = e.clipboardData.getData('text/plain');\n document.execCommand('insertText', false, text);\n }, []);\n\n // Insert variable at cursor position\n const insertVariable = useCallback((varName: string) => {\n if (editorRef.current) {\n editorRef.current.focus();\n const varText = `{{${varName}}}`;\n document.execCommand('insertText', false, varText);\n }\n }, []);\n\n // Insert artifact at cursor position\n const insertArtifact = useCallback((artName: string) => {\n if (editorRef.current) {\n editorRef.current.focus();\n const artText = `[[${artName}]]`;\n document.execCommand('insertText', false, artText);\n }\n }, []);\n\n // Insert text at cursor position (or append if no focus)\n const insertText = useCallback((text: string) => {\n if (editorRef.current) {\n editorRef.current.focus();\n document.execCommand('insertText', false, text);\n }\n }, []);\n\n // Add new variable\n const handleAddVariable = useCallback(() => {\n if (newVarName.trim()) {\n insertVariable(newVarName.trim());\n setNewVarName('');\n }\n }, [newVarName, insertVariable]);\n\n // Add new artifact\n const handleAddArtifact = useCallback(() => {\n if (newArtifactName.trim()) {\n insertArtifact(newArtifactName.trim());\n setNewArtifactName('');\n }\n }, [newArtifactName, insertArtifact]);\n\n // Handle key press in new variable input\n const handleVarInputKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddVariable();\n }\n }, [handleAddVariable]);\n\n // Render tokens as HTML - variables show as green tags, artifacts as blue tags\n const renderContent = useMemo(() => {\n if (!hasContent) return '';\n\n return tokens.map((token) => {\n if (token.type === 'variable') {\n const isValid = availableVariables.includes(token.value) || token.value.includes('.');\n return `<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 rounded text-xs font-semibold align-baseline cursor-default select-none ${\n isValid\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/50 dark:text-emerald-300'\n : 'bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300'\n }\" contenteditable=\"false\" data-var=\"${token.value}\">${token.value}</span>`;\n }\n if (token.type === 'artifact') {\n return `<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 rounded text-xs font-semibold align-baseline cursor-default select-none bg-sky-100 text-sky-700 dark:bg-sky-900/50 dark:text-sky-300\" contenteditable=\"false\" data-artifact=\"${token.value}\">\\u2192 ${token.value}</span>`;\n }\n // Escape HTML in text and preserve whitespace\n return token.value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\n/g, '<br>');\n }).join('');\n }, [tokens, availableVariables, hasContent]);\n\n // Sync content when value changes externally\n useEffect(() => {\n if (editorRef.current && !isFocused) {\n editorRef.current.innerHTML = renderContent;\n }\n }, [renderContent, isFocused]);\n\n return (\n <div className=\"space-y-2\">\n {/* Main editor */}\n <div\n className={cn(\n 'relative rounded-md border transition-colors',\n isFocused ? 'border-primary ring-2 ring-primary/20' : 'border-border'\n )}\n >\n <div\n ref={editorRef}\n contentEditable\n onInput={handleInput}\n onPaste={handlePaste}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n data-placeholder={placeholder}\n className={cn(\n 'w-full px-3 py-2 text-sm font-mono leading-relaxed',\n 'focus:outline-none',\n 'whitespace-pre-wrap break-words',\n '[&:empty]:before:content-[attr(data-placeholder)] [&:empty]:before:text-muted-foreground'\n )}\n style={{ minHeight }}\n dangerouslySetInnerHTML={{ __html: renderContent }}\n />\n </div>\n\n {/* Variable & Artifact toolbar */}\n <div className=\"flex flex-wrap items-center gap-2 p-2 rounded-md bg-muted/30 border border-border\">\n {/* Add new variable input */}\n <div className=\"flex items-center gap-1\">\n <Input\n value={newVarName}\n onChange={(e) => setNewVarName(e.target.value)}\n onKeyDown={handleVarInputKeyDown}\n placeholder=\"{{变量}}\"\n className=\"h-7 w-20 text-xs font-mono\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleAddVariable}\n disabled={!newVarName.trim()}\n className=\"h-7 px-2\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </Button>\n </div>\n\n <div className=\"w-px h-5 bg-border\" />\n\n {/* Add new artifact input */}\n <div className=\"flex items-center gap-1\">\n <Input\n value={newArtifactName}\n onChange={(e) => setNewArtifactName(e.target.value)}\n onKeyDown={(e: KeyboardEvent<HTMLInputElement>) => { if (e.key === 'Enter') { e.preventDefault(); handleAddArtifact(); } }}\n placeholder=\"[[产物]]\"\n className=\"h-7 w-20 text-xs font-mono\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleAddArtifact}\n disabled={!newArtifactName.trim()}\n className=\"h-7 px-2\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </Button>\n </div>\n\n {/* Quick insert available variables */}\n {availableVariables.length > 0 && (\n <>\n <div className=\"w-px h-5 bg-border\" />\n <span className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.available' })}</span>\n {availableVariables.slice(0, 5).map((varName) => (\n <button\n key={varName}\n type=\"button\"\n onClick={() => insertVariable(varName)}\n className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-mono bg-emerald-100 text-emerald-700 hover:bg-emerald-200 dark:bg-emerald-900/50 dark:text-emerald-300 dark:hover:bg-emerald-900/70 transition-colors\"\n >\n {varName}\n </button>\n ))}\n </>\n )}\n\n {/* Detected variables summary */}\n {detectedVars.length > 0 && (\n <>\n <div className=\"w-px h-5 bg-border\" />\n <span className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.variables' })}</span>\n {detectedVars.map((varName) => {\n const isValid = availableVariables.includes(varName) || varName.includes('.');\n return (\n <span\n key={varName}\n className={cn(\n 'inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-mono',\n isValid\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/50 dark:text-emerald-300'\n : 'bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300'\n )}\n >\n {isValid ? <CheckCircle2 className=\"w-3 h-3\" /> : <AlertCircle className=\"w-3 h-3\" />}\n {varName}\n </span>\n );\n })}\n </>\n )}\n\n {/* Detected artifacts summary */}\n {detectedArtifacts.length > 0 && (\n <>\n <div className=\"w-px h-5 bg-border\" />\n <span className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.artifactsLabel' })}</span>\n {detectedArtifacts.map((artName) => (\n <span\n key={artName}\n className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-mono bg-sky-100 text-sky-700 dark:bg-sky-900/50 dark:text-sky-300\"\n >\n {'\\u2192'} {artName}\n </span>\n ))}\n </>\n )}\n </div>\n\n {/* Templates - categorized */}\n <div className=\"space-y-2\">\n {/* Template buttons by category */}\n <div className=\"flex flex-wrap items-center gap-2 p-2 rounded-md bg-muted/30 border border-border\">\n <span className=\"text-xs text-muted-foreground shrink-0\">{formatMessage({ id: 'orchestrator.propertyPanel.templateLabel' })}</span>\n\n {allTemplates.map((template) => (\n <div key={template.id} className=\"relative group\">\n <button\n type=\"button\"\n onClick={() => {\n if (template.hasInput) {\n const inputValue = prompt(template.inputLabel + ':', template.inputDefault);\n if (inputValue !== null) {\n const content = template.content.replace(/\\$INPUT/g, inputValue);\n insertText('\\n\\n' + content);\n }\n } else {\n insertText('\\n\\n' + template.content);\n }\n }}\n className={cn(\n 'inline-flex items-center px-2 py-1 rounded text-xs font-medium transition-colors',\n TEMPLATE_COLORS[template.color]\n )}\n >\n {template.label}\n </button>\n {/* Delete button for custom templates */}\n {template.isCustom && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n if (confirm(formatMessage({ id: 'orchestrator.propertyPanel.confirmDeleteTemplate' }, { name: template.label }))) {\n handleDeleteTemplate(template.id);\n }\n }}\n className=\"absolute -top-1 -right-1 w-4 h-4 rounded-full bg-destructive text-destructive-foreground items-center justify-center text-xs hidden group-hover:flex\"\n >\n ×\n </button>\n )}\n </div>\n ))}\n\n {/* Add custom template button */}\n <button\n type=\"button\"\n onClick={() => setIsModalOpen(true)}\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium border border-dashed border-border text-muted-foreground hover:text-foreground hover:border-foreground transition-colors\"\n >\n <Plus className=\"w-3 h-3\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.newTemplate' })}\n </button>\n </div>\n </div>\n\n {/* Custom Template Modal */}\n <TemplateModal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n onSave={handleSaveTemplate}\n />\n </div>\n );\n}\n\n// ========== Form Field Components ==========\n\ninterface LabelInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction LabelInput({ value, onChange }: LabelInputProps) {\n const { formatMessage } = useIntl();\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.label' })}\n </label>\n <Input\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.placeholders.nodeLabel' })}\n />\n </div>\n );\n}\n\n// ========== Slash Command Section ==========\n\ninterface SlashCommandSectionProps {\n data: PromptTemplateNodeData;\n onChange: (updates: Partial<PromptTemplateNodeData>) => void;\n availableVariables: string[];\n}\n\nfunction SlashCommandSection({ data, onChange, availableVariables }: SlashCommandSectionProps) {\n const { formatMessage } = useIntl();\n const [argumentHint, setArgumentHint] = useState<string>('');\n\n // Look up argumentHint from loaded commands when mounting with pre-selected command\n const { commands } = useCommands({ filter: { showDisabled: false } });\n useEffect(() => {\n if (data.slashCommand && commands.length > 0) {\n const cmd = commands.find((c) => c.name === data.slashCommand);\n if (cmd?.argumentHint) {\n setArgumentHint(cmd.argumentHint);\n }\n }\n }, [data.slashCommand, commands]);\n\n const handleCommandSelect = useCallback(\n (name: string) => {\n const updates: Partial<PromptTemplateNodeData> = { slashCommand: name };\n // Auto-set label if still default\n if (!data.label || data.label === 'Slash Command' || data.label === 'Slash Command (Async)' || data.label === 'New Step') {\n updates.label = `/${name}`;\n }\n onChange(updates);\n },\n [data.label, onChange]\n );\n\n const handleSelectDetails = useCallback(\n (details: CommandSelectDetails) => {\n setArgumentHint(details.argumentHint || '');\n },\n []\n );\n\n return (\n <div className=\"space-y-3\">\n {/* Slash Command Picker */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.slashCommand' })}\n </label>\n <CommandCombobox\n value={data.slashCommand || ''}\n onChange={handleCommandSelect}\n onSelectDetails={handleSelectDetails}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.placeholders.slashCommand' })}\n />\n </div>\n\n {/* Args Input */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.slashArgs' })}\n </label>\n <Input\n value={data.slashArgs || ''}\n onChange={(e) => onChange({ slashArgs: e.target.value })}\n placeholder={argumentHint || formatMessage({ id: 'orchestrator.propertyPanel.placeholders.slashArgs' })}\n className=\"font-mono\"\n />\n {argumentHint && (\n <p className=\"text-xs text-muted-foreground mt-1 font-mono truncate\" title={argumentHint}>\n {argumentHint}\n </p>\n )}\n </div>\n\n {/* Additional instruction for context */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.additionalInstruction' })}\n </label>\n <TagEditor\n value={data.instruction || ''}\n onChange={(value) => onChange({ instruction: value })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.placeholders.additionalInstruction' })}\n minHeight={80}\n availableVariables={availableVariables}\n />\n </div>\n </div>\n );\n}\n\n// ========== Collapsible Section ==========\n\nfunction CollapsibleSection({\n title,\n defaultExpanded = false,\n children,\n}: {\n title: string;\n defaultExpanded?: boolean;\n children: React.ReactNode;\n}) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n return (\n <div className=\"border-t border-border pt-3\">\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex items-center gap-2 w-full text-left text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2 hover:text-foreground transition-colors\"\n >\n {isExpanded ? <ChevronDown className=\"w-3 h-3\" /> : <ChevronRight className=\"w-3 h-3\" />}\n {title}\n </button>\n {isExpanded && <div className=\"space-y-3\">{children}</div>}\n </div>\n );\n}\n\n// ========== Tags Input ==========\n\nfunction TagsInput({ tags, onChange }: { tags: string[]; onChange: (tags: string[]) => void }) {\n const { formatMessage } = useIntl();\n const [input, setInput] = useState('');\n\n const handleAdd = () => {\n if (input.trim() && !tags.includes(input.trim())) {\n onChange([...tags, input.trim()]);\n setInput('');\n }\n };\n\n const handleRemove = (tag: string) => {\n onChange(tags.filter(t => t !== tag));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAdd();\n }\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1\">\n {tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-primary/10 text-primary\">\n {tag}\n <button onClick={() => handleRemove(tag)} className=\"hover:text-destructive\">\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n </div>\n <div className=\"flex gap-1\">\n <Input\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.addTag' })}\n className=\"h-7 text-xs\"\n />\n <Button variant=\"ghost\" size=\"sm\" onClick={handleAdd} disabled={!input.trim()} className=\"h-7 px-2\">\n <Plus className=\"w-3 h-3\" />\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Artifacts List ==========\n\nfunction ArtifactsList({ artifacts, onChange }: { artifacts: string[]; onChange: (artifacts: string[]) => void }) {\n const [input, setInput] = useState('');\n\n const handleAdd = () => {\n if (input.trim()) {\n onChange([...artifacts, input.trim()]);\n setInput('');\n }\n };\n\n const handleRemove = (index: number) => {\n onChange(artifacts.filter((_, i) => i !== index));\n };\n\n return (\n <div className=\"space-y-2\">\n {artifacts.map((artifact, i) => (\n <div key={i} className=\"flex items-center gap-2 text-xs\">\n <span className=\"text-muted-foreground\">{'->'}</span>\n <span className=\"flex-1 font-mono truncate\">{artifact}</span>\n <button onClick={() => handleRemove(i)} className=\"text-muted-foreground hover:text-destructive\">\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n <div className=\"flex gap-1\">\n <Input\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); handleAdd(); } }}\n placeholder=\"output-file.json\"\n className=\"h-7 text-xs font-mono\"\n />\n <Button variant=\"ghost\" size=\"sm\" onClick={handleAdd} disabled={!input.trim()} className=\"h-7 px-2\">\n <Plus className=\"w-3 h-3\" />\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Unified PromptTemplate Property Editor ==========\n\ninterface PromptTemplatePropertiesProps {\n data: PromptTemplateNodeData;\n onChange: (updates: Partial<PromptTemplateNodeData>) => void;\n}\n\nfunction PromptTemplateProperties({ data, onChange }: PromptTemplatePropertiesProps) {\n const { formatMessage } = useIntl();\n const nodes = useFlowStore((state) => state.nodes);\n const selectedNodeId = useFlowStore((state) => state.selectedNodeId);\n\n const isSlashCommandMode = data.mode === 'mainprocess' || data.mode === 'async';\n\n // Build available outputNames from other nodes for contextRefs picker\n const availableOutputNames = useMemo(() => {\n return nodes\n .filter((n) => n.id !== selectedNodeId && n.data?.outputName)\n .map((n) => ({\n id: n.data.outputName as string,\n label: n.data.label || n.id,\n }));\n }, [nodes, selectedNodeId]);\n\n // Extract variable names for VariableTextarea validation\n const availableVariables = useMemo(() => {\n return availableOutputNames.map((n) => n.id);\n }, [availableOutputNames]);\n\n return (\n <div className=\"space-y-4\">\n {/* Label */}\n <LabelInput value={data.label} onChange={(value) => onChange({ label: value })} />\n\n {/* Mode Select - different options for Slash Commands vs CLI Tools */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.mode' })}\n </label>\n <select\n value={data.mode || 'mainprocess'}\n onChange={(e) => {\n const newMode = e.target.value as ExecutionMode;\n const updates: Partial<PromptTemplateNodeData> = { mode: newMode };\n // Clear slash command fields when switching to CLI mode\n if (newMode === 'analysis' || newMode === 'write') {\n updates.slashCommand = '';\n updates.slashArgs = '';\n }\n onChange(updates);\n }}\n className=\"w-full h-10 px-3 rounded-md border border-border bg-background text-foreground text-sm\"\n >\n <optgroup label={formatMessage({ id: 'orchestrator.propertyPanel.slashCommandsGroup' })}>\n <option value=\"mainprocess\">{formatMessage({ id: 'orchestrator.propertyPanel.options.modeMainprocess' })}</option>\n <option value=\"async\">{formatMessage({ id: 'orchestrator.propertyPanel.options.modeAsync' })}</option>\n </optgroup>\n <optgroup label={formatMessage({ id: 'orchestrator.propertyPanel.cliToolsGroup' })}>\n <option value=\"analysis\">{formatMessage({ id: 'orchestrator.propertyPanel.options.modeAnalysis' })}</option>\n <option value=\"write\">{formatMessage({ id: 'orchestrator.propertyPanel.options.modeWrite' })}</option>\n </optgroup>\n </select>\n </div>\n\n {/* Conditional: Slash Command Section vs Instruction textarea */}\n {isSlashCommandMode ? (\n <SlashCommandSection data={data} onChange={onChange} availableVariables={availableVariables} />\n ) : (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.labels.instruction' })}\n </label>\n <TagEditor\n value={data.instruction || ''}\n onChange={(value) => {\n // Auto-extract [[artifact]] names and sync to artifacts field\n const arts = extractArtifacts(value);\n onChange({ instruction: value, artifacts: arts.length > 0 ? arts : undefined });\n }}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.placeholders.instruction' })}\n minHeight={120}\n availableVariables={availableVariables}\n />\n </div>\n )}\n\n {/* Classification Section */}\n <CollapsibleSection title={formatMessage({ id: 'orchestrator.propertyPanel.classificationSection' })} defaultExpanded={false}>\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.description' })}</label>\n <textarea\n value={data.description || ''}\n onChange={(e) => onChange({ description: e.target.value })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.descriptionPlaceholder' })}\n rows={2}\n className=\"w-full px-3 py-2 rounded-md border border-border bg-background text-foreground text-sm resize-none\"\n />\n </div>\n\n {/* Tags */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.tags' })}</label>\n <TagsInput\n tags={data.tags || []}\n onChange={(tags) => onChange({ tags })}\n />\n </div>\n </CollapsibleSection>\n\n {/* Execution Section */}\n <CollapsibleSection title={formatMessage({ id: 'orchestrator.propertyPanel.executionSection' })} defaultExpanded={false}>\n {/* Condition */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.condition' })}</label>\n <Input\n value={data.condition || ''}\n onChange={(e) => onChange({ condition: e.target.value || undefined })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.conditionPlaceholder' })}\n className=\"font-mono text-sm\"\n />\n </div>\n\n {/* Artifacts */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">{formatMessage({ id: 'orchestrator.propertyPanel.artifacts' })}</label>\n <ArtifactsList\n artifacts={data.artifacts || []}\n onChange={(artifacts) => onChange({ artifacts })}\n />\n </div>\n\n {/* CLI Session Routing (tmux-like) */}\n {!isSlashCommandMode && (\n <>\n {/* Instruction Type for native CLI sessions */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n Instruction Type\n </label>\n <select\n value={data.instructionType || 'prompt'}\n onChange={(e) => {\n const next = e.target.value as 'prompt' | 'skill' | 'command';\n const updates: Partial<PromptTemplateNodeData> = { instructionType: next };\n if (next !== 'skill') {\n updates.skillName = undefined;\n }\n onChange(updates);\n }}\n className=\"w-full h-10 px-3 rounded-md border border-border bg-background text-foreground text-sm\"\n >\n <option value=\"prompt\">Prompt (direct text)</option>\n <option value=\"skill\">Skill (CLI-specific prefix)</option>\n <option value=\"command\">Command (CLI native)</option>\n </select>\n </div>\n\n {/* Skill Name - shown when instructionType is 'skill' */}\n {(data.instructionType === 'skill') && (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n Skill Name\n {data.tool && (\n <span className=\"ml-2 text-xs text-muted-foreground font-normal\">\n {data.tool === 'claude' ? 'prefix: /' : data.tool === 'codex' ? 'prefix: $' : 'no prefix'}\n </span>\n )}\n </label>\n <Input\n value={data.skillName || ''}\n onChange={(e) => onChange({ skillName: e.target.value || undefined })}\n placeholder={data.tool === 'claude' ? 'e.g. review-code' : data.tool === 'codex' ? 'e.g. fix' : 'skill name'}\n className=\"font-mono text-sm\"\n />\n </div>\n )}\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.delivery' })}\n </label>\n <select\n value={(data.delivery as string) || 'newExecution'}\n onChange={(e) => {\n const next = e.target.value as 'newExecution' | 'sendToSession';\n const updates: Partial<PromptTemplateNodeData> = { delivery: next };\n if (next !== 'sendToSession') {\n updates.targetSessionKey = undefined;\n updates.resumeKey = undefined;\n updates.resumeStrategy = undefined;\n }\n onChange(updates);\n }}\n className=\"w-full h-10 px-3 rounded-md border border-border bg-background text-foreground text-sm\"\n >\n <option value=\"newExecution\">\n {formatMessage({ id: 'orchestrator.propertyPanel.options.deliveryNewExecution' })}\n </option>\n <option value=\"sendToSession\">\n {formatMessage({ id: 'orchestrator.propertyPanel.options.deliverySendToSession' })}\n </option>\n </select>\n </div>\n\n {((data.delivery as string) || 'newExecution') === 'sendToSession' && (\n <>\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.targetSessionKey' })}\n </label>\n <Input\n value={(data.targetSessionKey as string) || ''}\n onChange={(e) => onChange({ targetSessionKey: e.target.value || undefined })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.targetSessionKeyPlaceholder' })}\n className=\"font-mono text-sm\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.resumeKey' })}\n </label>\n <Input\n value={(data.resumeKey as string) || ''}\n onChange={(e) => onChange({ resumeKey: e.target.value || undefined })}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.resumeKeyPlaceholder' })}\n className=\"font-mono text-sm\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1\">\n {formatMessage({ id: 'orchestrator.propertyPanel.resumeStrategy' })}\n </label>\n <select\n value={(data.resumeStrategy as string) || 'nativeResume'}\n onChange={(e) => onChange({ resumeStrategy: e.target.value as any })}\n className=\"w-full h-10 px-3 rounded-md border border-border bg-background text-foreground text-sm\"\n >\n <option value=\"nativeResume\">\n {formatMessage({ id: 'orchestrator.propertyPanel.options.resumeStrategyNative' })}\n </option>\n <option value=\"promptConcat\">\n {formatMessage({ id: 'orchestrator.propertyPanel.options.resumeStrategyPromptConcat' })}\n </option>\n </select>\n </div>\n </>\n )}\n </>\n )}\n </CollapsibleSection>\n </div>\n );\n}\n\n// ========== Save As Template Button ==========\n\nconst SAVE_COLOR_OPTIONS = [\n { value: 'bg-blue-500', label: 'Blue' },\n { value: 'bg-green-500', label: 'Green' },\n { value: 'bg-purple-500', label: 'Purple' },\n { value: 'bg-rose-500', label: 'Rose' },\n { value: 'bg-amber-500', label: 'Amber' },\n { value: 'bg-cyan-500', label: 'Cyan' },\n { value: 'bg-teal-500', label: 'Teal' },\n { value: 'bg-orange-500', label: 'Orange' },\n];\n\nfunction SaveAsTemplateButton({ nodeId, nodeLabel }: { nodeId: string; nodeLabel: string }) {\n const { formatMessage } = useIntl();\n const [isOpen, setIsOpen] = useState(false);\n const [name, setName] = useState('');\n const [desc, setDesc] = useState('');\n const [color, setColor] = useState('bg-blue-500');\n const addCustomTemplate = useFlowStore((s) => s.addCustomTemplate);\n const nodes = useFlowStore((s) => s.nodes);\n\n const handleSave = () => {\n const node = nodes.find((n) => n.id === nodeId);\n if (!node || !name.trim()) return;\n\n const { executionStatus, executionError, executionResult, ...templateData } = node.data;\n addCustomTemplate({\n id: `custom-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n label: name.trim(),\n description: desc.trim() || name.trim(),\n icon: 'MessageSquare',\n color,\n category: 'command',\n data: { ...templateData, label: name.trim() },\n });\n\n setIsOpen(false);\n setName('');\n setDesc('');\n setColor('bg-blue-500');\n };\n\n if (!isOpen) {\n return (\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => { setName(nodeLabel); setIsOpen(true); }}\n >\n <BookmarkPlus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.saveToLibrary' })}\n </Button>\n );\n }\n\n return (\n <div className=\"p-2 rounded-md border border-primary/50 bg-muted/50 space-y-2\">\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.templateName' })}\n className=\"h-8 text-sm\"\n autoFocus\n />\n <Input\n value={desc}\n onChange={(e) => setDesc(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.propertyPanel.descriptionOptional' })}\n className=\"h-8 text-sm\"\n />\n <div className=\"flex flex-wrap gap-1\">\n {SAVE_COLOR_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n onClick={() => setColor(opt.value)}\n className={cn(\n 'w-5 h-5 rounded-full transition-all',\n opt.value,\n color === opt.value ? 'ring-2 ring-offset-1 ring-offset-background ring-primary' : '',\n )}\n title={opt.label}\n />\n ))}\n </div>\n <div className=\"flex gap-1\">\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1\" onClick={() => setIsOpen(false)}>\n {formatMessage({ id: 'orchestrator.propertyPanel.cancel' })}\n </Button>\n <Button size=\"sm\" className=\"flex-1\" onClick={handleSave} disabled={!name.trim()}>\n <Save className=\"w-3.5 h-3.5 mr-1\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.save' })}\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Main PropertyPanel Component ==========\n\ninterface PropertyPanelProps {\n className?: string;\n}\n\nexport function PropertyPanel({ className }: PropertyPanelProps) {\n const { formatMessage } = useIntl();\n const selectedNodeId = useFlowStore((state) => state.selectedNodeId);\n const nodes = useFlowStore((state) => state.nodes);\n const updateNode = useFlowStore((state) => state.updateNode);\n const removeNode = useFlowStore((state) => state.removeNode);\n const setIsPropertyPanelOpen = useFlowStore((state) => state.setIsPropertyPanelOpen);\n\n const selectedNode = nodes.find((n) => n.id === selectedNodeId);\n\n const handleChange = useCallback(\n (updates: Partial<PromptTemplateNodeData>) => {\n if (selectedNodeId) {\n updateNode(selectedNodeId, updates);\n }\n },\n [selectedNodeId, updateNode]\n );\n\n const handleDelete = useCallback(() => {\n if (selectedNodeId) {\n removeNode(selectedNodeId);\n }\n }, [selectedNodeId, removeNode]);\n\n // No node selected\n if (!selectedNode) {\n return (\n <div className={cn('w-72 bg-card/95 backdrop-blur-sm border border-border rounded-lg shadow-xl flex flex-col', className)}>\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\n <h3 className=\"font-semibold text-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.title' })}</h3>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => setIsPropertyPanelOpen(false)}\n title={formatMessage({ id: 'orchestrator.propertyPanel.close' })}\n >\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n <div className=\"flex-1 flex items-center justify-center p-4\">\n <div className=\"text-center text-muted-foreground\">\n <Settings className=\"w-12 h-12 mx-auto mb-2 opacity-50\" />\n <p className=\"text-sm\">{formatMessage({ id: 'orchestrator.propertyPanel.selectNode' })}</p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn('w-72 bg-card/95 backdrop-blur-sm border border-border rounded-lg shadow-xl flex flex-col', className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\n <div className=\"flex items-center gap-2\">\n <MessageSquare className=\"w-4 h-4 text-primary\" />\n <h3 className=\"font-semibold text-foreground\">{formatMessage({ id: 'orchestrator.propertyPanel.title' })}</h3>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => setIsPropertyPanelOpen(false)}\n title={formatMessage({ id: 'orchestrator.propertyPanel.close' })}\n >\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n\n {/* Node Type Badge */}\n <div className=\"px-4 py-2 border-b border-border bg-muted/30\">\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {formatMessage({ id: 'orchestrator.propertyPanel.nodeType' })}\n </span>\n </div>\n\n {/* Properties Form - unified for all nodes */}\n <div className=\"flex-1 overflow-y-auto p-4\">\n <PromptTemplateProperties\n data={selectedNode.data as PromptTemplateNodeData}\n onChange={handleChange}\n />\n </div>\n\n {/* Footer Actions */}\n <div className=\"px-4 py-3 border-t border-border space-y-2\">\n <SaveAsTemplateButton nodeId={selectedNodeId!} nodeLabel={selectedNode.data.label} />\n <Button variant=\"destructive\" className=\"w-full\" onClick={handleDelete}>\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'orchestrator.propertyPanel.deleteNode' })}\n </Button>\n </div>\n </div>\n );\n}\n\nexport default PropertyPanel;\n","// ========================================\n// Flow Toolbar Component\n// ========================================\n// Toolbar for flow operations: Save, Load, Import Template, Export, Send to Terminal\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Save,\n FolderOpen,\n Download,\n Trash2,\n Copy,\n Workflow,\n Loader2,\n ChevronDown,\n Library,\n Terminal,\n Maximize2,\n Minimize2,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { useFlowStore, toast } from '@/stores';\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\nimport type { Flow } from '@/types/flow';\n\ninterface FlowToolbarProps {\n className?: string;\n onOpenTemplateLibrary?: () => void;\n}\n\nexport function FlowToolbar({ className, onOpenTemplateLibrary }: FlowToolbarProps) {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const [isFlowListOpen, setIsFlowListOpen] = useState(false);\n const [flowName, setFlowName] = useState('');\n const [isSaving, setIsSaving] = useState(false);\n\n // Immersive mode state\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\n\n // Flow store\n const currentFlow = useFlowStore((state) => state.currentFlow);\n const isModified = useFlowStore((state) => state.isModified);\n const flows = useFlowStore((state) => state.flows);\n const isLoadingFlows = useFlowStore((state) => state.isLoadingFlows);\n const saveFlow = useFlowStore((state) => state.saveFlow);\n const loadFlow = useFlowStore((state) => state.loadFlow);\n const deleteFlow = useFlowStore((state) => state.deleteFlow);\n const duplicateFlow = useFlowStore((state) => state.duplicateFlow);\n const fetchFlows = useFlowStore((state) => state.fetchFlows);\n\n // Load flows on mount\n useEffect(() => {\n fetchFlows();\n }, [fetchFlows]);\n\n // Sync flow name with current flow\n useEffect(() => {\n setFlowName(currentFlow?.name || '');\n }, [currentFlow?.name]);\n\n // Handle save\n const handleSave = useCallback(async () => {\n setIsSaving(true);\n try {\n const name = flowName.trim() || formatMessage({ id: 'orchestrator.toolbar.placeholder' });\n\n // Auto-create a new flow if none exists\n if (!currentFlow) {\n const now = new Date().toISOString();\n const newFlow: Flow = {\n id: `flow-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n name,\n version: 1,\n created_at: now,\n updated_at: now,\n nodes: useFlowStore.getState().nodes,\n edges: useFlowStore.getState().edges,\n variables: {},\n metadata: {},\n };\n useFlowStore.setState({ currentFlow: newFlow });\n } else if (flowName && flowName !== currentFlow.name) {\n // Update flow name if changed\n useFlowStore.setState((state) => ({\n currentFlow: state.currentFlow\n ? { ...state.currentFlow, name }\n : null,\n }));\n }\n\n const saved = await saveFlow();\n if (saved) {\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowSaved' }), formatMessage({ id: 'orchestrator.notifications.savedSuccessfully' }, { name }));\n } else {\n toast.error(formatMessage({ id: 'orchestrator.notifications.saveFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotSave' }));\n }\n } catch (err) {\n toast.error(formatMessage({ id: 'orchestrator.notifications.saveFailed' }), formatMessage({ id: 'orchestrator.notifications.saveError' }));\n } finally {\n setIsSaving(false);\n }\n }, [currentFlow, flowName, saveFlow, formatMessage]);\n\n // Handle load\n const handleLoad = useCallback(\n async (flow: Flow) => {\n const loaded = await loadFlow(flow.id);\n if (loaded) {\n setIsFlowListOpen(false);\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowLoaded' }), formatMessage({ id: 'orchestrator.notifications.loadedSuccessfully' }, { name: flow.name }));\n } else {\n toast.error(formatMessage({ id: 'orchestrator.notifications.loadFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotLoad' }));\n }\n },\n [loadFlow]\n );\n\n // Handle delete\n const handleDelete = useCallback(\n async (flow: Flow, e: React.MouseEvent) => {\n e.stopPropagation();\n if (!confirm(formatMessage({ id: 'orchestrator.notifications.confirmDelete' }, { name: flow.name }))) return;\n\n const deleted = await deleteFlow(flow.id);\n if (deleted) {\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowDeleted' }), formatMessage({ id: 'orchestrator.notifications.deletedSuccessfully' }, { name: flow.name }));\n } else {\n toast.error(formatMessage({ id: 'orchestrator.notifications.deleteFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotDelete' }));\n }\n },\n [deleteFlow]\n );\n\n // Handle duplicate\n const handleDuplicate = useCallback(\n async (flow: Flow, e: React.MouseEvent) => {\n e.stopPropagation();\n const duplicated = await duplicateFlow(flow.id);\n if (duplicated) {\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowDuplicated' }), formatMessage({ id: 'orchestrator.notifications.duplicatedSuccessfully' }, { name: duplicated.name }));\n } else {\n toast.error(formatMessage({ id: 'orchestrator.notifications.duplicateFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotDuplicate' }));\n }\n },\n [duplicateFlow]\n );\n\n // Handle export\n const handleExport = useCallback(() => {\n if (!currentFlow) {\n toast.error(formatMessage({ id: 'orchestrator.notifications.noFlow' }), formatMessage({ id: 'orchestrator.notifications.noFlowToExport' }));\n return;\n }\n\n const nodes = useFlowStore.getState().nodes;\n const edges = useFlowStore.getState().edges;\n const exportData = {\n ...currentFlow,\n nodes,\n edges,\n };\n\n const blob = new Blob([JSON.stringify(exportData, null, 2)], {\n type: 'application/json',\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${currentFlow.name.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowExported' }), formatMessage({ id: 'orchestrator.notifications.flowExported' }));\n }, [currentFlow]);\n\n // Handle send to terminal execution\n const handleSendToTerminal = useCallback(async () => {\n if (!currentFlow) {\n toast.error(formatMessage({ id: 'orchestrator.notifications.noFlow' }), formatMessage({ id: 'orchestrator.notifications.saveBeforeExecute' }));\n return;\n }\n\n // Save flow first if modified\n if (isModified) {\n const saved = await saveFlow();\n if (!saved) {\n toast.error(formatMessage({ id: 'orchestrator.notifications.saveFailed' }), formatMessage({ id: 'orchestrator.notifications.couldNotSave' }));\n return;\n }\n }\n\n // Navigate to terminal dashboard with flow execution request\n navigate(`/terminal?executeFlow=${currentFlow.id}`);\n toast.success(formatMessage({ id: 'orchestrator.notifications.flowSent' }), formatMessage({ id: 'orchestrator.notifications.sentToTerminal' }, { name: currentFlow.name }));\n }, [currentFlow, isModified, saveFlow, navigate, formatMessage]);\n\n return (\n <div className={cn('flex items-center gap-3 p-3 bg-card border-b border-border', className)}>\n {/* Flow Icon and Name */}\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <Workflow className=\"w-5 h-5 text-primary flex-shrink-0\" />\n <Input\n value={flowName}\n onChange={(e) => setFlowName(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.toolbar.placeholder' })}\n className=\"max-w-[200px] h-8 text-sm\"\n />\n {isModified && (\n <span className=\"text-xs text-amber-500 flex-shrink-0\">{formatMessage({ id: 'orchestrator.toolbar.unsavedChanges' })}</span>\n )}\n </div>\n\n {/* Action Buttons */}\n <div className=\"flex items-center gap-2\">\n {/* Save & Load Group */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleSave}\n disabled={isSaving}\n >\n {isSaving ? (\n <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" />\n ) : (\n <Save className=\"w-4 h-4 mr-1\" />\n )}\n {formatMessage({ id: 'orchestrator.toolbar.save' })}\n </Button>\n\n {/* Flow List Dropdown */}\n <div className=\"relative\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsFlowListOpen(!isFlowListOpen)}\n >\n <FolderOpen className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'orchestrator.toolbar.load' })}\n <ChevronDown className=\"w-3 h-3 ml-1\" />\n </Button>\n\n {isFlowListOpen && (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setIsFlowListOpen(false)}\n />\n\n {/* Dropdown */}\n <div className=\"absolute top-full right-0 mt-1 w-72 bg-card border border-border rounded-lg shadow-lg z-50 overflow-hidden\">\n <div className=\"px-3 py-2 border-b border-border bg-muted/50\">\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {formatMessage({ id: 'orchestrator.toolbar.savedFlows' }, { count: flows.length })}\n </span>\n </div>\n\n <div className=\"max-h-64 overflow-y-auto\">\n {isLoadingFlows ? (\n <div className=\"p-4 text-center text-muted-foreground\">\n <Loader2 className=\"w-5 h-5 animate-spin mx-auto mb-2\" />\n {formatMessage({ id: 'orchestrator.toolbar.loading' })}\n </div>\n ) : flows.length === 0 ? (\n <div className=\"p-4 text-center text-muted-foreground\">\n {formatMessage({ id: 'orchestrator.toolbar.noSavedFlows' })}\n </div>\n ) : (\n flows.map((flow) => (\n <div\n key={flow.id}\n onClick={() => handleLoad(flow)}\n className={cn(\n 'flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-muted/50 transition-colors',\n currentFlow?.id === flow.id && 'bg-primary/10'\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-medium text-foreground truncate\">\n {flow.name}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {new Date(flow.updated_at).toLocaleDateString()}\n </div>\n </div>\n <div className=\"flex items-center gap-1 ml-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={(e) => handleDuplicate(flow, e)}\n title={formatMessage({ id: 'orchestrator.toolbar.duplicate' })}\n >\n <Copy className=\"w-3 h-3\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 text-destructive hover:text-destructive\"\n onClick={(e) => handleDelete(flow, e)}\n title={formatMessage({ id: 'orchestrator.toolbar.delete' })}\n >\n <Trash2 className=\"w-3 h-3\" />\n </Button>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </>\n )}\n </div>\n\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Import & Export Group */}\n <Button variant=\"outline\" size=\"sm\" onClick={onOpenTemplateLibrary}>\n <Library className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'orchestrator.toolbar.importTemplate' })}\n </Button>\n\n <Button variant=\"outline\" size=\"sm\" onClick={handleExport} disabled={!currentFlow}>\n <Download className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'orchestrator.toolbar.export' })}\n </Button>\n\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Execute in Terminal */}\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleSendToTerminal}\n disabled={!currentFlow}\n >\n <Terminal className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'orchestrator.toolbar.sendToTerminal' })}\n </Button>\n\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Fullscreen Toggle */}\n <button\n onClick={toggleImmersiveMode}\n className={cn(\n 'p-2 rounded-md transition-colors',\n isImmersiveMode\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\n )}\n title={isImmersiveMode ? 'Exit Fullscreen' : 'Fullscreen'}\n >\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\n </button>\n </div>\n </div>\n );\n}\n\nexport default FlowToolbar;\n","// ========================================\n// Template Library\n// ========================================\n// Template browser with import/export functionality\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Library,\n Search,\n Download,\n Upload,\n Grid,\n List,\n Tag,\n Calendar,\n FileText,\n GitBranch,\n Loader2,\n Trash2,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from '@/components/ui/Dialog';\nimport { useTemplates, useInstallTemplate, useExportTemplate, useDeleteTemplate } from '@/hooks/useTemplates';\nimport { useFlowStore } from '@/stores';\nimport type { FlowTemplate } from '@/types/execution';\n\n// ========== Helper Functions ==========\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\n// ========== Template Card Component ==========\n\ninterface TemplateCardProps {\n template: FlowTemplate;\n viewMode: 'grid' | 'list';\n onInstall: (template: FlowTemplate) => void;\n onDelete: (template: FlowTemplate) => void;\n isInstalling: boolean;\n isDeleting: boolean;\n}\n\nfunction TemplateCard({\n template,\n viewMode,\n onInstall,\n onDelete,\n isInstalling,\n isDeleting,\n}: TemplateCardProps) {\n const { formatMessage } = useIntl();\n const isGrid = viewMode === 'grid';\n\n return (\n <Card\n className={cn(\n 'hover:border-primary/50 transition-colors',\n isGrid ? '' : 'flex items-center'\n )}\n >\n {isGrid ? (\n <>\n {/* Grid view */}\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-start justify-between\">\n <CardTitle className=\"text-base truncate\" title={template.name}>\n {template.name}\n </CardTitle>\n {template.category && (\n <Badge variant=\"secondary\" className=\"text-xs shrink-0\">\n {template.category}\n </Badge>\n )}\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {template.description && (\n <p className=\"text-sm text-muted-foreground line-clamp-2\">\n {template.description}\n </p>\n )}\n\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <GitBranch className=\"h-3 w-3\" />\n {template.nodeCount} {formatMessage({ id: 'orchestrator.templateLibrary.card.nodes' })}\n </span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatDate(template.updated_at)}\n </span>\n </div>\n\n {template.tags && template.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {template.tags.slice(0, 3).map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n <Tag className=\"h-2 w-2 mr-1\" />\n {tag}\n </Badge>\n ))}\n {template.tags.length > 3 && (\n <span className=\"text-xs text-muted-foreground\">\n +{template.tags.length - 3}\n </span>\n )}\n </div>\n )}\n\n <div className=\"flex items-center gap-2 pt-2\">\n <Button\n size=\"sm\"\n variant=\"default\"\n className=\"flex-1\"\n onClick={() => onInstall(template)}\n disabled={isInstalling}\n >\n {isInstalling ? (\n <Loader2 className=\"h-4 w-4 animate-spin mr-1\" />\n ) : (\n <Download className=\"h-4 w-4 mr-1\" />\n )}\n Import\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onDelete(template)}\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </CardContent>\n </>\n ) : (\n <>\n {/* List view */}\n <div className=\"flex-1 flex items-center gap-4 p-4\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium truncate\">{template.name}</span>\n {template.category && (\n <Badge variant=\"secondary\" className=\"text-xs shrink-0\">\n {template.category}\n </Badge>\n )}\n </div>\n {template.description && (\n <p className=\"text-sm text-muted-foreground truncate\">\n {template.description}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground shrink-0\">\n <span className=\"flex items-center gap-1\">\n <GitBranch className=\"h-3 w-3\" />\n {template.nodeCount}\n </span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatDate(template.updated_at)}\n </span>\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n <Button\n size=\"sm\"\n variant=\"default\"\n onClick={() => onInstall(template)}\n disabled={isInstalling}\n >\n {isInstalling ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Download className=\"h-4 w-4\" />\n )}\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onDelete(template)}\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </div>\n </>\n )}\n </Card>\n );\n}\n\n// ========== Export Dialog Component ==========\n\ninterface ExportDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onExport: (name: string, description: string, category: string, tags: string[]) => void;\n isExporting: boolean;\n flowName: string;\n}\n\nfunction ExportDialog({\n open,\n onOpenChange,\n onExport,\n isExporting,\n flowName,\n}: ExportDialogProps) {\n const { formatMessage } = useIntl();\n const [name, setName] = useState(flowName);\n const [description, setDescription] = useState('');\n const [category, setCategory] = useState('');\n const [tagsInput, setTagsInput] = useState('');\n\n const handleExport = useCallback(() => {\n const tags = tagsInput\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n onExport(name, description, category, tags);\n }, [name, description, category, tagsInput, onExport]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.title' })}</DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.description' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.name' })}</label>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.namePlaceholder' })}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.description' })}</label>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.descriptionPlaceholder' })}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.category' })}</label>\n <Input\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.categoryPlaceholder' })}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.tags' })}</label>\n <Input\n value={tagsInput}\n onChange={(e) => setTagsInput(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.exportDialog.fields.tagsPlaceholder' })}\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={handleExport} disabled={!name.trim() || isExporting}>\n {isExporting ? (\n <Loader2 className=\"h-4 w-4 animate-spin mr-1\" />\n ) : (\n <Upload className=\"h-4 w-4 mr-1\" />\n )}\n Export\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ========== Main Component ==========\n\ninterface TemplateLibraryProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport function TemplateLibrary({ open, onOpenChange }: TemplateLibraryProps) {\n const { formatMessage } = useIntl();\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid');\n const [exportDialogOpen, setExportDialogOpen] = useState(false);\n const [installingId, setInstallingId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n\n // Flow store\n const currentFlow = useFlowStore((state) => state.currentFlow);\n const setCurrentFlow = useFlowStore((state) => state.setCurrentFlow);\n\n // Query hooks\n const { data, isLoading, error } = useTemplates(selectedCategory ?? undefined);\n\n // Mutation hooks\n const installTemplate = useInstallTemplate();\n const exportTemplate = useExportTemplate();\n const deleteTemplate = useDeleteTemplate();\n\n // Filter templates by search query\n const filteredTemplates = useMemo(() => {\n if (!data?.templates) return [];\n if (!searchQuery.trim()) return data.templates;\n\n const query = searchQuery.toLowerCase();\n return data.templates.filter(\n (t) =>\n t.name.toLowerCase().includes(query) ||\n t.description?.toLowerCase().includes(query) ||\n t.tags?.some((tag) => tag.toLowerCase().includes(query))\n );\n }, [data?.templates, searchQuery]);\n\n // Handle install\n const handleInstall = useCallback(\n async (template: FlowTemplate) => {\n setInstallingId(template.id);\n try {\n const result = await installTemplate.mutateAsync({\n templateId: template.id,\n });\n // Set the installed flow as current\n setCurrentFlow(result.flow);\n onOpenChange(false);\n } catch (error) {\n console.error('Failed to install template:', error);\n } finally {\n setInstallingId(null);\n }\n },\n [installTemplate, setCurrentFlow, onOpenChange]\n );\n\n // Handle export\n const handleExport = useCallback(\n async (name: string, description: string, category: string, tags: string[]) => {\n if (!currentFlow) return;\n\n try {\n await exportTemplate.mutateAsync({\n flowId: currentFlow.id,\n name,\n description,\n category,\n tags,\n });\n setExportDialogOpen(false);\n } catch (error) {\n console.error('Failed to export template:', error);\n }\n },\n [currentFlow, exportTemplate]\n );\n\n // Handle delete\n const handleDelete = useCallback(\n async (template: FlowTemplate) => {\n setDeletingId(template.id);\n try {\n await deleteTemplate.mutateAsync(template.id);\n } catch (error) {\n console.error('Failed to delete template:', error);\n } finally {\n setDeletingId(null);\n }\n },\n [deleteTemplate]\n );\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-4xl max-h-[80vh] flex flex-col\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Library className=\"h-5 w-5\" />\n Template Library\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'orchestrator.templateLibrary.description' })}\n </DialogDescription>\n </DialogHeader>\n\n {/* Toolbar */}\n <div className=\"flex items-center gap-4 py-2\">\n {/* Search */}\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={formatMessage({ id: 'orchestrator.templateLibrary.searchPlaceholder' })}\n className=\"pl-9\"\n />\n </div>\n\n {/* Category filter */}\n {data?.categories && data.categories.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <Button\n variant={selectedCategory === null ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedCategory(null)}\n >\n All\n </Button>\n {data.categories.slice(0, 4).map((cat) => (\n <Button\n key={cat}\n variant={selectedCategory === cat ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedCategory(cat)}\n >\n {cat}\n </Button>\n ))}\n </div>\n )}\n\n {/* View mode toggle */}\n <div className=\"flex items-center border border-border rounded-md\">\n <Button\n variant={viewMode === 'grid' ? 'secondary' : 'ghost'}\n size=\"sm\"\n className=\"rounded-r-none\"\n onClick={() => setViewMode('grid')}\n >\n <Grid className=\"h-4 w-4\" />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'secondary' : 'ghost'}\n size=\"sm\"\n className=\"rounded-l-none\"\n onClick={() => setViewMode('list')}\n >\n <List className=\"h-4 w-4\" />\n </Button>\n </div>\n\n {/* Export button */}\n {currentFlow && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setExportDialogOpen(true)}\n >\n <Upload className=\"h-4 w-4 mr-1\" />\n Export Current\n </Button>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto min-h-0\">\n {isLoading ? (\n <div className=\"flex items-center justify-center h-48\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n ) : error ? (\n <div className=\"flex flex-col items-center justify-center h-48 text-muted-foreground\">\n <FileText className=\"h-12 w-12 mb-2\" />\n <p>{formatMessage({ id: 'orchestrator.templateLibrary.errors.loadFailed' })}</p>\n <p className=\"text-sm\">{(error as Error).message}</p>\n </div>\n ) : filteredTemplates.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-48 text-muted-foreground\">\n <Library className=\"h-12 w-12 mb-2\" />\n <p>{formatMessage({ id: 'orchestrator.templateLibrary.emptyState.title' })}</p>\n {searchQuery && (\n <p className=\"text-sm\">{formatMessage({ id: 'orchestrator.templateLibrary.emptyState.searchSuggestion' })}</p>\n )}\n </div>\n ) : (\n <div\n className={cn(\n viewMode === 'grid'\n ? 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4'\n : 'space-y-2'\n )}\n >\n {filteredTemplates.map((template) => (\n <TemplateCard\n key={template.id}\n template={template}\n viewMode={viewMode}\n onInstall={handleInstall}\n onDelete={handleDelete}\n isInstalling={installingId === template.id}\n isDeleting={deletingId === template.id}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <DialogFooter className=\"border-t border-border pt-4\">\n <div className=\"flex items-center justify-between w-full\">\n <span className=\"text-sm text-muted-foreground\">\n {formatMessage(\n { id: 'orchestrator.templateLibrary.footer.templateCount' },\n { count: filteredTemplates.length }\n )}\n </span>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Close\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Export Dialog */}\n {currentFlow && (\n <ExportDialog\n open={exportDialogOpen}\n onOpenChange={setExportDialogOpen}\n onExport={handleExport}\n isExporting={exportTemplate.isPending}\n flowName={currentFlow.name}\n />\n )}\n </>\n );\n}\n\nexport default TemplateLibrary;\n","// ========================================\r\n// Orchestrator Page\r\n// ========================================\r\n// Visual workflow template editor with React Flow, drag-drop node palette, and property panel\r\n// Execution functionality moved to Terminal Dashboard\r\n\r\nimport { useEffect, useState, useCallback } from 'react';\r\nimport * as Collapsible from '@radix-ui/react-collapsible';\r\nimport { ChevronRight } from 'lucide-react';\r\nimport { useFlowStore } from '@/stores';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { FlowCanvas } from './FlowCanvas';\r\nimport { LeftSidebar } from './LeftSidebar';\r\nimport { PropertyPanel } from './PropertyPanel';\r\nimport { FlowToolbar } from './FlowToolbar';\r\nimport { TemplateLibrary } from './TemplateLibrary';\r\n\r\nexport function OrchestratorPage() {\r\n const fetchFlows = useFlowStore((state) => state.fetchFlows);\r\n const isPaletteOpen = useFlowStore((state) => state.isPaletteOpen);\r\n const setIsPaletteOpen = useFlowStore((state) => state.setIsPaletteOpen);\r\n const isPropertyPanelOpen = useFlowStore((state) => state.isPropertyPanelOpen);\r\n const [isTemplateLibraryOpen, setIsTemplateLibraryOpen] = useState(false);\r\n\r\n // Load flows on mount\r\n useEffect(() => {\r\n fetchFlows();\r\n }, [fetchFlows]);\r\n\r\n // Handle open template library\r\n const handleOpenTemplateLibrary = useCallback(() => {\r\n setIsTemplateLibraryOpen(true);\r\n }, []);\r\n\r\n return (\r\n <div className=\"h-[calc(100%+2rem)] md:h-[calc(100%+3rem)] flex flex-col -m-4 md:-m-6\">\r\n {/* Toolbar */}\r\n <FlowToolbar onOpenTemplateLibrary={handleOpenTemplateLibrary} />\r\n\r\n {/* Main Content Area */}\r\n <div className=\"flex-1 flex overflow-hidden\">\r\n {/* Left Sidebar with collapse toggle */}\r\n {!isPaletteOpen && (\r\n <div className=\"w-10 bg-card border-r border-border flex flex-col items-center py-4\">\r\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setIsPaletteOpen(true)} title=\"Expand\">\r\n <ChevronRight className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n )}\r\n <Collapsible.Root open={isPaletteOpen} onOpenChange={setIsPaletteOpen} className=\"h-full\">\r\n <Collapsible.Content className=\"h-full overflow-hidden data-[state=open]:animate-collapsible-slide-down data-[state=closed]:animate-collapsible-slide-up\">\r\n <LeftSidebar />\r\n </Collapsible.Content>\r\n </Collapsible.Root>\r\n\r\n {/* Flow Canvas (Center) + PropertyPanel Overlay */}\r\n <div className=\"flex-1 relative\">\r\n <FlowCanvas className=\"absolute inset-0\" />\r\n\r\n {/* Property Panel as overlay - only shown when a node is selected */}\r\n {isPropertyPanelOpen && (\r\n <div className=\"absolute top-2 right-2 bottom-2 z-10\">\r\n <PropertyPanel className=\"h-full\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Template Library Dialog */}\r\n <TemplateLibrary\r\n open={isTemplateLibraryOpen}\r\n onOpenChange={setIsTemplateLibraryOpen}\r\n />\r\n </div>\r\n );\r\n}\r\n"],"names":["GripVertical","createLucideIcon","Hand","Library","MousePointerClick","STATUS_STYLES","SELECTION_STYLES","StatusIcon","status","jsx","Circle","Loader2","CheckCircle2","XCircle","NodeWrapper","children","selected","accentColor","className","jsxs","cn","MODE_STYLES","TOOL_STYLES","PHASE_COLORS","PHASE_THEME","CATEGORY_THEME","DEFAULT_THEME","STATUS_INDICATORS","PromptTemplateNode","memo","data","displayInstruction","hasContextRefs","hasPhase","statusInfo","hasArtifacts","hasTags","theme","Handle","Position","MessageSquare","Terminal","tag","Link2","artifact","nodeTypes","InteractionModeToggle","disabled","formatMessage","useIntl","interactionMode","useFlowStore","state","toggleInteractionMode","FlowCanvasInner","reactFlowWrapper","useRef","screenToFlowPosition","useReactFlow","isExecuting","useExecutionStore","selectIsExecuting","nodes","edges","setNodes","setEdges","addNode","addNodeFromTemplate","setSelectedNodeId","setSelectedEdgeId","markModified","isCtrlPressed","setIsCtrlPressed","useState","useEffect","handleKeyDown","e","handleKeyUp","handleBlur","effectiveMode","onNodesChange","useCallback","changes","updatedNodes","applyNodeChanges","onEdgesChange","updatedEdges","applyEdgeChanges","onConnect","connection","newEdge","onNodeClick","_event","node","onEdgeClick","edge","onPaneClick","onDragOver","event","onDrop","position","templateId","ReactFlow","Panel","Controls","MiniMap","Background","BackgroundVariant","FlowCanvas","props","ReactFlowProvider","TEMPLATE_ICONS","TEMPLATE_I18N","COLOR_OPTIONS","TemplateCategory","title","defaultExpanded","action","isExpanded","setIsExpanded","ChevronDown","ChevronRight","QuickTemplateCard","template","onDelete","Icon","i18n","displayLabel","displayDesc","onDragStart","onDoubleClick","Trash2","BasicTemplateCard","Plus","CreateTemplateForm","onClose","label","setLabel","description","setDescription","instruction","setInstruction","color","setColor","addCustomTemplate","s","handleSubmit","X","opt","NodeLibrary","isCreating","setIsCreating","customTemplates","removeCustomTemplate","QUICK_TEMPLATES","API_BASE","templateKeys","filters","id","toFlowTemplate","raw","meta","toFlowFromTemplate","now","fetchTemplates","category","url","response","json","templates","total","categories","t","c","installTemplate","request","exportTemplate","deleteTemplate","useTemplates","useQuery","useInstallTemplate","queryClient","useQueryClient","useMutation","useExportTemplate","result","old","useDeleteTemplate","_","deletedId","TemplateItem","onInstall","isInstalling","GitBranch","Badge","Download","InlineTemplatePanel","searchQuery","setSearchQuery","installingId","setInstallingId","setCurrentFlow","isLoading","error","filteredTemplates","useMemo","query","_a","_b","_c","handleInstall","err","Search","Input","FileText","useResizablePanel","options","minWidth","maxWidth","defaultWidth","storageKey","direction","width","setWidth","saved","parsed","isResizing","setIsResizing","startXRef","startWidthRef","handleMouseMove","deltaX","newWidth","constrainedWidth","handleMouseUp","handleMouseDown","ResizeHandle","onMouseDown","TABS","LeftSidebar","setIsPaletteOpen","leftPanelTab","setLeftPanelTab","Button","tab","CommandCombobox","value","onChange","onSelectDetails","placeholder","open","setOpen","search","setSearch","containerRef","inputRef","commands","commandsLoading","useCommands","skills","skillsLoading","useSkills","unifiedItems","items","cmd","skill","groupedFiltered","filtered","item","groups","totalFiltered","sum","handleClickOutside","handleSelect","handleInputChange","selectedItem","displayValue","a","b","group","BUILTIN_TEMPLATES","TEMPLATE_COLORS","CUSTOM_TEMPLATES_KEY","loadCustomTemplates","stored","saveCustomTemplates","TemplateModal","isOpen","onSave","content","setContent","hasInput","setHasInput","inputLabel","setInputLabel","inputDefault","setInputDefault","handleSave","Save","tokenize","text","tokens","regex","lastIndex","match","extractVariables","matches","m","extractArtifacts","TagEditor","availableVariables","minHeight","editorRef","isFocused","setIsFocused","newVarName","setNewVarName","newArtifactName","setNewArtifactName","isModalOpen","setIsModalOpen","setCustomTemplates","detectedVars","detectedArtifacts","hasContent","allTemplates","handleSaveTemplate","updated","handleDeleteTemplate","handleInput","clone","varName","artName","br","handlePaste","insertVariable","varText","insertArtifact","artText","insertText","handleAddVariable","handleAddArtifact","handleVarInputKeyDown","renderContent","token","Fragment","isValid","AlertCircle","inputValue","LabelInput","SlashCommandSection","argumentHint","setArgumentHint","handleCommandSelect","name","updates","handleSelectDetails","details","CollapsibleSection","TagsInput","tags","input","setInput","handleAdd","handleRemove","ArtifactsList","artifacts","index","i","PromptTemplateProperties","selectedNodeId","isSlashCommandMode","availableOutputNames","n","newMode","arts","next","SAVE_COLOR_OPTIONS","SaveAsTemplateButton","nodeId","nodeLabel","setIsOpen","setName","desc","setDesc","executionStatus","executionError","executionResult","templateData","BookmarkPlus","PropertyPanel","updateNode","removeNode","setIsPropertyPanelOpen","selectedNode","handleChange","handleDelete","Settings","FlowToolbar","onOpenTemplateLibrary","navigate","useNavigate","isFlowListOpen","setIsFlowListOpen","flowName","setFlowName","isSaving","setIsSaving","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","currentFlow","isModified","flows","isLoadingFlows","saveFlow","loadFlow","deleteFlow","duplicateFlow","fetchFlows","newFlow","toast","handleLoad","flow","handleDuplicate","duplicated","handleExport","exportData","blob","handleSendToTerminal","Workflow","FolderOpen","Copy","Minimize2","Maximize2","formatDate","dateString","TemplateCard","viewMode","isDeleting","isGrid","Card","CardHeader","CardTitle","CardContent","Calendar","Tag","ExportDialog","onOpenChange","onExport","isExporting","setCategory","tagsInput","setTagsInput","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","Upload","TemplateLibrary","selectedCategory","setSelectedCategory","setViewMode","exportDialogOpen","setExportDialogOpen","deletingId","setDeletingId","cat","Grid","List","OrchestratorPage","isPaletteOpen","isPropertyPanelOpen","isTemplateLibraryOpen","setIsTemplateLibraryOpen","handleOpenTemplateLibrary","Collapsible.Root","Collapsible.Content"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}