claude-code-workflow 7.2.10 → 7.2.11

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 (322) hide show
  1. package/.claude/agents/cli-planning-agent.md +3 -0
  2. package/.claude/agents/debug-explore-agent.md +1 -0
  3. package/.claude/agents/tdd-developer.md +1 -0
  4. package/.claude/agents/team-worker.md +1 -1
  5. package/.claude/agents/test-action-planning-agent.md +3 -0
  6. package/.claude/agents/test-context-search-agent.md +1 -0
  7. package/.claude/agents/test-fix-agent.md +3 -0
  8. package/.claude/skills/review-code/SKILL.md +2 -0
  9. package/.claude/skills/review-cycle/SKILL.md +4 -0
  10. package/.claude/skills/skill-simplify/phases/02-optimize.md +4 -0
  11. package/.claude/skills/spec-generator/phases/05-epics-stories.md +4 -0
  12. package/.claude/skills/team-arch-opt/specs/team-config.json +5 -5
  13. package/.claude/skills/team-frontend-debug/roles/analyzer/role.md +3 -2
  14. package/.claude/skills/team-perf-opt/roles/coordinator/commands/monitor.md +1 -1
  15. package/.claude/skills/team-perf-opt/specs/team-config.json +5 -5
  16. package/.claude/skills/team-quality-assurance/roles/executor/role.md +2 -1
  17. package/.claude/skills/team-review/roles/reviewer/role.md +2 -1
  18. package/.claude/skills/team-tech-debt/roles/scanner/role.md +2 -1
  19. package/.claude/skills/team-testing/roles/executor/role.md +2 -1
  20. package/.claude/skills/team-testing/roles/generator/role.md +2 -1
  21. package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +2 -1
  22. package/.claude/skills/team-ux-improve/specs/team-config.json +6 -6
  23. package/.claude/skills/workflow-execute/phases/06-review.md +4 -4
  24. package/.claude/skills/workflow-lite-test-review/SKILL.md +2 -0
  25. package/.claude/skills/workflow-plan/phases/05-plan-verify.md +4 -0
  26. package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +1 -0
  27. package/.claude/skills/workflow-tdd-plan/phases/05-tdd-task-generation.md +2 -1
  28. package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +1 -0
  29. package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +2 -1
  30. package/.claude/skills/workflow-tune/SKILL.md +487 -0
  31. package/.claude/skills/workflow-tune/phases/01-setup.md +548 -0
  32. package/.claude/skills/workflow-tune/phases/02-step-execute.md +197 -0
  33. package/.claude/skills/workflow-tune/phases/03-step-analyze.md +386 -0
  34. package/.claude/skills/workflow-tune/phases/04-synthesize.md +257 -0
  35. package/.claude/skills/workflow-tune/phases/05-optimize-report.md +246 -0
  36. package/.claude/skills/workflow-tune/specs/workflow-eval-criteria.md +57 -0
  37. package/.claude/skills/workflow-tune/templates/step-analysis-prompt.md +88 -0
  38. package/.claude/skills/workflow-tune/templates/synthesis-prompt.md +90 -0
  39. package/.codex/skills/analyze-with-file/SKILL.md +2 -0
  40. package/.codex/skills/debug-with-file/SKILL.md +4 -0
  41. package/.codex/skills/issue-discover/SKILL.md +1 -0
  42. package/.codex/skills/review-cycle/phases/02-parallel-review.md +3 -0
  43. package/.codex/skills/team-designer/agents/validation-reporter.md +186 -0
  44. package/.codex/skills/team-iterdev/agents/gc-controller.md +193 -0
  45. package/.codex/skills/team-iterdev/agents/task-analyzer.md +206 -0
  46. package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +165 -0
  47. package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +163 -0
  48. package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +182 -0
  49. package/.codex/skills/team-uidesign/agents/completion-handler.md +177 -0
  50. package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +162 -0
  51. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +4 -0
  52. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +2 -0
  53. package/ccw/dist/commands/spec.d.ts.map +1 -1
  54. package/ccw/dist/commands/spec.js +9 -4
  55. package/ccw/dist/commands/spec.js.map +1 -1
  56. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  57. package/ccw/dist/core/routes/codexlens-routes.js +3 -1
  58. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  59. package/ccw/dist/tools/spec-index-builder.d.ts +8 -4
  60. package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -1
  61. package/ccw/dist/tools/spec-index-builder.js +8 -4
  62. package/ccw/dist/tools/spec-index-builder.js.map +1 -1
  63. package/ccw/dist/tools/spec-init.d.ts +1 -1
  64. package/ccw/dist/tools/spec-init.d.ts.map +1 -1
  65. package/ccw/dist/tools/spec-init.js +127 -0
  66. package/ccw/dist/tools/spec-init.js.map +1 -1
  67. package/ccw/dist/tools/spec-loader.d.ts.map +1 -1
  68. package/ccw/dist/tools/spec-loader.js +2 -1
  69. package/ccw/dist/tools/spec-loader.js.map +1 -1
  70. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js → AlertDialog-BW9jiZ-p.js} +2 -2
  71. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js.map → AlertDialog-BW9jiZ-p.js.map} +1 -1
  72. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js → AnalysisPage-ds-w_nVO.js} +2 -2
  73. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js.map → AnalysisPage-ds-w_nVO.js.map} +1 -1
  74. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js → ApiSettingsPage-DlCbXxTz.js} +2 -2
  75. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js.map → ApiSettingsPage-DlCbXxTz.js.map} +1 -1
  76. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js → CliModeToggle-Dq3nL4fF.js} +2 -2
  77. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js.map → CliModeToggle-Dq3nL4fF.js.map} +1 -1
  78. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js → CliSessionSharePage-BNDkEE4u.js} +2 -2
  79. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js.map → CliSessionSharePage-BNDkEE4u.js.map} +1 -1
  80. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js → CliViewerPage-ChM-uNx_.js} +2 -2
  81. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js.map → CliViewerPage-ChM-uNx_.js.map} +1 -1
  82. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js +2 -0
  83. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js.map +1 -0
  84. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js → Collapsible-CRNbykXN.js} +2 -2
  85. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js.map → Collapsible-CRNbykXN.js.map} +1 -1
  86. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js → CommandsManagerPage-C2JWcemF.js} +2 -2
  87. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js.map → CommandsManagerPage-C2JWcemF.js.map} +1 -1
  88. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js → DeepWikiPage-CvleOtJy.js} +2 -2
  89. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js.map → DeepWikiPage-CvleOtJy.js.map} +1 -1
  90. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js → EndpointsPage-CMOWQG64.js} +2 -2
  91. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js.map → EndpointsPage-CMOWQG64.js.map} +1 -1
  92. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js → ExplorerPage-DaFPRlNo.js} +2 -2
  93. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js.map → ExplorerPage-DaFPRlNo.js.map} +1 -1
  94. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js → FixSessionPage-CC4p04Az.js} +2 -2
  95. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js.map → FixSessionPage-CC4p04Az.js.map} +1 -1
  96. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js → FloatingFileBrowser-DROn1xZ5.js} +2 -2
  97. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js.map → FloatingFileBrowser-DROn1xZ5.js.map} +1 -1
  98. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js → FloatingPanel-CmL_yhDv.js} +2 -2
  99. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js.map → FloatingPanel-CmL_yhDv.js.map} +1 -1
  100. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js → GraphExplorerPage-DCV5ybKE.js} +2 -2
  101. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js.map → GraphExplorerPage-DCV5ybKE.js.map} +1 -1
  102. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js → HistoryPage-D0fYQZgc.js} +2 -2
  103. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js.map → HistoryPage-D0fYQZgc.js.map} +1 -1
  104. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js → HookManagerPage-D2FuJfsM.js} +2 -2
  105. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js.map → HookManagerPage-D2FuJfsM.js.map} +1 -1
  106. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js → InstallationsPage-tjklillZ.js} +2 -2
  107. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js.map → InstallationsPage-tjklillZ.js.map} +1 -1
  108. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js → IssueHubPage-E4JVrhO1.js} +2 -2
  109. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js.map → IssueHubPage-E4JVrhO1.js.map} +1 -1
  110. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js → LiteTasksPage-aJuRoyLt.js} +2 -2
  111. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js.map → LiteTasksPage-aJuRoyLt.js.map} +1 -1
  112. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js → McpManagerPage-BJeuWJv1.js} +2 -2
  113. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js.map → McpManagerPage-BJeuWJv1.js.map} +1 -1
  114. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js → MemoryPage-BI4FAXhs.js} +2 -2
  115. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js.map → MemoryPage-BI4FAXhs.js.map} +1 -1
  116. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js → NotFoundPage-DD2svchp.js} +2 -2
  117. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js.map → NotFoundPage-DD2svchp.js.map} +1 -1
  118. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js → OrchestratorPage-FC__7yYa.js} +2 -2
  119. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js.map → OrchestratorPage-FC__7yYa.js.map} +1 -1
  120. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js → ProjectOverviewPage-DBB_-FzV.js} +2 -2
  121. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js.map → ProjectOverviewPage-DBB_-FzV.js.map} +1 -1
  122. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js → PromptHistoryPage-BwOAvCH8.js} +2 -2
  123. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js.map → PromptHistoryPage-BwOAvCH8.js.map} +1 -1
  124. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js → ReviewSessionPage-Dd1-g_gp.js} +2 -2
  125. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js.map → ReviewSessionPage-Dd1-g_gp.js.map} +1 -1
  126. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js → RulesManagerPage-B3RGdsKD.js} +2 -2
  127. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js.map → RulesManagerPage-B3RGdsKD.js.map} +1 -1
  128. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js → SessionDetailPage-DM-W5R8K.js} +2 -2
  129. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js.map → SessionDetailPage-DM-W5R8K.js.map} +1 -1
  130. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js → SessionsPage-BVz1KCc7.js} +2 -2
  131. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js.map → SessionsPage-BVz1KCc7.js.map} +1 -1
  132. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js → SettingsPage-ComW7EZS.js} +4 -4
  133. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js.map → SettingsPage-ComW7EZS.js.map} +1 -1
  134. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js → SkillsManagerPage-CKom9XwV.js} +2 -2
  135. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js.map → SkillsManagerPage-CKom9XwV.js.map} +1 -1
  136. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js → SpecsSettingsPage-DQz7WP2s.js} +2 -2
  137. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js.map → SpecsSettingsPage-DQz7WP2s.js.map} +1 -1
  138. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js → Switch-BPMdND9H.js} +2 -2
  139. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js.map → Switch-BPMdND9H.js.map} +1 -1
  140. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js → TabsNavigation-qqt70VYL.js} +2 -2
  141. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js.map → TabsNavigation-qqt70VYL.js.map} +1 -1
  142. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js → TaskDrawer-BqK_qiHX.js} +2 -2
  143. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js.map → TaskDrawer-BqK_qiHX.js.map} +1 -1
  144. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js → TeamPage-u5_i0Rgh.js} +2 -2
  145. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js.map → TeamPage-u5_i0Rgh.js.map} +1 -1
  146. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js → TerminalDashboardPage-rUtC9e40.js} +2 -2
  147. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js.map → TerminalDashboardPage-rUtC9e40.js.map} +1 -1
  148. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js → archive-C3u8YNQF.js} +2 -2
  149. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js.map → archive-C3u8YNQF.js.map} +1 -1
  150. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js → archive-restore-DfQ998g5.js} +2 -2
  151. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js.map → archive-restore-DfQ998g5.js.map} +1 -1
  152. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js → arrow-right-BshJM9Po.js} +2 -2
  153. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js.map → arrow-right-BshJM9Po.js.map} +1 -1
  154. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js → bookmark-plus-D03qJyOZ.js} +2 -2
  155. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js.map → bookmark-plus-D03qJyOZ.js.map} +1 -1
  156. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js → bot-CyzWuwq0.js} +2 -2
  157. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js.map → bot-CyzWuwq0.js.map} +1 -1
  158. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js → braces-BPgtyjsG.js} +2 -2
  159. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js.map → braces-BPgtyjsG.js.map} +1 -1
  160. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js → circle-stop-Dix1AOmw.js} +2 -2
  161. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js.map → circle-stop-Dix1AOmw.js.map} +1 -1
  162. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js → cpu-CCQ4Q0Zh.js} +2 -2
  163. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js.map → cpu-CCQ4Q0Zh.js.map} +1 -1
  164. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js → ellipsis-vertical-BpTysg-Y.js} +2 -2
  165. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js.map → ellipsis-vertical-BpTysg-Y.js.map} +1 -1
  166. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js → eye-DGY1rAZs.js} +2 -2
  167. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js.map → eye-DGY1rAZs.js.map} +1 -1
  168. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js → eye-off-D8t3JfWG.js} +2 -2
  169. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js.map → eye-off-D8t3JfWG.js.map} +1 -1
  170. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js → file-json-BAdJb0n8.js} +2 -2
  171. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js.map → file-json-BAdJb0n8.js.map} +1 -1
  172. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js → file-text-DrJFiOUB.js} +2 -2
  173. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js.map → file-text-DrJFiOUB.js.map} +1 -1
  174. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js → filter-CKqzYbz7.js} +2 -2
  175. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js.map → filter-CKqzYbz7.js.map} +1 -1
  176. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js → folder-CV8511y9.js} +2 -2
  177. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js.map → folder-CV8511y9.js.map} +1 -1
  178. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js → gauge-XKvmu_uU.js} +2 -2
  179. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js.map → gauge-XKvmu_uU.js.map} +1 -1
  180. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js → globe-C56cDUzX.js} +2 -2
  181. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js.map → globe-C56cDUzX.js.map} +1 -1
  182. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js → grid-3x3-Bya-suFW.js} +2 -2
  183. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js.map → grid-3x3-Bya-suFW.js.map} +1 -1
  184. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js → hard-drive-CmuTZpsB.js} +2 -2
  185. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js.map → hard-drive-CmuTZpsB.js.map} +1 -1
  186. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js → hash-CRPT_tJQ.js} +2 -2
  187. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js.map → hash-CRPT_tJQ.js.map} +1 -1
  188. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js → history-C1pJZQCL.js} +2 -2
  189. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js.map → history-C1pJZQCL.js.map} +1 -1
  190. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js → index-B6TpijCe.js} +2 -2
  191. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js.map → index-B6TpijCe.js.map} +1 -1
  192. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js → index-Bcq-7r6F.js} +2 -2
  193. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js.map → index-Bcq-7r6F.js.map} +1 -1
  194. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js → index-CI8-rBff.js} +2 -2
  195. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js.map → index-CI8-rBff.js.map} +1 -1
  196. package/ccw/frontend/dist/assets/{index-CY6Lueph.js → index-Dmt9OiEf.js} +2 -2
  197. package/ccw/frontend/dist/assets/{index-CY6Lueph.js.map → index-Dmt9OiEf.js.map} +1 -1
  198. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js → index-anSMmEF8.js} +2 -2
  199. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js.map → index-anSMmEF8.js.map} +1 -1
  200. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js → index-dWT2M6Ef.js} +4 -4
  201. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js.map → index-dWT2M6Ef.js.map} +1 -1
  202. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js → layout-grid-TSO0BFQE.js} +2 -2
  203. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js.map → layout-grid-TSO0BFQE.js.map} +1 -1
  204. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js → lightbulb-Caj6fIQD.js} +2 -2
  205. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js.map → lightbulb-Caj6fIQD.js.map} +1 -1
  206. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js → link-2-DE9lMxa-.js} +2 -2
  207. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js.map → link-2-DE9lMxa-.js.map} +1 -1
  208. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js → link-BZtPgLW0.js} +2 -2
  209. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js.map → link-BZtPgLW0.js.map} +1 -1
  210. package/ccw/frontend/dist/assets/{list-CDmYFcio.js → list-DubWyY-U.js} +2 -2
  211. package/ccw/frontend/dist/assets/{list-CDmYFcio.js.map → list-DubWyY-U.js.map} +1 -1
  212. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js → map-pin-DwN_48AF.js} +2 -2
  213. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js.map → map-pin-DwN_48AF.js.map} +1 -1
  214. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js → messages-square-bjxvaiM9.js} +2 -2
  215. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js.map → messages-square-bjxvaiM9.js.map} +1 -1
  216. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js → minimize-2-CGfBKD_V.js} +2 -2
  217. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js.map → minimize-2-CGfBKD_V.js.map} +1 -1
  218. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js → package-nzWY6ilt.js} +2 -2
  219. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js.map → package-nzWY6ilt.js.map} +1 -1
  220. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js → plug-CiLce49C.js} +2 -2
  221. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js.map → plug-CiLce49C.js.map} +1 -1
  222. package/ccw/frontend/dist/assets/{power-DmIojFl-.js → power-CFLmB-U9.js} +2 -2
  223. package/ccw/frontend/dist/assets/{power-DmIojFl-.js.map → power-CFLmB-U9.js.map} +1 -1
  224. package/ccw/frontend/dist/assets/{save-BFa03OnG.js → save-DuO6OF0C.js} +2 -2
  225. package/ccw/frontend/dist/assets/{save-BFa03OnG.js.map → save-DuO6OF0C.js.map} +1 -1
  226. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js → send-CZk9p0mM.js} +2 -2
  227. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js.map → send-CZk9p0mM.js.map} +1 -1
  228. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js → square-check-big-BY_1YQQg.js} +2 -2
  229. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js.map → square-check-big-BY_1YQQg.js.map} +1 -1
  230. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js → square-pen-CnZgm6g-.js} +2 -2
  231. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js.map → square-pen-CnZgm6g-.js.map} +1 -1
  232. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js → star-Cn1F0qy7.js} +2 -2
  233. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js.map → star-Cn1F0qy7.js.map} +1 -1
  234. package/ccw/frontend/dist/assets/{style-CJsrp48L.js → style-Dxs1iXCV.js} +2 -2
  235. package/ccw/frontend/dist/assets/{style-CJsrp48L.js.map → style-Dxs1iXCV.js.map} +1 -1
  236. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js → target-Bz1fLRKH.js} +2 -2
  237. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js.map → target-Bz1fLRKH.js.map} +1 -1
  238. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js → test-tube-C6qCYlDr.js} +2 -2
  239. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js.map → test-tube-C6qCYlDr.js.map} +1 -1
  240. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js → upload-C71kd4Qs.js} +2 -2
  241. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js.map → upload-C71kd4Qs.js.map} +1 -1
  242. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js → useApiSettings-CqP2BAJ7.js} +2 -2
  243. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js.map → useApiSettings-CqP2BAJ7.js.map} +1 -1
  244. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js → useCli-PCoPoVeM.js} +2 -2
  245. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js.map → useCli-PCoPoVeM.js.map} +1 -1
  246. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js → useCommands-3OfPQPw4.js} +2 -2
  247. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js.map → useCommands-3OfPQPw4.js.map} +1 -1
  248. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js → useDebounce-bXiFhQx9.js} +2 -2
  249. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js.map → useDebounce-bXiFhQx9.js.map} +1 -1
  250. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js → useFileExplorer-DEyUm46_.js} +2 -2
  251. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js.map → useFileExplorer-DEyUm46_.js.map} +1 -1
  252. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js → useLocale-sXTrdxcJ.js} +2 -2
  253. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js.map → useLocale-sXTrdxcJ.js.map} +1 -1
  254. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js → useSkills-D0W0kXYm.js} +3 -3
  255. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js.map → useSkills-D0W0kXYm.js.map} +1 -1
  256. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js → useSystemSettings-DZ-8lZsG.js} +2 -2
  257. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js.map → useSystemSettings-DZ-8lZsG.js.map} +1 -1
  258. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js → wand-sparkles-83GmAYuw.js} +2 -2
  259. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js.map → wand-sparkles-83GmAYuw.js.map} +1 -1
  260. package/ccw/frontend/dist/index.html +1 -1
  261. package/package.json +1 -1
  262. package/.claude/skills/team-arch-opt/role-specs/analyzer.md +0 -80
  263. package/.claude/skills/team-arch-opt/role-specs/designer.md +0 -118
  264. package/.claude/skills/team-arch-opt/role-specs/refactorer.md +0 -106
  265. package/.claude/skills/team-arch-opt/role-specs/reviewer.md +0 -116
  266. package/.claude/skills/team-arch-opt/role-specs/validator.md +0 -117
  267. package/.claude/skills/team-brainstorm/role-specs/challenger.md +0 -63
  268. package/.claude/skills/team-brainstorm/role-specs/evaluator.md +0 -58
  269. package/.claude/skills/team-brainstorm/role-specs/ideator.md +0 -71
  270. package/.claude/skills/team-brainstorm/role-specs/synthesizer.md +0 -59
  271. package/.claude/skills/team-frontend/role-specs/analyst.md +0 -91
  272. package/.claude/skills/team-frontend/role-specs/architect.md +0 -85
  273. package/.claude/skills/team-frontend/role-specs/developer.md +0 -92
  274. package/.claude/skills/team-frontend/role-specs/qa.md +0 -78
  275. package/.claude/skills/team-issue/role-specs/explorer.md +0 -95
  276. package/.claude/skills/team-issue/role-specs/implementer.md +0 -89
  277. package/.claude/skills/team-issue/role-specs/integrator.md +0 -86
  278. package/.claude/skills/team-issue/role-specs/planner.md +0 -83
  279. package/.claude/skills/team-issue/role-specs/reviewer.md +0 -89
  280. package/.claude/skills/team-iterdev/role-specs/architect.md +0 -64
  281. package/.claude/skills/team-iterdev/role-specs/developer.md +0 -73
  282. package/.claude/skills/team-iterdev/role-specs/reviewer.md +0 -65
  283. package/.claude/skills/team-iterdev/role-specs/tester.md +0 -87
  284. package/.claude/skills/team-perf-opt/role-specs/benchmarker.md +0 -110
  285. package/.claude/skills/team-perf-opt/role-specs/optimizer.md +0 -102
  286. package/.claude/skills/team-perf-opt/role-specs/profiler.md +0 -73
  287. package/.claude/skills/team-perf-opt/role-specs/reviewer.md +0 -91
  288. package/.claude/skills/team-perf-opt/role-specs/strategist.md +0 -114
  289. package/.claude/skills/team-planex/role-specs/executor.md +0 -90
  290. package/.claude/skills/team-planex/role-specs/planner.md +0 -110
  291. package/.claude/skills/team-quality-assurance/role-specs/analyst.md +0 -79
  292. package/.claude/skills/team-quality-assurance/role-specs/executor.md +0 -64
  293. package/.claude/skills/team-quality-assurance/role-specs/generator.md +0 -67
  294. package/.claude/skills/team-quality-assurance/role-specs/scout.md +0 -66
  295. package/.claude/skills/team-quality-assurance/role-specs/strategist.md +0 -70
  296. package/.claude/skills/team-review/role-specs/fixer.md +0 -75
  297. package/.claude/skills/team-review/role-specs/reviewer.md +0 -66
  298. package/.claude/skills/team-review/role-specs/scanner.md +0 -70
  299. package/.claude/skills/team-roadmap-dev/role-specs/executor.md +0 -71
  300. package/.claude/skills/team-roadmap-dev/role-specs/planner.md +0 -77
  301. package/.claude/skills/team-roadmap-dev/role-specs/verifier.md +0 -73
  302. package/.claude/skills/team-tech-debt/role-specs/assessor.md +0 -70
  303. package/.claude/skills/team-tech-debt/role-specs/executor.md +0 -80
  304. package/.claude/skills/team-tech-debt/role-specs/planner.md +0 -71
  305. package/.claude/skills/team-tech-debt/role-specs/scanner.md +0 -85
  306. package/.claude/skills/team-tech-debt/role-specs/validator.md +0 -83
  307. package/.claude/skills/team-testing/role-specs/analyst.md +0 -94
  308. package/.claude/skills/team-testing/role-specs/executor.md +0 -97
  309. package/.claude/skills/team-testing/role-specs/generator.md +0 -96
  310. package/.claude/skills/team-testing/role-specs/strategist.md +0 -82
  311. package/.claude/skills/team-uidesign/role-specs/designer.md +0 -72
  312. package/.claude/skills/team-uidesign/role-specs/implementer.md +0 -74
  313. package/.claude/skills/team-uidesign/role-specs/researcher.md +0 -84
  314. package/.claude/skills/team-uidesign/role-specs/reviewer.md +0 -70
  315. package/.claude/skills/team-ux-improve/role-specs/designer.md +0 -191
  316. package/.claude/skills/team-ux-improve/role-specs/diagnoser.md +0 -110
  317. package/.claude/skills/team-ux-improve/role-specs/explorer.md +0 -109
  318. package/.claude/skills/team-ux-improve/role-specs/implementer.md +0 -164
  319. package/.claude/skills/team-ux-improve/role-specs/scanner.md +0 -117
  320. package/.claude/skills/team-ux-improve/role-specs/tester.md +0 -163
  321. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js +0 -2
  322. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FixSessionPage-C74-MPza.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-CC4p04Az.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-B6I7GQC5.js";import{F as M}from"./FloatingPanel-BGwmbJR1.js";import{u as S,a as A,T as P,F as V}from"./useFileExplorer-G5UoArCU.js";import{E as q}from"./eye-off-CGRUVRDR.js";import{E as G}from"./eye-DUy7aLEx.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-dWT2M6Ef.js";import{F as M}from"./FloatingPanel-CmL_yhDv.js";import{u as S,a as A,T as P,F as V}from"./useFileExplorer-DEyUm46_.js";import{E as q}from"./eye-off-D8t3JfWG.js";import{E as G}from"./eye-DGY1rAZs.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-x_-6y_n2.js.map
7
+ //# sourceMappingURL=FloatingFileBrowser-DROn1xZ5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingFileBrowser-x_-6y_n2.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-DROn1xZ5.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-B6I7GQC5.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-BGwmbJR1.js.map
1
+ import{r as s,j as e,c as l,X as u}from"./index-dWT2M6Ef.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-CmL_yhDv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingPanel-BGwmbJR1.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-CmL_yhDv.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 A,e as F,B as T,ap as X,f as Q,v as Y,h as W,dU 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,dV as me,F as ge,N as he,C as K,m as _}from"./index-B6I7GQC5.js";import{H as w,P as k,g as U,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-Cs2ShCCy.js";/* empty css */import{F as D}from"./filter-B4vOqP6B.js";import{F as we}from"./file-text-BoHsW2es.js";import{P as ke}from"./package-CoLVUZGJ.js";import{B as Te}from"./braces-Dqjg_eCO.js";/**
1
+ import{O as B,u as V,r as h,j as e,D as O,d as A,e as F,B as T,ap as X,f as Q,v as Y,h as W,dU 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,dV as me,F as ge,N as he,C as K,m as _}from"./index-dWT2M6Ef.js";import{H as w,P as k,g as U,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-CI8-rBff.js";/* empty css */import{F as D}from"./filter-CKqzYbz7.js";import{F as we}from"./file-text-DrJFiOUB.js";import{P as ke}from"./package-nzWY6ilt.js";import{B as Te}from"./braces-BPgtyjsG.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 A,e as F,B as T,ap as X,f as Q,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"})]})});J.displayName="VariableNode";const Le={module:v,class:L,function:E,variable:J,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]=U({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]=U({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 Ye(){return e.jsx(xe,{children:e.jsx(Ve,{})})}export{Ye as GraphExplorerPage,Ye as default};
57
- //# sourceMappingURL=GraphExplorerPage-Bg5-aQxi.js.map
57
+ //# sourceMappingURL=GraphExplorerPage-DCV5ybKE.js.map