claude-code-workflow 7.2.18 → 7.2.20

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 (200) hide show
  1. package/.claude/commands/workflow/analyze-with-file.md +33 -8
  2. package/.codex/skills/analyze-with-file/SKILL.md +55 -8
  3. package/ccw/dist/core/routes/agent-definitions-routes.d.ts.map +1 -1
  4. package/ccw/dist/core/routes/agent-definitions-routes.js +152 -6
  5. package/ccw/dist/core/routes/agent-definitions-routes.js.map +1 -1
  6. package/ccw/frontend/dist/assets/{AlertDialog-5DA_OF9w.js → AlertDialog-Cukb0xv2.js} +2 -2
  7. package/ccw/frontend/dist/assets/{AlertDialog-5DA_OF9w.js.map → AlertDialog-Cukb0xv2.js.map} +1 -1
  8. package/ccw/frontend/dist/assets/{AnalysisPage-MoK5luZM.js → AnalysisPage-Ddmv0J4x.js} +2 -2
  9. package/ccw/frontend/dist/assets/{AnalysisPage-MoK5luZM.js.map → AnalysisPage-Ddmv0J4x.js.map} +1 -1
  10. package/ccw/frontend/dist/assets/{ApiSettingsPage-OreSF7CY.js → ApiSettingsPage-DMkrTZDX.js} +2 -2
  11. package/ccw/frontend/dist/assets/{ApiSettingsPage-OreSF7CY.js.map → ApiSettingsPage-DMkrTZDX.js.map} +1 -1
  12. package/ccw/frontend/dist/assets/{CliModeToggle-B_Vu8NDb.js → CliModeToggle-DXenjpbe.js} +2 -2
  13. package/ccw/frontend/dist/assets/{CliModeToggle-B_Vu8NDb.js.map → CliModeToggle-DXenjpbe.js.map} +1 -1
  14. package/ccw/frontend/dist/assets/{CliSessionSharePage-Bb3DrLGF.js → CliSessionSharePage-B-ZIMqmX.js} +2 -2
  15. package/ccw/frontend/dist/assets/{CliSessionSharePage-Bb3DrLGF.js.map → CliSessionSharePage-B-ZIMqmX.js.map} +1 -1
  16. package/ccw/frontend/dist/assets/{CliViewerPage-BS4zrFVp.js → CliViewerPage-9YxGyLxh.js} +2 -2
  17. package/ccw/frontend/dist/assets/{CliViewerPage-BS4zrFVp.js.map → CliViewerPage-9YxGyLxh.js.map} +1 -1
  18. package/ccw/frontend/dist/assets/{CodexLensPage-BWSIk06e.js → CodexLensPage-B_uv5wdn.js} +2 -2
  19. package/ccw/frontend/dist/assets/{CodexLensPage-BWSIk06e.js.map → CodexLensPage-B_uv5wdn.js.map} +1 -1
  20. package/ccw/frontend/dist/assets/{Collapsible-Cw1zJkjU.js → Collapsible-C2qk3yV0.js} +2 -2
  21. package/ccw/frontend/dist/assets/{Collapsible-Cw1zJkjU.js.map → Collapsible-C2qk3yV0.js.map} +1 -1
  22. package/ccw/frontend/dist/assets/{CommandsManagerPage-a240GHzx.js → CommandsManagerPage-DBtaWxLB.js} +2 -2
  23. package/ccw/frontend/dist/assets/{CommandsManagerPage-a240GHzx.js.map → CommandsManagerPage-DBtaWxLB.js.map} +1 -1
  24. package/ccw/frontend/dist/assets/{DeepWikiPage-CZ4pN-5G.js → DeepWikiPage-d9K4_TgG.js} +2 -2
  25. package/ccw/frontend/dist/assets/{DeepWikiPage-CZ4pN-5G.js.map → DeepWikiPage-d9K4_TgG.js.map} +1 -1
  26. package/ccw/frontend/dist/assets/{EndpointsPage-Ct66AIze.js → EndpointsPage-DhW6hYrI.js} +2 -2
  27. package/ccw/frontend/dist/assets/{EndpointsPage-Ct66AIze.js.map → EndpointsPage-DhW6hYrI.js.map} +1 -1
  28. package/ccw/frontend/dist/assets/{ExplorerPage-DAZkXx2Q.js → ExplorerPage-DYYpCvtB.js} +2 -2
  29. package/ccw/frontend/dist/assets/{ExplorerPage-DAZkXx2Q.js.map → ExplorerPage-DYYpCvtB.js.map} +1 -1
  30. package/ccw/frontend/dist/assets/{FixSessionPage-cDE32BH8.js → FixSessionPage-CSmiT5SE.js} +2 -2
  31. package/ccw/frontend/dist/assets/{FixSessionPage-cDE32BH8.js.map → FixSessionPage-CSmiT5SE.js.map} +1 -1
  32. package/ccw/frontend/dist/assets/{FloatingFileBrowser-tgDOT5P0.js → FloatingFileBrowser-DvMsXLdP.js} +2 -2
  33. package/ccw/frontend/dist/assets/{FloatingFileBrowser-tgDOT5P0.js.map → FloatingFileBrowser-DvMsXLdP.js.map} +1 -1
  34. package/ccw/frontend/dist/assets/{FloatingPanel-Diyvdyo1.js → FloatingPanel-sqezhSI8.js} +2 -2
  35. package/ccw/frontend/dist/assets/{FloatingPanel-Diyvdyo1.js.map → FloatingPanel-sqezhSI8.js.map} +1 -1
  36. package/ccw/frontend/dist/assets/{GraphExplorerPage-CPwRsfd2.js → GraphExplorerPage-DS8ghMFM.js} +2 -2
  37. package/ccw/frontend/dist/assets/{GraphExplorerPage-CPwRsfd2.js.map → GraphExplorerPage-DS8ghMFM.js.map} +1 -1
  38. package/ccw/frontend/dist/assets/{HistoryPage-D2F7j-xY.js → HistoryPage-B-x1RyHu.js} +2 -2
  39. package/ccw/frontend/dist/assets/{HistoryPage-D2F7j-xY.js.map → HistoryPage-B-x1RyHu.js.map} +1 -1
  40. package/ccw/frontend/dist/assets/{HookManagerPage-Cq_CqegO.js → HookManagerPage-BbxpDb68.js} +2 -2
  41. package/ccw/frontend/dist/assets/{HookManagerPage-Cq_CqegO.js.map → HookManagerPage-BbxpDb68.js.map} +1 -1
  42. package/ccw/frontend/dist/assets/{InstallationsPage-DeBLZFZg.js → InstallationsPage-3bShz_Ai.js} +2 -2
  43. package/ccw/frontend/dist/assets/{InstallationsPage-DeBLZFZg.js.map → InstallationsPage-3bShz_Ai.js.map} +1 -1
  44. package/ccw/frontend/dist/assets/{IssueHubPage-DqytkqBW.js → IssueHubPage-BQY_Hh3e.js} +2 -2
  45. package/ccw/frontend/dist/assets/{IssueHubPage-DqytkqBW.js.map → IssueHubPage-BQY_Hh3e.js.map} +1 -1
  46. package/ccw/frontend/dist/assets/{LiteTasksPage-BOknokuo.js → LiteTasksPage-vD_8fQcR.js} +17 -22
  47. package/ccw/frontend/dist/assets/LiteTasksPage-vD_8fQcR.js.map +1 -0
  48. package/ccw/frontend/dist/assets/{McpManagerPage-DPF421ki.js → McpManagerPage-CI5ZzB8A.js} +2 -2
  49. package/ccw/frontend/dist/assets/{McpManagerPage-DPF421ki.js.map → McpManagerPage-CI5ZzB8A.js.map} +1 -1
  50. package/ccw/frontend/dist/assets/{MemoryPage-CK-QH9cl.js → MemoryPage-CNuj2eNg.js} +2 -2
  51. package/ccw/frontend/dist/assets/{MemoryPage-CK-QH9cl.js.map → MemoryPage-CNuj2eNg.js.map} +1 -1
  52. package/ccw/frontend/dist/assets/{NotFoundPage-Bk_u5rzz.js → NotFoundPage-BrnAXkb1.js} +2 -2
  53. package/ccw/frontend/dist/assets/{NotFoundPage-Bk_u5rzz.js.map → NotFoundPage-BrnAXkb1.js.map} +1 -1
  54. package/ccw/frontend/dist/assets/{OrchestratorPage-B9ND5ptW.js → OrchestratorPage-CH81PGt4.js} +2 -2
  55. package/ccw/frontend/dist/assets/{OrchestratorPage-B9ND5ptW.js.map → OrchestratorPage-CH81PGt4.js.map} +1 -1
  56. package/ccw/frontend/dist/assets/{ProjectOverviewPage-0DUpa-rl.js → ProjectOverviewPage-dwiEXl2O.js} +2 -2
  57. package/ccw/frontend/dist/assets/{ProjectOverviewPage-0DUpa-rl.js.map → ProjectOverviewPage-dwiEXl2O.js.map} +1 -1
  58. package/ccw/frontend/dist/assets/{PromptHistoryPage-B--0N_wr.js → PromptHistoryPage-CabgLjJU.js} +2 -2
  59. package/ccw/frontend/dist/assets/{PromptHistoryPage-B--0N_wr.js.map → PromptHistoryPage-CabgLjJU.js.map} +1 -1
  60. package/ccw/frontend/dist/assets/{ReviewSessionPage-DJtY0kQl.js → ReviewSessionPage-DAMrNFn8.js} +2 -2
  61. package/ccw/frontend/dist/assets/{ReviewSessionPage-DJtY0kQl.js.map → ReviewSessionPage-DAMrNFn8.js.map} +1 -1
  62. package/ccw/frontend/dist/assets/{RulesManagerPage-yW19Un_V.js → RulesManagerPage-4jzmxPn0.js} +2 -2
  63. package/ccw/frontend/dist/assets/{RulesManagerPage-yW19Un_V.js.map → RulesManagerPage-4jzmxPn0.js.map} +1 -1
  64. package/ccw/frontend/dist/assets/{SessionDetailPage-tr8g0Hc1.js → SessionDetailPage-C5Btktmp.js} +2 -2
  65. package/ccw/frontend/dist/assets/{SessionDetailPage-tr8g0Hc1.js.map → SessionDetailPage-C5Btktmp.js.map} +1 -1
  66. package/ccw/frontend/dist/assets/{SessionsPage-CxDytLfb.js → SessionsPage-CQIB4E8m.js} +2 -2
  67. package/ccw/frontend/dist/assets/{SessionsPage-CxDytLfb.js.map → SessionsPage-CQIB4E8m.js.map} +1 -1
  68. package/ccw/frontend/dist/assets/SettingsPage-Yi9UAfm7.js +150 -0
  69. package/ccw/frontend/dist/assets/SettingsPage-Yi9UAfm7.js.map +1 -0
  70. package/ccw/frontend/dist/assets/{SkillsManagerPage-C0MOJy-C.js → SkillsManagerPage-BqfvYSkT.js} +2 -2
  71. package/ccw/frontend/dist/assets/{SkillsManagerPage-C0MOJy-C.js.map → SkillsManagerPage-BqfvYSkT.js.map} +1 -1
  72. package/ccw/frontend/dist/assets/{SpecsSettingsPage-D9Y6-U-n.js → SpecsSettingsPage-BdVPM5R6.js} +4 -4
  73. package/ccw/frontend/dist/assets/{SpecsSettingsPage-D9Y6-U-n.js.map → SpecsSettingsPage-BdVPM5R6.js.map} +1 -1
  74. package/ccw/frontend/dist/assets/{Switch-BEfkMCxZ.js → Switch-BG929kV0.js} +2 -2
  75. package/ccw/frontend/dist/assets/{Switch-BEfkMCxZ.js.map → Switch-BG929kV0.js.map} +1 -1
  76. package/ccw/frontend/dist/assets/{TabsNavigation-Dit0DM3m.js → TabsNavigation-Bol1y09b.js} +2 -2
  77. package/ccw/frontend/dist/assets/{TabsNavigation-Dit0DM3m.js.map → TabsNavigation-Bol1y09b.js.map} +1 -1
  78. package/ccw/frontend/dist/assets/{TaskDrawer-XN-D_bDk.js → TaskDrawer-Dwutrn8_.js} +2 -2
  79. package/ccw/frontend/dist/assets/{TaskDrawer-XN-D_bDk.js.map → TaskDrawer-Dwutrn8_.js.map} +1 -1
  80. package/ccw/frontend/dist/assets/{TeamPage-BOwkjrDi.js → TeamPage-CpCSwpxD.js} +2 -2
  81. package/ccw/frontend/dist/assets/{TeamPage-BOwkjrDi.js.map → TeamPage-CpCSwpxD.js.map} +1 -1
  82. package/ccw/frontend/dist/assets/{TerminalDashboardPage-X8RymrSN.js → TerminalDashboardPage-DODKjOeK.js} +2 -2
  83. package/ccw/frontend/dist/assets/{TerminalDashboardPage-X8RymrSN.js.map → TerminalDashboardPage-DODKjOeK.js.map} +1 -1
  84. package/ccw/frontend/dist/assets/{archive-BMXBzq8R.js → archive-CQw634kD.js} +2 -2
  85. package/ccw/frontend/dist/assets/{archive-BMXBzq8R.js.map → archive-CQw634kD.js.map} +1 -1
  86. package/ccw/frontend/dist/assets/{archive-restore-DHvAhQBT.js → archive-restore-B-_EG6wE.js} +2 -2
  87. package/ccw/frontend/dist/assets/{archive-restore-DHvAhQBT.js.map → archive-restore-B-_EG6wE.js.map} +1 -1
  88. package/ccw/frontend/dist/assets/{arrow-right-CBObFEN0.js → arrow-right-CcQtxBrU.js} +2 -2
  89. package/ccw/frontend/dist/assets/{arrow-right-CBObFEN0.js.map → arrow-right-CcQtxBrU.js.map} +1 -1
  90. package/ccw/frontend/dist/assets/{bookmark-plus-D-2SQ5pV.js → bookmark-plus-Cl-BbcpR.js} +2 -2
  91. package/ccw/frontend/dist/assets/{bookmark-plus-D-2SQ5pV.js.map → bookmark-plus-Cl-BbcpR.js.map} +1 -1
  92. package/ccw/frontend/dist/assets/{bot-DS7saQkk.js → bot-CLSNSkW_.js} +2 -2
  93. package/ccw/frontend/dist/assets/{bot-DS7saQkk.js.map → bot-CLSNSkW_.js.map} +1 -1
  94. package/ccw/frontend/dist/assets/{braces-D0pAnktp.js → braces-DWwkaDS6.js} +2 -2
  95. package/ccw/frontend/dist/assets/{braces-D0pAnktp.js.map → braces-DWwkaDS6.js.map} +1 -1
  96. package/ccw/frontend/dist/assets/{circle-stop-FWSboNE6.js → circle-stop-DiS7e6ma.js} +2 -2
  97. package/ccw/frontend/dist/assets/{circle-stop-FWSboNE6.js.map → circle-stop-DiS7e6ma.js.map} +1 -1
  98. package/ccw/frontend/dist/assets/{cpu-BNM2uIpY.js → cpu-CuvHUVXO.js} +2 -2
  99. package/ccw/frontend/dist/assets/{cpu-BNM2uIpY.js.map → cpu-CuvHUVXO.js.map} +1 -1
  100. package/ccw/frontend/dist/assets/{ellipsis-vertical-GwdnnWQj.js → ellipsis-vertical-BoVlINSw.js} +2 -2
  101. package/ccw/frontend/dist/assets/{ellipsis-vertical-GwdnnWQj.js.map → ellipsis-vertical-BoVlINSw.js.map} +1 -1
  102. package/ccw/frontend/dist/assets/{eye-kV2pWXQ5.js → eye-BEMOdcAN.js} +2 -2
  103. package/ccw/frontend/dist/assets/{eye-kV2pWXQ5.js.map → eye-BEMOdcAN.js.map} +1 -1
  104. package/ccw/frontend/dist/assets/{eye-off-6o-KYsBM.js → eye-off-C5HS4Ytm.js} +2 -2
  105. package/ccw/frontend/dist/assets/{eye-off-6o-KYsBM.js.map → eye-off-C5HS4Ytm.js.map} +1 -1
  106. package/ccw/frontend/dist/assets/{file-json-Q4_Blhd8.js → file-json-DQ9XLq0B.js} +2 -2
  107. package/ccw/frontend/dist/assets/{file-json-Q4_Blhd8.js.map → file-json-DQ9XLq0B.js.map} +1 -1
  108. package/ccw/frontend/dist/assets/{file-text-DSroEAMu.js → file-text-TGs_qCbw.js} +2 -2
  109. package/ccw/frontend/dist/assets/{file-text-DSroEAMu.js.map → file-text-TGs_qCbw.js.map} +1 -1
  110. package/ccw/frontend/dist/assets/{filter-A5I9Xz7E.js → filter-CIuCqnDB.js} +2 -2
  111. package/ccw/frontend/dist/assets/{filter-A5I9Xz7E.js.map → filter-CIuCqnDB.js.map} +1 -1
  112. package/ccw/frontend/dist/assets/{folder-DNNgXVVH.js → folder-BkivHBwn.js} +2 -2
  113. package/ccw/frontend/dist/assets/{folder-DNNgXVVH.js.map → folder-BkivHBwn.js.map} +1 -1
  114. package/ccw/frontend/dist/assets/{gauge-PfGM68A8.js → gauge-CtM68fVY.js} +2 -2
  115. package/ccw/frontend/dist/assets/{gauge-PfGM68A8.js.map → gauge-CtM68fVY.js.map} +1 -1
  116. package/ccw/frontend/dist/assets/{globe-C3X8YQrU.js → globe-DpnrINqP.js} +2 -2
  117. package/ccw/frontend/dist/assets/{globe-C3X8YQrU.js.map → globe-DpnrINqP.js.map} +1 -1
  118. package/ccw/frontend/dist/assets/{grid-3x3-DpyJO-oF.js → grid-3x3-SjX0a5JH.js} +2 -2
  119. package/ccw/frontend/dist/assets/{grid-3x3-DpyJO-oF.js.map → grid-3x3-SjX0a5JH.js.map} +1 -1
  120. package/ccw/frontend/dist/assets/{hard-drive-C2PQHoNg.js → hard-drive-ByAmnoEg.js} +2 -2
  121. package/ccw/frontend/dist/assets/{hard-drive-C2PQHoNg.js.map → hard-drive-ByAmnoEg.js.map} +1 -1
  122. package/ccw/frontend/dist/assets/{hash-DX8VaW1j.js → hash-DbLc3VOZ.js} +2 -2
  123. package/ccw/frontend/dist/assets/{hash-DX8VaW1j.js.map → hash-DbLc3VOZ.js.map} +1 -1
  124. package/ccw/frontend/dist/assets/{history-BXaQEkhy.js → history-Botz5Z5d.js} +2 -2
  125. package/ccw/frontend/dist/assets/{history-BXaQEkhy.js.map → history-Botz5Z5d.js.map} +1 -1
  126. package/ccw/frontend/dist/assets/{index-BiN-BRcE.js → index-BGvyf4-9.js} +2 -2
  127. package/ccw/frontend/dist/assets/{index-BiN-BRcE.js.map → index-BGvyf4-9.js.map} +1 -1
  128. package/ccw/frontend/dist/assets/index-BoqylFO4.css +39 -0
  129. package/ccw/frontend/dist/assets/{index-B8K8MdMl.js → index-DP_mTJI8.js} +3 -3
  130. package/ccw/frontend/dist/assets/{index-B8K8MdMl.js.map → index-DP_mTJI8.js.map} +1 -1
  131. package/ccw/frontend/dist/assets/{index-Dpe_7YH0.js → index-MkgdhX7a.js} +2 -2
  132. package/ccw/frontend/dist/assets/{index-Dpe_7YH0.js.map → index-MkgdhX7a.js.map} +1 -1
  133. package/ccw/frontend/dist/assets/{index-4zmlzlPo.js → index-ni-tG9rm.js} +2 -2
  134. package/ccw/frontend/dist/assets/{index-4zmlzlPo.js.map → index-ni-tG9rm.js.map} +1 -1
  135. package/ccw/frontend/dist/assets/{layout-grid-CUqTukRt.js → layout-grid-11E4bGJz.js} +2 -2
  136. package/ccw/frontend/dist/assets/{layout-grid-CUqTukRt.js.map → layout-grid-11E4bGJz.js.map} +1 -1
  137. package/ccw/frontend/dist/assets/{lightbulb-h90ex0mh.js → lightbulb-8KrKY82b.js} +2 -2
  138. package/ccw/frontend/dist/assets/{lightbulb-h90ex0mh.js.map → lightbulb-8KrKY82b.js.map} +1 -1
  139. package/ccw/frontend/dist/assets/{link-2-1-DjXqTg.js → link-2-BUn6RILb.js} +2 -2
  140. package/ccw/frontend/dist/assets/{link-2-1-DjXqTg.js.map → link-2-BUn6RILb.js.map} +1 -1
  141. package/ccw/frontend/dist/assets/{link-DbyJpuls.js → link-CmP254Ai.js} +2 -2
  142. package/ccw/frontend/dist/assets/{link-DbyJpuls.js.map → link-CmP254Ai.js.map} +1 -1
  143. package/ccw/frontend/dist/assets/{list-CU0leArg.js → list-BAwzl4a2.js} +2 -2
  144. package/ccw/frontend/dist/assets/{list-CU0leArg.js.map → list-BAwzl4a2.js.map} +1 -1
  145. package/ccw/frontend/dist/assets/{map-pin-DheJ6EJB.js → map-pin-gi342rqk.js} +2 -2
  146. package/ccw/frontend/dist/assets/{map-pin-DheJ6EJB.js.map → map-pin-gi342rqk.js.map} +1 -1
  147. package/ccw/frontend/dist/assets/{messages-square-Bmo5DCr1.js → messages-square-C1Lh8q8b.js} +2 -2
  148. package/ccw/frontend/dist/assets/{messages-square-Bmo5DCr1.js.map → messages-square-C1Lh8q8b.js.map} +1 -1
  149. package/ccw/frontend/dist/assets/{minimize-2-h1gktUQ6.js → minimize-2-OgWNLKdq.js} +2 -2
  150. package/ccw/frontend/dist/assets/{minimize-2-h1gktUQ6.js.map → minimize-2-OgWNLKdq.js.map} +1 -1
  151. package/ccw/frontend/dist/assets/{package-CmuCX6Z_.js → package-Djsvs5qp.js} +2 -2
  152. package/ccw/frontend/dist/assets/{package-CmuCX6Z_.js.map → package-Djsvs5qp.js.map} +1 -1
  153. package/ccw/frontend/dist/assets/{plug-Jz5HaKIu.js → plug-DvSZP2cp.js} +2 -2
  154. package/ccw/frontend/dist/assets/{plug-Jz5HaKIu.js.map → plug-DvSZP2cp.js.map} +1 -1
  155. package/ccw/frontend/dist/assets/{power-CpN5I4BU.js → power-BY7vTLmU.js} +2 -2
  156. package/ccw/frontend/dist/assets/{power-CpN5I4BU.js.map → power-BY7vTLmU.js.map} +1 -1
  157. package/ccw/frontend/dist/assets/{save-B3iyK-h8.js → save-DXfqv84T.js} +2 -2
  158. package/ccw/frontend/dist/assets/{save-B3iyK-h8.js.map → save-DXfqv84T.js.map} +1 -1
  159. package/ccw/frontend/dist/assets/{send-CYO-YU9A.js → send-E2o2LZSX.js} +2 -2
  160. package/ccw/frontend/dist/assets/{send-CYO-YU9A.js.map → send-E2o2LZSX.js.map} +1 -1
  161. package/ccw/frontend/dist/assets/settings-2-ChD1LFHH.js +7 -0
  162. package/ccw/frontend/dist/assets/settings-2-ChD1LFHH.js.map +1 -0
  163. package/ccw/frontend/dist/assets/{square-check-big-1h37S4wz.js → square-check-big-CBymuqmD.js} +2 -2
  164. package/ccw/frontend/dist/assets/{square-check-big-1h37S4wz.js.map → square-check-big-CBymuqmD.js.map} +1 -1
  165. package/ccw/frontend/dist/assets/{square-pen-BS0-oO7y.js → square-pen-BfaiJgOX.js} +2 -2
  166. package/ccw/frontend/dist/assets/{square-pen-BS0-oO7y.js.map → square-pen-BfaiJgOX.js.map} +1 -1
  167. package/ccw/frontend/dist/assets/{star-Dal-o3Lo.js → star-DHMWqZ09.js} +2 -2
  168. package/ccw/frontend/dist/assets/{star-Dal-o3Lo.js.map → star-DHMWqZ09.js.map} +1 -1
  169. package/ccw/frontend/dist/assets/{style-wEWj0pe8.js → style-wvcOEAiM.js} +2 -2
  170. package/ccw/frontend/dist/assets/{style-wEWj0pe8.js.map → style-wvcOEAiM.js.map} +1 -1
  171. package/ccw/frontend/dist/assets/{target-BB9AJiC7.js → target-B8AMmf_N.js} +2 -2
  172. package/ccw/frontend/dist/assets/{target-BB9AJiC7.js.map → target-B8AMmf_N.js.map} +1 -1
  173. package/ccw/frontend/dist/assets/{test-tube-DDnQZrAm.js → test-tube-BpDeTJi1.js} +2 -2
  174. package/ccw/frontend/dist/assets/{test-tube-DDnQZrAm.js.map → test-tube-BpDeTJi1.js.map} +1 -1
  175. package/ccw/frontend/dist/assets/{upload-DshzYJC_.js → upload-pflkdIDG.js} +2 -2
  176. package/ccw/frontend/dist/assets/{upload-DshzYJC_.js.map → upload-pflkdIDG.js.map} +1 -1
  177. package/ccw/frontend/dist/assets/{useApiSettings-DkV-yWup.js → useApiSettings-BPx4DyKT.js} +2 -2
  178. package/ccw/frontend/dist/assets/{useApiSettings-DkV-yWup.js.map → useApiSettings-BPx4DyKT.js.map} +1 -1
  179. package/ccw/frontend/dist/assets/{useCli-CnwgIkqD.js → useCli-D1jfH3XA.js} +2 -2
  180. package/ccw/frontend/dist/assets/{useCli-CnwgIkqD.js.map → useCli-D1jfH3XA.js.map} +1 -1
  181. package/ccw/frontend/dist/assets/{useCommands-S0sc5bfK.js → useCommands-DhR71vpa.js} +2 -2
  182. package/ccw/frontend/dist/assets/{useCommands-S0sc5bfK.js.map → useCommands-DhR71vpa.js.map} +1 -1
  183. package/ccw/frontend/dist/assets/{useDebounce-HxG5rpQo.js → useDebounce-a6Yyer3m.js} +2 -2
  184. package/ccw/frontend/dist/assets/{useDebounce-HxG5rpQo.js.map → useDebounce-a6Yyer3m.js.map} +1 -1
  185. package/ccw/frontend/dist/assets/{useFileExplorer-CTg0zndf.js → useFileExplorer-B8W2JTj2.js} +2 -2
  186. package/ccw/frontend/dist/assets/{useFileExplorer-CTg0zndf.js.map → useFileExplorer-B8W2JTj2.js.map} +1 -1
  187. package/ccw/frontend/dist/assets/{useLocale-C2BlVToA.js → useLocale-aMHdQIL_.js} +2 -2
  188. package/ccw/frontend/dist/assets/{useLocale-C2BlVToA.js.map → useLocale-aMHdQIL_.js.map} +1 -1
  189. package/ccw/frontend/dist/assets/{useSkills-8IWJgwQU.js → useSkills-BHpc2LtN.js} +3 -3
  190. package/ccw/frontend/dist/assets/{useSkills-8IWJgwQU.js.map → useSkills-BHpc2LtN.js.map} +1 -1
  191. package/ccw/frontend/dist/assets/{useSystemSettings-BAtCCf8T.js → useSystemSettings-BFD0SvEF.js} +2 -2
  192. package/ccw/frontend/dist/assets/{useSystemSettings-BAtCCf8T.js.map → useSystemSettings-BFD0SvEF.js.map} +1 -1
  193. package/ccw/frontend/dist/assets/{wand-sparkles-CI1Tfudg.js → wand-sparkles-dYtI2IKM.js} +2 -2
  194. package/ccw/frontend/dist/assets/{wand-sparkles-CI1Tfudg.js.map → wand-sparkles-dYtI2IKM.js.map} +1 -1
  195. package/ccw/frontend/dist/index.html +2 -2
  196. package/package.json +1 -1
  197. package/ccw/frontend/dist/assets/LiteTasksPage-BOknokuo.js.map +0 -1
  198. package/ccw/frontend/dist/assets/SettingsPage-DJltvfrs.js +0 -144
  199. package/ccw/frontend/dist/assets/SettingsPage-DJltvfrs.js.map +0 -1
  200. package/ccw/frontend/dist/assets/index-D6YeIKg_.css +0 -39
@@ -1 +1 @@
1
- {"version":3,"file":"FixSessionPage-cDE32BH8.js","sources":["../../src/pages/FixSessionPage.tsx"],"sourcesContent":["// ========================================\r\n// FixSessionPage Component\r\n// ========================================\r\n// Fix session detail page for displaying fix session tasks\r\n\r\nimport * as React from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n ArrowLeft,\r\n Wrench,\r\n CheckCircle,\r\n XCircle,\r\n Clock,\r\n File,\r\n Loader2,\r\n} from 'lucide-react';\r\nimport { useSessions } from '@/hooks/useSessions';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\n\r\ntype TaskStatusFilter = 'all' | 'pending' | 'in_progress' | 'fixed' | 'failed';\r\n\r\ninterface FixTask {\r\n task_id: string;\r\n id?: string;\r\n title?: string;\r\n status: 'pending' | 'in_progress' | 'completed';\r\n result?: 'fixed' | 'failed';\r\n file?: string;\r\n line?: number;\r\n finding_title?: string;\r\n dimension?: string;\r\n attempts?: number;\r\n commit_hash?: string;\r\n}\r\n\r\n/**\r\n * FixSessionPage component - Display fix session tasks and progress\r\n */\r\nexport function FixSessionPage() {\r\n const { sessionId } = useParams<{ sessionId: string }>();\r\n const navigate = useNavigate();\r\n const { formatMessage } = useIntl();\r\n const { filteredSessions, isLoading, error, refetch } = useSessions({\r\n filter: { location: 'all' },\r\n });\r\n\r\n const [statusFilter, setStatusFilter] = React.useState<TaskStatusFilter>('all');\r\n\r\n // Find session\r\n const session = React.useMemo(\r\n () => filteredSessions.find((s) => s.session_id === sessionId),\r\n [filteredSessions, sessionId]\r\n );\r\n\r\n const tasks = React.useMemo(() => {\r\n if (!session?.tasks) return [];\r\n return session.tasks as FixTask[];\r\n }, [session?.tasks]);\r\n\r\n // Calculate statistics\r\n const stats = React.useMemo(() => {\r\n const total = tasks.length;\r\n const fixed = tasks.filter((t) => t.status === 'completed' && t.result === 'fixed').length;\r\n const failed = tasks.filter((t) => t.status === 'completed' && t.result === 'failed').length;\r\n const pending = tasks.filter((t) => t.status === 'pending').length;\r\n const inProgress = tasks.filter((t) => t.status === 'in_progress').length;\r\n const completed = fixed + failed;\r\n const percentComplete = total > 0 ? Math.round((completed / total) * 100) : 0;\r\n\r\n return { total, fixed, failed, pending, inProgress, completed, percentComplete };\r\n }, [tasks]);\r\n\r\n // Filter tasks\r\n const filteredTasks = React.useMemo(() => {\r\n if (statusFilter === 'all') return tasks;\r\n if (statusFilter === 'fixed') {\r\n return tasks.filter((t) => t.status === 'completed' && t.result === 'fixed');\r\n }\r\n if (statusFilter === 'failed') {\r\n return tasks.filter((t) => t.status === 'completed' && t.result === 'failed');\r\n }\r\n return tasks.filter((t) => t.status === statusFilter);\r\n }, [tasks, statusFilter]);\r\n\r\n // Get status badge props\r\n const getStatusBadge = (task: FixTask) => {\r\n if (task.status === 'completed') {\r\n if (task.result === 'fixed') {\r\n return { variant: 'success' as const, label: formatMessage({ id: 'fixSession.status.fixed' }), icon: CheckCircle };\r\n }\r\n if (task.result === 'failed') {\r\n return { variant: 'destructive' as const, label: formatMessage({ id: 'fixSession.status.failed' }), icon: XCircle };\r\n }\r\n }\r\n if (task.status === 'in_progress') {\r\n return { variant: 'warning' as const, label: formatMessage({ id: 'fixSession.status.inProgress' }), icon: Loader2 };\r\n }\r\n return { variant: 'secondary' as const, label: formatMessage({ id: 'fixSession.status.pending' }), icon: Clock };\r\n };\r\n\r\n const handleBack = () => {\r\n navigate('/sessions');\r\n };\r\n\r\n const handleFilterChange = (filter: TaskStatusFilter) => {\r\n setStatusFilter(filter);\r\n };\r\n\r\n // Loading state\r\n if (isLoading) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center gap-4\">\r\n <Button variant=\"ghost\" size=\"sm\" disabled>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n <div className=\"h-8 w-48 rounded bg-muted animate-pulse\" />\r\n </div>\r\n <div className=\"grid grid-cols-4 gap-4\">\r\n {Array.from({ length: 4 }).map((_, i) => (\r\n <div key={i} className=\"h-24 rounded-lg bg-muted animate-pulse\" />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <XCircle className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{error.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n {formatMessage({ id: 'common.actions.retry' })}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n // Session not found\r\n if (!session) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n <Wrench className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'fixSession.notFound.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {formatMessage({ id: 'fixSession.notFound.message' })}\r\n </p>\r\n <Button onClick={handleBack}>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <Button variant=\"ghost\" size=\"sm\" onClick={handleBack}>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-2xl font-semibold text-foreground\">{session.session_id}</h1>\r\n {session.title && (\r\n <p className=\"text-sm text-muted-foreground mt-0.5\">{session.title}</p>\r\n )}\r\n </div>\r\n <Badge variant=\"warning\">\r\n <Wrench className=\"h-3 w-3 mr-1\" />\r\n Fix\r\n </Badge>\r\n </div>\r\n\r\n {/* Progress Section */}\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold flex items-center gap-2\">\r\n <Wrench className=\"h-5 w-5\" />\r\n {formatMessage({ id: 'fixSession.progress.title' })}\r\n </h3>\r\n <Badge variant=\"secondary\">{session.phase || formatMessage({ id: 'fixSession.phase.execution' })}</Badge>\r\n </div>\r\n\r\n {/* Progress Bar */}\r\n <div className=\"mb-2\">\r\n <div className=\"h-2 w-full rounded-full bg-muted overflow-hidden\">\r\n <div\r\n className=\"h-full bg-primary transition-all duration-300\"\r\n style={{ width: `${stats.percentComplete}%` }}\r\n />\r\n </div>\r\n </div>\r\n <div className=\"text-sm text-muted-foreground mb-6\">\r\n <strong>{stats.completed}</strong>/{stats.total} {formatMessage({ id: 'common.tasks' })} (\r\n {stats.percentComplete}%)\r\n </div>\r\n\r\n {/* Summary Cards */}\r\n <div className=\"grid grid-cols-4 gap-4\">\r\n <div className=\"text-center p-4 bg-background rounded-lg border\">\r\n <div className=\"text-2xl font-semibold text-foreground\">{stats.total}</div>\r\n <div className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'fixSession.stats.total' })}</div>\r\n </div>\r\n <div className=\"text-center p-4 bg-background rounded-lg border border-success/30 bg-success/5\">\r\n <div className=\"text-2xl font-semibold text-success\">{stats.fixed}</div>\r\n <div className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'fixSession.stats.fixed' })}</div>\r\n </div>\r\n <div className=\"text-center p-4 bg-background rounded-lg border border-destructive/30 bg-destructive/5\">\r\n <div className=\"text-2xl font-semibold text-destructive\">{stats.failed}</div>\r\n <div className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'fixSession.stats.failed' })}</div>\r\n </div>\r\n <div className=\"text-center p-4 bg-background rounded-lg border\">\r\n <div className=\"text-2xl font-semibold text-foreground\">{stats.pending}</div>\r\n <div className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'fixSession.stats.pending' })}</div>\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Tasks Section */}\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold flex items-center gap-2\">\r\n <File className=\"h-5 w-5\" />\r\n {formatMessage({ id: 'fixSession.tasks.title' })}\r\n </h3>\r\n <div className=\"flex gap-1\">\r\n {[\r\n { key: 'all' as const, label: formatMessage({ id: 'fixSession.filter.all' }) },\r\n { key: 'pending' as const, label: formatMessage({ id: 'fixSession.filter.pending' }) },\r\n { key: 'in_progress' as const, label: formatMessage({ id: 'fixSession.filter.inProgress' }) },\r\n { key: 'fixed' as const, label: formatMessage({ id: 'fixSession.filter.fixed' }) },\r\n { key: 'failed' as const, label: formatMessage({ id: 'fixSession.filter.failed' }) },\r\n ].map((filter) => (\r\n <Button\r\n key={filter.key}\r\n variant={statusFilter === filter.key ? 'default' : 'outline'}\r\n size=\"sm\"\r\n onClick={() => handleFilterChange(filter.key)}\r\n >\r\n {filter.label}\r\n </Button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Tasks List */}\r\n {filteredTasks.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <File className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'fixSession.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'fixSession.empty.message' })}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-3\">\r\n {filteredTasks.map((task) => {\r\n const statusBadge = getStatusBadge(task);\r\n const StatusIcon = statusBadge.icon;\r\n\r\n return (\r\n <Card\r\n key={task.task_id || task.id}\r\n className={`hover:shadow-sm transition-shadow ${\r\n task.status === 'completed' && task.result === 'failed'\r\n ? 'border-destructive/30 bg-destructive/5'\r\n : ''\r\n }`}\r\n >\r\n <CardContent className=\"p-4\">\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-mono font-semibold bg-primary/10 text-primary border border-primary/20\">\r\n {task.task_id || task.id || 'N/A'}\r\n </span>\r\n <Badge variant={statusBadge.variant} className=\"gap-1\">\r\n <StatusIcon className=\"h-3 w-3\" />\r\n {statusBadge.label}\r\n </Badge>\r\n </div>\r\n <h4 className=\"font-medium text-foreground text-sm\">\r\n {task.title || formatMessage({ id: 'fixSession.task.untitled' })}\r\n </h4>\r\n {task.finding_title && (\r\n <p className=\"text-sm text-muted-foreground mt-1\">{task.finding_title}</p>\r\n )}\r\n {task.file && (\r\n <div className=\"flex items-center gap-1 mt-2 text-xs text-muted-foreground\">\r\n <File className=\"h-3 w-3\" />\r\n {task.file}\r\n {task.line && `:${task.line}`}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"flex flex-wrap items-center gap-1 text-xs\">\r\n {task.dimension && (\r\n <span className=\"px-2 py-0.5 bg-muted rounded text-muted-foreground\">\r\n {task.dimension}\r\n </span>\r\n )}\r\n {task.attempts && task.attempts > 1 && (\r\n <span className=\"px-2 py-0.5 bg-muted rounded text-muted-foreground\">\r\n {formatMessage({ id: 'fixSession.task.attempts' }, { count: task.attempts })}\r\n </span>\r\n )}\r\n {task.commit_hash && (\r\n <span className=\"px-2 py-0.5 bg-primary-light text-primary rounded font-mono\">\r\n {task.commit_hash.substring(0, 7)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Session Info */}\r\n <div className=\"flex flex-wrap gap-4 text-sm text-muted-foreground p-4 bg-background rounded-lg border\">\r\n <div>\r\n <span className=\"font-medium\">{formatMessage({ id: 'fixSession.info.created' })}:</span>{' '}\r\n {new Date(session.created_at).toLocaleString()}\r\n </div>\r\n {session.updated_at && (\r\n <div>\r\n <span className=\"font-medium\">{formatMessage({ id: 'fixSession.info.updated' })}:</span>{' '}\r\n {new Date(session.updated_at).toLocaleString()}\r\n </div>\r\n )}\r\n {session.description && (\r\n <div className=\"w-full\">\r\n <span className=\"font-medium\">{formatMessage({ id: 'fixSession.info.description' })}:</span>{' '}\r\n {session.description}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default FixSessionPage;\r\n"],"names":["FixSessionPage","sessionId","useParams","navigate","useNavigate","formatMessage","useIntl","filteredSessions","isLoading","error","refetch","useSessions","statusFilter","setStatusFilter","React.useState","session","React.useMemo","tasks","stats","total","fixed","t","failed","pending","inProgress","completed","percentComplete","filteredTasks","getStatusBadge","task","CheckCircle","XCircle","Loader2","Clock","handleBack","handleFilterChange","filter","jsxs","Button","jsx","ArrowLeft","_","i","Badge","Wrench","Card","CardContent","File","statusBadge","StatusIcon"],"mappings":"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"}
1
+ {"version":3,"file":"FixSessionPage-CSmiT5SE.js","sources":["../../src/pages/FixSessionPage.tsx"],"sourcesContent":["// ========================================\r\n// FixSessionPage Component\r\n// ========================================\r\n// Fix session detail page for displaying fix session tasks\r\n\r\nimport * as React from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n ArrowLeft,\r\n Wrench,\r\n CheckCircle,\r\n XCircle,\r\n Clock,\r\n File,\r\n Loader2,\r\n} from 'lucide-react';\r\nimport { useSessions } from '@/hooks/useSessions';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\n\r\ntype TaskStatusFilter = 'all' | 'pending' | 'in_progress' | 'fixed' | 'failed';\r\n\r\ninterface FixTask {\r\n task_id: string;\r\n id?: string;\r\n title?: string;\r\n status: 'pending' | 'in_progress' | 'completed';\r\n result?: 'fixed' | 'failed';\r\n file?: string;\r\n line?: number;\r\n finding_title?: string;\r\n dimension?: string;\r\n attempts?: number;\r\n commit_hash?: string;\r\n}\r\n\r\n/**\r\n * FixSessionPage component - Display fix session tasks and progress\r\n */\r\nexport function FixSessionPage() {\r\n const { sessionId } = useParams<{ sessionId: string }>();\r\n const navigate = useNavigate();\r\n const { formatMessage } = useIntl();\r\n const { filteredSessions, isLoading, error, refetch } = useSessions({\r\n filter: { location: 'all' },\r\n });\r\n\r\n const [statusFilter, setStatusFilter] = React.useState<TaskStatusFilter>('all');\r\n\r\n // Find session\r\n const session = React.useMemo(\r\n () => filteredSessions.find((s) => s.session_id === sessionId),\r\n [filteredSessions, sessionId]\r\n );\r\n\r\n const tasks = React.useMemo(() => {\r\n if (!session?.tasks) return [];\r\n return session.tasks as FixTask[];\r\n }, [session?.tasks]);\r\n\r\n // Calculate statistics\r\n const stats = React.useMemo(() => {\r\n const total = tasks.length;\r\n const fixed = tasks.filter((t) => t.status === 'completed' && t.result === 'fixed').length;\r\n const failed = tasks.filter((t) => t.status === 'completed' && t.result === 'failed').length;\r\n const pending = tasks.filter((t) => t.status === 'pending').length;\r\n const inProgress = tasks.filter((t) => t.status === 'in_progress').length;\r\n const completed = fixed + failed;\r\n const percentComplete = total > 0 ? Math.round((completed / total) * 100) : 0;\r\n\r\n return { total, fixed, failed, pending, inProgress, completed, percentComplete };\r\n }, [tasks]);\r\n\r\n // Filter tasks\r\n const filteredTasks = React.useMemo(() => {\r\n if (statusFilter === 'all') return tasks;\r\n if (statusFilter === 'fixed') {\r\n return tasks.filter((t) => t.status === 'completed' && t.result === 'fixed');\r\n }\r\n if (statusFilter === 'failed') {\r\n return tasks.filter((t) => t.status === 'completed' && t.result === 'failed');\r\n }\r\n return tasks.filter((t) => t.status === statusFilter);\r\n }, [tasks, statusFilter]);\r\n\r\n // Get status badge props\r\n const getStatusBadge = (task: FixTask) => {\r\n if (task.status === 'completed') {\r\n if (task.result === 'fixed') {\r\n return { variant: 'success' as const, label: formatMessage({ id: 'fixSession.status.fixed' }), icon: CheckCircle };\r\n }\r\n if (task.result === 'failed') {\r\n return { variant: 'destructive' as const, label: formatMessage({ id: 'fixSession.status.failed' }), icon: XCircle };\r\n }\r\n }\r\n if (task.status === 'in_progress') {\r\n return { variant: 'warning' as const, label: formatMessage({ id: 'fixSession.status.inProgress' }), icon: Loader2 };\r\n }\r\n return { variant: 'secondary' as const, label: formatMessage({ id: 'fixSession.status.pending' }), icon: Clock };\r\n };\r\n\r\n const handleBack = () => {\r\n navigate('/sessions');\r\n };\r\n\r\n const handleFilterChange = (filter: TaskStatusFilter) => {\r\n setStatusFilter(filter);\r\n };\r\n\r\n // Loading state\r\n if (isLoading) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center gap-4\">\r\n <Button variant=\"ghost\" size=\"sm\" disabled>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n <div className=\"h-8 w-48 rounded bg-muted animate-pulse\" />\r\n </div>\r\n <div className=\"grid grid-cols-4 gap-4\">\r\n {Array.from({ length: 4 }).map((_, i) => (\r\n <div key={i} className=\"h-24 rounded-lg bg-muted animate-pulse\" />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <XCircle className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{error.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n {formatMessage({ id: 'common.actions.retry' })}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n // Session not found\r\n if (!session) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n <Wrench className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'fixSession.notFound.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {formatMessage({ id: 'fixSession.notFound.message' })}\r\n </p>\r\n <Button onClick={handleBack}>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <Button variant=\"ghost\" size=\"sm\" onClick={handleBack}>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-2xl font-semibold text-foreground\">{session.session_id}</h1>\r\n {session.title && (\r\n <p className=\"text-sm text-muted-foreground mt-0.5\">{session.title}</p>\r\n )}\r\n </div>\r\n <Badge variant=\"warning\">\r\n <Wrench className=\"h-3 w-3 mr-1\" />\r\n Fix\r\n </Badge>\r\n </div>\r\n\r\n {/* Progress Section */}\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold flex items-center gap-2\">\r\n <Wrench className=\"h-5 w-5\" />\r\n {formatMessage({ id: 'fixSession.progress.title' })}\r\n </h3>\r\n <Badge variant=\"secondary\">{session.phase || formatMessage({ id: 'fixSession.phase.execution' })}</Badge>\r\n </div>\r\n\r\n {/* Progress Bar */}\r\n <div className=\"mb-2\">\r\n <div className=\"h-2 w-full rounded-full bg-muted overflow-hidden\">\r\n <div\r\n className=\"h-full bg-primary transition-all duration-300\"\r\n style={{ width: `${stats.percentComplete}%` }}\r\n />\r\n </div>\r\n </div>\r\n <div className=\"text-sm text-muted-foreground mb-6\">\r\n <strong>{stats.completed}</strong>/{stats.total} {formatMessage({ id: 'common.tasks' })} (\r\n {stats.percentComplete}%)\r\n </div>\r\n\r\n {/* Summary Cards */}\r\n <div className=\"grid grid-cols-4 gap-4\">\r\n <div className=\"text-center p-4 bg-background rounded-lg border\">\r\n <div className=\"text-2xl font-semibold text-foreground\">{stats.total}</div>\r\n <div className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'fixSession.stats.total' })}</div>\r\n </div>\r\n <div className=\"text-center p-4 bg-background rounded-lg border border-success/30 bg-success/5\">\r\n <div className=\"text-2xl font-semibold text-success\">{stats.fixed}</div>\r\n <div className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'fixSession.stats.fixed' })}</div>\r\n </div>\r\n <div className=\"text-center p-4 bg-background rounded-lg border border-destructive/30 bg-destructive/5\">\r\n <div className=\"text-2xl font-semibold text-destructive\">{stats.failed}</div>\r\n <div className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'fixSession.stats.failed' })}</div>\r\n </div>\r\n <div className=\"text-center p-4 bg-background rounded-lg border\">\r\n <div className=\"text-2xl font-semibold text-foreground\">{stats.pending}</div>\r\n <div className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'fixSession.stats.pending' })}</div>\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Tasks Section */}\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold flex items-center gap-2\">\r\n <File className=\"h-5 w-5\" />\r\n {formatMessage({ id: 'fixSession.tasks.title' })}\r\n </h3>\r\n <div className=\"flex gap-1\">\r\n {[\r\n { key: 'all' as const, label: formatMessage({ id: 'fixSession.filter.all' }) },\r\n { key: 'pending' as const, label: formatMessage({ id: 'fixSession.filter.pending' }) },\r\n { key: 'in_progress' as const, label: formatMessage({ id: 'fixSession.filter.inProgress' }) },\r\n { key: 'fixed' as const, label: formatMessage({ id: 'fixSession.filter.fixed' }) },\r\n { key: 'failed' as const, label: formatMessage({ id: 'fixSession.filter.failed' }) },\r\n ].map((filter) => (\r\n <Button\r\n key={filter.key}\r\n variant={statusFilter === filter.key ? 'default' : 'outline'}\r\n size=\"sm\"\r\n onClick={() => handleFilterChange(filter.key)}\r\n >\r\n {filter.label}\r\n </Button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Tasks List */}\r\n {filteredTasks.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <File className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'fixSession.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'fixSession.empty.message' })}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-3\">\r\n {filteredTasks.map((task) => {\r\n const statusBadge = getStatusBadge(task);\r\n const StatusIcon = statusBadge.icon;\r\n\r\n return (\r\n <Card\r\n key={task.task_id || task.id}\r\n className={`hover:shadow-sm transition-shadow ${\r\n task.status === 'completed' && task.result === 'failed'\r\n ? 'border-destructive/30 bg-destructive/5'\r\n : ''\r\n }`}\r\n >\r\n <CardContent className=\"p-4\">\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-mono font-semibold bg-primary/10 text-primary border border-primary/20\">\r\n {task.task_id || task.id || 'N/A'}\r\n </span>\r\n <Badge variant={statusBadge.variant} className=\"gap-1\">\r\n <StatusIcon className=\"h-3 w-3\" />\r\n {statusBadge.label}\r\n </Badge>\r\n </div>\r\n <h4 className=\"font-medium text-foreground text-sm\">\r\n {task.title || formatMessage({ id: 'fixSession.task.untitled' })}\r\n </h4>\r\n {task.finding_title && (\r\n <p className=\"text-sm text-muted-foreground mt-1\">{task.finding_title}</p>\r\n )}\r\n {task.file && (\r\n <div className=\"flex items-center gap-1 mt-2 text-xs text-muted-foreground\">\r\n <File className=\"h-3 w-3\" />\r\n {task.file}\r\n {task.line && `:${task.line}`}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"flex flex-wrap items-center gap-1 text-xs\">\r\n {task.dimension && (\r\n <span className=\"px-2 py-0.5 bg-muted rounded text-muted-foreground\">\r\n {task.dimension}\r\n </span>\r\n )}\r\n {task.attempts && task.attempts > 1 && (\r\n <span className=\"px-2 py-0.5 bg-muted rounded text-muted-foreground\">\r\n {formatMessage({ id: 'fixSession.task.attempts' }, { count: task.attempts })}\r\n </span>\r\n )}\r\n {task.commit_hash && (\r\n <span className=\"px-2 py-0.5 bg-primary-light text-primary rounded font-mono\">\r\n {task.commit_hash.substring(0, 7)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Session Info */}\r\n <div className=\"flex flex-wrap gap-4 text-sm text-muted-foreground p-4 bg-background rounded-lg border\">\r\n <div>\r\n <span className=\"font-medium\">{formatMessage({ id: 'fixSession.info.created' })}:</span>{' '}\r\n {new Date(session.created_at).toLocaleString()}\r\n </div>\r\n {session.updated_at && (\r\n <div>\r\n <span className=\"font-medium\">{formatMessage({ id: 'fixSession.info.updated' })}:</span>{' '}\r\n {new Date(session.updated_at).toLocaleString()}\r\n </div>\r\n )}\r\n {session.description && (\r\n <div className=\"w-full\">\r\n <span className=\"font-medium\">{formatMessage({ id: 'fixSession.info.description' })}:</span>{' '}\r\n {session.description}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default FixSessionPage;\r\n"],"names":["FixSessionPage","sessionId","useParams","navigate","useNavigate","formatMessage","useIntl","filteredSessions","isLoading","error","refetch","useSessions","statusFilter","setStatusFilter","React.useState","session","React.useMemo","tasks","stats","total","fixed","t","failed","pending","inProgress","completed","percentComplete","filteredTasks","getStatusBadge","task","CheckCircle","XCircle","Loader2","Clock","handleBack","handleFilterChange","filter","jsxs","Button","jsx","ArrowLeft","_","i","Badge","Wrench","Card","CardContent","File","statusBadge","StatusIcon"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import{O as L,u as T,r as f,j as e,e as l,R as z,c as w,am as R,N as H}from"./index-B8K8MdMl.js";import{F as M}from"./FloatingPanel-Diyvdyo1.js";import{u as S,a as A,T as P,F as V}from"./useFileExplorer-CTg0zndf.js";import{E as q}from"./eye-off-6o-KYsBM.js";import{E as G}from"./eye-kV2pWXQ5.js";/**
1
+ import{O as L,u as T,r as f,j as e,e as l,R as z,c as w,am as R,N as H}from"./index-DP_mTJI8.js";import{F as M}from"./FloatingPanel-sqezhSI8.js";import{u as S,a as A,T as P,F as V}from"./useFileExplorer-B8W2JTj2.js";import{E as q}from"./eye-off-C5HS4Ytm.js";import{E as G}from"./eye-BEMOdcAN.js";/**
2
2
  * @license lucide-react v0.460.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const J=L("ArrowRightToLine",[["path",{d:"M17 12H3",key:"8awo09"}],["path",{d:"m11 18 6-6-6-6",key:"8c2y43"}],["path",{d:"M21 5v14",key:"nzette"}]]);function Y({isOpen:i,onClose:p,rootPath:c,onInsertPath:t,initialSelectedPath:n=null,width:u=400}){const{formatMessage:a}=T(),{state:r,rootNodes:g,isLoading:j,isFetching:h,error:b,refetch:N,setSelectedFile:m,toggleExpanded:v,toggleShowHidden:y}=S({rootPath:c,maxDepth:6,enabled:i}),s=r.selectedFile,{content:F,isLoading:C,error:d}=A(s,{enabled:i&&!!s}),[k,x]=f.useState(!1);f.useEffect(()=>{i&&n&&m(n)},[i,n]);const B=o=>{o.type==="file"&&m(o.path)},D=async()=>{if(s)try{await navigator.clipboard.writeText(s),x(!0),setTimeout(()=>x(!1),1200)}catch(o){console.error("[FloatingFileBrowser] copy path failed:",o)}},E=()=>{s&&(t==null||t(s))};return e.jsx(M,{isOpen:i,onClose:p,title:a({id:"terminalDashboard.fileBrowser.title"}),side:"right",width:u,children:e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 px-3 py-2 border-b border-border bg-muted/20 shrink-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] text-muted-foreground",children:a(s?{id:"terminalDashboard.fileBrowser.selected"}:{id:"terminalDashboard.fileBrowser.noSelection"})}),e.jsx("div",{className:"text-xs font-mono truncate",title:s??void 0,children:s??c})]}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx(l,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8",onClick:y,title:a({id:"terminalDashboard.fileBrowser.showHidden"}),children:r.showHiddenFiles?e.jsx(q,{className:"w-4 h-4"}):e.jsx(G,{className:"w-4 h-4"})}),e.jsx(l,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>void N(),disabled:!i||h,title:a({id:"common.actions.refresh"}),children:e.jsx(z,{className:w("w-4 h-4",h&&"animate-spin")})}),e.jsx(l,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8",onClick:D,disabled:!s,title:a(k?{id:"terminalDashboard.fileBrowser.copied"}:{id:"terminalDashboard.fileBrowser.copyPath"}),children:e.jsx(R,{className:"w-4 h-4"})}),e.jsx(l,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8",onClick:E,disabled:!s||!t,title:a({id:"terminalDashboard.fileBrowser.insertPath"}),children:e.jsx(J,{className:"w-4 h-4"})})]})]}),e.jsxs("div",{className:"flex-1 min-h-0 flex overflow-hidden",children:[e.jsx("div",{className:"w-[240px] shrink-0 border-r border-border overflow-y-auto",children:j?e.jsxs("div",{className:"flex items-center justify-center py-8 text-muted-foreground",children:[e.jsx(H,{className:"w-5 h-5 animate-spin"}),e.jsx("span",{className:"ml-2 text-xs",children:a({id:"terminalDashboard.fileBrowser.loading"})})]}):b?e.jsx("div",{className:"p-3 text-xs text-destructive",children:a({id:"terminalDashboard.fileBrowser.loadFailed"})}):e.jsx(P,{nodes:g,expandedPaths:r.expandedPaths,selectedPath:r.selectedFile,onNodeClick:B,onToggle:v,maxDepth:0,className:w("py-1")})}),e.jsx("div",{className:"flex-1 min-w-0 overflow-hidden",children:e.jsx(V,{fileContent:F,isLoading:C,error:d?String(d.message??d):null,className:"h-full overflow-auto"})})]})]})})}export{Y as F};
7
- //# sourceMappingURL=FloatingFileBrowser-tgDOT5P0.js.map
7
+ //# sourceMappingURL=FloatingFileBrowser-DvMsXLdP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingFileBrowser-tgDOT5P0.js","sources":["../../../../node_modules/lucide-react/dist/esm/icons/arrow-right-to-line.js","../../src/components/terminal-dashboard/FloatingFileBrowser.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 ArrowRightToLine = createLucideIcon(\"ArrowRightToLine\", [\n [\"path\", { d: \"M17 12H3\", key: \"8awo09\" }],\n [\"path\", { d: \"m11 18 6-6-6-6\", key: \"8c2y43\" }],\n [\"path\", { d: \"M21 5v14\", key: \"nzette\" }]\n]);\n\nexport { ArrowRightToLine as default };\n//# sourceMappingURL=arrow-right-to-line.js.map\n","// ========================================\n// FloatingFileBrowser Component\n// ========================================\n// Floating file browser panel for Terminal Dashboard.\n\nimport * as React from 'react';\nimport { useIntl } from 'react-intl';\nimport { Copy, ArrowRightToLine, Loader2, RefreshCw, Eye, EyeOff } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { FloatingPanel } from './FloatingPanel';\nimport { Button } from '@/components/ui/Button';\nimport { TreeView } from '@/components/shared/TreeView';\nimport { FilePreview } from '@/components/shared/FilePreview';\nimport { useFileExplorer, useFileContent } from '@/hooks/useFileExplorer';\nimport type { FileSystemNode } from '@/types/file-explorer';\n\nexport interface FloatingFileBrowserProps {\n isOpen: boolean;\n onClose: () => void;\n rootPath: string;\n onInsertPath?: (path: string) => void;\n initialSelectedPath?: string | null;\n width?: number | string;\n}\n\nexport function FloatingFileBrowser({\n isOpen,\n onClose,\n rootPath,\n onInsertPath,\n initialSelectedPath = null,\n width = 400,\n}: FloatingFileBrowserProps) {\n const { formatMessage } = useIntl();\n\n const {\n state,\n rootNodes,\n isLoading,\n isFetching,\n error,\n refetch,\n setSelectedFile,\n toggleExpanded,\n toggleShowHidden,\n } = useFileExplorer({\n rootPath,\n maxDepth: 6,\n enabled: isOpen,\n });\n\n const selectedPath = state.selectedFile;\n const { content, isLoading: isContentLoading, error: contentError } = useFileContent(selectedPath, {\n enabled: isOpen && !!selectedPath,\n });\n\n const [copied, setCopied] = React.useState(false);\n\n React.useEffect(() => {\n if (!isOpen) return;\n if (initialSelectedPath) {\n setSelectedFile(initialSelectedPath);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, initialSelectedPath]);\n\n const handleNodeClick = (node: FileSystemNode) => {\n if (node.type === 'file') {\n setSelectedFile(node.path);\n }\n };\n\n const handleCopyPath = async () => {\n if (!selectedPath) return;\n try {\n await navigator.clipboard.writeText(selectedPath);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch (err) {\n console.error('[FloatingFileBrowser] copy path failed:', err);\n }\n };\n\n const handleInsert = () => {\n if (!selectedPath) return;\n onInsertPath?.(selectedPath);\n };\n\n return (\n <FloatingPanel\n isOpen={isOpen}\n onClose={onClose}\n title={formatMessage({ id: 'terminalDashboard.fileBrowser.title' })}\n side=\"right\"\n width={width}\n >\n <div className=\"flex flex-col h-full\">\n {/* Toolbar */}\n <div className=\"flex items-center justify-between gap-2 px-3 py-2 border-b border-border bg-muted/20 shrink-0\">\n <div className=\"min-w-0\">\n <div className=\"text-[10px] text-muted-foreground\">\n {selectedPath\n ? formatMessage({ id: 'terminalDashboard.fileBrowser.selected' })\n : formatMessage({ id: 'terminalDashboard.fileBrowser.noSelection' })}\n </div>\n <div className=\"text-xs font-mono truncate\" title={selectedPath ?? undefined}>\n {selectedPath ?? rootPath}\n </div>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={toggleShowHidden}\n title={formatMessage({ id: 'terminalDashboard.fileBrowser.showHidden' })}\n >\n {state.showHiddenFiles ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => void refetch()}\n disabled={!isOpen || isFetching}\n title={formatMessage({ id: 'common.actions.refresh' })}\n >\n <RefreshCw className={cn('w-4 h-4', isFetching && 'animate-spin')} />\n </Button>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={handleCopyPath}\n disabled={!selectedPath}\n title={copied\n ? formatMessage({ id: 'terminalDashboard.fileBrowser.copied' })\n : formatMessage({ id: 'terminalDashboard.fileBrowser.copyPath' })}\n >\n <Copy className=\"w-4 h-4\" />\n </Button>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={handleInsert}\n disabled={!selectedPath || !onInsertPath}\n title={formatMessage({ id: 'terminalDashboard.fileBrowser.insertPath' })}\n >\n <ArrowRightToLine className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"flex-1 min-h-0 flex overflow-hidden\">\n {/* Tree */}\n <div className=\"w-[240px] shrink-0 border-r border-border overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex items-center justify-center py-8 text-muted-foreground\">\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n <span className=\"ml-2 text-xs\">\n {formatMessage({ id: 'terminalDashboard.fileBrowser.loading' })}\n </span>\n </div>\n ) : error ? (\n <div className=\"p-3 text-xs text-destructive\">\n {formatMessage({ id: 'terminalDashboard.fileBrowser.loadFailed' })}\n </div>\n ) : (\n <TreeView\n nodes={rootNodes}\n expandedPaths={state.expandedPaths}\n selectedPath={state.selectedFile}\n onNodeClick={handleNodeClick}\n onToggle={toggleExpanded}\n maxDepth={0}\n className={cn('py-1')}\n />\n )}\n </div>\n\n {/* Preview */}\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <FilePreview\n fileContent={content}\n isLoading={isContentLoading}\n error={contentError ? String((contentError as any).message ?? contentError) : null}\n className=\"h-full overflow-auto\"\n />\n </div>\n </div>\n </div>\n </FloatingPanel>\n );\n}\n\nexport default FloatingFileBrowser;\n"],"names":["ArrowRightToLine","createLucideIcon","FloatingFileBrowser","isOpen","onClose","rootPath","onInsertPath","initialSelectedPath","width","formatMessage","useIntl","state","rootNodes","isLoading","isFetching","error","refetch","setSelectedFile","toggleExpanded","toggleShowHidden","useFileExplorer","selectedPath","content","isContentLoading","contentError","useFileContent","copied","setCopied","React.useState","React.useEffect","handleNodeClick","node","handleCopyPath","err","handleInsert","jsx","FloatingPanel","jsxs","Button","EyeOff","Eye","RefreshCw","cn","Copy","Loader2","TreeView","FilePreview"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"FloatingFileBrowser-DvMsXLdP.js","sources":["../../../../node_modules/lucide-react/dist/esm/icons/arrow-right-to-line.js","../../src/components/terminal-dashboard/FloatingFileBrowser.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 ArrowRightToLine = createLucideIcon(\"ArrowRightToLine\", [\n [\"path\", { d: \"M17 12H3\", key: \"8awo09\" }],\n [\"path\", { d: \"m11 18 6-6-6-6\", key: \"8c2y43\" }],\n [\"path\", { d: \"M21 5v14\", key: \"nzette\" }]\n]);\n\nexport { ArrowRightToLine as default };\n//# sourceMappingURL=arrow-right-to-line.js.map\n","// ========================================\n// FloatingFileBrowser Component\n// ========================================\n// Floating file browser panel for Terminal Dashboard.\n\nimport * as React from 'react';\nimport { useIntl } from 'react-intl';\nimport { Copy, ArrowRightToLine, Loader2, RefreshCw, Eye, EyeOff } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { FloatingPanel } from './FloatingPanel';\nimport { Button } from '@/components/ui/Button';\nimport { TreeView } from '@/components/shared/TreeView';\nimport { FilePreview } from '@/components/shared/FilePreview';\nimport { useFileExplorer, useFileContent } from '@/hooks/useFileExplorer';\nimport type { FileSystemNode } from '@/types/file-explorer';\n\nexport interface FloatingFileBrowserProps {\n isOpen: boolean;\n onClose: () => void;\n rootPath: string;\n onInsertPath?: (path: string) => void;\n initialSelectedPath?: string | null;\n width?: number | string;\n}\n\nexport function FloatingFileBrowser({\n isOpen,\n onClose,\n rootPath,\n onInsertPath,\n initialSelectedPath = null,\n width = 400,\n}: FloatingFileBrowserProps) {\n const { formatMessage } = useIntl();\n\n const {\n state,\n rootNodes,\n isLoading,\n isFetching,\n error,\n refetch,\n setSelectedFile,\n toggleExpanded,\n toggleShowHidden,\n } = useFileExplorer({\n rootPath,\n maxDepth: 6,\n enabled: isOpen,\n });\n\n const selectedPath = state.selectedFile;\n const { content, isLoading: isContentLoading, error: contentError } = useFileContent(selectedPath, {\n enabled: isOpen && !!selectedPath,\n });\n\n const [copied, setCopied] = React.useState(false);\n\n React.useEffect(() => {\n if (!isOpen) return;\n if (initialSelectedPath) {\n setSelectedFile(initialSelectedPath);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, initialSelectedPath]);\n\n const handleNodeClick = (node: FileSystemNode) => {\n if (node.type === 'file') {\n setSelectedFile(node.path);\n }\n };\n\n const handleCopyPath = async () => {\n if (!selectedPath) return;\n try {\n await navigator.clipboard.writeText(selectedPath);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch (err) {\n console.error('[FloatingFileBrowser] copy path failed:', err);\n }\n };\n\n const handleInsert = () => {\n if (!selectedPath) return;\n onInsertPath?.(selectedPath);\n };\n\n return (\n <FloatingPanel\n isOpen={isOpen}\n onClose={onClose}\n title={formatMessage({ id: 'terminalDashboard.fileBrowser.title' })}\n side=\"right\"\n width={width}\n >\n <div className=\"flex flex-col h-full\">\n {/* Toolbar */}\n <div className=\"flex items-center justify-between gap-2 px-3 py-2 border-b border-border bg-muted/20 shrink-0\">\n <div className=\"min-w-0\">\n <div className=\"text-[10px] text-muted-foreground\">\n {selectedPath\n ? formatMessage({ id: 'terminalDashboard.fileBrowser.selected' })\n : formatMessage({ id: 'terminalDashboard.fileBrowser.noSelection' })}\n </div>\n <div className=\"text-xs font-mono truncate\" title={selectedPath ?? undefined}>\n {selectedPath ?? rootPath}\n </div>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={toggleShowHidden}\n title={formatMessage({ id: 'terminalDashboard.fileBrowser.showHidden' })}\n >\n {state.showHiddenFiles ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => void refetch()}\n disabled={!isOpen || isFetching}\n title={formatMessage({ id: 'common.actions.refresh' })}\n >\n <RefreshCw className={cn('w-4 h-4', isFetching && 'animate-spin')} />\n </Button>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={handleCopyPath}\n disabled={!selectedPath}\n title={copied\n ? formatMessage({ id: 'terminalDashboard.fileBrowser.copied' })\n : formatMessage({ id: 'terminalDashboard.fileBrowser.copyPath' })}\n >\n <Copy className=\"w-4 h-4\" />\n </Button>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={handleInsert}\n disabled={!selectedPath || !onInsertPath}\n title={formatMessage({ id: 'terminalDashboard.fileBrowser.insertPath' })}\n >\n <ArrowRightToLine className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"flex-1 min-h-0 flex overflow-hidden\">\n {/* Tree */}\n <div className=\"w-[240px] shrink-0 border-r border-border overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex items-center justify-center py-8 text-muted-foreground\">\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n <span className=\"ml-2 text-xs\">\n {formatMessage({ id: 'terminalDashboard.fileBrowser.loading' })}\n </span>\n </div>\n ) : error ? (\n <div className=\"p-3 text-xs text-destructive\">\n {formatMessage({ id: 'terminalDashboard.fileBrowser.loadFailed' })}\n </div>\n ) : (\n <TreeView\n nodes={rootNodes}\n expandedPaths={state.expandedPaths}\n selectedPath={state.selectedFile}\n onNodeClick={handleNodeClick}\n onToggle={toggleExpanded}\n maxDepth={0}\n className={cn('py-1')}\n />\n )}\n </div>\n\n {/* Preview */}\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <FilePreview\n fileContent={content}\n isLoading={isContentLoading}\n error={contentError ? String((contentError as any).message ?? contentError) : null}\n className=\"h-full overflow-auto\"\n />\n </div>\n </div>\n </div>\n </FloatingPanel>\n );\n}\n\nexport default FloatingFileBrowser;\n"],"names":["ArrowRightToLine","createLucideIcon","FloatingFileBrowser","isOpen","onClose","rootPath","onInsertPath","initialSelectedPath","width","formatMessage","useIntl","state","rootNodes","isLoading","isFetching","error","refetch","setSelectedFile","toggleExpanded","toggleShowHidden","useFileExplorer","selectedPath","content","isContentLoading","contentError","useFileContent","copied","setCopied","React.useState","React.useEffect","handleNodeClick","node","handleCopyPath","err","handleInsert","jsx","FloatingPanel","jsxs","Button","EyeOff","Eye","RefreshCw","cn","Copy","Loader2","TreeView","FilePreview"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- import{r as s,j as e,c as l,X as u}from"./index-B8K8MdMl.js";function h({isOpen:t,onClose:r,title:i,side:a="left",width:o=320,children:c}){const d=s.useRef(null);s.useEffect(()=>{if(!t)return;const n=f=>{f.key==="Escape"&&r()};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[t,r]);const x=s.useCallback(n=>{n.target===n.currentTarget&&r()},[r]);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:l("fixed z-40 transition-opacity duration-200",t?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),style:{top:"40px",bottom:0,left:0,right:0},onClick:x,children:e.jsx("div",{className:"absolute inset-0 bg-black/20 pointer-events-none"})}),e.jsxs("div",{ref:d,className:l("fixed z-50 flex flex-col bg-background border-border shadow-lg","transition-transform duration-200 ease-out",a==="left"&&"left-0 border-r",a==="right"&&"right-0 border-l",a==="left"&&(t?"translate-x-0":"-translate-x-full"),a==="right"&&(t?"translate-x-0":"translate-x-full")),style:{top:"40px",height:"calc(100vh - 40px)",width:typeof o=="number"?`${o}px`:o},children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-border shrink-0",children:[e.jsx("h2",{className:"text-sm font-semibold",children:i}),e.jsx("button",{onClick:r,className:"p-1 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground",children:e.jsx(u,{className:"w-4 h-4"})})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:c})]})]})}export{h as F};
2
- //# sourceMappingURL=FloatingPanel-Diyvdyo1.js.map
1
+ import{r as s,j as e,c as l,X as u}from"./index-DP_mTJI8.js";function h({isOpen:t,onClose:r,title:i,side:a="left",width:o=320,children:c}){const d=s.useRef(null);s.useEffect(()=>{if(!t)return;const n=f=>{f.key==="Escape"&&r()};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[t,r]);const x=s.useCallback(n=>{n.target===n.currentTarget&&r()},[r]);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:l("fixed z-40 transition-opacity duration-200",t?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),style:{top:"40px",bottom:0,left:0,right:0},onClick:x,children:e.jsx("div",{className:"absolute inset-0 bg-black/20 pointer-events-none"})}),e.jsxs("div",{ref:d,className:l("fixed z-50 flex flex-col bg-background border-border shadow-lg","transition-transform duration-200 ease-out",a==="left"&&"left-0 border-r",a==="right"&&"right-0 border-l",a==="left"&&(t?"translate-x-0":"-translate-x-full"),a==="right"&&(t?"translate-x-0":"translate-x-full")),style:{top:"40px",height:"calc(100vh - 40px)",width:typeof o=="number"?`${o}px`:o},children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-border shrink-0",children:[e.jsx("h2",{className:"text-sm font-semibold",children:i}),e.jsx("button",{onClick:r,className:"p-1 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground",children:e.jsx(u,{className:"w-4 h-4"})})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:c})]})]})}export{h as F};
2
+ //# sourceMappingURL=FloatingPanel-sqezhSI8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingPanel-Diyvdyo1.js","sources":["../../src/components/terminal-dashboard/FloatingPanel.tsx"],"sourcesContent":["// ========================================\r\n// FloatingPanel Component\r\n// ========================================\r\n// Generic floating panel container (Drawer style).\r\n// Slides in from left or right side, overlaying the terminal grid.\r\n\r\nimport { useCallback, useEffect, useRef } from 'react';\r\nimport { X } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ========== Types ==========\r\n\r\ninterface FloatingPanelProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n title: string;\r\n side?: 'left' | 'right';\r\n width?: number | string;\r\n children: React.ReactNode;\r\n}\r\n\r\n// ========== Component ==========\r\n\r\nexport function FloatingPanel({\r\n isOpen,\r\n onClose,\r\n title,\r\n side = 'left',\r\n width = 320,\r\n children,\r\n}: FloatingPanelProps) {\r\n const panelRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close on Escape key\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n document.addEventListener('keydown', handleKeyDown);\r\n return () => document.removeEventListener('keydown', handleKeyDown);\r\n }, [isOpen, onClose]);\r\n\r\n const handleBackdropClick = useCallback(\r\n (e: React.MouseEvent) => {\r\n if (e.target === e.currentTarget) onClose();\r\n },\r\n [onClose]\r\n );\r\n\r\n return (\r\n <>\r\n {/* Backdrop */}\r\n <div\r\n className={cn(\r\n 'fixed z-40 transition-opacity duration-200',\r\n isOpen ? 'opacity-100 pointer-events-auto' : 'opacity-0 pointer-events-none'\r\n )}\r\n style={{ top: '40px', bottom: 0, left: 0, right: 0 }}\r\n onClick={handleBackdropClick}\r\n >\r\n <div className=\"absolute inset-0 bg-black/20 pointer-events-none\" />\r\n </div>\r\n\r\n {/* Panel */}\r\n <div\r\n ref={panelRef}\r\n className={cn(\r\n 'fixed z-50 flex flex-col bg-background border-border shadow-lg',\r\n 'transition-transform duration-200 ease-out',\r\n side === 'left' && 'left-0 border-r',\r\n side === 'right' && 'right-0 border-l',\r\n // Transform based on open state and side\r\n side === 'left' && (isOpen ? 'translate-x-0' : '-translate-x-full'),\r\n side === 'right' && (isOpen ? 'translate-x-0' : 'translate-x-full'),\r\n )}\r\n style={{\r\n top: '40px', // Below toolbar\r\n height: 'calc(100vh - 40px)', // Full height below toolbar\r\n width: typeof width === 'number' ? `${width}px` : width,\r\n }}\r\n >\r\n {/* Panel header */}\r\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border shrink-0\">\r\n <h2 className=\"text-sm font-semibold\">{title}</h2>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n\r\n {/* Panel content */}\r\n <div className=\"flex-1 min-h-0 overflow-hidden\">\r\n {children}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":["FloatingPanel","isOpen","onClose","title","side","width","children","panelRef","useRef","useEffect","handleKeyDown","e","handleBackdropClick","useCallback","jsxs","Fragment","jsx","cn","X"],"mappings":"6DAuBO,SAASA,EAAc,CAC5B,OAAAC,EACA,QAAAC,EACA,MAAAC,EACA,KAAAC,EAAO,OACP,MAAAC,EAAQ,IACR,SAAAC,CACF,EAAuB,CACrB,MAAMC,EAAWC,EAAAA,OAAuB,IAAI,EAG5CC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACR,EAAQ,OACb,MAAMS,EAAiBC,GAAqB,CACtCA,EAAE,MAAQ,UAAUT,EAAA,CAC1B,EACA,gBAAS,iBAAiB,UAAWQ,CAAa,EAC3C,IAAM,SAAS,oBAAoB,UAAWA,CAAa,CACpE,EAAG,CAACT,EAAQC,CAAO,CAAC,EAEpB,MAAMU,EAAsBC,EAAAA,YACzBF,GAAwB,CACnBA,EAAE,SAAWA,EAAE,eAAeT,EAAA,CACpC,EACA,CAACA,CAAO,CAAA,EAGV,OACEY,EAAAA,KAAAC,WAAA,CAEE,SAAA,CAAAC,EAAAA,IAAC,MAAA,CACC,UAAWC,EACT,6CACAhB,EAAS,kCAAoC,+BAAA,EAE/C,MAAO,CAAE,IAAK,OAAQ,OAAQ,EAAG,KAAM,EAAG,MAAO,CAAA,EACjD,QAASW,EAET,SAAAI,EAAAA,IAAC,MAAA,CAAI,UAAU,kDAAA,CAAmD,CAAA,CAAA,EAIpEF,EAAAA,KAAC,MAAA,CACC,IAAKP,EACL,UAAWU,EACT,iEACA,6CACAb,IAAS,QAAU,kBACnBA,IAAS,SAAW,mBAEpBA,IAAS,SAAWH,EAAS,gBAAkB,qBAC/CG,IAAS,UAAYH,EAAS,gBAAkB,mBAAA,EAElD,MAAO,CACL,IAAK,OACL,OAAQ,qBACR,MAAO,OAAOI,GAAU,SAAW,GAAGA,CAAK,KAAOA,CAAA,EAIpD,SAAA,CAAAS,EAAAA,KAAC,MAAA,CAAI,UAAU,8EACb,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAb,EAAM,EAC7Ca,EAAAA,IAAC,SAAA,CACC,QAASd,EACT,UAAU,2FAEV,SAAAc,EAAAA,IAACE,EAAA,CAAE,UAAU,SAAA,CAAU,CAAA,CAAA,CACzB,EACF,EAGAF,EAAAA,IAAC,MAAA,CAAI,UAAU,iCACZ,SAAAV,CAAA,CACH,CAAA,CAAA,CAAA,CACF,EACF,CAEJ"}
1
+ {"version":3,"file":"FloatingPanel-sqezhSI8.js","sources":["../../src/components/terminal-dashboard/FloatingPanel.tsx"],"sourcesContent":["// ========================================\r\n// FloatingPanel Component\r\n// ========================================\r\n// Generic floating panel container (Drawer style).\r\n// Slides in from left or right side, overlaying the terminal grid.\r\n\r\nimport { useCallback, useEffect, useRef } from 'react';\r\nimport { X } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ========== Types ==========\r\n\r\ninterface FloatingPanelProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n title: string;\r\n side?: 'left' | 'right';\r\n width?: number | string;\r\n children: React.ReactNode;\r\n}\r\n\r\n// ========== Component ==========\r\n\r\nexport function FloatingPanel({\r\n isOpen,\r\n onClose,\r\n title,\r\n side = 'left',\r\n width = 320,\r\n children,\r\n}: FloatingPanelProps) {\r\n const panelRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close on Escape key\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n document.addEventListener('keydown', handleKeyDown);\r\n return () => document.removeEventListener('keydown', handleKeyDown);\r\n }, [isOpen, onClose]);\r\n\r\n const handleBackdropClick = useCallback(\r\n (e: React.MouseEvent) => {\r\n if (e.target === e.currentTarget) onClose();\r\n },\r\n [onClose]\r\n );\r\n\r\n return (\r\n <>\r\n {/* Backdrop */}\r\n <div\r\n className={cn(\r\n 'fixed z-40 transition-opacity duration-200',\r\n isOpen ? 'opacity-100 pointer-events-auto' : 'opacity-0 pointer-events-none'\r\n )}\r\n style={{ top: '40px', bottom: 0, left: 0, right: 0 }}\r\n onClick={handleBackdropClick}\r\n >\r\n <div className=\"absolute inset-0 bg-black/20 pointer-events-none\" />\r\n </div>\r\n\r\n {/* Panel */}\r\n <div\r\n ref={panelRef}\r\n className={cn(\r\n 'fixed z-50 flex flex-col bg-background border-border shadow-lg',\r\n 'transition-transform duration-200 ease-out',\r\n side === 'left' && 'left-0 border-r',\r\n side === 'right' && 'right-0 border-l',\r\n // Transform based on open state and side\r\n side === 'left' && (isOpen ? 'translate-x-0' : '-translate-x-full'),\r\n side === 'right' && (isOpen ? 'translate-x-0' : 'translate-x-full'),\r\n )}\r\n style={{\r\n top: '40px', // Below toolbar\r\n height: 'calc(100vh - 40px)', // Full height below toolbar\r\n width: typeof width === 'number' ? `${width}px` : width,\r\n }}\r\n >\r\n {/* Panel header */}\r\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border shrink-0\">\r\n <h2 className=\"text-sm font-semibold\">{title}</h2>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n\r\n {/* Panel content */}\r\n <div className=\"flex-1 min-h-0 overflow-hidden\">\r\n {children}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":["FloatingPanel","isOpen","onClose","title","side","width","children","panelRef","useRef","useEffect","handleKeyDown","e","handleBackdropClick","useCallback","jsxs","Fragment","jsx","cn","X"],"mappings":"6DAuBO,SAASA,EAAc,CAC5B,OAAAC,EACA,QAAAC,EACA,MAAAC,EACA,KAAAC,EAAO,OACP,MAAAC,EAAQ,IACR,SAAAC,CACF,EAAuB,CACrB,MAAMC,EAAWC,EAAAA,OAAuB,IAAI,EAG5CC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACR,EAAQ,OACb,MAAMS,EAAiBC,GAAqB,CACtCA,EAAE,MAAQ,UAAUT,EAAA,CAC1B,EACA,gBAAS,iBAAiB,UAAWQ,CAAa,EAC3C,IAAM,SAAS,oBAAoB,UAAWA,CAAa,CACpE,EAAG,CAACT,EAAQC,CAAO,CAAC,EAEpB,MAAMU,EAAsBC,EAAAA,YACzBF,GAAwB,CACnBA,EAAE,SAAWA,EAAE,eAAeT,EAAA,CACpC,EACA,CAACA,CAAO,CAAA,EAGV,OACEY,EAAAA,KAAAC,WAAA,CAEE,SAAA,CAAAC,EAAAA,IAAC,MAAA,CACC,UAAWC,EACT,6CACAhB,EAAS,kCAAoC,+BAAA,EAE/C,MAAO,CAAE,IAAK,OAAQ,OAAQ,EAAG,KAAM,EAAG,MAAO,CAAA,EACjD,QAASW,EAET,SAAAI,EAAAA,IAAC,MAAA,CAAI,UAAU,kDAAA,CAAmD,CAAA,CAAA,EAIpEF,EAAAA,KAAC,MAAA,CACC,IAAKP,EACL,UAAWU,EACT,iEACA,6CACAb,IAAS,QAAU,kBACnBA,IAAS,SAAW,mBAEpBA,IAAS,SAAWH,EAAS,gBAAkB,qBAC/CG,IAAS,UAAYH,EAAS,gBAAkB,mBAAA,EAElD,MAAO,CACL,IAAK,OACL,OAAQ,qBACR,MAAO,OAAOI,GAAU,SAAW,GAAGA,CAAK,KAAOA,CAAA,EAIpD,SAAA,CAAAS,EAAAA,KAAC,MAAA,CAAI,UAAU,8EACb,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAb,EAAM,EAC7Ca,EAAAA,IAAC,SAAA,CACC,QAASd,EACT,UAAU,2FAEV,SAAAc,EAAAA,IAACE,EAAA,CAAE,UAAU,SAAA,CAAU,CAAA,CAAA,CACzB,EACF,EAGAF,EAAAA,IAAC,MAAA,CAAI,UAAU,iCACZ,SAAAV,CAAA,CACH,CAAA,CAAA,CAAA,CACF,EACF,CAEJ"}
@@ -1,4 +1,4 @@
1
- import{O as B,u as V,r as h,j as e,D as O,d as X,e as F,B as T,ap as A,f as Y,v as Q,h as W,dX as Z,R as re,a1 as ne,Z as de,av as ie,X as oe,c as H,aF as le,ab as ce,dY as me,F as ge,N as he,C as K,m as _}from"./index-B8K8MdMl.js";import{H as w,P as k,g as J,h as R,E as q,j as ue,R as xe,u as pe,i as be,B as fe,d as ye,C as je,M as Ne,c as ve}from"./index-4zmlzlPo.js";/* empty css */import{F as D}from"./filter-A5I9Xz7E.js";import{F as we}from"./file-text-DSroEAMu.js";import{P as ke}from"./package-CmuCX6Z_.js";import{B as Te}from"./braces-D0pAnktp.js";/**
1
+ import{O as B,u as V,r as h,j as e,D as O,d as X,e as F,B as T,ap as A,f as Y,v as Q,h as W,dX as Z,R as re,a1 as ne,Z as de,av as ie,X as oe,c as H,aF as le,ab as ce,dY as me,F as ge,N as he,C as K,m as _}from"./index-DP_mTJI8.js";import{H as w,P as k,g as J,h as R,E as q,j as ue,R as xe,u as pe,i as be,B as fe,d as ye,C as je,M as Ne,c as ve}from"./index-ni-tG9rm.js";/* empty css */import{F as D}from"./filter-CIuCqnDB.js";import{F as we}from"./file-text-TGs_qCbw.js";import{P as ke}from"./package-Djsvs5qp.js";import{B as Te}from"./braces-DWwkaDS6.js";/**
2
2
  * @license lucide-react v0.460.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -54,4 +54,4 @@ import{O as B,u as V,r as h,j as e,D as O,d as X,e as F,B as T,ap as A,f as Y,v
54
54
  flex-shrink-0 w-2 h-2 rounded-full
55
55
  ${a==="error"?"bg-red-500":a==="warning"?"bg-amber-500":"bg-blue-500"}
56
56
  `})]}),s.documentation&&e.jsx("div",{className:"mt-2 text-xs text-muted-foreground font-mono",title:s.documentation,children:s.documentation}),e.jsx(w,{type:"source",position:k.Bottom,className:"!bg-cyan-500"})]})});U.displayName="VariableNode";const Le={module:v,class:L,function:E,variable:U,component:v,interface:L,file:v,folder:v,dependency:v,api:v,database:v,service:v,hook:E,utility:E,unknown:v},ee=h.memo(n=>{const{id:i,sourceX:o,sourceY:s,targetX:c,targetY:a,sourcePosition:r,targetPosition:t,selected:d,style:x,markerEnd:m}=n,l=n.data,[g]=J({sourceX:o,sourceY:s,sourcePosition:r,targetX:c,targetY:a,targetPosition:t}),N={...x,stroke:d?"#3b82f6":"#64748b",strokeWidth:d?2:1.5,strokeDasharray:(l==null?void 0:l.importType)==="dynamic"?"5,5":void 0};return e.jsxs(e.Fragment,{children:[e.jsx(R,{id:i,path:g,style:N,markerEnd:m}),(l==null?void 0:l.label)&&e.jsx(q,{children:e.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${(o+c)/2}px, ${(s+a)/2}px)`,pointerEvents:"all"},className:"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-gray-200 dark:border-gray-700",children:l.label})})]})});ee.displayName="ImportsEdge";const se=h.memo(n=>{const{id:i,sourceX:o,sourceY:s,targetX:c,targetY:a,sourcePosition:r,targetPosition:t,selected:d,style:x,markerEnd:m}=n,l=n.data,[g]=J({sourceX:o,sourceY:s,sourcePosition:r,targetX:c,targetY:a,targetPosition:t}),N={...x,stroke:d?"#10b981":"#22c55e",strokeWidth:d?2:1.5};return e.jsxs(e.Fragment,{children:[e.jsx(R,{id:i,path:g,style:N,markerEnd:m}),(l==null?void 0:l.label)&&e.jsx(q,{children:e.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${(o+c)/2}px, ${(s+a)/2}px)`,pointerEvents:"all"},className:"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-green-200 dark:border-green-700",children:l.label})})]})});se.displayName="CallsEdge";const z=h.memo(n=>{const{id:i,sourceX:o,sourceY:s,targetX:c,targetY:a,sourcePosition:r,targetPosition:t,selected:d,style:x,markerEnd:m}=n,l=n.data,[g]=ue({sourceX:o,sourceY:s,sourcePosition:r,targetX:c,targetY:a,targetPosition:t,borderRadius:20}),N={...x,stroke:d?"#f59e0b":"#a855f7",strokeWidth:2,strokeDasharray:"4,4"};return e.jsxs(e.Fragment,{children:[e.jsx(R,{id:i,path:g,style:N,markerEnd:m}),(l==null?void 0:l.label)&&e.jsx(q,{children:e.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${(o+c)/2}px, ${(s+a)/2}px)`,pointerEvents:"all"},className:"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-purple-200 dark:border-purple-700",children:l.label})})]})});z.displayName="InheritsEdge";const ze={imports:ee,calls:se,extends:z,implements:z};function Ve(){const{formatMessage:n}=V(),{fitView:i}=pe(),[o,s]=h.useState(null),[c,a]=h.useState(!0),[r,t]=h.useState({nodeTypes:["component","module","class","function","variable","interface","hook"],edgeTypes:["imports","exports","extends","implements","uses","calls","depends-on"],showIsolatedNodes:!1}),{graphData:d,isLoading:x,isFetching:m,error:l,refetch:g,applyFilters:N}=De({rootPath:"/src",maxDepth:3,enabled:!0}),C=h.useMemo(()=>N(r)||{nodes:[],edges:[],metadata:void 0},[d,r,N]),S=h.useMemo(()=>{const f={};return d==null||d.nodes.forEach(P=>{f[P.type]=(f[P.type]||0)+1}),f},[d]),M=h.useMemo(()=>{const f={};return d==null||d.edges.forEach(P=>{var G;const $=(G=P.data)==null?void 0:G.edgeType;$&&(f[$]=(f[$]||0)+1)}),f},[d]),u=h.useCallback((f,P)=>{s(P),a(!0)},[]),p=h.useCallback(()=>{s(null)},[]),b=h.useCallback(()=>{i({padding:.2,duration:300})},[i]),y=h.useCallback(async()=>{await g()},[g]),j=h.useCallback(f=>{t(f)},[]),ae=h.useCallback(()=>{t({nodeTypes:["component","module","class","function","variable","interface","hook"],edgeTypes:["imports","exports","extends","implements","uses","calls","depends-on"],showIsolatedNodes:!1})},[]),te=h.useCallback(()=>{a(!1),s(null)},[]);return x?e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(he,{className:"w-8 h-8 animate-spin text-muted-foreground"})}):l?e.jsx("div",{className:"flex items-center justify-center h-full p-6",children:e.jsx(K,{className:"p-6 border-red-200 dark:border-red-800",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{className:"w-5 h-5 text-red-500"}),e.jsx("p",{className:"text-sm text-red-600 dark:text-red-400",children:n({id:"graph.error.loading"},{message:l.message})})]})})}):!d||d.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(K,{className:"p-6",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{className:"w-5 h-5 text-muted-foreground"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:n({id:"graph.empty"})})]})})}):e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(Se,{filters:r,onFiltersChange:j,onFitView:b,onRefresh:y,onResetFilters:ae,nodeTypeCounts:S,edgeTypeCounts:M}),e.jsxs("div",{className:"flex-1 flex overflow-hidden",children:[e.jsx("div",{className:"flex-1 relative",children:e.jsxs(be,{nodes:C.nodes,edges:C.edges,onNodeClick:u,onPaneClick:p,nodeTypes:Le,edgeTypes:ze,fitView:!0,defaultViewport:{x:0,y:0,zoom:.8},minZoom:.1,maxZoom:2,className:"bg-background",children:[e.jsx(fe,{variant:ye.Dots,gap:20,size:1}),e.jsx(je,{}),e.jsx(Ne,{nodeColor:f=>{switch(f.type){case"component":case"module":return"#3b82f6";case"class":return"#22c55e";case"function":return"#f97316";case"variable":return"#06b6d4";default:return"#6b7280"}},maskColor:"rgba(0, 0, 0, 0.1)"}),e.jsx(ve,{position:"top-left",className:"bg-card/90 backdrop-blur border border-border rounded-lg p-3 shadow-lg",children:e.jsxs("div",{className:"text-xs space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsx("span",{className:"text-muted-foreground",children:n({id:"graph.status.nodes"})}),e.jsx("span",{className:"font-medium",children:C.nodes.length})]}),e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsx("span",{className:"text-muted-foreground",children:n({id:"graph.status.edges"})}),e.jsx("span",{className:"font-medium",children:C.edges.length})]}),m&&e.jsx("div",{className:"text-xs text-muted-foreground",children:n({id:"graph.status.updating"})})]})})]})}),c&&e.jsx(Me,{selectedNode:o,showLegend:!o,onClose:te})]})]})}function Qe(){return e.jsx(xe,{children:e.jsx(Ve,{})})}export{Qe as GraphExplorerPage,Qe as default};
57
- //# sourceMappingURL=GraphExplorerPage-CPwRsfd2.js.map
57
+ //# sourceMappingURL=GraphExplorerPage-DS8ghMFM.js.map