claude-code-workflow 7.2.27 → 7.2.29

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 (416) 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-interactive-craft/SKILL.md +127 -0
  27. package/.claude/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
  28. package/.claude/skills/team-interactive-craft/roles/builder/role.md +216 -0
  29. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
  30. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +192 -0
  31. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +183 -0
  32. package/.claude/skills/team-interactive-craft/roles/coordinator/role.md +166 -0
  33. package/.claude/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
  34. package/.claude/skills/team-interactive-craft/roles/researcher/role.md +131 -0
  35. package/.claude/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
  36. package/.claude/skills/team-interactive-craft/specs/pipelines.md +85 -0
  37. package/.claude/skills/team-interactive-craft/specs/team-config.json +105 -0
  38. package/.claude/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
  39. package/.claude/skills/team-motion-design/SKILL.md +129 -0
  40. package/.claude/skills/team-motion-design/roles/animator/role.md +194 -0
  41. package/.claude/skills/team-motion-design/roles/choreographer/role.md +164 -0
  42. package/.claude/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
  43. package/.claude/skills/team-motion-design/roles/coordinator/commands/dispatch.md +203 -0
  44. package/.claude/skills/team-motion-design/roles/coordinator/commands/monitor.md +184 -0
  45. package/.claude/skills/team-motion-design/roles/coordinator/role.md +167 -0
  46. package/.claude/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
  47. package/.claude/skills/team-motion-design/roles/motion-tester/role.md +175 -0
  48. package/.claude/skills/team-motion-design/specs/gpu-constraints.md +114 -0
  49. package/.claude/skills/team-motion-design/specs/motion-tokens.md +128 -0
  50. package/.claude/skills/team-motion-design/specs/pipelines.md +74 -0
  51. package/.claude/skills/team-motion-design/specs/reduced-motion.md +129 -0
  52. package/.claude/skills/team-motion-design/specs/team-config.json +99 -0
  53. package/.claude/skills/team-ui-polish/SKILL.md +127 -0
  54. package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
  55. package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
  56. package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
  57. package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
  58. package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
  59. package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
  60. package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
  61. package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
  62. package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
  63. package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
  64. package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
  65. package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
  66. package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
  67. package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
  68. package/.claude/skills/team-uidesign/SKILL.md +6 -1
  69. package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
  70. package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
  71. package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
  72. package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
  73. package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
  74. package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
  75. package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
  76. package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
  77. package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
  78. package/.claude/skills/team-ux-improve/SKILL.md +3 -0
  79. package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
  80. package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
  81. package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
  82. package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
  83. package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
  84. package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
  85. package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
  86. package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
  87. package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
  88. package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
  89. package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
  90. package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
  91. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
  92. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
  93. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
  94. package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
  95. package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
  96. package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
  97. package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
  98. package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
  99. package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
  100. package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
  101. package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
  102. package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
  103. package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
  104. package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
  105. package/.codex/skills/brainstorm/SKILL.md +3 -3
  106. package/.codex/skills/clean/SKILL.md +3 -3
  107. package/.codex/skills/investigate/agents/investigator.md +392 -0
  108. package/.codex/skills/investigate/orchestrator.md +362 -0
  109. package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
  110. package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
  111. package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
  112. package/.codex/skills/investigate/phases/04-implementation.md +195 -0
  113. package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
  114. package/.codex/skills/issue-discover/SKILL.md +13 -13
  115. package/.codex/skills/issue-discover/phases/02-discover.md +4 -4
  116. package/.codex/skills/issue-discover/phases/03-discover-by-prompt.md +3 -3
  117. package/.codex/skills/parallel-dev-cycle/SKILL.md +4 -4
  118. package/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md +6 -6
  119. package/.codex/skills/parallel-dev-cycle/phases/03-result-aggregation.md +10 -10
  120. package/.codex/skills/review-cycle/SKILL.md +10 -10
  121. package/.codex/skills/review-cycle/phases/02-parallel-review.md +6 -6
  122. package/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md +4 -4
  123. package/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md +4 -4
  124. package/.codex/skills/review-cycle/phases/08-fix-execution.md +2 -2
  125. package/.codex/skills/roadmap-with-file/SKILL.md +14 -14
  126. package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
  127. package/.codex/skills/security-audit/orchestrator.md +384 -0
  128. package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
  129. package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
  130. package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
  131. package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
  132. package/.codex/skills/ship/agents/ship-operator.md +318 -0
  133. package/.codex/skills/ship/orchestrator.md +426 -0
  134. package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
  135. package/.codex/skills/ship/phases/02-code-review.md +228 -0
  136. package/.codex/skills/ship/phases/03-version-bump.md +259 -0
  137. package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
  138. package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
  139. package/.codex/skills/spec-generator/README.md +1 -1
  140. package/.codex/skills/spec-generator/SKILL.md +184 -88
  141. package/.codex/skills/spec-generator/phases/01-5-requirement-clarification.md +4 -7
  142. package/.codex/skills/spec-generator/phases/01-discovery.md +30 -11
  143. package/.codex/skills/spec-generator/phases/02-product-brief.md +2 -5
  144. package/.codex/skills/spec-generator/phases/03-requirements.md +4 -6
  145. package/.codex/skills/spec-generator/phases/04-architecture.md +4 -6
  146. package/.codex/skills/spec-generator/phases/05-epics-stories.md +4 -6
  147. package/.codex/skills/spec-generator/phases/06-5-auto-fix.md +4 -5
  148. package/.codex/skills/spec-generator/phases/06-readiness-check.md +8 -8
  149. package/.codex/skills/spec-generator/phases/07-issue-export.md +2 -2
  150. package/.codex/skills/spec-setup/SKILL.md +4 -4
  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/.codex/skills/workflow-plan/SKILL.md +6 -6
  210. package/.codex/skills/workflow-tdd-plan/SKILL.md +5 -5
  211. package/.codex/skills/workflow-test-fix-cycle/SKILL.md +19 -19
  212. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +5 -5
  213. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +5 -5
  214. package/README.md +8 -0
  215. package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
  216. package/ccw/dist/core/hooks/hook-templates.js +114 -1
  217. package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
  218. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  219. package/ccw/dist/core/routes/cli-routes.js +34 -0
  220. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  221. package/ccw/dist/core/routes/system-routes.js +2 -2
  222. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  223. package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-exlTDW81.js} +3 -3
  224. package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-exlTDW81.js.map} +1 -1
  225. package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-cgV9LfAI.js} +2 -2
  226. package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-cgV9LfAI.js.map} +1 -1
  227. package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-Dk5jJdWt.js} +2 -2
  228. package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-Dk5jJdWt.js.map} +1 -1
  229. package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-Be9xsPiv.js} +2 -2
  230. package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-Be9xsPiv.js.map} +1 -1
  231. package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-Bh9jBtPI.js} +2 -2
  232. package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-Bh9jBtPI.js.map} +1 -1
  233. package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BrE-oyEq.js} +2 -2
  234. package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BrE-oyEq.js.map} +1 -1
  235. package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cd3nrC93.js} +2 -2
  236. package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cd3nrC93.js.map} +1 -1
  237. package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DXFl3VKF.js} +2 -2
  238. package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DXFl3VKF.js.map} +1 -1
  239. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-IV8zpjgX.js} +2 -2
  240. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-IV8zpjgX.js.map} +1 -1
  241. package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-CpDxtmRX.js} +2 -2
  242. package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-CpDxtmRX.js.map} +1 -1
  243. package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-BchjWe7s.js} +2 -2
  244. package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-BchjWe7s.js.map} +1 -1
  245. package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-CbWvaJ0y.js} +2 -2
  246. package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-CbWvaJ0y.js.map} +1 -1
  247. package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-YMjVRiCk.js} +2 -2
  248. package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-YMjVRiCk.js.map} +1 -1
  249. package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-JW2ehYY_.js} +2 -2
  250. package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-JW2ehYY_.js.map} +1 -1
  251. package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BtqzqDVq.js} +2 -2
  252. package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BtqzqDVq.js.map} +1 -1
  253. package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-BsJL_W4d.js} +3 -3
  254. package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-BsJL_W4d.js.map} +1 -1
  255. package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-BuWpQ7k5.js} +2 -2
  256. package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-BuWpQ7k5.js.map} +1 -1
  257. package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-D0BtMIWy.js} +2 -2
  258. package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-D0BtMIWy.js.map} +1 -1
  259. package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-C7dwsAKG.js} +2 -2
  260. package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-C7dwsAKG.js.map} +1 -1
  261. package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-D0nCNaeB.js} +2 -2
  262. package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-D0nCNaeB.js.map} +1 -1
  263. package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-B5c2Kb9r.js} +3 -3
  264. package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-B5c2Kb9r.js.map} +1 -1
  265. package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-C-S5CehM.js} +2 -2
  266. package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-C-S5CehM.js.map} +1 -1
  267. package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-P_B0JVUQ.js} +2 -2
  268. package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-P_B0JVUQ.js.map} +1 -1
  269. package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-S4Jn9LUE.js} +2 -2
  270. package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-S4Jn9LUE.js.map} +1 -1
  271. package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-C2Zlr7AC.js} +2 -2
  272. package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-C2Zlr7AC.js.map} +1 -1
  273. package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-CMVfz8s5.js} +2 -2
  274. package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-CMVfz8s5.js.map} +1 -1
  275. package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-YEMjFARX.js} +3 -3
  276. package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-YEMjFARX.js.map} +1 -1
  277. package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-DnTm55nG.js} +2 -2
  278. package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-DnTm55nG.js.map} +1 -1
  279. package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CUwebtO2.js} +2 -2
  280. package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CUwebtO2.js.map} +1 -1
  281. package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-0qyH1Z5P.js} +2 -2
  282. package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-0qyH1Z5P.js.map} +1 -1
  283. package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-BpgP4087.js} +2 -2
  284. package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-BpgP4087.js.map} +1 -1
  285. package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js +150 -0
  286. package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js.map +1 -0
  287. package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js +7 -0
  288. package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js.map +1 -0
  289. package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DT-yTVkD.js} +4 -4
  290. package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DT-yTVkD.js.map} +1 -1
  291. package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-CYSPdqWk.js} +2 -2
  292. package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-CYSPdqWk.js.map} +1 -1
  293. package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-CPh6Zor1.js} +2 -2
  294. package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-CPh6Zor1.js.map} +1 -1
  295. package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-Ds-8830B.js} +2 -2
  296. package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-Ds-8830B.js.map} +1 -1
  297. package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-CJODUxBk.js} +2 -2
  298. package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-CJODUxBk.js.map} +1 -1
  299. package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-Cn3fGUuO.js} +3 -3
  300. package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-Cn3fGUuO.js.map} +1 -1
  301. package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-CjwVpw6k.js} +2 -2
  302. package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-CjwVpw6k.js.map} +1 -1
  303. package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-2vZa9Ic3.js} +2 -2
  304. package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-2vZa9Ic3.js.map} +1 -1
  305. package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-CUU5XDgT.js} +2 -2
  306. package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-CUU5XDgT.js.map} +1 -1
  307. package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-Cc3nKRZ5.js} +2 -2
  308. package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-Cc3nKRZ5.js.map} +1 -1
  309. package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-BwpSRDUa.js} +2 -2
  310. package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-BwpSRDUa.js.map} +1 -1
  311. package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-DBzUW1XC.js} +2 -2
  312. package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-DBzUW1XC.js.map} +1 -1
  313. package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CGNNsjvE.js} +2 -2
  314. package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CGNNsjvE.js.map} +1 -1
  315. package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-D27G86Ul.js} +2 -2
  316. package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-D27G86Ul.js.map} +1 -1
  317. package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-C1Ij47Yz.js} +2 -2
  318. package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-C1Ij47Yz.js.map} +1 -1
  319. package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-C6MOB7Au.js} +2 -2
  320. package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-C6MOB7Au.js.map} +1 -1
  321. package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-BxfBlZ26.js} +2 -2
  322. package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-BxfBlZ26.js.map} +1 -1
  323. package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-NI237wA-.js} +2 -2
  324. package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-NI237wA-.js.map} +1 -1
  325. package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-Byn2_2v6.js} +2 -2
  326. package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-Byn2_2v6.js.map} +1 -1
  327. package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-D-7PhZjx.js} +2 -2
  328. package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-D-7PhZjx.js.map} +1 -1
  329. package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-BoAsK_FL.js} +2 -2
  330. package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-BoAsK_FL.js.map} +1 -1
  331. package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-DCSxJIS4.js} +2 -2
  332. package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-DCSxJIS4.js.map} +1 -1
  333. package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-CHS3prza.js} +2 -2
  334. package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-CHS3prza.js.map} +1 -1
  335. package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-D7K35U7S.js} +2 -2
  336. package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-D7K35U7S.js.map} +1 -1
  337. package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-eq9xE07G.js} +2 -2
  338. package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-eq9xE07G.js.map} +1 -1
  339. package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-C1DMpBua.js} +2 -2
  340. package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-C1DMpBua.js.map} +1 -1
  341. package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-Di5SBCY-.js} +2 -2
  342. package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-Di5SBCY-.js.map} +1 -1
  343. package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index--_R7COnA.js} +2 -2
  344. package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index--_R7COnA.js.map} +1 -1
  345. package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-BUol9HDD.js} +3 -3
  346. package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-BUol9HDD.js.map} +1 -1
  347. package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-CT9oykfw.js} +2 -2
  348. package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-CT9oykfw.js.map} +1 -1
  349. package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-Ddwvf87H.js} +2 -2
  350. package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-Ddwvf87H.js.map} +1 -1
  351. package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-LiX0qZbN.js} +2 -2
  352. package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-LiX0qZbN.js.map} +1 -1
  353. package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-CL3DVEwb.js} +2 -2
  354. package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-CL3DVEwb.js.map} +1 -1
  355. package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CC5cFeq6.js} +2 -2
  356. package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CC5cFeq6.js.map} +1 -1
  357. package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-ngFQ9bs0.js} +2 -2
  358. package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-ngFQ9bs0.js.map} +1 -1
  359. package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-BEU6I0KK.js} +2 -2
  360. package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-BEU6I0KK.js.map} +1 -1
  361. package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BWZdLA6y.js} +2 -2
  362. package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BWZdLA6y.js.map} +1 -1
  363. package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-K6_Chm7n.js} +2 -2
  364. package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-K6_Chm7n.js.map} +1 -1
  365. package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CWkphauf.js} +2 -2
  366. package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CWkphauf.js.map} +1 -1
  367. package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-DrNgkamn.js} +2 -2
  368. package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-DrNgkamn.js.map} +1 -1
  369. package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CMo3sw5_.js} +2 -2
  370. package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CMo3sw5_.js.map} +1 -1
  371. package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-DppNTW5e.js} +2 -2
  372. package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-DppNTW5e.js.map} +1 -1
  373. package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-CD8aPMbZ.js} +2 -2
  374. package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-CD8aPMbZ.js.map} +1 -1
  375. package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-B4z90fQD.js} +2 -2
  376. package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-B4z90fQD.js.map} +1 -1
  377. package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2-CAKRU_QC.js} +2 -2
  378. package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2-CAKRU_QC.js.map} +1 -1
  379. package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-KhI3HrzX.js} +2 -2
  380. package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-KhI3HrzX.js.map} +1 -1
  381. package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-BtdGIpuq.js} +2 -2
  382. package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-BtdGIpuq.js.map} +1 -1
  383. package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-ZoBUkXoD.js} +2 -2
  384. package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-ZoBUkXoD.js.map} +1 -1
  385. package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CltxQP-P.js} +2 -2
  386. package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CltxQP-P.js.map} +1 -1
  387. package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-C32OUSGf.js} +2 -2
  388. package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-C32OUSGf.js.map} +1 -1
  389. package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-0IxoyAVZ.js} +2 -2
  390. package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-0IxoyAVZ.js.map} +1 -1
  391. package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-4eKCkyBn.js} +2 -2
  392. package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-4eKCkyBn.js.map} +1 -1
  393. package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-zLTUWqhi.js} +2 -2
  394. package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-zLTUWqhi.js.map} +1 -1
  395. package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-BtN2vpOX.js} +2 -2
  396. package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-BtN2vpOX.js.map} +1 -1
  397. package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-_spj49qL.js} +2 -2
  398. package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-_spj49qL.js.map} +1 -1
  399. package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-Bm9KFZvd.js} +2 -2
  400. package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-Bm9KFZvd.js.map} +1 -1
  401. package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-DOmpm6v9.js} +2 -2
  402. package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-DOmpm6v9.js.map} +1 -1
  403. package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-D2rj4rea.js} +2 -2
  404. package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-D2rj4rea.js.map} +1 -1
  405. package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-OskEpomF.js} +3 -3
  406. package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-OskEpomF.js.map} +1 -1
  407. package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-BjMgsNSF.js} +2 -2
  408. package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-BjMgsNSF.js.map} +1 -1
  409. package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-CLhyYWa7.js} +2 -2
  410. package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-CLhyYWa7.js.map} +1 -1
  411. package/ccw/frontend/dist/index.html +1 -1
  412. package/package.json +105 -105
  413. package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js +0 -150
  414. package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
  415. package/ccw/frontend/dist/assets/SkillsManagerPage-D3LzbpJY.js +0 -7
  416. package/ccw/frontend/dist/assets/SkillsManagerPage-D3LzbpJY.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{j as e,C as U,a as X,c as b,u as J,Z as le,S as re,F as ce,b as A,B as x,D as W,d as Y,e as f,f as ee,g as F,h as E,T as de,i as oe,L as me,k as H,l as xe,R as se,m as T,n as he,r as y,o as Q,s as pe,p as ue,q as ge,t as fe,I as je,X as K,v as ve,w as Ne,x as we,y as ye,z as be,A as Ce,E as ke,G as Se}from"./index-Dff4bg3u.js";import{F as I}from"./file-text-DRkrjie9.js";import{T as Fe}from"./test-tube-wciJaoas.js";import{E as De}from"./ellipsis-vertical-CbNlw2gS.js";import{E as Me}from"./eye-yAy69Cnn.js";import{A as _e}from"./archive-CQJ86bQp.js";import{T as Le}from"./TabsNavigation-BGsKy7DO.js";import{M as Pe,a as Te}from"./minimize-2-DO-zbT3a.js";import{F as Ae}from"./filter-BOe-OTu1.js";const Ee={planning:{variant:"info"},in_progress:{variant:"warning"},completed:{variant:"success"},archived:{variant:"secondary"},paused:{variant:"default"}},V={planning:"sessions.status.planning",in_progress:"sessions.status.inProgress",completed:"sessions.status.completed",archived:"sessions.status.archived",paused:"sessions.status.paused"},Ie={review:{variant:"review",icon:A},tdd:{variant:"success",icon:Fe},test:{variant:"info",icon:I},docs:{variant:"warning",icon:ce},workflow:{variant:"default",icon:re},"lite-plan":{variant:"secondary",icon:I},"lite-fix":{variant:"destructive",icon:le}},Z={review:"sessions.type.review",tdd:"sessions.type.tdd",test:"sessions.type.test",docs:"sessions.type.docs",workflow:"sessions.type.workflow","lite-plan":"sessions.type.lite-plan","lite-fix":"sessions.type.lite-fix"};function q(s){if(!s)return"Unknown";try{return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}catch{return"Invalid date"}}function ze(s){if(!s||s.length===0)return{total:0,completed:0,failed:0,pending:0,inProgress:0,percentage:0};const d=s.length,o=s.filter(r=>r.status==="completed").length,h=s.filter(r=>r.status==="blocked"||r.status==="skipped").length,n=s.filter(r=>r.status==="in_progress").length,g=s.filter(r=>r.status==="pending").length,l=Math.round(o/d*100);return{total:d,completed:o,failed:h,pending:g,inProgress:n,percentage:l}}function Be(s){if(!(s!=null&&s.dimensions)||s.dimensions.length===0)return{total:0,critical:0,high:0,medium:0,low:0};let d=0,o=0,h=0,n=0;return s.dimensions.forEach(l=>{l.findings&&l.findings.forEach(r=>{var u;const t=(u=r.severity)==null?void 0:u.toLowerCase();t==="critical"?d++:t==="high"?o++:t==="medium"?h++:t==="low"&&n++})}),{total:d+o+h+n,critical:d,high:o,medium:h,low:n}}function Ke({session:s,onView:d,onArchive:o,onDelete:h,onClick:n,className:g,showActions:l=!0,actionsDisabled:r=!1}){var k,_,L;const{formatMessage:t}=J(),{variant:u}=Ee[s.status]||{variant:"default"},D=V[s.status]?t({id:V[s.status]}):t({id:"common.status.unknown"}),j=s.type?Ie[s.type]:null,v=s.type&&Z[s.type]?t({id:Z[s.type]}):null,i=ze(s.tasks),p=Be(s.review),C=s.status==="planning",z=s.status==="archived"||s.location==="archived",M=c=>{c.target.closest("[data-radix-popper-content-wrapper]")||n==null||n(s.session_id)},w=(c,N)=>{switch(c.stopPropagation(),N){case"view":d==null||d(s.session_id);break;case"archive":o==null||o(s.session_id);break;case"delete":h==null||h(s.session_id);break}};return e.jsx(U,{className:b("group cursor-pointer transition-all duration-200 hover:shadow-md hover:border-primary/30",C&&"border-info/30 bg-info/5",g),onClick:M,children:e.jsxs(X,{className:"p-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-2",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[j&&v&&e.jsxs(x,{variant:j.variant,className:"gap-1 flex-shrink-0",children:[e.jsx(j.icon,{className:"h-3 w-3"}),v]}),e.jsx("h3",{className:"font-bold text-card-foreground text-sm tracking-wide uppercase truncate",children:s.session_id})]})}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx(x,{variant:u,children:D}),l&&e.jsxs(W,{children:[e.jsx(Y,{asChild:!0,children:e.jsxs(f,{variant:"ghost",size:"icon",className:"h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity",onClick:c=>c.stopPropagation(),disabled:r,children:[e.jsx(De,{className:"h-4 w-4"}),e.jsx("span",{className:"sr-only",children:t({id:"common.aria.actions"})})]})}),e.jsxs(ee,{align:"end",children:[e.jsxs(F,{onClick:c=>w(c,"view"),children:[e.jsx(Me,{className:"mr-2 h-4 w-4"}),t({id:"sessions.actions.viewDetails"})]}),!z&&e.jsxs(e.Fragment,{children:[e.jsx(E,{}),e.jsxs(F,{onClick:c=>w(c,"archive"),children:[e.jsx(_e,{className:"mr-2 h-4 w-4"}),t({id:"sessions.actions.archive"})]})]}),e.jsx(E,{}),e.jsxs(F,{onClick:c=>w(c,"delete"),className:"text-destructive focus:text-destructive",children:[e.jsx(de,{className:"mr-2 h-4 w-4"}),t({id:"sessions.actions.delete"})]})]})]})]})]}),s.title&&e.jsx("p",{className:"text-sm text-foreground line-clamp-2 mb-3",children:s.title}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-2 text-xs text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(oe,{className:"h-3.5 w-3.5"}),q(s.created_at)]}),s.type==="review"?e.jsxs(e.Fragment,{children:[((k=s.review)==null?void 0:k.dimensions)&&s.review.dimensions.length>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(A,{className:"h-3.5 w-3.5"}),s.review.dimensions.length," ",t({id:"sessions.card.dimensions"})]}),((_=s.review)==null?void 0:_.findings)!==void 0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(I,{className:"h-3.5 w-3.5"}),typeof s.review.findings=="number"?s.review.findings:((L=s.review.dimensions)==null?void 0:L.reduce((c,N)=>{var P;return c+(((P=N.findings)==null?void 0:P.length)||0)},0))||0," ",t({id:"sessions.card.findings"})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(me,{className:"h-3.5 w-3.5"}),i.total," ",t({id:"sessions.card.tasks"})]}),i.total>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(H,{className:"h-3.5 w-3.5 text-success"}),i.completed," ",t({id:"sessions.card.completed"})]})]}),s.updated_at&&s.updated_at!==s.created_at&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(xe,{className:"h-3.5 w-3.5"}),t({id:"sessions.card.updated"}),": ",q(s.updated_at)]})]}),s.type!=="review"&&i.total>0&&e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 mt-2",children:[i.inProgress>0&&e.jsxs(x,{variant:"info",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(se,{className:"h-3 w-3"}),i.inProgress," ",t({id:"sessions.taskStatus.inProgress"})]}),i.completed>0&&e.jsxs(x,{variant:"success",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(H,{className:"h-3 w-3"}),i.completed," ",t({id:"sessions.taskStatus.completed"})]}),i.failed>0&&e.jsxs(x,{variant:"destructive",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(T,{className:"h-3 w-3"}),i.failed," ",t({id:"sessions.taskStatus.failed"})]})]}),s.type==="review"&&p.total>0&&e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 mt-2",children:[p.critical>0&&e.jsxs(x,{variant:"destructive",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(T,{className:"h-3 w-3"}),p.critical," Critical"]}),p.high>0&&e.jsxs(x,{variant:"warning",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(T,{className:"h-3 w-3"}),p.high," High"]}),p.medium>0&&e.jsxs(x,{variant:"info",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(A,{className:"h-3 w-3"}),p.medium," Medium"]}),p.low>0&&e.jsxs(x,{variant:"secondary",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(I,{className:"h-3 w-3"}),p.low," Low"]})]}),s.type!=="review"&&i.total>0&&!C&&e.jsxs("div",{className:"mt-3",children:[e.jsxs("div",{className:"flex items-center justify-between text-xs mb-1",children:[e.jsx("span",{className:"text-muted-foreground",children:t({id:"sessions.card.progress"})}),e.jsxs("span",{className:"text-card-foreground font-medium",children:[i.completed,"/",i.total," (",i.percentage,"%)"]})]}),e.jsx("div",{className:"h-1.5 w-full rounded-full bg-muted overflow-hidden",children:e.jsx("div",{className:b("h-full transition-all duration-300",i.percentage===100?"bg-success":"bg-primary"),style:{width:`${i.percentage}%`}})})]}),s.description&&s.description!==s.title&&e.jsx("p",{className:"mt-2 text-xs text-muted-foreground line-clamp-2 italic",children:s.description})]})})}function $e({className:s}){return e.jsx(U,{className:b("animate-pulse",s),children:e.jsxs(X,{className:"p-4",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"h-5 w-32 rounded bg-muted"}),e.jsx("div",{className:"mt-1 h-3 w-24 rounded bg-muted"})]}),e.jsx("div",{className:"h-5 w-16 rounded-full bg-muted"})]}),e.jsxs("div",{className:"mt-3 flex gap-4",children:[e.jsx("div",{className:"h-4 w-20 rounded bg-muted"}),e.jsx("div",{className:"h-4 w-16 rounded bg-muted"})]}),e.jsxs("div",{className:"mt-2 flex gap-1.5",children:[e.jsx("div",{className:"h-5 w-16 rounded-full bg-muted"}),e.jsx("div",{className:"h-5 w-20 rounded-full bg-muted"}),e.jsx("div",{className:"h-5 w-18 rounded-full bg-muted"})]}),e.jsx("div",{className:"mt-3",children:e.jsx("div",{className:"h-1.5 w-full rounded-full bg-muted"})})]})})}const G={planning:"sessions.status.planning",in_progress:"sessions.status.inProgress",completed:"sessions.status.completed",archived:"sessions.status.archived",paused:"sessions.status.paused"};function Xe(){const{formatMessage:s}=J(),d=he(),[o,h]=y.useState("active"),[n,g]=y.useState(""),[l,r]=y.useState([]),[t,u]=y.useState(!1),[D,j]=y.useState(null),v=Q(pe),i=Q(a=>a.toggleImmersiveMode),p=y.useMemo(()=>({location:o,search:n,status:l.length>0?l:void 0}),[o,n,l]),{filteredSessions:C,isLoading:z,isFetching:M,error:w,refetch:k}=ue({filter:p}),{archiveSession:_,isArchiving:L}=ge(),{deleteSession:c,isDeleting:N}=fe(),P=L||N,$=(a,m)=>{d(m==="review"?`/sessions/${a}/review`:`/sessions/${a}`)},ae=async a=>{try{await _(a)}catch(m){console.error("Failed to archive session:",m)}},te=a=>{j(a),u(!0)},ie=async()=>{if(D)try{await c(D),u(!1),j(null)}catch(a){console.error("Failed to delete session:",a)}},O=()=>{g("")},R=a=>{r(m=>m.includes(a)?m.filter(ne=>ne!==a):[...m,a])},B=()=>{r([]),g("")},S=l.length>0||n.length>0;return e.jsxs("div",{className:b("space-y-6",v&&"h-screen overflow-hidden"),children:[e.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold text-foreground",children:s({id:"sessions.title"})}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:s({id:"sessions.description"})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(f,{variant:"outline",size:"sm",onClick:()=>k(),disabled:M,children:[e.jsx(se,{className:b("h-4 w-4 mr-2",M&&"animate-spin")}),s({id:"common.actions.refresh"})]}),e.jsx("button",{onClick:i,className:b("p-2 rounded-md transition-colors",v?"bg-primary/10 text-primary":"text-muted-foreground hover:text-foreground hover:bg-muted"),title:s(v?{id:"common.exitFullscreen",defaultMessage:"Exit Fullscreen"}:{id:"common.fullscreen",defaultMessage:"Fullscreen"}),children:v?e.jsx(Pe,{className:"w-4 h-4"}):e.jsx(Te,{className:"w-4 h-4"})})]})]}),w&&e.jsxs("div",{className:"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive",children:[e.jsx(T,{className:"h-5 w-5 flex-shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium",children:s({id:"common.errors.loadFailed"})}),e.jsx("p",{className:"text-xs mt-0.5",children:w.message})]}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>k(),children:s({id:"home.errors.retry"})})]}),e.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center",children:[e.jsx(Le,{value:o,onValueChange:a=>h(a),tabs:[{value:"active",label:s({id:"sessions.filters.active"})},{value:"archived",label:s({id:"sessions.filters.archived"})},{value:"all",label:s({id:"sessions.filters.all"})}]}),e.jsxs("div",{className:"flex-1 max-w-sm relative",children:[e.jsx(A,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(je,{placeholder:s({id:"sessions.searchPlaceholder"}),value:n,onChange:a=>g(a.target.value),className:"pl-9 pr-9"}),n&&e.jsx("button",{onClick:O,className:"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",children:e.jsx(K,{className:"h-4 w-4"})})]}),e.jsxs(W,{children:[e.jsx(Y,{asChild:!0,children:e.jsxs(f,{variant:"outline",size:"sm",className:"gap-2",children:[e.jsx(Ae,{className:"h-4 w-4"}),s({id:"common.actions.filter"}),l.length>0&&e.jsx(x,{variant:"secondary",className:"ml-1 h-5 min-w-5 px-1",children:l.length})]})}),e.jsxs(ee,{align:"end",className:"w-48",children:[e.jsx(ve,{children:s({id:"common.status.label"})}),e.jsx(E,{}),["planning","in_progress","completed","paused"].map(a=>e.jsxs(F,{onClick:()=>R(a),className:"justify-between",children:[e.jsx("span",{children:s({id:G[a]})}),l.includes(a)&&e.jsx("span",{className:"text-primary",children:"✓"})]},a)),S&&e.jsxs(e.Fragment,{children:[e.jsx(E,{}),e.jsx(F,{onClick:B,className:"text-destructive",children:s({id:"common.actions.clearFilters"})})]})]})]})]}),S&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:[s({id:"common.actions.filters"}),":"]}),l.map(a=>e.jsxs(x,{variant:"secondary",className:"cursor-pointer",onClick:()=>R(a),children:[s({id:G[a]}),e.jsx(K,{className:"ml-1 h-3 w-3"})]},a)),n&&e.jsxs(x,{variant:"secondary",className:"cursor-pointer",onClick:O,children:[s({id:"common.actions.search"}),": ",n,e.jsx(K,{className:"ml-1 h-3 w-3"})]}),e.jsx(f,{variant:"ghost",size:"sm",onClick:B,className:"h-6 text-xs",children:s({id:"common.actions.clearAll"})})]}),z?e.jsx("div",{className:"grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3",children:Array.from({length:9}).map((a,m)=>e.jsx($e,{},m))}):C.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center py-16 px-4 border border-dashed border-border rounded-lg",children:[e.jsx(Ne,{className:"h-12 w-12 text-muted-foreground mb-4"}),e.jsx("h3",{className:"text-lg font-medium text-foreground mb-1",children:s(S?{id:"sessions.emptyState.title"}:{id:"sessions.emptyState.title"})}),e.jsx("p",{className:"text-sm text-muted-foreground text-center max-w-sm mb-4",children:s(S?{id:"sessions.emptyState.message"}:{id:"sessions.emptyState.createFirst"})}),S&&e.jsx(f,{variant:"outline",onClick:B,children:s({id:"common.actions.clearFilters"})})]}):e.jsx("div",{className:"grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3",children:C.map(a=>e.jsx(Ke,{session:a,onClick:m=>$(m,a.type),onView:m=>$(m,a.type),onArchive:ae,onDelete:te,actionsDisabled:P},a.session_id))}),e.jsx(we,{open:t,onOpenChange:u,children:e.jsxs(ye,{children:[e.jsxs(be,{children:[e.jsx(Ce,{children:s({id:"common.dialog.deleteSession"})}),e.jsx(ke,{children:s({id:"common.dialog.deleteConfirm"})})]}),e.jsxs(Se,{children:[e.jsx(f,{variant:"outline",onClick:()=>{u(!1),j(null)},children:s({id:"common.actions.cancel"})}),e.jsx(f,{variant:"destructive",onClick:ie,disabled:N,children:s(N?{id:"common.status.deleting"}:{id:"common.actions.delete"})})]})]})})]})}export{Xe as SessionsPage,Xe as default};
2
- //# sourceMappingURL=SessionsPage-Ciqjy9kz.js.map
1
+ import{j as e,C as U,a as X,c as b,u as J,Z as le,S as re,F as ce,b as A,B as x,D as W,d as Y,e as f,f as ee,g as F,h as E,T as de,i as oe,L as me,k as H,l as xe,R as se,m as T,n as he,r as y,o as Q,s as pe,p as ue,q as ge,t as fe,I as je,X as K,v as ve,w as Ne,x as we,y as ye,z as be,A as Ce,E as ke,G as Se}from"./index-BUol9HDD.js";import{F as I}from"./file-text-Byn2_2v6.js";import{T as Fe}from"./test-tube-0IxoyAVZ.js";import{E as De}from"./ellipsis-vertical-C1Ij47Yz.js";import{E as Me}from"./eye-C6MOB7Au.js";import{A as _e}from"./archive-CjwVpw6k.js";import{T as Le}from"./TabsNavigation-CPh6Zor1.js";import{M as Pe,a as Te}from"./minimize-2-CWkphauf.js";import{F as Ae}from"./filter-D-7PhZjx.js";const Ee={planning:{variant:"info"},in_progress:{variant:"warning"},completed:{variant:"success"},archived:{variant:"secondary"},paused:{variant:"default"}},V={planning:"sessions.status.planning",in_progress:"sessions.status.inProgress",completed:"sessions.status.completed",archived:"sessions.status.archived",paused:"sessions.status.paused"},Ie={review:{variant:"review",icon:A},tdd:{variant:"success",icon:Fe},test:{variant:"info",icon:I},docs:{variant:"warning",icon:ce},workflow:{variant:"default",icon:re},"lite-plan":{variant:"secondary",icon:I},"lite-fix":{variant:"destructive",icon:le}},Z={review:"sessions.type.review",tdd:"sessions.type.tdd",test:"sessions.type.test",docs:"sessions.type.docs",workflow:"sessions.type.workflow","lite-plan":"sessions.type.lite-plan","lite-fix":"sessions.type.lite-fix"};function q(s){if(!s)return"Unknown";try{return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}catch{return"Invalid date"}}function ze(s){if(!s||s.length===0)return{total:0,completed:0,failed:0,pending:0,inProgress:0,percentage:0};const d=s.length,o=s.filter(r=>r.status==="completed").length,h=s.filter(r=>r.status==="blocked"||r.status==="skipped").length,n=s.filter(r=>r.status==="in_progress").length,g=s.filter(r=>r.status==="pending").length,l=Math.round(o/d*100);return{total:d,completed:o,failed:h,pending:g,inProgress:n,percentage:l}}function Be(s){if(!(s!=null&&s.dimensions)||s.dimensions.length===0)return{total:0,critical:0,high:0,medium:0,low:0};let d=0,o=0,h=0,n=0;return s.dimensions.forEach(l=>{l.findings&&l.findings.forEach(r=>{var u;const t=(u=r.severity)==null?void 0:u.toLowerCase();t==="critical"?d++:t==="high"?o++:t==="medium"?h++:t==="low"&&n++})}),{total:d+o+h+n,critical:d,high:o,medium:h,low:n}}function Ke({session:s,onView:d,onArchive:o,onDelete:h,onClick:n,className:g,showActions:l=!0,actionsDisabled:r=!1}){var k,_,L;const{formatMessage:t}=J(),{variant:u}=Ee[s.status]||{variant:"default"},D=V[s.status]?t({id:V[s.status]}):t({id:"common.status.unknown"}),j=s.type?Ie[s.type]:null,v=s.type&&Z[s.type]?t({id:Z[s.type]}):null,i=ze(s.tasks),p=Be(s.review),C=s.status==="planning",z=s.status==="archived"||s.location==="archived",M=c=>{c.target.closest("[data-radix-popper-content-wrapper]")||n==null||n(s.session_id)},w=(c,N)=>{switch(c.stopPropagation(),N){case"view":d==null||d(s.session_id);break;case"archive":o==null||o(s.session_id);break;case"delete":h==null||h(s.session_id);break}};return e.jsx(U,{className:b("group cursor-pointer transition-all duration-200 hover:shadow-md hover:border-primary/30",C&&"border-info/30 bg-info/5",g),onClick:M,children:e.jsxs(X,{className:"p-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-2",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[j&&v&&e.jsxs(x,{variant:j.variant,className:"gap-1 flex-shrink-0",children:[e.jsx(j.icon,{className:"h-3 w-3"}),v]}),e.jsx("h3",{className:"font-bold text-card-foreground text-sm tracking-wide uppercase truncate",children:s.session_id})]})}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx(x,{variant:u,children:D}),l&&e.jsxs(W,{children:[e.jsx(Y,{asChild:!0,children:e.jsxs(f,{variant:"ghost",size:"icon",className:"h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity",onClick:c=>c.stopPropagation(),disabled:r,children:[e.jsx(De,{className:"h-4 w-4"}),e.jsx("span",{className:"sr-only",children:t({id:"common.aria.actions"})})]})}),e.jsxs(ee,{align:"end",children:[e.jsxs(F,{onClick:c=>w(c,"view"),children:[e.jsx(Me,{className:"mr-2 h-4 w-4"}),t({id:"sessions.actions.viewDetails"})]}),!z&&e.jsxs(e.Fragment,{children:[e.jsx(E,{}),e.jsxs(F,{onClick:c=>w(c,"archive"),children:[e.jsx(_e,{className:"mr-2 h-4 w-4"}),t({id:"sessions.actions.archive"})]})]}),e.jsx(E,{}),e.jsxs(F,{onClick:c=>w(c,"delete"),className:"text-destructive focus:text-destructive",children:[e.jsx(de,{className:"mr-2 h-4 w-4"}),t({id:"sessions.actions.delete"})]})]})]})]})]}),s.title&&e.jsx("p",{className:"text-sm text-foreground line-clamp-2 mb-3",children:s.title}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-2 text-xs text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(oe,{className:"h-3.5 w-3.5"}),q(s.created_at)]}),s.type==="review"?e.jsxs(e.Fragment,{children:[((k=s.review)==null?void 0:k.dimensions)&&s.review.dimensions.length>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(A,{className:"h-3.5 w-3.5"}),s.review.dimensions.length," ",t({id:"sessions.card.dimensions"})]}),((_=s.review)==null?void 0:_.findings)!==void 0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(I,{className:"h-3.5 w-3.5"}),typeof s.review.findings=="number"?s.review.findings:((L=s.review.dimensions)==null?void 0:L.reduce((c,N)=>{var P;return c+(((P=N.findings)==null?void 0:P.length)||0)},0))||0," ",t({id:"sessions.card.findings"})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(me,{className:"h-3.5 w-3.5"}),i.total," ",t({id:"sessions.card.tasks"})]}),i.total>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(H,{className:"h-3.5 w-3.5 text-success"}),i.completed," ",t({id:"sessions.card.completed"})]})]}),s.updated_at&&s.updated_at!==s.created_at&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(xe,{className:"h-3.5 w-3.5"}),t({id:"sessions.card.updated"}),": ",q(s.updated_at)]})]}),s.type!=="review"&&i.total>0&&e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 mt-2",children:[i.inProgress>0&&e.jsxs(x,{variant:"info",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(se,{className:"h-3 w-3"}),i.inProgress," ",t({id:"sessions.taskStatus.inProgress"})]}),i.completed>0&&e.jsxs(x,{variant:"success",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(H,{className:"h-3 w-3"}),i.completed," ",t({id:"sessions.taskStatus.completed"})]}),i.failed>0&&e.jsxs(x,{variant:"destructive",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(T,{className:"h-3 w-3"}),i.failed," ",t({id:"sessions.taskStatus.failed"})]})]}),s.type==="review"&&p.total>0&&e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 mt-2",children:[p.critical>0&&e.jsxs(x,{variant:"destructive",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(T,{className:"h-3 w-3"}),p.critical," Critical"]}),p.high>0&&e.jsxs(x,{variant:"warning",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(T,{className:"h-3 w-3"}),p.high," High"]}),p.medium>0&&e.jsxs(x,{variant:"info",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(A,{className:"h-3 w-3"}),p.medium," Medium"]}),p.low>0&&e.jsxs(x,{variant:"secondary",className:"gap-1 px-1.5 py-0 text-[10px]",children:[e.jsx(I,{className:"h-3 w-3"}),p.low," Low"]})]}),s.type!=="review"&&i.total>0&&!C&&e.jsxs("div",{className:"mt-3",children:[e.jsxs("div",{className:"flex items-center justify-between text-xs mb-1",children:[e.jsx("span",{className:"text-muted-foreground",children:t({id:"sessions.card.progress"})}),e.jsxs("span",{className:"text-card-foreground font-medium",children:[i.completed,"/",i.total," (",i.percentage,"%)"]})]}),e.jsx("div",{className:"h-1.5 w-full rounded-full bg-muted overflow-hidden",children:e.jsx("div",{className:b("h-full transition-all duration-300",i.percentage===100?"bg-success":"bg-primary"),style:{width:`${i.percentage}%`}})})]}),s.description&&s.description!==s.title&&e.jsx("p",{className:"mt-2 text-xs text-muted-foreground line-clamp-2 italic",children:s.description})]})})}function $e({className:s}){return e.jsx(U,{className:b("animate-pulse",s),children:e.jsxs(X,{className:"p-4",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"h-5 w-32 rounded bg-muted"}),e.jsx("div",{className:"mt-1 h-3 w-24 rounded bg-muted"})]}),e.jsx("div",{className:"h-5 w-16 rounded-full bg-muted"})]}),e.jsxs("div",{className:"mt-3 flex gap-4",children:[e.jsx("div",{className:"h-4 w-20 rounded bg-muted"}),e.jsx("div",{className:"h-4 w-16 rounded bg-muted"})]}),e.jsxs("div",{className:"mt-2 flex gap-1.5",children:[e.jsx("div",{className:"h-5 w-16 rounded-full bg-muted"}),e.jsx("div",{className:"h-5 w-20 rounded-full bg-muted"}),e.jsx("div",{className:"h-5 w-18 rounded-full bg-muted"})]}),e.jsx("div",{className:"mt-3",children:e.jsx("div",{className:"h-1.5 w-full rounded-full bg-muted"})})]})})}const G={planning:"sessions.status.planning",in_progress:"sessions.status.inProgress",completed:"sessions.status.completed",archived:"sessions.status.archived",paused:"sessions.status.paused"};function Xe(){const{formatMessage:s}=J(),d=he(),[o,h]=y.useState("active"),[n,g]=y.useState(""),[l,r]=y.useState([]),[t,u]=y.useState(!1),[D,j]=y.useState(null),v=Q(pe),i=Q(a=>a.toggleImmersiveMode),p=y.useMemo(()=>({location:o,search:n,status:l.length>0?l:void 0}),[o,n,l]),{filteredSessions:C,isLoading:z,isFetching:M,error:w,refetch:k}=ue({filter:p}),{archiveSession:_,isArchiving:L}=ge(),{deleteSession:c,isDeleting:N}=fe(),P=L||N,$=(a,m)=>{d(m==="review"?`/sessions/${a}/review`:`/sessions/${a}`)},ae=async a=>{try{await _(a)}catch(m){console.error("Failed to archive session:",m)}},te=a=>{j(a),u(!0)},ie=async()=>{if(D)try{await c(D),u(!1),j(null)}catch(a){console.error("Failed to delete session:",a)}},O=()=>{g("")},R=a=>{r(m=>m.includes(a)?m.filter(ne=>ne!==a):[...m,a])},B=()=>{r([]),g("")},S=l.length>0||n.length>0;return e.jsxs("div",{className:b("space-y-6",v&&"h-screen overflow-hidden"),children:[e.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold text-foreground",children:s({id:"sessions.title"})}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:s({id:"sessions.description"})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(f,{variant:"outline",size:"sm",onClick:()=>k(),disabled:M,children:[e.jsx(se,{className:b("h-4 w-4 mr-2",M&&"animate-spin")}),s({id:"common.actions.refresh"})]}),e.jsx("button",{onClick:i,className:b("p-2 rounded-md transition-colors",v?"bg-primary/10 text-primary":"text-muted-foreground hover:text-foreground hover:bg-muted"),title:s(v?{id:"common.exitFullscreen",defaultMessage:"Exit Fullscreen"}:{id:"common.fullscreen",defaultMessage:"Fullscreen"}),children:v?e.jsx(Pe,{className:"w-4 h-4"}):e.jsx(Te,{className:"w-4 h-4"})})]})]}),w&&e.jsxs("div",{className:"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive",children:[e.jsx(T,{className:"h-5 w-5 flex-shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium",children:s({id:"common.errors.loadFailed"})}),e.jsx("p",{className:"text-xs mt-0.5",children:w.message})]}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>k(),children:s({id:"home.errors.retry"})})]}),e.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center",children:[e.jsx(Le,{value:o,onValueChange:a=>h(a),tabs:[{value:"active",label:s({id:"sessions.filters.active"})},{value:"archived",label:s({id:"sessions.filters.archived"})},{value:"all",label:s({id:"sessions.filters.all"})}]}),e.jsxs("div",{className:"flex-1 max-w-sm relative",children:[e.jsx(A,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(je,{placeholder:s({id:"sessions.searchPlaceholder"}),value:n,onChange:a=>g(a.target.value),className:"pl-9 pr-9"}),n&&e.jsx("button",{onClick:O,className:"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",children:e.jsx(K,{className:"h-4 w-4"})})]}),e.jsxs(W,{children:[e.jsx(Y,{asChild:!0,children:e.jsxs(f,{variant:"outline",size:"sm",className:"gap-2",children:[e.jsx(Ae,{className:"h-4 w-4"}),s({id:"common.actions.filter"}),l.length>0&&e.jsx(x,{variant:"secondary",className:"ml-1 h-5 min-w-5 px-1",children:l.length})]})}),e.jsxs(ee,{align:"end",className:"w-48",children:[e.jsx(ve,{children:s({id:"common.status.label"})}),e.jsx(E,{}),["planning","in_progress","completed","paused"].map(a=>e.jsxs(F,{onClick:()=>R(a),className:"justify-between",children:[e.jsx("span",{children:s({id:G[a]})}),l.includes(a)&&e.jsx("span",{className:"text-primary",children:"✓"})]},a)),S&&e.jsxs(e.Fragment,{children:[e.jsx(E,{}),e.jsx(F,{onClick:B,className:"text-destructive",children:s({id:"common.actions.clearFilters"})})]})]})]})]}),S&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:[s({id:"common.actions.filters"}),":"]}),l.map(a=>e.jsxs(x,{variant:"secondary",className:"cursor-pointer",onClick:()=>R(a),children:[s({id:G[a]}),e.jsx(K,{className:"ml-1 h-3 w-3"})]},a)),n&&e.jsxs(x,{variant:"secondary",className:"cursor-pointer",onClick:O,children:[s({id:"common.actions.search"}),": ",n,e.jsx(K,{className:"ml-1 h-3 w-3"})]}),e.jsx(f,{variant:"ghost",size:"sm",onClick:B,className:"h-6 text-xs",children:s({id:"common.actions.clearAll"})})]}),z?e.jsx("div",{className:"grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3",children:Array.from({length:9}).map((a,m)=>e.jsx($e,{},m))}):C.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center py-16 px-4 border border-dashed border-border rounded-lg",children:[e.jsx(Ne,{className:"h-12 w-12 text-muted-foreground mb-4"}),e.jsx("h3",{className:"text-lg font-medium text-foreground mb-1",children:s(S?{id:"sessions.emptyState.title"}:{id:"sessions.emptyState.title"})}),e.jsx("p",{className:"text-sm text-muted-foreground text-center max-w-sm mb-4",children:s(S?{id:"sessions.emptyState.message"}:{id:"sessions.emptyState.createFirst"})}),S&&e.jsx(f,{variant:"outline",onClick:B,children:s({id:"common.actions.clearFilters"})})]}):e.jsx("div",{className:"grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3",children:C.map(a=>e.jsx(Ke,{session:a,onClick:m=>$(m,a.type),onView:m=>$(m,a.type),onArchive:ae,onDelete:te,actionsDisabled:P},a.session_id))}),e.jsx(we,{open:t,onOpenChange:u,children:e.jsxs(ye,{children:[e.jsxs(be,{children:[e.jsx(Ce,{children:s({id:"common.dialog.deleteSession"})}),e.jsx(ke,{children:s({id:"common.dialog.deleteConfirm"})})]}),e.jsxs(Se,{children:[e.jsx(f,{variant:"outline",onClick:()=>{u(!1),j(null)},children:s({id:"common.actions.cancel"})}),e.jsx(f,{variant:"destructive",onClick:ie,disabled:N,children:s(N?{id:"common.status.deleting"}:{id:"common.actions.delete"})})]})]})})]})}export{Xe as SessionsPage,Xe as default};
2
+ //# sourceMappingURL=SessionsPage-BpgP4087.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionsPage-Ciqjy9kz.js","sources":["../../src/components/shared/SessionCard.tsx","../../src/pages/SessionsPage.tsx"],"sourcesContent":["// ========================================\r\n// SessionCard Component\r\n// ========================================\r\n// Session card with status badge and action menu\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { cn } from '@/lib/utils';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Button } from '@/components/ui/Button';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n} from '@/components/ui/Dropdown';\r\nimport {\r\n Calendar,\r\n ListChecks,\r\n MoreVertical,\r\n Eye,\r\n Archive,\r\n Trash2,\r\n Clock,\r\n CheckCircle2,\r\n AlertCircle,\r\n RefreshCw,\r\n FileText,\r\n Search,\r\n TestTube,\r\n File,\r\n Settings,\r\n Zap,\r\n} from 'lucide-react';\r\nimport type { SessionMetadata } from '@/types/store';\r\n\r\nexport interface SessionCardProps {\r\n /** Session data */\r\n session: SessionMetadata;\r\n /** Called when view action is triggered */\r\n onView?: (sessionId: string) => void;\r\n /** Called when archive action is triggered */\r\n onArchive?: (sessionId: string) => void;\r\n /** Called when delete action is triggered */\r\n onDelete?: (sessionId: string) => void;\r\n /** Called when card is clicked */\r\n onClick?: (sessionId: string) => void;\r\n /** Optional className */\r\n className?: string;\r\n /** Show actions dropdown */\r\n showActions?: boolean;\r\n /** Disabled state for actions */\r\n actionsDisabled?: boolean;\r\n}\r\n\r\n// Status variant configuration (without labels for i18n)\r\nconst statusVariantConfig: Record<\r\n SessionMetadata['status'],\r\n { variant: 'default' | 'secondary' | 'destructive' | 'success' | 'warning' | 'info' }\r\n> = {\r\n planning: { variant: 'info' },\r\n in_progress: { variant: 'warning' },\r\n completed: { variant: 'success' },\r\n archived: { variant: 'secondary' },\r\n paused: { variant: 'default' },\r\n};\r\n\r\n// Status label keys for i18n\r\nconst statusLabelKeys: Record<SessionMetadata['status'], string> = {\r\n planning: 'sessions.status.planning',\r\n in_progress: 'sessions.status.inProgress',\r\n completed: 'sessions.status.completed',\r\n archived: 'sessions.status.archived',\r\n paused: 'sessions.status.paused',\r\n};\r\n\r\n// Type variant configuration for session type badges (unique colors for each type)\r\nconst typeVariantConfig: Record<\r\n NonNullable<SessionMetadata['type']>,\r\n { variant: 'default' | 'secondary' | 'destructive' | 'success' | 'warning' | 'info' | 'review'; icon: React.ElementType }\r\n> = {\r\n review: { variant: 'review', icon: Search }, // Purple\r\n 'tdd': { variant: 'success', icon: TestTube }, // Green\r\n test: { variant: 'info', icon: FileText }, // Blue\r\n docs: { variant: 'warning', icon: File }, // Orange/Yellow\r\n workflow: { variant: 'default', icon: Settings }, // Primary (blue-violet)\r\n 'lite-plan': { variant: 'secondary', icon: FileText }, // Gray/Neutral\r\n 'lite-fix': { variant: 'destructive', icon: Zap }, // Red\r\n};\r\n\r\n// Type label keys for i18n\r\nconst typeLabelKeys: Record<NonNullable<SessionMetadata['type']>, string> = {\r\n review: 'sessions.type.review',\r\n tdd: 'sessions.type.tdd',\r\n test: 'sessions.type.test',\r\n docs: 'sessions.type.docs',\r\n workflow: 'sessions.type.workflow',\r\n 'lite-plan': 'sessions.type.lite-plan',\r\n 'lite-fix': 'sessions.type.lite-fix',\r\n};\r\n\r\n/**\r\n * Format date to localized string\r\n */\r\nfunction formatDate(dateString: string | undefined): string {\r\n if (!dateString) return 'Unknown';\r\n\r\n try {\r\n const date = new Date(dateString);\r\n return date.toLocaleDateString(undefined, {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n } catch {\r\n return 'Invalid date';\r\n }\r\n}\r\n\r\n/**\r\n * Task status breakdown returned by calculateProgress\r\n */\r\ninterface TaskStatusBreakdown {\r\n total: number;\r\n completed: number;\r\n failed: number;\r\n pending: number;\r\n inProgress: number;\r\n percentage: number;\r\n}\r\n\r\n/**\r\n * Calculate progress and status breakdown from tasks\r\n */\r\nfunction calculateProgress(tasks: SessionMetadata['tasks']): TaskStatusBreakdown {\r\n if (!tasks || tasks.length === 0) {\r\n return { total: 0, completed: 0, failed: 0, pending: 0, inProgress: 0, percentage: 0 };\r\n }\r\n\r\n const total = tasks.length;\r\n const completed = tasks.filter((t) => t.status === 'completed').length;\r\n const failed = tasks.filter((t) => t.status === 'blocked' || t.status === 'skipped').length;\r\n const inProgress = tasks.filter((t) => t.status === 'in_progress').length;\r\n const pending = tasks.filter((t) => t.status === 'pending').length;\r\n const percentage = Math.round((completed / total) * 100);\r\n\r\n return { total, completed, failed, pending, inProgress, percentage };\r\n}\r\n\r\n/**\r\n * Severity breakdown for review sessions\r\n */\r\ninterface SeverityBreakdown {\r\n total: number;\r\n critical: number;\r\n high: number;\r\n medium: number;\r\n low: number;\r\n}\r\n\r\n/**\r\n * Calculate severity breakdown from review dimensions\r\n */\r\nfunction calculateSeverityBreakdown(review: SessionMetadata['review']): SeverityBreakdown {\r\n if (!review?.dimensions || review.dimensions.length === 0) {\r\n return { total: 0, critical: 0, high: 0, medium: 0, low: 0 };\r\n }\r\n\r\n let critical = 0, high = 0, medium = 0, low = 0;\r\n\r\n review.dimensions.forEach(dim => {\r\n if (dim.findings) {\r\n dim.findings.forEach(finding => {\r\n const severity = finding.severity?.toLowerCase();\r\n if (severity === 'critical') critical++;\r\n else if (severity === 'high') high++;\r\n else if (severity === 'medium') medium++;\r\n else if (severity === 'low') low++;\r\n });\r\n }\r\n });\r\n\r\n const total = critical + high + medium + low;\r\n return { total, critical, high, medium, low };\r\n}\r\n\r\n/**\r\n * SessionCard component for displaying session information\r\n *\r\n * @example\r\n * ```tsx\r\n * <SessionCard\r\n * session={session}\r\n * onView={(id) => navigate(`/sessions/${id}`)}\r\n * onArchive={(id) => archiveSession(id)}\r\n * onDelete={(id) => deleteSession(id)}\r\n * />\r\n * ```\r\n */\r\nexport function SessionCard({\r\n session,\r\n onView,\r\n onArchive,\r\n onDelete,\r\n onClick,\r\n className,\r\n showActions = true,\r\n actionsDisabled = false,\r\n}: SessionCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n const { variant: statusVariant } = statusVariantConfig[session.status] || {\r\n variant: 'default' as const,\r\n };\r\n const statusLabel = statusLabelKeys[session.status]\r\n ? formatMessage({ id: statusLabelKeys[session.status] })\r\n : formatMessage({ id: 'common.status.unknown' });\r\n\r\n // Type badge configuration (graceful degradation when type is undefined)\r\n const typeConfig = session.type ? typeVariantConfig[session.type] : null;\r\n const typeLabel = session.type && typeLabelKeys[session.type]\r\n ? formatMessage({ id: typeLabelKeys[session.type] })\r\n : null;\r\n\r\n const progress = calculateProgress(session.tasks);\r\n const severity = calculateSeverityBreakdown(session.review);\r\n const isPlanning = session.status === 'planning';\r\n const isArchived = session.status === 'archived' || session.location === 'archived';\r\n\r\n const handleCardClick = (e: React.MouseEvent) => {\r\n // Don't trigger if clicking on dropdown\r\n if ((e.target as HTMLElement).closest('[data-radix-popper-content-wrapper]')) {\r\n return;\r\n }\r\n onClick?.(session.session_id);\r\n };\r\n\r\n const handleAction = (\r\n e: React.MouseEvent,\r\n action: 'view' | 'archive' | 'delete'\r\n ) => {\r\n e.stopPropagation();\r\n switch (action) {\r\n case 'view':\r\n onView?.(session.session_id);\r\n break;\r\n case 'archive':\r\n onArchive?.(session.session_id);\r\n break;\r\n case 'delete':\r\n onDelete?.(session.session_id);\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <Card\r\n className={cn(\r\n 'group cursor-pointer transition-all duration-200 hover:shadow-md hover:border-primary/30',\r\n isPlanning && 'border-info/30 bg-info/5',\r\n className\r\n )}\r\n onClick={handleCardClick}\r\n >\r\n <CardContent className=\"p-4\">\r\n {/* Header - Type badge + Session ID as title */}\r\n <div className=\"flex items-start justify-between gap-2 mb-2\">\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n {/* Type badge BEFORE title */}\r\n {typeConfig && typeLabel && (\r\n <Badge variant={typeConfig.variant} className=\"gap-1 flex-shrink-0\">\r\n <typeConfig.icon className=\"h-3 w-3\" />\r\n {typeLabel}\r\n </Badge>\r\n )}\r\n <h3 className=\"font-bold text-card-foreground text-sm tracking-wide uppercase truncate\">\r\n {session.session_id}\r\n </h3>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 flex-shrink-0\">\r\n <Badge variant={statusVariant}>{statusLabel}</Badge>\r\n {showActions && (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity\"\r\n onClick={(e) => e.stopPropagation()}\r\n disabled={actionsDisabled}\r\n >\r\n <MoreVertical className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">{formatMessage({ id: 'common.aria.actions' })}</span>\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuItem onClick={(e) => handleAction(e, 'view')}>\r\n <Eye className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'sessions.actions.viewDetails' })}\r\n </DropdownMenuItem>\r\n {!isArchived && (\r\n <>\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem onClick={(e) => handleAction(e, 'archive')}>\r\n <Archive className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'sessions.actions.archive' })}\r\n </DropdownMenuItem>\r\n </>\r\n )}\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem\r\n onClick={(e) => handleAction(e, 'delete')}\r\n className=\"text-destructive focus:text-destructive\"\r\n >\r\n <Trash2 className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'sessions.actions.delete' })}\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Title as description */}\r\n {session.title && (\r\n <p className=\"text-sm text-foreground line-clamp-2 mb-3\">\r\n {session.title}\r\n </p>\r\n )}\r\n\r\n {/* Meta info - different based on session type */}\r\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 text-xs text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\">\r\n <Calendar className=\"h-3.5 w-3.5\" />\r\n {formatDate(session.created_at)}\r\n </span>\r\n\r\n {/* Review sessions: Show findings and dimensions */}\r\n {session.type === 'review' ? (\r\n <>\r\n {session.review?.dimensions && session.review.dimensions.length > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <Search className=\"h-3.5 w-3.5\" />\r\n {session.review.dimensions.length} {formatMessage({ id: 'sessions.card.dimensions' })}\r\n </span>\r\n )}\r\n {session.review?.findings !== undefined && (\r\n <span className=\"flex items-center gap-1\">\r\n <FileText className=\"h-3.5 w-3.5\" />\r\n {typeof session.review.findings === 'number'\r\n ? session.review.findings\r\n : session.review.dimensions?.reduce((sum, dim) => sum + (dim.findings?.length || 0), 0) || 0\r\n } {formatMessage({ id: 'sessions.card.findings' })}\r\n </span>\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n {/* Workflow/other sessions: Show tasks */}\r\n <span className=\"flex items-center gap-1\">\r\n <ListChecks className=\"h-3.5 w-3.5\" />\r\n {progress.total} {formatMessage({ id: 'sessions.card.tasks' })}\r\n </span>\r\n {progress.total > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <CheckCircle2 className=\"h-3.5 w-3.5 text-success\" />\r\n {progress.completed} {formatMessage({ id: 'sessions.card.completed' })}\r\n </span>\r\n )}\r\n </>\r\n )}\r\n {session.updated_at && session.updated_at !== session.created_at && (\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3.5 w-3.5\" />\r\n {formatMessage({ id: 'sessions.card.updated' })}: {formatDate(session.updated_at)}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Task status badges - only for non-review sessions */}\r\n {session.type !== 'review' && progress.total > 0 && (\r\n <div className=\"flex flex-wrap items-center gap-1.5 mt-2\">\r\n {progress.inProgress > 0 && (\r\n <Badge variant=\"info\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <RefreshCw className=\"h-3 w-3\" />\r\n {progress.inProgress} {formatMessage({ id: 'sessions.taskStatus.inProgress' })}\r\n </Badge>\r\n )}\r\n {progress.completed > 0 && (\r\n <Badge variant=\"success\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <CheckCircle2 className=\"h-3 w-3\" />\r\n {progress.completed} {formatMessage({ id: 'sessions.taskStatus.completed' })}\r\n </Badge>\r\n )}\r\n {progress.failed > 0 && (\r\n <Badge variant=\"destructive\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <AlertCircle className=\"h-3 w-3\" />\r\n {progress.failed} {formatMessage({ id: 'sessions.taskStatus.failed' })}\r\n </Badge>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Severity badges - only for review sessions */}\r\n {session.type === 'review' && severity.total > 0 && (\r\n <div className=\"flex flex-wrap items-center gap-1.5 mt-2\">\r\n {severity.critical > 0 && (\r\n <Badge variant=\"destructive\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <AlertCircle className=\"h-3 w-3\" />\r\n {severity.critical} Critical\r\n </Badge>\r\n )}\r\n {severity.high > 0 && (\r\n <Badge variant=\"warning\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <AlertCircle className=\"h-3 w-3\" />\r\n {severity.high} High\r\n </Badge>\r\n )}\r\n {severity.medium > 0 && (\r\n <Badge variant=\"info\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <Search className=\"h-3 w-3\" />\r\n {severity.medium} Medium\r\n </Badge>\r\n )}\r\n {severity.low > 0 && (\r\n <Badge variant=\"secondary\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <FileText className=\"h-3 w-3\" />\r\n {severity.low} Low\r\n </Badge>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Progress bar (only show for non-review sessions with tasks) */}\r\n {session.type !== 'review' && progress.total > 0 && !isPlanning && (\r\n <div className=\"mt-3\">\r\n <div className=\"flex items-center justify-between text-xs mb-1\">\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'sessions.card.progress' })}</span>\r\n <span className=\"text-card-foreground font-medium\">\r\n {progress.completed}/{progress.total} ({progress.percentage}%)\r\n </span>\r\n </div>\r\n <div className=\"h-1.5 w-full rounded-full bg-muted overflow-hidden\">\r\n <div\r\n className={cn(\r\n \"h-full transition-all duration-300\",\r\n progress.percentage === 100 ? \"bg-success\" : \"bg-primary\"\r\n )}\r\n style={{ width: `${progress.percentage}%` }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Description (if exists and different from title) */}\r\n {session.description && session.description !== session.title && (\r\n <p className=\"mt-2 text-xs text-muted-foreground line-clamp-2 italic\">\r\n {session.description}\r\n </p>\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\n/**\r\n * Skeleton loader for SessionCard\r\n */\r\nexport function SessionCardSkeleton({ className }: { className?: string }) {\r\n return (\r\n <Card className={cn('animate-pulse', className)}>\r\n <CardContent className=\"p-4\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex-1\">\r\n <div className=\"h-5 w-32 rounded bg-muted\" />\r\n <div className=\"mt-1 h-3 w-24 rounded bg-muted\" />\r\n </div>\r\n <div className=\"h-5 w-16 rounded-full bg-muted\" />\r\n </div>\r\n <div className=\"mt-3 flex gap-4\">\r\n <div className=\"h-4 w-20 rounded bg-muted\" />\r\n <div className=\"h-4 w-16 rounded bg-muted\" />\r\n </div>\r\n {/* Status badge skeletons */}\r\n <div className=\"mt-2 flex gap-1.5\">\r\n <div className=\"h-5 w-16 rounded-full bg-muted\" />\r\n <div className=\"h-5 w-20 rounded-full bg-muted\" />\r\n <div className=\"h-5 w-18 rounded-full bg-muted\" />\r\n </div>\r\n <div className=\"mt-3\">\r\n <div className=\"h-1.5 w-full rounded-full bg-muted\" />\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n","// ========================================\n// SessionsPage Component\n// ========================================\n// Sessions list page with CRUD operations\n\nimport * as React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useIntl } from 'react-intl';\nimport {\n RefreshCw,\n Search,\n Filter,\n AlertCircle,\n FolderKanban,\n X,\n Maximize2,\n Minimize2,\n} from 'lucide-react';\nimport {\n useSessions,\n useArchiveSession,\n useDeleteSession,\n type SessionsFilter,\n} from '@/hooks/useSessions';\nimport { SessionCard, SessionCardSkeleton } from '@/components/shared/SessionCard';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from '@/components/ui/Dialog';\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuLabel,\n} from '@/components/ui/Dropdown';\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\nimport { cn } from '@/lib/utils';\nimport type { SessionMetadata } from '@/types/store';\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\n\ntype LocationFilter = 'all' | 'active' | 'archived';\n\n// Status label keys for i18n (maps snake_case status to camelCase translation keys)\nconst statusLabelKeys: Record<SessionMetadata['status'], string> = {\n planning: 'sessions.status.planning',\n in_progress: 'sessions.status.inProgress',\n completed: 'sessions.status.completed',\n archived: 'sessions.status.archived',\n paused: 'sessions.status.paused',\n};\n\n/**\n * SessionsPage component - Sessions list with CRUD operations\n */\nexport function SessionsPage() {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n\n // Filter state\n const [locationFilter, setLocationFilter] = React.useState<LocationFilter>('active');\n const [searchQuery, setSearchQuery] = React.useState('');\n const [statusFilter, setStatusFilter] = React.useState<SessionMetadata['status'][]>([]);\n\n // Dialog state\n const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false);\n const [sessionToDelete, setSessionToDelete] = React.useState<string | null>(null);\n\n // Immersive mode (fullscreen)\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\n\n // Build filter object\n const filter: SessionsFilter = React.useMemo(\n () => ({\n location: locationFilter,\n search: searchQuery,\n status: statusFilter.length > 0 ? statusFilter : undefined,\n }),\n [locationFilter, searchQuery, statusFilter]\n );\n\n // Fetch sessions with filter\n const {\n filteredSessions,\n isLoading,\n isFetching,\n error,\n refetch,\n } = useSessions({ filter });\n\n // Mutations\n const { archiveSession, isArchiving } = useArchiveSession();\n const { deleteSession, isDeleting } = useDeleteSession();\n\n const isMutating = isArchiving || isDeleting;\n\n // Handlers\n const handleSessionClick = (sessionId: string, sessionType?: SessionMetadata['type']) => {\n // Route review sessions to the dedicated review page\n if (sessionType === 'review') {\n navigate(`/sessions/${sessionId}/review`);\n } else {\n navigate(`/sessions/${sessionId}`);\n }\n };\n\n const handleArchive = async (sessionId: string) => {\n try {\n await archiveSession(sessionId);\n } catch (err) {\n console.error('Failed to archive session:', err);\n }\n };\n\n const handleDeleteClick = (sessionId: string) => {\n setSessionToDelete(sessionId);\n setDeleteDialogOpen(true);\n };\n\n const handleConfirmDelete = async () => {\n if (!sessionToDelete) return;\n\n try {\n await deleteSession(sessionToDelete);\n setDeleteDialogOpen(false);\n setSessionToDelete(null);\n } catch (err) {\n console.error('Failed to delete session:', err);\n }\n };\n\n const handleClearSearch = () => {\n setSearchQuery('');\n };\n\n const toggleStatusFilter = (status: SessionMetadata['status']) => {\n setStatusFilter((prev) =>\n prev.includes(status) ? prev.filter((s) => s !== status) : [...prev, status]\n );\n };\n\n const clearFilters = () => {\n setStatusFilter([]);\n setSearchQuery('');\n };\n\n const hasActiveFilters = statusFilter.length > 0 || searchQuery.length > 0;\n\n return (\n <div className={cn(\"space-y-6\", isImmersiveMode && \"h-screen overflow-hidden\")}>\n {/* Header */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">{formatMessage({ id: 'sessions.title' })}</h1>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'sessions.description' })}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => refetch()}\n disabled={isFetching}\n >\n <RefreshCw className={cn('h-4 w-4 mr-2', isFetching && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n <button\n onClick={toggleImmersiveMode}\n className={cn(\n 'p-2 rounded-md transition-colors',\n isImmersiveMode\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\n )}\n title={isImmersiveMode ? formatMessage({ id: 'common.exitFullscreen', defaultMessage: 'Exit Fullscreen' }) : formatMessage({ id: 'common.fullscreen', defaultMessage: 'Fullscreen' })}\n >\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\n </button>\n </div>\n </div>\n\n {/* Error alert */}\n {error && (\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\n <p className=\"text-xs mt-0.5\">{error.message}</p>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\n {formatMessage({ id: 'home.errors.retry' })}\n </Button>\n </div>\n )}\n\n {/* Filters */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n {/* Location tabs */}\n <TabsNavigation\n value={locationFilter}\n onValueChange={(v) => setLocationFilter(v as LocationFilter)}\n tabs={[\n { value: 'active', label: formatMessage({ id: 'sessions.filters.active' }) },\n { value: 'archived', label: formatMessage({ id: 'sessions.filters.archived' }) },\n { value: 'all', label: formatMessage({ id: 'sessions.filters.all' }) },\n ]}\n />\n\n {/* Search input */}\n <div className=\"flex-1 max-w-sm relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'sessions.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9 pr-9\"\n />\n {searchQuery && (\n <button\n onClick={handleClearSearch}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n\n {/* Status filter dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2\">\n <Filter className=\"h-4 w-4\" />\n {formatMessage({ id: 'common.actions.filter' })}\n {statusFilter.length > 0 && (\n <Badge variant=\"secondary\" className=\"ml-1 h-5 min-w-5 px-1\">\n {statusFilter.length}\n </Badge>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel>{formatMessage({ id: 'common.status.label' })}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {(['planning', 'in_progress', 'completed', 'paused'] as const).map((status) => (\n <DropdownMenuItem\n key={status}\n onClick={() => toggleStatusFilter(status)}\n className=\"justify-between\"\n >\n <span>{formatMessage({ id: statusLabelKeys[status] })}</span>\n {statusFilter.includes(status) && (\n <span className=\"text-primary\">&#10003;</span>\n )}\n </DropdownMenuItem>\n ))}\n {hasActiveFilters && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={clearFilters} className=\"text-destructive\">\n {formatMessage({ id: 'common.actions.clearFilters' })}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Active filters display */}\n {hasActiveFilters && (\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'common.actions.filters' })}:</span>\n {statusFilter.map((status) => (\n <Badge\n key={status}\n variant=\"secondary\"\n className=\"cursor-pointer\"\n onClick={() => toggleStatusFilter(status)}\n >\n {formatMessage({ id: statusLabelKeys[status] })}\n <X className=\"ml-1 h-3 w-3\" />\n </Badge>\n ))}\n {searchQuery && (\n <Badge\n variant=\"secondary\"\n className=\"cursor-pointer\"\n onClick={handleClearSearch}\n >\n {formatMessage({ id: 'common.actions.search' })}: {searchQuery}\n <X className=\"ml-1 h-3 w-3\" />\n </Badge>\n )}\n <Button variant=\"ghost\" size=\"sm\" onClick={clearFilters} className=\"h-6 text-xs\">\n {formatMessage({ id: 'common.actions.clearAll' })}\n </Button>\n </div>\n )}\n\n {/* Sessions grid */}\n {isLoading ? (\n <div className=\"grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 9 }).map((_, i) => (\n <SessionCardSkeleton key={i} />\n ))}\n </div>\n ) : filteredSessions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 px-4 border border-dashed border-border rounded-lg\">\n <FolderKanban className=\"h-12 w-12 text-muted-foreground mb-4\" />\n <h3 className=\"text-lg font-medium text-foreground mb-1\">\n {hasActiveFilters ? formatMessage({ id: 'sessions.emptyState.title' }) : formatMessage({ id: 'sessions.emptyState.title' })}\n </h3>\n <p className=\"text-sm text-muted-foreground text-center max-w-sm mb-4\">\n {hasActiveFilters\n ? formatMessage({ id: 'sessions.emptyState.message' })\n : formatMessage({ id: 'sessions.emptyState.createFirst' })}\n </p>\n {hasActiveFilters && (\n <Button variant=\"outline\" onClick={clearFilters}>\n {formatMessage({ id: 'common.actions.clearFilters' })}\n </Button>\n )}\n </div>\n ) : (\n <div className=\"grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3\">\n {filteredSessions.map((session) => (\n <SessionCard\n key={session.session_id}\n session={session}\n onClick={(sessionId) => handleSessionClick(sessionId, session.type)}\n onView={(sessionId) => handleSessionClick(sessionId, session.type)}\n onArchive={handleArchive}\n onDelete={handleDeleteClick}\n actionsDisabled={isMutating}\n />\n ))}\n </div>\n )}\n\n {/* Delete Confirmation Dialog */}\n <Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{formatMessage({ id: 'common.dialog.deleteSession' })}</DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'common.dialog.deleteConfirm' })}\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => {\n setDeleteDialogOpen(false);\n setSessionToDelete(null);\n }}\n >\n {formatMessage({ id: 'common.actions.cancel' })}\n </Button>\n <Button\n variant=\"destructive\"\n onClick={handleConfirmDelete}\n disabled={isDeleting}\n >\n {isDeleting ? formatMessage({ id: 'common.status.deleting' }) : formatMessage({ id: 'common.actions.delete' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n\nexport default SessionsPage;\n"],"names":["statusVariantConfig","statusLabelKeys","typeVariantConfig","Search","TestTube","FileText","File","Settings","Zap","typeLabelKeys","formatDate","dateString","calculateProgress","tasks","total","completed","t","failed","inProgress","pending","percentage","calculateSeverityBreakdown","review","critical","high","medium","low","dim","finding","severity","_a","SessionCard","session","onView","onArchive","onDelete","onClick","className","showActions","actionsDisabled","formatMessage","useIntl","statusVariant","statusLabel","typeConfig","typeLabel","progress","isPlanning","isArchived","handleCardClick","e","handleAction","action","jsx","Card","cn","jsxs","CardContent","Badge","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","Eye","Fragment","DropdownMenuSeparator","Archive","Trash2","Calendar","_b","_c","sum","ListChecks","CheckCircle2","Clock","RefreshCw","AlertCircle","SessionCardSkeleton","SessionsPage","navigate","useNavigate","locationFilter","setLocationFilter","React.useState","searchQuery","setSearchQuery","statusFilter","setStatusFilter","deleteDialogOpen","setDeleteDialogOpen","sessionToDelete","setSessionToDelete","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","s","filter","React.useMemo","filteredSessions","isLoading","isFetching","error","refetch","useSessions","archiveSession","isArchiving","useArchiveSession","deleteSession","isDeleting","useDeleteSession","isMutating","handleSessionClick","sessionId","sessionType","handleArchive","err","handleDeleteClick","handleConfirmDelete","handleClearSearch","toggleStatusFilter","status","prev","clearFilters","hasActiveFilters","Minimize2","Maximize2","TabsNavigation","v","Input","X","Filter","DropdownMenuLabel","_","i","FolderKanban","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter"],"mappings":"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"}
1
+ {"version":3,"file":"SessionsPage-BpgP4087.js","sources":["../../src/components/shared/SessionCard.tsx","../../src/pages/SessionsPage.tsx"],"sourcesContent":["// ========================================\r\n// SessionCard Component\r\n// ========================================\r\n// Session card with status badge and action menu\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { cn } from '@/lib/utils';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Button } from '@/components/ui/Button';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n} from '@/components/ui/Dropdown';\r\nimport {\r\n Calendar,\r\n ListChecks,\r\n MoreVertical,\r\n Eye,\r\n Archive,\r\n Trash2,\r\n Clock,\r\n CheckCircle2,\r\n AlertCircle,\r\n RefreshCw,\r\n FileText,\r\n Search,\r\n TestTube,\r\n File,\r\n Settings,\r\n Zap,\r\n} from 'lucide-react';\r\nimport type { SessionMetadata } from '@/types/store';\r\n\r\nexport interface SessionCardProps {\r\n /** Session data */\r\n session: SessionMetadata;\r\n /** Called when view action is triggered */\r\n onView?: (sessionId: string) => void;\r\n /** Called when archive action is triggered */\r\n onArchive?: (sessionId: string) => void;\r\n /** Called when delete action is triggered */\r\n onDelete?: (sessionId: string) => void;\r\n /** Called when card is clicked */\r\n onClick?: (sessionId: string) => void;\r\n /** Optional className */\r\n className?: string;\r\n /** Show actions dropdown */\r\n showActions?: boolean;\r\n /** Disabled state for actions */\r\n actionsDisabled?: boolean;\r\n}\r\n\r\n// Status variant configuration (without labels for i18n)\r\nconst statusVariantConfig: Record<\r\n SessionMetadata['status'],\r\n { variant: 'default' | 'secondary' | 'destructive' | 'success' | 'warning' | 'info' }\r\n> = {\r\n planning: { variant: 'info' },\r\n in_progress: { variant: 'warning' },\r\n completed: { variant: 'success' },\r\n archived: { variant: 'secondary' },\r\n paused: { variant: 'default' },\r\n};\r\n\r\n// Status label keys for i18n\r\nconst statusLabelKeys: Record<SessionMetadata['status'], string> = {\r\n planning: 'sessions.status.planning',\r\n in_progress: 'sessions.status.inProgress',\r\n completed: 'sessions.status.completed',\r\n archived: 'sessions.status.archived',\r\n paused: 'sessions.status.paused',\r\n};\r\n\r\n// Type variant configuration for session type badges (unique colors for each type)\r\nconst typeVariantConfig: Record<\r\n NonNullable<SessionMetadata['type']>,\r\n { variant: 'default' | 'secondary' | 'destructive' | 'success' | 'warning' | 'info' | 'review'; icon: React.ElementType }\r\n> = {\r\n review: { variant: 'review', icon: Search }, // Purple\r\n 'tdd': { variant: 'success', icon: TestTube }, // Green\r\n test: { variant: 'info', icon: FileText }, // Blue\r\n docs: { variant: 'warning', icon: File }, // Orange/Yellow\r\n workflow: { variant: 'default', icon: Settings }, // Primary (blue-violet)\r\n 'lite-plan': { variant: 'secondary', icon: FileText }, // Gray/Neutral\r\n 'lite-fix': { variant: 'destructive', icon: Zap }, // Red\r\n};\r\n\r\n// Type label keys for i18n\r\nconst typeLabelKeys: Record<NonNullable<SessionMetadata['type']>, string> = {\r\n review: 'sessions.type.review',\r\n tdd: 'sessions.type.tdd',\r\n test: 'sessions.type.test',\r\n docs: 'sessions.type.docs',\r\n workflow: 'sessions.type.workflow',\r\n 'lite-plan': 'sessions.type.lite-plan',\r\n 'lite-fix': 'sessions.type.lite-fix',\r\n};\r\n\r\n/**\r\n * Format date to localized string\r\n */\r\nfunction formatDate(dateString: string | undefined): string {\r\n if (!dateString) return 'Unknown';\r\n\r\n try {\r\n const date = new Date(dateString);\r\n return date.toLocaleDateString(undefined, {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n } catch {\r\n return 'Invalid date';\r\n }\r\n}\r\n\r\n/**\r\n * Task status breakdown returned by calculateProgress\r\n */\r\ninterface TaskStatusBreakdown {\r\n total: number;\r\n completed: number;\r\n failed: number;\r\n pending: number;\r\n inProgress: number;\r\n percentage: number;\r\n}\r\n\r\n/**\r\n * Calculate progress and status breakdown from tasks\r\n */\r\nfunction calculateProgress(tasks: SessionMetadata['tasks']): TaskStatusBreakdown {\r\n if (!tasks || tasks.length === 0) {\r\n return { total: 0, completed: 0, failed: 0, pending: 0, inProgress: 0, percentage: 0 };\r\n }\r\n\r\n const total = tasks.length;\r\n const completed = tasks.filter((t) => t.status === 'completed').length;\r\n const failed = tasks.filter((t) => t.status === 'blocked' || t.status === 'skipped').length;\r\n const inProgress = tasks.filter((t) => t.status === 'in_progress').length;\r\n const pending = tasks.filter((t) => t.status === 'pending').length;\r\n const percentage = Math.round((completed / total) * 100);\r\n\r\n return { total, completed, failed, pending, inProgress, percentage };\r\n}\r\n\r\n/**\r\n * Severity breakdown for review sessions\r\n */\r\ninterface SeverityBreakdown {\r\n total: number;\r\n critical: number;\r\n high: number;\r\n medium: number;\r\n low: number;\r\n}\r\n\r\n/**\r\n * Calculate severity breakdown from review dimensions\r\n */\r\nfunction calculateSeverityBreakdown(review: SessionMetadata['review']): SeverityBreakdown {\r\n if (!review?.dimensions || review.dimensions.length === 0) {\r\n return { total: 0, critical: 0, high: 0, medium: 0, low: 0 };\r\n }\r\n\r\n let critical = 0, high = 0, medium = 0, low = 0;\r\n\r\n review.dimensions.forEach(dim => {\r\n if (dim.findings) {\r\n dim.findings.forEach(finding => {\r\n const severity = finding.severity?.toLowerCase();\r\n if (severity === 'critical') critical++;\r\n else if (severity === 'high') high++;\r\n else if (severity === 'medium') medium++;\r\n else if (severity === 'low') low++;\r\n });\r\n }\r\n });\r\n\r\n const total = critical + high + medium + low;\r\n return { total, critical, high, medium, low };\r\n}\r\n\r\n/**\r\n * SessionCard component for displaying session information\r\n *\r\n * @example\r\n * ```tsx\r\n * <SessionCard\r\n * session={session}\r\n * onView={(id) => navigate(`/sessions/${id}`)}\r\n * onArchive={(id) => archiveSession(id)}\r\n * onDelete={(id) => deleteSession(id)}\r\n * />\r\n * ```\r\n */\r\nexport function SessionCard({\r\n session,\r\n onView,\r\n onArchive,\r\n onDelete,\r\n onClick,\r\n className,\r\n showActions = true,\r\n actionsDisabled = false,\r\n}: SessionCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n const { variant: statusVariant } = statusVariantConfig[session.status] || {\r\n variant: 'default' as const,\r\n };\r\n const statusLabel = statusLabelKeys[session.status]\r\n ? formatMessage({ id: statusLabelKeys[session.status] })\r\n : formatMessage({ id: 'common.status.unknown' });\r\n\r\n // Type badge configuration (graceful degradation when type is undefined)\r\n const typeConfig = session.type ? typeVariantConfig[session.type] : null;\r\n const typeLabel = session.type && typeLabelKeys[session.type]\r\n ? formatMessage({ id: typeLabelKeys[session.type] })\r\n : null;\r\n\r\n const progress = calculateProgress(session.tasks);\r\n const severity = calculateSeverityBreakdown(session.review);\r\n const isPlanning = session.status === 'planning';\r\n const isArchived = session.status === 'archived' || session.location === 'archived';\r\n\r\n const handleCardClick = (e: React.MouseEvent) => {\r\n // Don't trigger if clicking on dropdown\r\n if ((e.target as HTMLElement).closest('[data-radix-popper-content-wrapper]')) {\r\n return;\r\n }\r\n onClick?.(session.session_id);\r\n };\r\n\r\n const handleAction = (\r\n e: React.MouseEvent,\r\n action: 'view' | 'archive' | 'delete'\r\n ) => {\r\n e.stopPropagation();\r\n switch (action) {\r\n case 'view':\r\n onView?.(session.session_id);\r\n break;\r\n case 'archive':\r\n onArchive?.(session.session_id);\r\n break;\r\n case 'delete':\r\n onDelete?.(session.session_id);\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <Card\r\n className={cn(\r\n 'group cursor-pointer transition-all duration-200 hover:shadow-md hover:border-primary/30',\r\n isPlanning && 'border-info/30 bg-info/5',\r\n className\r\n )}\r\n onClick={handleCardClick}\r\n >\r\n <CardContent className=\"p-4\">\r\n {/* Header - Type badge + Session ID as title */}\r\n <div className=\"flex items-start justify-between gap-2 mb-2\">\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n {/* Type badge BEFORE title */}\r\n {typeConfig && typeLabel && (\r\n <Badge variant={typeConfig.variant} className=\"gap-1 flex-shrink-0\">\r\n <typeConfig.icon className=\"h-3 w-3\" />\r\n {typeLabel}\r\n </Badge>\r\n )}\r\n <h3 className=\"font-bold text-card-foreground text-sm tracking-wide uppercase truncate\">\r\n {session.session_id}\r\n </h3>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 flex-shrink-0\">\r\n <Badge variant={statusVariant}>{statusLabel}</Badge>\r\n {showActions && (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity\"\r\n onClick={(e) => e.stopPropagation()}\r\n disabled={actionsDisabled}\r\n >\r\n <MoreVertical className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">{formatMessage({ id: 'common.aria.actions' })}</span>\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuItem onClick={(e) => handleAction(e, 'view')}>\r\n <Eye className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'sessions.actions.viewDetails' })}\r\n </DropdownMenuItem>\r\n {!isArchived && (\r\n <>\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem onClick={(e) => handleAction(e, 'archive')}>\r\n <Archive className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'sessions.actions.archive' })}\r\n </DropdownMenuItem>\r\n </>\r\n )}\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem\r\n onClick={(e) => handleAction(e, 'delete')}\r\n className=\"text-destructive focus:text-destructive\"\r\n >\r\n <Trash2 className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'sessions.actions.delete' })}\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Title as description */}\r\n {session.title && (\r\n <p className=\"text-sm text-foreground line-clamp-2 mb-3\">\r\n {session.title}\r\n </p>\r\n )}\r\n\r\n {/* Meta info - different based on session type */}\r\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 text-xs text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\">\r\n <Calendar className=\"h-3.5 w-3.5\" />\r\n {formatDate(session.created_at)}\r\n </span>\r\n\r\n {/* Review sessions: Show findings and dimensions */}\r\n {session.type === 'review' ? (\r\n <>\r\n {session.review?.dimensions && session.review.dimensions.length > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <Search className=\"h-3.5 w-3.5\" />\r\n {session.review.dimensions.length} {formatMessage({ id: 'sessions.card.dimensions' })}\r\n </span>\r\n )}\r\n {session.review?.findings !== undefined && (\r\n <span className=\"flex items-center gap-1\">\r\n <FileText className=\"h-3.5 w-3.5\" />\r\n {typeof session.review.findings === 'number'\r\n ? session.review.findings\r\n : session.review.dimensions?.reduce((sum, dim) => sum + (dim.findings?.length || 0), 0) || 0\r\n } {formatMessage({ id: 'sessions.card.findings' })}\r\n </span>\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n {/* Workflow/other sessions: Show tasks */}\r\n <span className=\"flex items-center gap-1\">\r\n <ListChecks className=\"h-3.5 w-3.5\" />\r\n {progress.total} {formatMessage({ id: 'sessions.card.tasks' })}\r\n </span>\r\n {progress.total > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <CheckCircle2 className=\"h-3.5 w-3.5 text-success\" />\r\n {progress.completed} {formatMessage({ id: 'sessions.card.completed' })}\r\n </span>\r\n )}\r\n </>\r\n )}\r\n {session.updated_at && session.updated_at !== session.created_at && (\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3.5 w-3.5\" />\r\n {formatMessage({ id: 'sessions.card.updated' })}: {formatDate(session.updated_at)}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Task status badges - only for non-review sessions */}\r\n {session.type !== 'review' && progress.total > 0 && (\r\n <div className=\"flex flex-wrap items-center gap-1.5 mt-2\">\r\n {progress.inProgress > 0 && (\r\n <Badge variant=\"info\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <RefreshCw className=\"h-3 w-3\" />\r\n {progress.inProgress} {formatMessage({ id: 'sessions.taskStatus.inProgress' })}\r\n </Badge>\r\n )}\r\n {progress.completed > 0 && (\r\n <Badge variant=\"success\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <CheckCircle2 className=\"h-3 w-3\" />\r\n {progress.completed} {formatMessage({ id: 'sessions.taskStatus.completed' })}\r\n </Badge>\r\n )}\r\n {progress.failed > 0 && (\r\n <Badge variant=\"destructive\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <AlertCircle className=\"h-3 w-3\" />\r\n {progress.failed} {formatMessage({ id: 'sessions.taskStatus.failed' })}\r\n </Badge>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Severity badges - only for review sessions */}\r\n {session.type === 'review' && severity.total > 0 && (\r\n <div className=\"flex flex-wrap items-center gap-1.5 mt-2\">\r\n {severity.critical > 0 && (\r\n <Badge variant=\"destructive\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <AlertCircle className=\"h-3 w-3\" />\r\n {severity.critical} Critical\r\n </Badge>\r\n )}\r\n {severity.high > 0 && (\r\n <Badge variant=\"warning\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <AlertCircle className=\"h-3 w-3\" />\r\n {severity.high} High\r\n </Badge>\r\n )}\r\n {severity.medium > 0 && (\r\n <Badge variant=\"info\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <Search className=\"h-3 w-3\" />\r\n {severity.medium} Medium\r\n </Badge>\r\n )}\r\n {severity.low > 0 && (\r\n <Badge variant=\"secondary\" className=\"gap-1 px-1.5 py-0 text-[10px]\">\r\n <FileText className=\"h-3 w-3\" />\r\n {severity.low} Low\r\n </Badge>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Progress bar (only show for non-review sessions with tasks) */}\r\n {session.type !== 'review' && progress.total > 0 && !isPlanning && (\r\n <div className=\"mt-3\">\r\n <div className=\"flex items-center justify-between text-xs mb-1\">\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'sessions.card.progress' })}</span>\r\n <span className=\"text-card-foreground font-medium\">\r\n {progress.completed}/{progress.total} ({progress.percentage}%)\r\n </span>\r\n </div>\r\n <div className=\"h-1.5 w-full rounded-full bg-muted overflow-hidden\">\r\n <div\r\n className={cn(\r\n \"h-full transition-all duration-300\",\r\n progress.percentage === 100 ? \"bg-success\" : \"bg-primary\"\r\n )}\r\n style={{ width: `${progress.percentage}%` }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Description (if exists and different from title) */}\r\n {session.description && session.description !== session.title && (\r\n <p className=\"mt-2 text-xs text-muted-foreground line-clamp-2 italic\">\r\n {session.description}\r\n </p>\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\n/**\r\n * Skeleton loader for SessionCard\r\n */\r\nexport function SessionCardSkeleton({ className }: { className?: string }) {\r\n return (\r\n <Card className={cn('animate-pulse', className)}>\r\n <CardContent className=\"p-4\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex-1\">\r\n <div className=\"h-5 w-32 rounded bg-muted\" />\r\n <div className=\"mt-1 h-3 w-24 rounded bg-muted\" />\r\n </div>\r\n <div className=\"h-5 w-16 rounded-full bg-muted\" />\r\n </div>\r\n <div className=\"mt-3 flex gap-4\">\r\n <div className=\"h-4 w-20 rounded bg-muted\" />\r\n <div className=\"h-4 w-16 rounded bg-muted\" />\r\n </div>\r\n {/* Status badge skeletons */}\r\n <div className=\"mt-2 flex gap-1.5\">\r\n <div className=\"h-5 w-16 rounded-full bg-muted\" />\r\n <div className=\"h-5 w-20 rounded-full bg-muted\" />\r\n <div className=\"h-5 w-18 rounded-full bg-muted\" />\r\n </div>\r\n <div className=\"mt-3\">\r\n <div className=\"h-1.5 w-full rounded-full bg-muted\" />\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n","// ========================================\n// SessionsPage Component\n// ========================================\n// Sessions list page with CRUD operations\n\nimport * as React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useIntl } from 'react-intl';\nimport {\n RefreshCw,\n Search,\n Filter,\n AlertCircle,\n FolderKanban,\n X,\n Maximize2,\n Minimize2,\n} from 'lucide-react';\nimport {\n useSessions,\n useArchiveSession,\n useDeleteSession,\n type SessionsFilter,\n} from '@/hooks/useSessions';\nimport { SessionCard, SessionCardSkeleton } from '@/components/shared/SessionCard';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from '@/components/ui/Dialog';\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuLabel,\n} from '@/components/ui/Dropdown';\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\nimport { cn } from '@/lib/utils';\nimport type { SessionMetadata } from '@/types/store';\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\n\ntype LocationFilter = 'all' | 'active' | 'archived';\n\n// Status label keys for i18n (maps snake_case status to camelCase translation keys)\nconst statusLabelKeys: Record<SessionMetadata['status'], string> = {\n planning: 'sessions.status.planning',\n in_progress: 'sessions.status.inProgress',\n completed: 'sessions.status.completed',\n archived: 'sessions.status.archived',\n paused: 'sessions.status.paused',\n};\n\n/**\n * SessionsPage component - Sessions list with CRUD operations\n */\nexport function SessionsPage() {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n\n // Filter state\n const [locationFilter, setLocationFilter] = React.useState<LocationFilter>('active');\n const [searchQuery, setSearchQuery] = React.useState('');\n const [statusFilter, setStatusFilter] = React.useState<SessionMetadata['status'][]>([]);\n\n // Dialog state\n const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false);\n const [sessionToDelete, setSessionToDelete] = React.useState<string | null>(null);\n\n // Immersive mode (fullscreen)\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\n\n // Build filter object\n const filter: SessionsFilter = React.useMemo(\n () => ({\n location: locationFilter,\n search: searchQuery,\n status: statusFilter.length > 0 ? statusFilter : undefined,\n }),\n [locationFilter, searchQuery, statusFilter]\n );\n\n // Fetch sessions with filter\n const {\n filteredSessions,\n isLoading,\n isFetching,\n error,\n refetch,\n } = useSessions({ filter });\n\n // Mutations\n const { archiveSession, isArchiving } = useArchiveSession();\n const { deleteSession, isDeleting } = useDeleteSession();\n\n const isMutating = isArchiving || isDeleting;\n\n // Handlers\n const handleSessionClick = (sessionId: string, sessionType?: SessionMetadata['type']) => {\n // Route review sessions to the dedicated review page\n if (sessionType === 'review') {\n navigate(`/sessions/${sessionId}/review`);\n } else {\n navigate(`/sessions/${sessionId}`);\n }\n };\n\n const handleArchive = async (sessionId: string) => {\n try {\n await archiveSession(sessionId);\n } catch (err) {\n console.error('Failed to archive session:', err);\n }\n };\n\n const handleDeleteClick = (sessionId: string) => {\n setSessionToDelete(sessionId);\n setDeleteDialogOpen(true);\n };\n\n const handleConfirmDelete = async () => {\n if (!sessionToDelete) return;\n\n try {\n await deleteSession(sessionToDelete);\n setDeleteDialogOpen(false);\n setSessionToDelete(null);\n } catch (err) {\n console.error('Failed to delete session:', err);\n }\n };\n\n const handleClearSearch = () => {\n setSearchQuery('');\n };\n\n const toggleStatusFilter = (status: SessionMetadata['status']) => {\n setStatusFilter((prev) =>\n prev.includes(status) ? prev.filter((s) => s !== status) : [...prev, status]\n );\n };\n\n const clearFilters = () => {\n setStatusFilter([]);\n setSearchQuery('');\n };\n\n const hasActiveFilters = statusFilter.length > 0 || searchQuery.length > 0;\n\n return (\n <div className={cn(\"space-y-6\", isImmersiveMode && \"h-screen overflow-hidden\")}>\n {/* Header */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">{formatMessage({ id: 'sessions.title' })}</h1>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'sessions.description' })}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => refetch()}\n disabled={isFetching}\n >\n <RefreshCw className={cn('h-4 w-4 mr-2', isFetching && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n <button\n onClick={toggleImmersiveMode}\n className={cn(\n 'p-2 rounded-md transition-colors',\n isImmersiveMode\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\n )}\n title={isImmersiveMode ? formatMessage({ id: 'common.exitFullscreen', defaultMessage: 'Exit Fullscreen' }) : formatMessage({ id: 'common.fullscreen', defaultMessage: 'Fullscreen' })}\n >\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\n </button>\n </div>\n </div>\n\n {/* Error alert */}\n {error && (\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\n <p className=\"text-xs mt-0.5\">{error.message}</p>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\n {formatMessage({ id: 'home.errors.retry' })}\n </Button>\n </div>\n )}\n\n {/* Filters */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n {/* Location tabs */}\n <TabsNavigation\n value={locationFilter}\n onValueChange={(v) => setLocationFilter(v as LocationFilter)}\n tabs={[\n { value: 'active', label: formatMessage({ id: 'sessions.filters.active' }) },\n { value: 'archived', label: formatMessage({ id: 'sessions.filters.archived' }) },\n { value: 'all', label: formatMessage({ id: 'sessions.filters.all' }) },\n ]}\n />\n\n {/* Search input */}\n <div className=\"flex-1 max-w-sm relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'sessions.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9 pr-9\"\n />\n {searchQuery && (\n <button\n onClick={handleClearSearch}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n\n {/* Status filter dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2\">\n <Filter className=\"h-4 w-4\" />\n {formatMessage({ id: 'common.actions.filter' })}\n {statusFilter.length > 0 && (\n <Badge variant=\"secondary\" className=\"ml-1 h-5 min-w-5 px-1\">\n {statusFilter.length}\n </Badge>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel>{formatMessage({ id: 'common.status.label' })}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {(['planning', 'in_progress', 'completed', 'paused'] as const).map((status) => (\n <DropdownMenuItem\n key={status}\n onClick={() => toggleStatusFilter(status)}\n className=\"justify-between\"\n >\n <span>{formatMessage({ id: statusLabelKeys[status] })}</span>\n {statusFilter.includes(status) && (\n <span className=\"text-primary\">&#10003;</span>\n )}\n </DropdownMenuItem>\n ))}\n {hasActiveFilters && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={clearFilters} className=\"text-destructive\">\n {formatMessage({ id: 'common.actions.clearFilters' })}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Active filters display */}\n {hasActiveFilters && (\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'common.actions.filters' })}:</span>\n {statusFilter.map((status) => (\n <Badge\n key={status}\n variant=\"secondary\"\n className=\"cursor-pointer\"\n onClick={() => toggleStatusFilter(status)}\n >\n {formatMessage({ id: statusLabelKeys[status] })}\n <X className=\"ml-1 h-3 w-3\" />\n </Badge>\n ))}\n {searchQuery && (\n <Badge\n variant=\"secondary\"\n className=\"cursor-pointer\"\n onClick={handleClearSearch}\n >\n {formatMessage({ id: 'common.actions.search' })}: {searchQuery}\n <X className=\"ml-1 h-3 w-3\" />\n </Badge>\n )}\n <Button variant=\"ghost\" size=\"sm\" onClick={clearFilters} className=\"h-6 text-xs\">\n {formatMessage({ id: 'common.actions.clearAll' })}\n </Button>\n </div>\n )}\n\n {/* Sessions grid */}\n {isLoading ? (\n <div className=\"grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 9 }).map((_, i) => (\n <SessionCardSkeleton key={i} />\n ))}\n </div>\n ) : filteredSessions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 px-4 border border-dashed border-border rounded-lg\">\n <FolderKanban className=\"h-12 w-12 text-muted-foreground mb-4\" />\n <h3 className=\"text-lg font-medium text-foreground mb-1\">\n {hasActiveFilters ? formatMessage({ id: 'sessions.emptyState.title' }) : formatMessage({ id: 'sessions.emptyState.title' })}\n </h3>\n <p className=\"text-sm text-muted-foreground text-center max-w-sm mb-4\">\n {hasActiveFilters\n ? formatMessage({ id: 'sessions.emptyState.message' })\n : formatMessage({ id: 'sessions.emptyState.createFirst' })}\n </p>\n {hasActiveFilters && (\n <Button variant=\"outline\" onClick={clearFilters}>\n {formatMessage({ id: 'common.actions.clearFilters' })}\n </Button>\n )}\n </div>\n ) : (\n <div className=\"grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3\">\n {filteredSessions.map((session) => (\n <SessionCard\n key={session.session_id}\n session={session}\n onClick={(sessionId) => handleSessionClick(sessionId, session.type)}\n onView={(sessionId) => handleSessionClick(sessionId, session.type)}\n onArchive={handleArchive}\n onDelete={handleDeleteClick}\n actionsDisabled={isMutating}\n />\n ))}\n </div>\n )}\n\n {/* Delete Confirmation Dialog */}\n <Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{formatMessage({ id: 'common.dialog.deleteSession' })}</DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'common.dialog.deleteConfirm' })}\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => {\n setDeleteDialogOpen(false);\n setSessionToDelete(null);\n }}\n >\n {formatMessage({ id: 'common.actions.cancel' })}\n </Button>\n <Button\n variant=\"destructive\"\n onClick={handleConfirmDelete}\n disabled={isDeleting}\n >\n {isDeleting ? formatMessage({ id: 'common.status.deleting' }) : formatMessage({ id: 'common.actions.delete' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n\nexport default SessionsPage;\n"],"names":["statusVariantConfig","statusLabelKeys","typeVariantConfig","Search","TestTube","FileText","File","Settings","Zap","typeLabelKeys","formatDate","dateString","calculateProgress","tasks","total","completed","t","failed","inProgress","pending","percentage","calculateSeverityBreakdown","review","critical","high","medium","low","dim","finding","severity","_a","SessionCard","session","onView","onArchive","onDelete","onClick","className","showActions","actionsDisabled","formatMessage","useIntl","statusVariant","statusLabel","typeConfig","typeLabel","progress","isPlanning","isArchived","handleCardClick","e","handleAction","action","jsx","Card","cn","jsxs","CardContent","Badge","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","Eye","Fragment","DropdownMenuSeparator","Archive","Trash2","Calendar","_b","_c","sum","ListChecks","CheckCircle2","Clock","RefreshCw","AlertCircle","SessionCardSkeleton","SessionsPage","navigate","useNavigate","locationFilter","setLocationFilter","React.useState","searchQuery","setSearchQuery","statusFilter","setStatusFilter","deleteDialogOpen","setDeleteDialogOpen","sessionToDelete","setSessionToDelete","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","s","filter","React.useMemo","filteredSessions","isLoading","isFetching","error","refetch","useSessions","archiveSession","isArchiving","useArchiveSession","deleteSession","isDeleting","useDeleteSession","isMutating","handleSessionClick","sessionId","sessionType","handleArchive","err","handleDeleteClick","handleConfirmDelete","handleClearSearch","toggleStatusFilter","status","prev","clearFilters","hasActiveFilters","Minimize2","Maximize2","TabsNavigation","v","Input","X","Filter","DropdownMenuLabel","_","i","FolderKanban","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter"],"mappings":"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"}