claude-code-workflow 7.2.26 → 7.2.28

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 (408) hide show
  1. package/.ccw/specs/architecture-constraints.md +5 -0
  2. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +140 -0
  3. package/.claude/skills/investigate/SKILL.md +110 -0
  4. package/.claude/skills/investigate/phases/01-root-cause-investigation.md +132 -0
  5. package/.claude/skills/investigate/phases/02-pattern-analysis.md +126 -0
  6. package/.claude/skills/investigate/phases/03-hypothesis-testing.md +177 -0
  7. package/.claude/skills/investigate/phases/04-implementation.md +139 -0
  8. package/.claude/skills/investigate/phases/05-verification-report.md +153 -0
  9. package/.claude/skills/investigate/specs/debug-report-format.md +226 -0
  10. package/.claude/skills/investigate/specs/iron-law.md +101 -0
  11. package/.claude/skills/security-audit/SKILL.md +125 -0
  12. package/.claude/skills/security-audit/phases/01-supply-chain-scan.md +139 -0
  13. package/.claude/skills/security-audit/phases/02-owasp-review.md +156 -0
  14. package/.claude/skills/security-audit/phases/03-threat-modeling.md +180 -0
  15. package/.claude/skills/security-audit/phases/04-report-tracking.md +177 -0
  16. package/.claude/skills/security-audit/specs/owasp-checklist.md +442 -0
  17. package/.claude/skills/security-audit/specs/scoring-gates.md +141 -0
  18. package/.claude/skills/ship/SKILL.md +105 -0
  19. package/.claude/skills/ship/phases/01-preflight-checks.md +121 -0
  20. package/.claude/skills/ship/phases/02-code-review.md +137 -0
  21. package/.claude/skills/ship/phases/03-version-bump.md +171 -0
  22. package/.claude/skills/ship/phases/04-changelog-commit.md +167 -0
  23. package/.claude/skills/ship/phases/05-pr-creation.md +163 -0
  24. package/.claude/skills/skill-generator/templates/sequential-phase.md +10 -0
  25. package/.claude/skills/skill-generator/templates/skill-md.md +4 -0
  26. package/.claude/skills/team-arch-opt/SKILL.md +1 -1
  27. package/.claude/skills/team-arch-opt/roles/coordinator/commands/monitor.md +3 -1
  28. package/.claude/skills/team-arch-opt/roles/refactorer/role.md +3 -1
  29. package/.claude/skills/team-arch-opt/specs/team-config.json +2 -2
  30. package/.claude/skills/team-coordinate/SKILL.md +4 -3
  31. package/.claude/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +1 -1
  32. package/.claude/skills/team-coordinate/roles/coordinator/commands/dispatch.md +3 -2
  33. package/.claude/skills/team-coordinate/roles/coordinator/commands/monitor.md +3 -2
  34. package/.claude/skills/team-coordinate/roles/coordinator/role.md +16 -15
  35. package/.claude/skills/team-coordinate/specs/pipelines.md +7 -4
  36. package/.claude/skills/team-coordinate/specs/role-spec-template.md +1 -0
  37. package/.claude/skills/team-interactive-craft/SKILL.md +127 -0
  38. package/.claude/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
  39. package/.claude/skills/team-interactive-craft/roles/builder/role.md +216 -0
  40. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
  41. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +192 -0
  42. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +183 -0
  43. package/.claude/skills/team-interactive-craft/roles/coordinator/role.md +166 -0
  44. package/.claude/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
  45. package/.claude/skills/team-interactive-craft/roles/researcher/role.md +131 -0
  46. package/.claude/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
  47. package/.claude/skills/team-interactive-craft/specs/pipelines.md +85 -0
  48. package/.claude/skills/team-interactive-craft/specs/team-config.json +105 -0
  49. package/.claude/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
  50. package/.claude/skills/team-lifecycle-v4/SKILL.md +1 -1
  51. package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +14 -2
  52. package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +24 -2
  53. package/.claude/skills/team-lifecycle-v4/roles/executor/role.md +3 -1
  54. package/.claude/skills/team-motion-design/SKILL.md +129 -0
  55. package/.claude/skills/team-motion-design/roles/animator/role.md +194 -0
  56. package/.claude/skills/team-motion-design/roles/choreographer/role.md +164 -0
  57. package/.claude/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
  58. package/.claude/skills/team-motion-design/roles/coordinator/commands/dispatch.md +203 -0
  59. package/.claude/skills/team-motion-design/roles/coordinator/commands/monitor.md +184 -0
  60. package/.claude/skills/team-motion-design/roles/coordinator/role.md +167 -0
  61. package/.claude/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
  62. package/.claude/skills/team-motion-design/roles/motion-tester/role.md +175 -0
  63. package/.claude/skills/team-motion-design/specs/gpu-constraints.md +114 -0
  64. package/.claude/skills/team-motion-design/specs/motion-tokens.md +128 -0
  65. package/.claude/skills/team-motion-design/specs/pipelines.md +74 -0
  66. package/.claude/skills/team-motion-design/specs/reduced-motion.md +129 -0
  67. package/.claude/skills/team-motion-design/specs/team-config.json +99 -0
  68. package/.claude/skills/team-perf-opt/SKILL.md +1 -1
  69. package/.claude/skills/team-perf-opt/roles/optimizer/role.md +3 -1
  70. package/.claude/skills/team-perf-opt/specs/team-config.json +2 -2
  71. package/.claude/skills/team-quality-assurance/SKILL.md +1 -1
  72. package/.claude/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +4 -2
  73. package/.claude/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +4 -2
  74. package/.claude/skills/team-quality-assurance/roles/executor/role.md +3 -1
  75. package/.claude/skills/team-testing/SKILL.md +1 -1
  76. package/.claude/skills/team-testing/roles/coordinator/commands/dispatch.md +5 -2
  77. package/.claude/skills/team-testing/roles/coordinator/commands/monitor.md +4 -2
  78. package/.claude/skills/team-testing/roles/executor/role.md +3 -1
  79. package/.claude/skills/team-ui-polish/SKILL.md +127 -0
  80. package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
  81. package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
  82. package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
  83. package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
  84. package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
  85. package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
  86. package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
  87. package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
  88. package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
  89. package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
  90. package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
  91. package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
  92. package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
  93. package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
  94. package/.claude/skills/team-uidesign/SKILL.md +6 -1
  95. package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
  96. package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
  97. package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
  98. package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
  99. package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
  100. package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
  101. package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
  102. package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
  103. package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
  104. package/.claude/skills/team-ux-improve/SKILL.md +3 -0
  105. package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
  106. package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
  107. package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
  108. package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
  109. package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
  110. package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
  111. package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
  112. package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
  113. package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
  114. package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
  115. package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
  116. package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
  117. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
  118. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
  119. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
  120. package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
  121. package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
  122. package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
  123. package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
  124. package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
  125. package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
  126. package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
  127. package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
  128. package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
  129. package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
  130. package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
  131. package/.codex/skills/investigate/agents/investigator.md +392 -0
  132. package/.codex/skills/investigate/orchestrator.md +362 -0
  133. package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
  134. package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
  135. package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
  136. package/.codex/skills/investigate/phases/04-implementation.md +195 -0
  137. package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
  138. package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
  139. package/.codex/skills/security-audit/orchestrator.md +384 -0
  140. package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
  141. package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
  142. package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
  143. package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
  144. package/.codex/skills/ship/agents/ship-operator.md +318 -0
  145. package/.codex/skills/ship/orchestrator.md +426 -0
  146. package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
  147. package/.codex/skills/ship/phases/02-code-review.md +228 -0
  148. package/.codex/skills/ship/phases/03-version-bump.md +259 -0
  149. package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
  150. package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
  151. package/.codex/skills/team-interactive-craft/SKILL.md +220 -0
  152. package/.codex/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
  153. package/.codex/skills/team-interactive-craft/roles/builder/role.md +216 -0
  154. package/.codex/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
  155. package/.codex/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +162 -0
  156. package/.codex/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +233 -0
  157. package/.codex/skills/team-interactive-craft/roles/coordinator/role.md +209 -0
  158. package/.codex/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
  159. package/.codex/skills/team-interactive-craft/roles/researcher/role.md +131 -0
  160. package/.codex/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
  161. package/.codex/skills/team-interactive-craft/specs/pipelines.md +85 -0
  162. package/.codex/skills/team-interactive-craft/specs/team-config.json +105 -0
  163. package/.codex/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
  164. package/.codex/skills/team-motion-design/SKILL.md +222 -0
  165. package/.codex/skills/team-motion-design/roles/animator/role.md +194 -0
  166. package/.codex/skills/team-motion-design/roles/choreographer/role.md +164 -0
  167. package/.codex/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
  168. package/.codex/skills/team-motion-design/roles/coordinator/commands/dispatch.md +168 -0
  169. package/.codex/skills/team-motion-design/roles/coordinator/commands/monitor.md +242 -0
  170. package/.codex/skills/team-motion-design/roles/coordinator/role.md +210 -0
  171. package/.codex/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
  172. package/.codex/skills/team-motion-design/roles/motion-tester/role.md +175 -0
  173. package/.codex/skills/team-motion-design/specs/gpu-constraints.md +114 -0
  174. package/.codex/skills/team-motion-design/specs/motion-tokens.md +128 -0
  175. package/.codex/skills/team-motion-design/specs/pipelines.md +74 -0
  176. package/.codex/skills/team-motion-design/specs/reduced-motion.md +129 -0
  177. package/.codex/skills/team-motion-design/specs/team-config.json +99 -0
  178. package/.codex/skills/team-ui-polish/SKILL.md +218 -0
  179. package/.codex/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
  180. package/.codex/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +167 -0
  181. package/.codex/skills/team-ui-polish/roles/coordinator/commands/monitor.md +230 -0
  182. package/.codex/skills/team-ui-polish/roles/coordinator/role.md +213 -0
  183. package/.codex/skills/team-ui-polish/roles/diagnostician/role.md +164 -0
  184. package/.codex/skills/team-ui-polish/roles/optimizer/role.md +229 -0
  185. package/.codex/skills/team-ui-polish/roles/scanner/role.md +360 -0
  186. package/.codex/skills/team-ui-polish/roles/verifier/role.md +142 -0
  187. package/.codex/skills/team-ui-polish/specs/anti-patterns.md +141 -0
  188. package/.codex/skills/team-ui-polish/specs/design-standards.md +356 -0
  189. package/.codex/skills/team-ui-polish/specs/fix-strategies.md +235 -0
  190. package/.codex/skills/team-ui-polish/specs/pipelines.md +81 -0
  191. package/.codex/skills/team-ui-polish/specs/scoring-guide.md +162 -0
  192. package/.codex/skills/team-ui-polish/specs/team-config.json +73 -0
  193. package/.codex/skills/team-visual-a11y/SKILL.md +319 -0
  194. package/.codex/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
  195. package/.codex/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
  196. package/.codex/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +188 -0
  197. package/.codex/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +281 -0
  198. package/.codex/skills/team-visual-a11y/roles/coordinator/role.md +213 -0
  199. package/.codex/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
  200. package/.codex/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
  201. package/.codex/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
  202. package/.codex/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
  203. package/.codex/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
  204. package/.codex/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
  205. package/.codex/skills/team-visual-a11y/specs/pipelines.md +98 -0
  206. package/.codex/skills/team-visual-a11y/specs/team-config.json +109 -0
  207. package/.codex/skills/team-visual-a11y/specs/typography-scale.md +165 -0
  208. package/.codex/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
  209. package/README.md +8 -0
  210. package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
  211. package/ccw/dist/core/hooks/hook-templates.js +114 -1
  212. package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
  213. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/cli-routes.js +34 -0
  215. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/system-routes.js +2 -2
  217. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  218. package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-BjP1ydDR.js} +2 -2
  219. package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-BjP1ydDR.js.map} +1 -1
  220. package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-CAX3xqMf.js} +2 -2
  221. package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-CAX3xqMf.js.map} +1 -1
  222. package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-CtWlmztq.js} +2 -2
  223. package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-CtWlmztq.js.map} +1 -1
  224. package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-hR4a-eLX.js} +2 -2
  225. package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-hR4a-eLX.js.map} +1 -1
  226. package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-DzNPkFN9.js} +2 -2
  227. package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-DzNPkFN9.js.map} +1 -1
  228. package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BPEGN4TT.js} +2 -2
  229. package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BPEGN4TT.js.map} +1 -1
  230. package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cf0r2RHY.js} +2 -2
  231. package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cf0r2RHY.js.map} +1 -1
  232. package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DEm1rJ4h.js} +2 -2
  233. package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DEm1rJ4h.js.map} +1 -1
  234. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-BpeWw8HO.js} +2 -2
  235. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-BpeWw8HO.js.map} +1 -1
  236. package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-BEsmh2vF.js} +2 -2
  237. package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-BEsmh2vF.js.map} +1 -1
  238. package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-B30SFdtU.js} +2 -2
  239. package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-B30SFdtU.js.map} +1 -1
  240. package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-BVvMpg1O.js} +2 -2
  241. package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-BVvMpg1O.js.map} +1 -1
  242. package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-CL73dHbh.js} +2 -2
  243. package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-CL73dHbh.js.map} +1 -1
  244. package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-BL-28lMZ.js} +2 -2
  245. package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-BL-28lMZ.js.map} +1 -1
  246. package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BzZDciHZ.js} +2 -2
  247. package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BzZDciHZ.js.map} +1 -1
  248. package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-CDp6-d8P.js} +2 -2
  249. package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-CDp6-d8P.js.map} +1 -1
  250. package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-fZY_7O9n.js} +2 -2
  251. package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-fZY_7O9n.js.map} +1 -1
  252. package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-4LJeC9bq.js} +2 -2
  253. package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-4LJeC9bq.js.map} +1 -1
  254. package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-Bpigrbhw.js} +2 -2
  255. package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-Bpigrbhw.js.map} +1 -1
  256. package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-BP0zJc1R.js} +2 -2
  257. package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-BP0zJc1R.js.map} +1 -1
  258. package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-CSt2oVKQ.js} +2 -2
  259. package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-CSt2oVKQ.js.map} +1 -1
  260. package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-B-xaMA0w.js} +2 -2
  261. package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-B-xaMA0w.js.map} +1 -1
  262. package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-CJqo_7DY.js} +2 -2
  263. package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-CJqo_7DY.js.map} +1 -1
  264. package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-ibZeQA-Y.js} +2 -2
  265. package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-ibZeQA-Y.js.map} +1 -1
  266. package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-DgJ4ctPQ.js} +2 -2
  267. package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-DgJ4ctPQ.js.map} +1 -1
  268. package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-Cit0Yq0D.js} +2 -2
  269. package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-Cit0Yq0D.js.map} +1 -1
  270. package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-Ce1HDIK0.js} +2 -2
  271. package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-Ce1HDIK0.js.map} +1 -1
  272. package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-J1KikNrk.js} +2 -2
  273. package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-J1KikNrk.js.map} +1 -1
  274. package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CdBjTmth.js} +2 -2
  275. package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CdBjTmth.js.map} +1 -1
  276. package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-B9ZK7LvX.js} +2 -2
  277. package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-B9ZK7LvX.js.map} +1 -1
  278. package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-CW_nS5UR.js} +2 -2
  279. package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-CW_nS5UR.js.map} +1 -1
  280. package/ccw/frontend/dist/assets/{SettingsPage-BPDbXPSM.js → SettingsPage-B2PYzSoO.js} +35 -35
  281. package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +1 -0
  282. package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js → SkillsManagerPage-CTnWrrwp.js} +2 -2
  283. package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js.map → SkillsManagerPage-CTnWrrwp.js.map} +1 -1
  284. package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DJpi9XQL.js} +2 -2
  285. package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DJpi9XQL.js.map} +1 -1
  286. package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-Ac6Ov7uy.js} +2 -2
  287. package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-Ac6Ov7uy.js.map} +1 -1
  288. package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-DZAAspqR.js} +2 -2
  289. package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-DZAAspqR.js.map} +1 -1
  290. package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-BJkwfhIZ.js} +2 -2
  291. package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-BJkwfhIZ.js.map} +1 -1
  292. package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-BJgjxBgb.js} +2 -2
  293. package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-BJgjxBgb.js.map} +1 -1
  294. package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-D1WekoOy.js} +2 -2
  295. package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-D1WekoOy.js.map} +1 -1
  296. package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-DxemgIhF.js} +2 -2
  297. package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-DxemgIhF.js.map} +1 -1
  298. package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-CjS83f1V.js} +2 -2
  299. package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-CjS83f1V.js.map} +1 -1
  300. package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-B5PUcn8I.js} +2 -2
  301. package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-B5PUcn8I.js.map} +1 -1
  302. package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-DCc9aPbb.js} +2 -2
  303. package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-DCc9aPbb.js.map} +1 -1
  304. package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-DOwFtzak.js} +2 -2
  305. package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-DOwFtzak.js.map} +1 -1
  306. package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-96qH3aFh.js} +2 -2
  307. package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-96qH3aFh.js.map} +1 -1
  308. package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CCxSuil1.js} +2 -2
  309. package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CCxSuil1.js.map} +1 -1
  310. package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-CZNSJFdq.js} +2 -2
  311. package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-CZNSJFdq.js.map} +1 -1
  312. package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-h8xtvw2_.js} +2 -2
  313. package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-h8xtvw2_.js.map} +1 -1
  314. package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-D3NY0bm6.js} +2 -2
  315. package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-D3NY0bm6.js.map} +1 -1
  316. package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-Cy2vkc8p.js} +2 -2
  317. package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-Cy2vkc8p.js.map} +1 -1
  318. package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-Bzq3U1Mx.js} +2 -2
  319. package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-Bzq3U1Mx.js.map} +1 -1
  320. package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-DwuwPDPi.js} +2 -2
  321. package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-DwuwPDPi.js.map} +1 -1
  322. package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-q9g-bknU.js} +2 -2
  323. package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-q9g-bknU.js.map} +1 -1
  324. package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-CL6vb42J.js} +2 -2
  325. package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-CL6vb42J.js.map} +1 -1
  326. package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-BkrcQBly.js} +2 -2
  327. package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-BkrcQBly.js.map} +1 -1
  328. package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-BQbwyNeV.js} +2 -2
  329. package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-BQbwyNeV.js.map} +1 -1
  330. package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-x5_7DrN7.js} +2 -2
  331. package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-x5_7DrN7.js.map} +1 -1
  332. package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-DTyWXwzf.js} +2 -2
  333. package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-DTyWXwzf.js.map} +1 -1
  334. package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-80O0kJO7.js} +2 -2
  335. package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-80O0kJO7.js.map} +1 -1
  336. package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-DDlN2Bwa.js} +2 -2
  337. package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-DDlN2Bwa.js.map} +1 -1
  338. package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-B9A3Hnrk.js} +2 -2
  339. package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-B9A3Hnrk.js.map} +1 -1
  340. package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-Bs80iCX0.js} +2 -2
  341. package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-Bs80iCX0.js.map} +1 -1
  342. package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index-mbeo62f8.js} +2 -2
  343. package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index-mbeo62f8.js.map} +1 -1
  344. package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-rLgoBCfV.js} +3 -3
  345. package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-rLgoBCfV.js.map} +1 -1
  346. package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-C1niOWJx.js} +2 -2
  347. package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-C1niOWJx.js.map} +1 -1
  348. package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-BTmI7SUg.js} +2 -2
  349. package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-BTmI7SUg.js.map} +1 -1
  350. package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CB9HKeuZ.js} +2 -2
  351. package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CB9HKeuZ.js.map} +1 -1
  352. package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-koEYiemK.js} +2 -2
  353. package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-koEYiemK.js.map} +1 -1
  354. package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-v2_GaLdC.js} +2 -2
  355. package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-v2_GaLdC.js.map} +1 -1
  356. package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BQNfAqG_.js} +2 -2
  357. package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BQNfAqG_.js.map} +1 -1
  358. package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-Dzq5LGg9.js} +2 -2
  359. package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-Dzq5LGg9.js.map} +1 -1
  360. package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CtkoJXcz.js} +2 -2
  361. package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CtkoJXcz.js.map} +1 -1
  362. package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-CH3smL37.js} +2 -2
  363. package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-CH3smL37.js.map} +1 -1
  364. package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CZ0aL_yF.js} +2 -2
  365. package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CZ0aL_yF.js.map} +1 -1
  366. package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-F2A_J4l6.js} +2 -2
  367. package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-F2A_J4l6.js.map} +1 -1
  368. package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-Byxot0YU.js} +2 -2
  369. package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-Byxot0YU.js.map} +1 -1
  370. package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-JjqhUkpw.js} +2 -2
  371. package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-JjqhUkpw.js.map} +1 -1
  372. package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2--SuN9rAt.js} +2 -2
  373. package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2--SuN9rAt.js.map} +1 -1
  374. package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-BbngGB2h.js} +2 -2
  375. package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-BbngGB2h.js.map} +1 -1
  376. package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-CgrHgZSl.js} +2 -2
  377. package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-CgrHgZSl.js.map} +1 -1
  378. package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-BU3TQr7Z.js} +2 -2
  379. package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-BU3TQr7Z.js.map} +1 -1
  380. package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CKs7nnn3.js} +2 -2
  381. package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CKs7nnn3.js.map} +1 -1
  382. package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-DW5tsDW6.js} +2 -2
  383. package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-DW5tsDW6.js.map} +1 -1
  384. package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-BHm7w3ON.js} +2 -2
  385. package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-BHm7w3ON.js.map} +1 -1
  386. package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-DYR7PWwt.js} +2 -2
  387. package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-DYR7PWwt.js.map} +1 -1
  388. package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-D0TVgQD_.js} +2 -2
  389. package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-D0TVgQD_.js.map} +1 -1
  390. package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-DfY8mAP8.js} +2 -2
  391. package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-DfY8mAP8.js.map} +1 -1
  392. package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-CGusDp0F.js} +2 -2
  393. package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-CGusDp0F.js.map} +1 -1
  394. package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-CIwh0fF1.js} +2 -2
  395. package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-CIwh0fF1.js.map} +1 -1
  396. package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-FMyFv39K.js} +2 -2
  397. package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-FMyFv39K.js.map} +1 -1
  398. package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-B2qhsoTb.js} +2 -2
  399. package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-B2qhsoTb.js.map} +1 -1
  400. package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-cxKXMBm3.js} +3 -3
  401. package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-cxKXMBm3.js.map} +1 -1
  402. package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-B-xUT_z-.js} +2 -2
  403. package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-B-xUT_z-.js.map} +1 -1
  404. package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-DZV_3lPr.js} +2 -2
  405. package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-DZV_3lPr.js.map} +1 -1
  406. package/ccw/frontend/dist/index.html +1 -1
  407. package/package.json +105 -105
  408. package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FixSessionPage-CwGs6dhz.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-CL73dHbh.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-Dff4bg3u.js";import{F as M}from"./FloatingPanel-DYvgQZRD.js";import{u as S,a as A,T as P,F as V}from"./useFileExplorer-D4gPp-LB.js";import{E as q}from"./eye-off-D5uzLZyP.js";import{E as G}from"./eye-yAy69Cnn.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-rLgoBCfV.js";import{F as M}from"./FloatingPanel-BzZDciHZ.js";import{u as S,a as A,T as P,F as V}from"./useFileExplorer-FMyFv39K.js";import{E as q}from"./eye-off-Cy2vkc8p.js";import{E as G}from"./eye-D3NY0bm6.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-COZRBslc.js.map
7
+ //# sourceMappingURL=FloatingFileBrowser-BL-28lMZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingFileBrowser-COZRBslc.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-BL-28lMZ.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-Dff4bg3u.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-DYvgQZRD.js.map
1
+ import{r as s,j as e,c as l,X as u}from"./index-rLgoBCfV.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-BzZDciHZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingPanel-DYvgQZRD.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-BzZDciHZ.js","sources":["../../src/components/terminal-dashboard/FloatingPanel.tsx"],"sourcesContent":["// ========================================\r\n// FloatingPanel Component\r\n// ========================================\r\n// Generic floating panel container (Drawer style).\r\n// Slides in from left or right side, overlaying the terminal grid.\r\n\r\nimport { useCallback, useEffect, useRef } from 'react';\r\nimport { X } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ========== Types ==========\r\n\r\ninterface FloatingPanelProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n title: string;\r\n side?: 'left' | 'right';\r\n width?: number | string;\r\n children: React.ReactNode;\r\n}\r\n\r\n// ========== Component ==========\r\n\r\nexport function FloatingPanel({\r\n isOpen,\r\n onClose,\r\n title,\r\n side = 'left',\r\n width = 320,\r\n children,\r\n}: FloatingPanelProps) {\r\n const panelRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close on Escape key\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n document.addEventListener('keydown', handleKeyDown);\r\n return () => document.removeEventListener('keydown', handleKeyDown);\r\n }, [isOpen, onClose]);\r\n\r\n const handleBackdropClick = useCallback(\r\n (e: React.MouseEvent) => {\r\n if (e.target === e.currentTarget) onClose();\r\n },\r\n [onClose]\r\n );\r\n\r\n return (\r\n <>\r\n {/* Backdrop */}\r\n <div\r\n className={cn(\r\n 'fixed z-40 transition-opacity duration-200',\r\n isOpen ? 'opacity-100 pointer-events-auto' : 'opacity-0 pointer-events-none'\r\n )}\r\n style={{ top: '40px', bottom: 0, left: 0, right: 0 }}\r\n onClick={handleBackdropClick}\r\n >\r\n <div className=\"absolute inset-0 bg-black/20 pointer-events-none\" />\r\n </div>\r\n\r\n {/* Panel */}\r\n <div\r\n ref={panelRef}\r\n className={cn(\r\n 'fixed z-50 flex flex-col bg-background border-border shadow-lg',\r\n 'transition-transform duration-200 ease-out',\r\n side === 'left' && 'left-0 border-r',\r\n side === 'right' && 'right-0 border-l',\r\n // Transform based on open state and side\r\n side === 'left' && (isOpen ? 'translate-x-0' : '-translate-x-full'),\r\n side === 'right' && (isOpen ? 'translate-x-0' : 'translate-x-full'),\r\n )}\r\n style={{\r\n top: '40px', // Below toolbar\r\n height: 'calc(100vh - 40px)', // Full height below toolbar\r\n width: typeof width === 'number' ? `${width}px` : width,\r\n }}\r\n >\r\n {/* Panel header */}\r\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border shrink-0\">\r\n <h2 className=\"text-sm font-semibold\">{title}</h2>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n\r\n {/* Panel content */}\r\n <div className=\"flex-1 min-h-0 overflow-hidden\">\r\n {children}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":["FloatingPanel","isOpen","onClose","title","side","width","children","panelRef","useRef","useEffect","handleKeyDown","e","handleBackdropClick","useCallback","jsxs","Fragment","jsx","cn","X"],"mappings":"6DAuBO,SAASA,EAAc,CAC5B,OAAAC,EACA,QAAAC,EACA,MAAAC,EACA,KAAAC,EAAO,OACP,MAAAC,EAAQ,IACR,SAAAC,CACF,EAAuB,CACrB,MAAMC,EAAWC,EAAAA,OAAuB,IAAI,EAG5CC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACR,EAAQ,OACb,MAAMS,EAAiBC,GAAqB,CACtCA,EAAE,MAAQ,UAAUT,EAAA,CAC1B,EACA,gBAAS,iBAAiB,UAAWQ,CAAa,EAC3C,IAAM,SAAS,oBAAoB,UAAWA,CAAa,CACpE,EAAG,CAACT,EAAQC,CAAO,CAAC,EAEpB,MAAMU,EAAsBC,EAAAA,YACzBF,GAAwB,CACnBA,EAAE,SAAWA,EAAE,eAAeT,EAAA,CACpC,EACA,CAACA,CAAO,CAAA,EAGV,OACEY,EAAAA,KAAAC,WAAA,CAEE,SAAA,CAAAC,EAAAA,IAAC,MAAA,CACC,UAAWC,EACT,6CACAhB,EAAS,kCAAoC,+BAAA,EAE/C,MAAO,CAAE,IAAK,OAAQ,OAAQ,EAAG,KAAM,EAAG,MAAO,CAAA,EACjD,QAASW,EAET,SAAAI,EAAAA,IAAC,MAAA,CAAI,UAAU,kDAAA,CAAmD,CAAA,CAAA,EAIpEF,EAAAA,KAAC,MAAA,CACC,IAAKP,EACL,UAAWU,EACT,iEACA,6CACAb,IAAS,QAAU,kBACnBA,IAAS,SAAW,mBAEpBA,IAAS,SAAWH,EAAS,gBAAkB,qBAC/CG,IAAS,UAAYH,EAAS,gBAAkB,mBAAA,EAElD,MAAO,CACL,IAAK,OACL,OAAQ,qBACR,MAAO,OAAOI,GAAU,SAAW,GAAGA,CAAK,KAAOA,CAAA,EAIpD,SAAA,CAAAS,EAAAA,KAAC,MAAA,CAAI,UAAU,8EACb,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAb,EAAM,EAC7Ca,EAAAA,IAAC,SAAA,CACC,QAASd,EACT,UAAU,2FAEV,SAAAc,EAAAA,IAACE,EAAA,CAAE,UAAU,SAAA,CAAU,CAAA,CAAA,CACzB,EACF,EAGAF,EAAAA,IAAC,MAAA,CAAI,UAAU,iCACZ,SAAAV,CAAA,CACH,CAAA,CAAA,CAAA,CACF,EACF,CAEJ"}
@@ -1,4 +1,4 @@
1
- import{O as B,u as V,r as h,j as e,D as O,d as X,e as F,B as T,ap as A,f as Y,v as Q,h as W,dX as Z,R as re,a1 as ne,Z as de,av as ie,X as oe,c as H,aF as le,ab as ce,dY as me,F as ge,N as he,C as K,m as _}from"./index-Dff4bg3u.js";import{H as w,P as k,g as J,h as R,E as q,j as ue,R as xe,u as pe,i as be,B as fe,d as ye,C as je,M as Ne,c as ve}from"./index-B76AGix5.js";/* empty css */import{F as D}from"./filter-BOe-OTu1.js";import{F as we}from"./file-text-DRkrjie9.js";import{P as ke}from"./package-BjOw1ldU.js";import{B as Te}from"./braces-D9HdgsO6.js";/**
1
+ import{O as B,u as V,r as h,j as e,D as O,d as X,e as F,B as T,ap as A,f as Y,v as Q,h as W,dX as Z,R as re,a1 as ne,Z as de,av as ie,X as oe,c as H,aF as le,ab as ce,dY as me,F as ge,N as he,C as K,m as _}from"./index-rLgoBCfV.js";import{H as w,P as k,g as J,h as R,E as q,j as ue,R as xe,u as pe,i as be,B as fe,d as ye,C as je,M as Ne,c as ve}from"./index-Bs80iCX0.js";/* empty css */import{F as D}from"./filter-q9g-bknU.js";import{F as we}from"./file-text-DwuwPDPi.js";import{P as ke}from"./package-CH3smL37.js";import{B as Te}from"./braces-96qH3aFh.js";/**
2
2
  * @license lucide-react v0.460.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -54,4 +54,4 @@ import{O as B,u as V,r as h,j as e,D as O,d as X,e as F,B as T,ap as A,f as Y,v
54
54
  flex-shrink-0 w-2 h-2 rounded-full
55
55
  ${a==="error"?"bg-red-500":a==="warning"?"bg-amber-500":"bg-blue-500"}
56
56
  `})]}),s.documentation&&e.jsx("div",{className:"mt-2 text-xs text-muted-foreground font-mono",title:s.documentation,children:s.documentation}),e.jsx(w,{type:"source",position:k.Bottom,className:"!bg-cyan-500"})]})});U.displayName="VariableNode";const Le={module:v,class:L,function:E,variable:U,component:v,interface:L,file:v,folder:v,dependency:v,api:v,database:v,service:v,hook:E,utility:E,unknown:v},ee=h.memo(n=>{const{id:i,sourceX:o,sourceY:s,targetX:c,targetY:a,sourcePosition:r,targetPosition:t,selected:d,style:x,markerEnd:m}=n,l=n.data,[g]=J({sourceX:o,sourceY:s,sourcePosition:r,targetX:c,targetY:a,targetPosition:t}),N={...x,stroke:d?"#3b82f6":"#64748b",strokeWidth:d?2:1.5,strokeDasharray:(l==null?void 0:l.importType)==="dynamic"?"5,5":void 0};return e.jsxs(e.Fragment,{children:[e.jsx(R,{id:i,path:g,style:N,markerEnd:m}),(l==null?void 0:l.label)&&e.jsx(q,{children:e.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${(o+c)/2}px, ${(s+a)/2}px)`,pointerEvents:"all"},className:"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-gray-200 dark:border-gray-700",children:l.label})})]})});ee.displayName="ImportsEdge";const se=h.memo(n=>{const{id:i,sourceX:o,sourceY:s,targetX:c,targetY:a,sourcePosition:r,targetPosition:t,selected:d,style:x,markerEnd:m}=n,l=n.data,[g]=J({sourceX:o,sourceY:s,sourcePosition:r,targetX:c,targetY:a,targetPosition:t}),N={...x,stroke:d?"#10b981":"#22c55e",strokeWidth:d?2:1.5};return e.jsxs(e.Fragment,{children:[e.jsx(R,{id:i,path:g,style:N,markerEnd:m}),(l==null?void 0:l.label)&&e.jsx(q,{children:e.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${(o+c)/2}px, ${(s+a)/2}px)`,pointerEvents:"all"},className:"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-green-200 dark:border-green-700",children:l.label})})]})});se.displayName="CallsEdge";const z=h.memo(n=>{const{id:i,sourceX:o,sourceY:s,targetX:c,targetY:a,sourcePosition:r,targetPosition:t,selected:d,style:x,markerEnd:m}=n,l=n.data,[g]=ue({sourceX:o,sourceY:s,sourcePosition:r,targetX:c,targetY:a,targetPosition:t,borderRadius:20}),N={...x,stroke:d?"#f59e0b":"#a855f7",strokeWidth:2,strokeDasharray:"4,4"};return e.jsxs(e.Fragment,{children:[e.jsx(R,{id:i,path:g,style:N,markerEnd:m}),(l==null?void 0:l.label)&&e.jsx(q,{children:e.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${(o+c)/2}px, ${(s+a)/2}px)`,pointerEvents:"all"},className:"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-purple-200 dark:border-purple-700",children:l.label})})]})});z.displayName="InheritsEdge";const ze={imports:ee,calls:se,extends:z,implements:z};function Ve(){const{formatMessage:n}=V(),{fitView:i}=pe(),[o,s]=h.useState(null),[c,a]=h.useState(!0),[r,t]=h.useState({nodeTypes:["component","module","class","function","variable","interface","hook"],edgeTypes:["imports","exports","extends","implements","uses","calls","depends-on"],showIsolatedNodes:!1}),{graphData:d,isLoading:x,isFetching:m,error:l,refetch:g,applyFilters:N}=De({rootPath:"/src",maxDepth:3,enabled:!0}),C=h.useMemo(()=>N(r)||{nodes:[],edges:[],metadata:void 0},[d,r,N]),S=h.useMemo(()=>{const f={};return d==null||d.nodes.forEach(P=>{f[P.type]=(f[P.type]||0)+1}),f},[d]),M=h.useMemo(()=>{const f={};return d==null||d.edges.forEach(P=>{var G;const $=(G=P.data)==null?void 0:G.edgeType;$&&(f[$]=(f[$]||0)+1)}),f},[d]),u=h.useCallback((f,P)=>{s(P),a(!0)},[]),p=h.useCallback(()=>{s(null)},[]),b=h.useCallback(()=>{i({padding:.2,duration:300})},[i]),y=h.useCallback(async()=>{await g()},[g]),j=h.useCallback(f=>{t(f)},[]),ae=h.useCallback(()=>{t({nodeTypes:["component","module","class","function","variable","interface","hook"],edgeTypes:["imports","exports","extends","implements","uses","calls","depends-on"],showIsolatedNodes:!1})},[]),te=h.useCallback(()=>{a(!1),s(null)},[]);return x?e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(he,{className:"w-8 h-8 animate-spin text-muted-foreground"})}):l?e.jsx("div",{className:"flex items-center justify-center h-full p-6",children:e.jsx(K,{className:"p-6 border-red-200 dark:border-red-800",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{className:"w-5 h-5 text-red-500"}),e.jsx("p",{className:"text-sm text-red-600 dark:text-red-400",children:n({id:"graph.error.loading"},{message:l.message})})]})})}):!d||d.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(K,{className:"p-6",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(_,{className:"w-5 h-5 text-muted-foreground"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:n({id:"graph.empty"})})]})})}):e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(Se,{filters:r,onFiltersChange:j,onFitView:b,onRefresh:y,onResetFilters:ae,nodeTypeCounts:S,edgeTypeCounts:M}),e.jsxs("div",{className:"flex-1 flex overflow-hidden",children:[e.jsx("div",{className:"flex-1 relative",children:e.jsxs(be,{nodes:C.nodes,edges:C.edges,onNodeClick:u,onPaneClick:p,nodeTypes:Le,edgeTypes:ze,fitView:!0,defaultViewport:{x:0,y:0,zoom:.8},minZoom:.1,maxZoom:2,className:"bg-background",children:[e.jsx(fe,{variant:ye.Dots,gap:20,size:1}),e.jsx(je,{}),e.jsx(Ne,{nodeColor:f=>{switch(f.type){case"component":case"module":return"#3b82f6";case"class":return"#22c55e";case"function":return"#f97316";case"variable":return"#06b6d4";default:return"#6b7280"}},maskColor:"rgba(0, 0, 0, 0.1)"}),e.jsx(ve,{position:"top-left",className:"bg-card/90 backdrop-blur border border-border rounded-lg p-3 shadow-lg",children:e.jsxs("div",{className:"text-xs space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsx("span",{className:"text-muted-foreground",children:n({id:"graph.status.nodes"})}),e.jsx("span",{className:"font-medium",children:C.nodes.length})]}),e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsx("span",{className:"text-muted-foreground",children:n({id:"graph.status.edges"})}),e.jsx("span",{className:"font-medium",children:C.edges.length})]}),m&&e.jsx("div",{className:"text-xs text-muted-foreground",children:n({id:"graph.status.updating"})})]})})]})}),c&&e.jsx(Me,{selectedNode:o,showLegend:!o,onClose:te})]})]})}function Qe(){return e.jsx(xe,{children:e.jsx(Ve,{})})}export{Qe as GraphExplorerPage,Qe as default};
57
- //# sourceMappingURL=GraphExplorerPage-ewMHQGem.js.map
57
+ //# sourceMappingURL=GraphExplorerPage-CDp6-d8P.js.map