claude-code-workflow 7.2.18 → 7.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/.claude/commands/workflow/analyze-with-file.md +33 -8
  2. package/.codex/skills/analyze-with-file/SKILL.md +55 -8
  3. package/ccw/dist/core/routes/agent-definitions-routes.d.ts.map +1 -1
  4. package/ccw/dist/core/routes/agent-definitions-routes.js +152 -6
  5. package/ccw/dist/core/routes/agent-definitions-routes.js.map +1 -1
  6. package/ccw/frontend/dist/assets/{AlertDialog-5DA_OF9w.js → AlertDialog-Cukb0xv2.js} +2 -2
  7. package/ccw/frontend/dist/assets/{AlertDialog-5DA_OF9w.js.map → AlertDialog-Cukb0xv2.js.map} +1 -1
  8. package/ccw/frontend/dist/assets/{AnalysisPage-MoK5luZM.js → AnalysisPage-Ddmv0J4x.js} +2 -2
  9. package/ccw/frontend/dist/assets/{AnalysisPage-MoK5luZM.js.map → AnalysisPage-Ddmv0J4x.js.map} +1 -1
  10. package/ccw/frontend/dist/assets/{ApiSettingsPage-OreSF7CY.js → ApiSettingsPage-DMkrTZDX.js} +2 -2
  11. package/ccw/frontend/dist/assets/{ApiSettingsPage-OreSF7CY.js.map → ApiSettingsPage-DMkrTZDX.js.map} +1 -1
  12. package/ccw/frontend/dist/assets/{CliModeToggle-B_Vu8NDb.js → CliModeToggle-DXenjpbe.js} +2 -2
  13. package/ccw/frontend/dist/assets/{CliModeToggle-B_Vu8NDb.js.map → CliModeToggle-DXenjpbe.js.map} +1 -1
  14. package/ccw/frontend/dist/assets/{CliSessionSharePage-Bb3DrLGF.js → CliSessionSharePage-B-ZIMqmX.js} +2 -2
  15. package/ccw/frontend/dist/assets/{CliSessionSharePage-Bb3DrLGF.js.map → CliSessionSharePage-B-ZIMqmX.js.map} +1 -1
  16. package/ccw/frontend/dist/assets/{CliViewerPage-BS4zrFVp.js → CliViewerPage-9YxGyLxh.js} +2 -2
  17. package/ccw/frontend/dist/assets/{CliViewerPage-BS4zrFVp.js.map → CliViewerPage-9YxGyLxh.js.map} +1 -1
  18. package/ccw/frontend/dist/assets/{CodexLensPage-BWSIk06e.js → CodexLensPage-B_uv5wdn.js} +2 -2
  19. package/ccw/frontend/dist/assets/{CodexLensPage-BWSIk06e.js.map → CodexLensPage-B_uv5wdn.js.map} +1 -1
  20. package/ccw/frontend/dist/assets/{Collapsible-Cw1zJkjU.js → Collapsible-C2qk3yV0.js} +2 -2
  21. package/ccw/frontend/dist/assets/{Collapsible-Cw1zJkjU.js.map → Collapsible-C2qk3yV0.js.map} +1 -1
  22. package/ccw/frontend/dist/assets/{CommandsManagerPage-a240GHzx.js → CommandsManagerPage-DBtaWxLB.js} +2 -2
  23. package/ccw/frontend/dist/assets/{CommandsManagerPage-a240GHzx.js.map → CommandsManagerPage-DBtaWxLB.js.map} +1 -1
  24. package/ccw/frontend/dist/assets/{DeepWikiPage-CZ4pN-5G.js → DeepWikiPage-d9K4_TgG.js} +2 -2
  25. package/ccw/frontend/dist/assets/{DeepWikiPage-CZ4pN-5G.js.map → DeepWikiPage-d9K4_TgG.js.map} +1 -1
  26. package/ccw/frontend/dist/assets/{EndpointsPage-Ct66AIze.js → EndpointsPage-DhW6hYrI.js} +2 -2
  27. package/ccw/frontend/dist/assets/{EndpointsPage-Ct66AIze.js.map → EndpointsPage-DhW6hYrI.js.map} +1 -1
  28. package/ccw/frontend/dist/assets/{ExplorerPage-DAZkXx2Q.js → ExplorerPage-DYYpCvtB.js} +2 -2
  29. package/ccw/frontend/dist/assets/{ExplorerPage-DAZkXx2Q.js.map → ExplorerPage-DYYpCvtB.js.map} +1 -1
  30. package/ccw/frontend/dist/assets/{FixSessionPage-cDE32BH8.js → FixSessionPage-CSmiT5SE.js} +2 -2
  31. package/ccw/frontend/dist/assets/{FixSessionPage-cDE32BH8.js.map → FixSessionPage-CSmiT5SE.js.map} +1 -1
  32. package/ccw/frontend/dist/assets/{FloatingFileBrowser-tgDOT5P0.js → FloatingFileBrowser-DvMsXLdP.js} +2 -2
  33. package/ccw/frontend/dist/assets/{FloatingFileBrowser-tgDOT5P0.js.map → FloatingFileBrowser-DvMsXLdP.js.map} +1 -1
  34. package/ccw/frontend/dist/assets/{FloatingPanel-Diyvdyo1.js → FloatingPanel-sqezhSI8.js} +2 -2
  35. package/ccw/frontend/dist/assets/{FloatingPanel-Diyvdyo1.js.map → FloatingPanel-sqezhSI8.js.map} +1 -1
  36. package/ccw/frontend/dist/assets/{GraphExplorerPage-CPwRsfd2.js → GraphExplorerPage-DS8ghMFM.js} +2 -2
  37. package/ccw/frontend/dist/assets/{GraphExplorerPage-CPwRsfd2.js.map → GraphExplorerPage-DS8ghMFM.js.map} +1 -1
  38. package/ccw/frontend/dist/assets/{HistoryPage-D2F7j-xY.js → HistoryPage-B-x1RyHu.js} +2 -2
  39. package/ccw/frontend/dist/assets/{HistoryPage-D2F7j-xY.js.map → HistoryPage-B-x1RyHu.js.map} +1 -1
  40. package/ccw/frontend/dist/assets/{HookManagerPage-Cq_CqegO.js → HookManagerPage-BbxpDb68.js} +2 -2
  41. package/ccw/frontend/dist/assets/{HookManagerPage-Cq_CqegO.js.map → HookManagerPage-BbxpDb68.js.map} +1 -1
  42. package/ccw/frontend/dist/assets/{InstallationsPage-DeBLZFZg.js → InstallationsPage-3bShz_Ai.js} +2 -2
  43. package/ccw/frontend/dist/assets/{InstallationsPage-DeBLZFZg.js.map → InstallationsPage-3bShz_Ai.js.map} +1 -1
  44. package/ccw/frontend/dist/assets/{IssueHubPage-DqytkqBW.js → IssueHubPage-BQY_Hh3e.js} +2 -2
  45. package/ccw/frontend/dist/assets/{IssueHubPage-DqytkqBW.js.map → IssueHubPage-BQY_Hh3e.js.map} +1 -1
  46. package/ccw/frontend/dist/assets/{LiteTasksPage-BOknokuo.js → LiteTasksPage-vD_8fQcR.js} +17 -22
  47. package/ccw/frontend/dist/assets/LiteTasksPage-vD_8fQcR.js.map +1 -0
  48. package/ccw/frontend/dist/assets/{McpManagerPage-DPF421ki.js → McpManagerPage-CI5ZzB8A.js} +2 -2
  49. package/ccw/frontend/dist/assets/{McpManagerPage-DPF421ki.js.map → McpManagerPage-CI5ZzB8A.js.map} +1 -1
  50. package/ccw/frontend/dist/assets/{MemoryPage-CK-QH9cl.js → MemoryPage-CNuj2eNg.js} +2 -2
  51. package/ccw/frontend/dist/assets/{MemoryPage-CK-QH9cl.js.map → MemoryPage-CNuj2eNg.js.map} +1 -1
  52. package/ccw/frontend/dist/assets/{NotFoundPage-Bk_u5rzz.js → NotFoundPage-BrnAXkb1.js} +2 -2
  53. package/ccw/frontend/dist/assets/{NotFoundPage-Bk_u5rzz.js.map → NotFoundPage-BrnAXkb1.js.map} +1 -1
  54. package/ccw/frontend/dist/assets/{OrchestratorPage-B9ND5ptW.js → OrchestratorPage-CH81PGt4.js} +2 -2
  55. package/ccw/frontend/dist/assets/{OrchestratorPage-B9ND5ptW.js.map → OrchestratorPage-CH81PGt4.js.map} +1 -1
  56. package/ccw/frontend/dist/assets/{ProjectOverviewPage-0DUpa-rl.js → ProjectOverviewPage-dwiEXl2O.js} +2 -2
  57. package/ccw/frontend/dist/assets/{ProjectOverviewPage-0DUpa-rl.js.map → ProjectOverviewPage-dwiEXl2O.js.map} +1 -1
  58. package/ccw/frontend/dist/assets/{PromptHistoryPage-B--0N_wr.js → PromptHistoryPage-CabgLjJU.js} +2 -2
  59. package/ccw/frontend/dist/assets/{PromptHistoryPage-B--0N_wr.js.map → PromptHistoryPage-CabgLjJU.js.map} +1 -1
  60. package/ccw/frontend/dist/assets/{ReviewSessionPage-DJtY0kQl.js → ReviewSessionPage-DAMrNFn8.js} +2 -2
  61. package/ccw/frontend/dist/assets/{ReviewSessionPage-DJtY0kQl.js.map → ReviewSessionPage-DAMrNFn8.js.map} +1 -1
  62. package/ccw/frontend/dist/assets/{RulesManagerPage-yW19Un_V.js → RulesManagerPage-4jzmxPn0.js} +2 -2
  63. package/ccw/frontend/dist/assets/{RulesManagerPage-yW19Un_V.js.map → RulesManagerPage-4jzmxPn0.js.map} +1 -1
  64. package/ccw/frontend/dist/assets/{SessionDetailPage-tr8g0Hc1.js → SessionDetailPage-C5Btktmp.js} +2 -2
  65. package/ccw/frontend/dist/assets/{SessionDetailPage-tr8g0Hc1.js.map → SessionDetailPage-C5Btktmp.js.map} +1 -1
  66. package/ccw/frontend/dist/assets/{SessionsPage-CxDytLfb.js → SessionsPage-CQIB4E8m.js} +2 -2
  67. package/ccw/frontend/dist/assets/{SessionsPage-CxDytLfb.js.map → SessionsPage-CQIB4E8m.js.map} +1 -1
  68. package/ccw/frontend/dist/assets/SettingsPage-Yi9UAfm7.js +150 -0
  69. package/ccw/frontend/dist/assets/SettingsPage-Yi9UAfm7.js.map +1 -0
  70. package/ccw/frontend/dist/assets/{SkillsManagerPage-C0MOJy-C.js → SkillsManagerPage-BqfvYSkT.js} +2 -2
  71. package/ccw/frontend/dist/assets/{SkillsManagerPage-C0MOJy-C.js.map → SkillsManagerPage-BqfvYSkT.js.map} +1 -1
  72. package/ccw/frontend/dist/assets/{SpecsSettingsPage-D9Y6-U-n.js → SpecsSettingsPage-BdVPM5R6.js} +4 -4
  73. package/ccw/frontend/dist/assets/{SpecsSettingsPage-D9Y6-U-n.js.map → SpecsSettingsPage-BdVPM5R6.js.map} +1 -1
  74. package/ccw/frontend/dist/assets/{Switch-BEfkMCxZ.js → Switch-BG929kV0.js} +2 -2
  75. package/ccw/frontend/dist/assets/{Switch-BEfkMCxZ.js.map → Switch-BG929kV0.js.map} +1 -1
  76. package/ccw/frontend/dist/assets/{TabsNavigation-Dit0DM3m.js → TabsNavigation-Bol1y09b.js} +2 -2
  77. package/ccw/frontend/dist/assets/{TabsNavigation-Dit0DM3m.js.map → TabsNavigation-Bol1y09b.js.map} +1 -1
  78. package/ccw/frontend/dist/assets/{TaskDrawer-XN-D_bDk.js → TaskDrawer-Dwutrn8_.js} +2 -2
  79. package/ccw/frontend/dist/assets/{TaskDrawer-XN-D_bDk.js.map → TaskDrawer-Dwutrn8_.js.map} +1 -1
  80. package/ccw/frontend/dist/assets/{TeamPage-BOwkjrDi.js → TeamPage-CpCSwpxD.js} +2 -2
  81. package/ccw/frontend/dist/assets/{TeamPage-BOwkjrDi.js.map → TeamPage-CpCSwpxD.js.map} +1 -1
  82. package/ccw/frontend/dist/assets/{TerminalDashboardPage-X8RymrSN.js → TerminalDashboardPage-DODKjOeK.js} +2 -2
  83. package/ccw/frontend/dist/assets/{TerminalDashboardPage-X8RymrSN.js.map → TerminalDashboardPage-DODKjOeK.js.map} +1 -1
  84. package/ccw/frontend/dist/assets/{archive-BMXBzq8R.js → archive-CQw634kD.js} +2 -2
  85. package/ccw/frontend/dist/assets/{archive-BMXBzq8R.js.map → archive-CQw634kD.js.map} +1 -1
  86. package/ccw/frontend/dist/assets/{archive-restore-DHvAhQBT.js → archive-restore-B-_EG6wE.js} +2 -2
  87. package/ccw/frontend/dist/assets/{archive-restore-DHvAhQBT.js.map → archive-restore-B-_EG6wE.js.map} +1 -1
  88. package/ccw/frontend/dist/assets/{arrow-right-CBObFEN0.js → arrow-right-CcQtxBrU.js} +2 -2
  89. package/ccw/frontend/dist/assets/{arrow-right-CBObFEN0.js.map → arrow-right-CcQtxBrU.js.map} +1 -1
  90. package/ccw/frontend/dist/assets/{bookmark-plus-D-2SQ5pV.js → bookmark-plus-Cl-BbcpR.js} +2 -2
  91. package/ccw/frontend/dist/assets/{bookmark-plus-D-2SQ5pV.js.map → bookmark-plus-Cl-BbcpR.js.map} +1 -1
  92. package/ccw/frontend/dist/assets/{bot-DS7saQkk.js → bot-CLSNSkW_.js} +2 -2
  93. package/ccw/frontend/dist/assets/{bot-DS7saQkk.js.map → bot-CLSNSkW_.js.map} +1 -1
  94. package/ccw/frontend/dist/assets/{braces-D0pAnktp.js → braces-DWwkaDS6.js} +2 -2
  95. package/ccw/frontend/dist/assets/{braces-D0pAnktp.js.map → braces-DWwkaDS6.js.map} +1 -1
  96. package/ccw/frontend/dist/assets/{circle-stop-FWSboNE6.js → circle-stop-DiS7e6ma.js} +2 -2
  97. package/ccw/frontend/dist/assets/{circle-stop-FWSboNE6.js.map → circle-stop-DiS7e6ma.js.map} +1 -1
  98. package/ccw/frontend/dist/assets/{cpu-BNM2uIpY.js → cpu-CuvHUVXO.js} +2 -2
  99. package/ccw/frontend/dist/assets/{cpu-BNM2uIpY.js.map → cpu-CuvHUVXO.js.map} +1 -1
  100. package/ccw/frontend/dist/assets/{ellipsis-vertical-GwdnnWQj.js → ellipsis-vertical-BoVlINSw.js} +2 -2
  101. package/ccw/frontend/dist/assets/{ellipsis-vertical-GwdnnWQj.js.map → ellipsis-vertical-BoVlINSw.js.map} +1 -1
  102. package/ccw/frontend/dist/assets/{eye-kV2pWXQ5.js → eye-BEMOdcAN.js} +2 -2
  103. package/ccw/frontend/dist/assets/{eye-kV2pWXQ5.js.map → eye-BEMOdcAN.js.map} +1 -1
  104. package/ccw/frontend/dist/assets/{eye-off-6o-KYsBM.js → eye-off-C5HS4Ytm.js} +2 -2
  105. package/ccw/frontend/dist/assets/{eye-off-6o-KYsBM.js.map → eye-off-C5HS4Ytm.js.map} +1 -1
  106. package/ccw/frontend/dist/assets/{file-json-Q4_Blhd8.js → file-json-DQ9XLq0B.js} +2 -2
  107. package/ccw/frontend/dist/assets/{file-json-Q4_Blhd8.js.map → file-json-DQ9XLq0B.js.map} +1 -1
  108. package/ccw/frontend/dist/assets/{file-text-DSroEAMu.js → file-text-TGs_qCbw.js} +2 -2
  109. package/ccw/frontend/dist/assets/{file-text-DSroEAMu.js.map → file-text-TGs_qCbw.js.map} +1 -1
  110. package/ccw/frontend/dist/assets/{filter-A5I9Xz7E.js → filter-CIuCqnDB.js} +2 -2
  111. package/ccw/frontend/dist/assets/{filter-A5I9Xz7E.js.map → filter-CIuCqnDB.js.map} +1 -1
  112. package/ccw/frontend/dist/assets/{folder-DNNgXVVH.js → folder-BkivHBwn.js} +2 -2
  113. package/ccw/frontend/dist/assets/{folder-DNNgXVVH.js.map → folder-BkivHBwn.js.map} +1 -1
  114. package/ccw/frontend/dist/assets/{gauge-PfGM68A8.js → gauge-CtM68fVY.js} +2 -2
  115. package/ccw/frontend/dist/assets/{gauge-PfGM68A8.js.map → gauge-CtM68fVY.js.map} +1 -1
  116. package/ccw/frontend/dist/assets/{globe-C3X8YQrU.js → globe-DpnrINqP.js} +2 -2
  117. package/ccw/frontend/dist/assets/{globe-C3X8YQrU.js.map → globe-DpnrINqP.js.map} +1 -1
  118. package/ccw/frontend/dist/assets/{grid-3x3-DpyJO-oF.js → grid-3x3-SjX0a5JH.js} +2 -2
  119. package/ccw/frontend/dist/assets/{grid-3x3-DpyJO-oF.js.map → grid-3x3-SjX0a5JH.js.map} +1 -1
  120. package/ccw/frontend/dist/assets/{hard-drive-C2PQHoNg.js → hard-drive-ByAmnoEg.js} +2 -2
  121. package/ccw/frontend/dist/assets/{hard-drive-C2PQHoNg.js.map → hard-drive-ByAmnoEg.js.map} +1 -1
  122. package/ccw/frontend/dist/assets/{hash-DX8VaW1j.js → hash-DbLc3VOZ.js} +2 -2
  123. package/ccw/frontend/dist/assets/{hash-DX8VaW1j.js.map → hash-DbLc3VOZ.js.map} +1 -1
  124. package/ccw/frontend/dist/assets/{history-BXaQEkhy.js → history-Botz5Z5d.js} +2 -2
  125. package/ccw/frontend/dist/assets/{history-BXaQEkhy.js.map → history-Botz5Z5d.js.map} +1 -1
  126. package/ccw/frontend/dist/assets/{index-BiN-BRcE.js → index-BGvyf4-9.js} +2 -2
  127. package/ccw/frontend/dist/assets/{index-BiN-BRcE.js.map → index-BGvyf4-9.js.map} +1 -1
  128. package/ccw/frontend/dist/assets/index-BoqylFO4.css +39 -0
  129. package/ccw/frontend/dist/assets/{index-B8K8MdMl.js → index-DP_mTJI8.js} +3 -3
  130. package/ccw/frontend/dist/assets/{index-B8K8MdMl.js.map → index-DP_mTJI8.js.map} +1 -1
  131. package/ccw/frontend/dist/assets/{index-Dpe_7YH0.js → index-MkgdhX7a.js} +2 -2
  132. package/ccw/frontend/dist/assets/{index-Dpe_7YH0.js.map → index-MkgdhX7a.js.map} +1 -1
  133. package/ccw/frontend/dist/assets/{index-4zmlzlPo.js → index-ni-tG9rm.js} +2 -2
  134. package/ccw/frontend/dist/assets/{index-4zmlzlPo.js.map → index-ni-tG9rm.js.map} +1 -1
  135. package/ccw/frontend/dist/assets/{layout-grid-CUqTukRt.js → layout-grid-11E4bGJz.js} +2 -2
  136. package/ccw/frontend/dist/assets/{layout-grid-CUqTukRt.js.map → layout-grid-11E4bGJz.js.map} +1 -1
  137. package/ccw/frontend/dist/assets/{lightbulb-h90ex0mh.js → lightbulb-8KrKY82b.js} +2 -2
  138. package/ccw/frontend/dist/assets/{lightbulb-h90ex0mh.js.map → lightbulb-8KrKY82b.js.map} +1 -1
  139. package/ccw/frontend/dist/assets/{link-2-1-DjXqTg.js → link-2-BUn6RILb.js} +2 -2
  140. package/ccw/frontend/dist/assets/{link-2-1-DjXqTg.js.map → link-2-BUn6RILb.js.map} +1 -1
  141. package/ccw/frontend/dist/assets/{link-DbyJpuls.js → link-CmP254Ai.js} +2 -2
  142. package/ccw/frontend/dist/assets/{link-DbyJpuls.js.map → link-CmP254Ai.js.map} +1 -1
  143. package/ccw/frontend/dist/assets/{list-CU0leArg.js → list-BAwzl4a2.js} +2 -2
  144. package/ccw/frontend/dist/assets/{list-CU0leArg.js.map → list-BAwzl4a2.js.map} +1 -1
  145. package/ccw/frontend/dist/assets/{map-pin-DheJ6EJB.js → map-pin-gi342rqk.js} +2 -2
  146. package/ccw/frontend/dist/assets/{map-pin-DheJ6EJB.js.map → map-pin-gi342rqk.js.map} +1 -1
  147. package/ccw/frontend/dist/assets/{messages-square-Bmo5DCr1.js → messages-square-C1Lh8q8b.js} +2 -2
  148. package/ccw/frontend/dist/assets/{messages-square-Bmo5DCr1.js.map → messages-square-C1Lh8q8b.js.map} +1 -1
  149. package/ccw/frontend/dist/assets/{minimize-2-h1gktUQ6.js → minimize-2-OgWNLKdq.js} +2 -2
  150. package/ccw/frontend/dist/assets/{minimize-2-h1gktUQ6.js.map → minimize-2-OgWNLKdq.js.map} +1 -1
  151. package/ccw/frontend/dist/assets/{package-CmuCX6Z_.js → package-Djsvs5qp.js} +2 -2
  152. package/ccw/frontend/dist/assets/{package-CmuCX6Z_.js.map → package-Djsvs5qp.js.map} +1 -1
  153. package/ccw/frontend/dist/assets/{plug-Jz5HaKIu.js → plug-DvSZP2cp.js} +2 -2
  154. package/ccw/frontend/dist/assets/{plug-Jz5HaKIu.js.map → plug-DvSZP2cp.js.map} +1 -1
  155. package/ccw/frontend/dist/assets/{power-CpN5I4BU.js → power-BY7vTLmU.js} +2 -2
  156. package/ccw/frontend/dist/assets/{power-CpN5I4BU.js.map → power-BY7vTLmU.js.map} +1 -1
  157. package/ccw/frontend/dist/assets/{save-B3iyK-h8.js → save-DXfqv84T.js} +2 -2
  158. package/ccw/frontend/dist/assets/{save-B3iyK-h8.js.map → save-DXfqv84T.js.map} +1 -1
  159. package/ccw/frontend/dist/assets/{send-CYO-YU9A.js → send-E2o2LZSX.js} +2 -2
  160. package/ccw/frontend/dist/assets/{send-CYO-YU9A.js.map → send-E2o2LZSX.js.map} +1 -1
  161. package/ccw/frontend/dist/assets/settings-2-ChD1LFHH.js +7 -0
  162. package/ccw/frontend/dist/assets/settings-2-ChD1LFHH.js.map +1 -0
  163. package/ccw/frontend/dist/assets/{square-check-big-1h37S4wz.js → square-check-big-CBymuqmD.js} +2 -2
  164. package/ccw/frontend/dist/assets/{square-check-big-1h37S4wz.js.map → square-check-big-CBymuqmD.js.map} +1 -1
  165. package/ccw/frontend/dist/assets/{square-pen-BS0-oO7y.js → square-pen-BfaiJgOX.js} +2 -2
  166. package/ccw/frontend/dist/assets/{square-pen-BS0-oO7y.js.map → square-pen-BfaiJgOX.js.map} +1 -1
  167. package/ccw/frontend/dist/assets/{star-Dal-o3Lo.js → star-DHMWqZ09.js} +2 -2
  168. package/ccw/frontend/dist/assets/{star-Dal-o3Lo.js.map → star-DHMWqZ09.js.map} +1 -1
  169. package/ccw/frontend/dist/assets/{style-wEWj0pe8.js → style-wvcOEAiM.js} +2 -2
  170. package/ccw/frontend/dist/assets/{style-wEWj0pe8.js.map → style-wvcOEAiM.js.map} +1 -1
  171. package/ccw/frontend/dist/assets/{target-BB9AJiC7.js → target-B8AMmf_N.js} +2 -2
  172. package/ccw/frontend/dist/assets/{target-BB9AJiC7.js.map → target-B8AMmf_N.js.map} +1 -1
  173. package/ccw/frontend/dist/assets/{test-tube-DDnQZrAm.js → test-tube-BpDeTJi1.js} +2 -2
  174. package/ccw/frontend/dist/assets/{test-tube-DDnQZrAm.js.map → test-tube-BpDeTJi1.js.map} +1 -1
  175. package/ccw/frontend/dist/assets/{upload-DshzYJC_.js → upload-pflkdIDG.js} +2 -2
  176. package/ccw/frontend/dist/assets/{upload-DshzYJC_.js.map → upload-pflkdIDG.js.map} +1 -1
  177. package/ccw/frontend/dist/assets/{useApiSettings-DkV-yWup.js → useApiSettings-BPx4DyKT.js} +2 -2
  178. package/ccw/frontend/dist/assets/{useApiSettings-DkV-yWup.js.map → useApiSettings-BPx4DyKT.js.map} +1 -1
  179. package/ccw/frontend/dist/assets/{useCli-CnwgIkqD.js → useCli-D1jfH3XA.js} +2 -2
  180. package/ccw/frontend/dist/assets/{useCli-CnwgIkqD.js.map → useCli-D1jfH3XA.js.map} +1 -1
  181. package/ccw/frontend/dist/assets/{useCommands-S0sc5bfK.js → useCommands-DhR71vpa.js} +2 -2
  182. package/ccw/frontend/dist/assets/{useCommands-S0sc5bfK.js.map → useCommands-DhR71vpa.js.map} +1 -1
  183. package/ccw/frontend/dist/assets/{useDebounce-HxG5rpQo.js → useDebounce-a6Yyer3m.js} +2 -2
  184. package/ccw/frontend/dist/assets/{useDebounce-HxG5rpQo.js.map → useDebounce-a6Yyer3m.js.map} +1 -1
  185. package/ccw/frontend/dist/assets/{useFileExplorer-CTg0zndf.js → useFileExplorer-B8W2JTj2.js} +2 -2
  186. package/ccw/frontend/dist/assets/{useFileExplorer-CTg0zndf.js.map → useFileExplorer-B8W2JTj2.js.map} +1 -1
  187. package/ccw/frontend/dist/assets/{useLocale-C2BlVToA.js → useLocale-aMHdQIL_.js} +2 -2
  188. package/ccw/frontend/dist/assets/{useLocale-C2BlVToA.js.map → useLocale-aMHdQIL_.js.map} +1 -1
  189. package/ccw/frontend/dist/assets/{useSkills-8IWJgwQU.js → useSkills-BHpc2LtN.js} +3 -3
  190. package/ccw/frontend/dist/assets/{useSkills-8IWJgwQU.js.map → useSkills-BHpc2LtN.js.map} +1 -1
  191. package/ccw/frontend/dist/assets/{useSystemSettings-BAtCCf8T.js → useSystemSettings-BFD0SvEF.js} +2 -2
  192. package/ccw/frontend/dist/assets/{useSystemSettings-BAtCCf8T.js.map → useSystemSettings-BFD0SvEF.js.map} +1 -1
  193. package/ccw/frontend/dist/assets/{wand-sparkles-CI1Tfudg.js → wand-sparkles-dYtI2IKM.js} +2 -2
  194. package/ccw/frontend/dist/assets/{wand-sparkles-CI1Tfudg.js.map → wand-sparkles-dYtI2IKM.js.map} +1 -1
  195. package/ccw/frontend/dist/index.html +2 -2
  196. package/package.json +1 -1
  197. package/ccw/frontend/dist/assets/LiteTasksPage-BOknokuo.js.map +0 -1
  198. package/ccw/frontend/dist/assets/SettingsPage-DJltvfrs.js +0 -144
  199. package/ccw/frontend/dist/assets/SettingsPage-DJltvfrs.js.map +0 -1
  200. package/ccw/frontend/dist/assets/index-D6YeIKg_.css +0 -39
@@ -1 +1 @@
1
- {"version":3,"file":"SessionDetailPage-tr8g0Hc1.js","sources":["../../../../node_modules/lucide-react/dist/esm/icons/forward.js","../../../../node_modules/lucide-react/dist/esm/icons/ruler.js","../../../../node_modules/lucide-react/dist/esm/icons/scale.js","../../src/hooks/useSessionDetail.ts","../../src/components/session-detail/tasks/BulkActionButton.tsx","../../src/components/session-detail/tasks/TaskStatsBar.tsx","../../src/components/session-detail/tasks/TaskStatusDropdown.tsx","../../src/pages/session-detail/TaskListTab.tsx","../../src/components/session-detail/context/DependenciesCard.tsx","../../src/components/session-detail/context/TestContextCard.tsx","../../src/pages/session-detail/ContextTab.tsx","../../src/components/shared/MarkdownModal.tsx","../../src/pages/session-detail/SummaryTab.tsx","../../src/pages/session-detail/ImplPlanTab.tsx","../../src/pages/session-detail/ConflictTab.tsx","../../src/pages/session-detail/ReviewTab.tsx","../../src/pages/SessionDetailPage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Forward = createLucideIcon(\"Forward\", [\n [\"polyline\", { points: \"15 17 20 12 15 7\", key: \"1w3sku\" }],\n [\"path\", { d: \"M4 18v-2a4 4 0 0 1 4-4h12\", key: \"jmiej9\" }]\n]);\n\nexport { Forward as default };\n//# sourceMappingURL=forward.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Ruler = createLucideIcon(\"Ruler\", [\n [\n \"path\",\n {\n d: \"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z\",\n key: \"icamh8\"\n }\n ],\n [\"path\", { d: \"m14.5 12.5 2-2\", key: \"inckbg\" }],\n [\"path\", { d: \"m11.5 9.5 2-2\", key: \"fmmyf7\" }],\n [\"path\", { d: \"m8.5 6.5 2-2\", key: \"vc6u1g\" }],\n [\"path\", { d: \"m17.5 15.5 2-2\", key: \"wo5hmg\" }]\n]);\n\nexport { Ruler as default };\n//# sourceMappingURL=ruler.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Scale = createLucideIcon(\"Scale\", [\n [\"path\", { d: \"m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z\", key: \"7g6ntu\" }],\n [\"path\", { d: \"m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z\", key: \"ijws7r\" }],\n [\"path\", { d: \"M7 21h10\", key: \"1b0cd5\" }],\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }],\n [\"path\", { d: \"M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2\", key: \"3gwbw2\" }]\n]);\n\nexport { Scale as default };\n//# sourceMappingURL=scale.js.map\n","// ========================================\r\n// useSessionDetail Hook\r\n// ========================================\r\n// TanStack Query hook for session detail data\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport { fetchSessionDetail } from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\n// Query key factory - include projectPath as part of the key\r\nexport const sessionDetailKeys = {\r\n all: ['sessionDetail'] as const,\r\n detail: (id: string, projectPath: string) => [...sessionDetailKeys.all, 'detail', id, projectPath] as const,\r\n};\r\n\r\n// Default stale time: 30 seconds\r\nconst STALE_TIME = 30 * 1000;\r\n\r\nexport interface UseSessionDetailOptions {\r\n /** Override default stale time (ms) */\r\n staleTime?: number;\r\n /** Enable/disable the query */\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Hook for fetching session detail data\r\n *\r\n * @example\r\n * ```tsx\r\n * const { sessionDetail, isLoading } = useSessionDetail(sessionId);\r\n * ```\r\n */\r\nexport function useSessionDetail(sessionId: string, options: UseSessionDetailOptions = {}) {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n const queryEnabled = enabled && !!sessionId && !!projectPath;\r\n\r\n const query = useQuery({\r\n queryKey: sessionDetailKeys.detail(sessionId, projectPath),\r\n queryFn: () => fetchSessionDetail(sessionId, projectPath),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n return {\r\n sessionDetail: query.data,\r\n isLoading: query.isLoading,\r\n error: query.error,\r\n refetch: query.refetch,\r\n };\r\n}\r\n","// ========================================\r\n// BulkActionButton Component\r\n// ========================================\r\n// Reusable button component for bulk actions\r\n\r\nimport { Loader2 } from 'lucide-react';\r\nimport { Button, ButtonProps } from '@/components/ui/Button';\r\nimport type { LucideIcon } from 'lucide-react';\r\n\r\nexport interface BulkActionButtonProps extends Omit<ButtonProps, 'leftIcon'> {\r\n icon: LucideIcon;\r\n label: string;\r\n isLoading?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * BulkActionButton component - Button with icon for bulk actions\r\n */\r\nexport function BulkActionButton({\r\n icon: Icon,\r\n label,\r\n isLoading = false,\r\n disabled = false,\r\n variant = 'default',\r\n size = 'sm',\r\n className = '',\r\n ...props\r\n}: BulkActionButtonProps) {\r\n return (\r\n <Button\r\n variant={variant}\r\n size={size}\r\n disabled={disabled || isLoading}\r\n className={className}\r\n {...props}\r\n >\r\n {isLoading ? (\r\n <Loader2 className=\"h-4 w-4 mr-1.5 animate-spin\" />\r\n ) : (\r\n <Icon className=\"h-4 w-4 mr-1.5\" />\r\n )}\r\n {label}\r\n </Button>\r\n );\r\n}\r\n","// ========================================\r\n// TaskStatsBar Component\r\n// ========================================\r\n// Statistics bar with bulk action buttons for tasks\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { CheckCircle, Loader2, Circle } from 'lucide-react';\r\nimport { BulkActionButton } from './BulkActionButton';\r\nimport { cn } from '@/lib/utils';\r\n\r\nexport interface TaskStatsBarProps {\r\n completed: number;\r\n inProgress: number;\r\n pending: number;\r\n onMarkAllPending?: () => void | Promise<void>;\r\n onMarkAllInProgress?: () => void | Promise<void>;\r\n onMarkAllCompleted?: () => void | Promise<void>;\r\n isLoadingPending?: boolean;\r\n isLoadingInProgress?: boolean;\r\n isLoadingCompleted?: boolean;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * TaskStatsBar component - Display task statistics with bulk action buttons\r\n */\r\nexport function TaskStatsBar({\r\n completed,\r\n inProgress,\r\n pending,\r\n onMarkAllPending,\r\n onMarkAllInProgress,\r\n onMarkAllCompleted,\r\n isLoadingPending = false,\r\n isLoadingInProgress = false,\r\n isLoadingCompleted = false,\r\n className = '',\r\n}: TaskStatsBarProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div className={cn('flex flex-wrap items-center gap-4 p-4 bg-background rounded-lg border', className)}>\r\n {/* Statistics */}\r\n <div className=\"flex flex-wrap items-center gap-4 flex-1\">\r\n <span className=\"flex items-center gap-1.5 text-sm\">\r\n <CheckCircle className=\"h-4 w-4 text-success\" />\r\n <strong>{completed}</strong> {formatMessage({ id: 'sessionDetail.tasks.completed' })}\r\n </span>\r\n <span className=\"flex items-center gap-1.5 text-sm\">\r\n <Loader2 className=\"h-4 w-4 text-warning\" />\r\n <strong>{inProgress}</strong> {formatMessage({ id: 'sessionDetail.tasks.inProgress' })}\r\n </span>\r\n <span className=\"flex items-center gap-1.5 text-sm\">\r\n <Circle className=\"h-4 w-4 text-muted-foreground\" />\r\n <strong>{pending}</strong> {formatMessage({ id: 'sessionDetail.tasks.pending' })}\r\n </span>\r\n </div>\r\n\r\n {/* Bulk Action Buttons */}\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n {onMarkAllPending && (\r\n <BulkActionButton\r\n icon={Circle}\r\n label={formatMessage({ id: 'sessionDetail.tasks.quickActions.markAllPending' })}\r\n onClick={onMarkAllPending}\r\n isLoading={isLoadingPending}\r\n disabled={pending === 0}\r\n variant=\"outline\"\r\n />\r\n )}\r\n {onMarkAllInProgress && (\r\n <BulkActionButton\r\n icon={Loader2}\r\n label={formatMessage({ id: 'sessionDetail.tasks.quickActions.markAllInProgress' })}\r\n onClick={onMarkAllInProgress}\r\n isLoading={isLoadingInProgress}\r\n disabled={inProgress === 0}\r\n variant=\"outline\"\r\n />\r\n )}\r\n {onMarkAllCompleted && (\r\n <BulkActionButton\r\n icon={CheckCircle}\r\n label={formatMessage({ id: 'sessionDetail.tasks.quickActions.markAllCompleted' })}\r\n onClick={onMarkAllCompleted}\r\n isLoading={isLoadingCompleted}\r\n disabled={completed === 0}\r\n variant=\"outline\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// TaskStatusDropdown Component\r\n// ========================================\r\n// Inline status dropdown for task items\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Circle,\r\n Loader2,\r\n CheckCircle,\r\n CircleX,\r\n Forward,\r\n} from 'lucide-react';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from '@/components/ui/Dropdown';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport type { TaskStatus } from '@/lib/api';\r\n\r\nexport interface TaskStatusDropdownProps {\r\n currentStatus: TaskStatus;\r\n onStatusChange: (newStatus: TaskStatus) => void | Promise<void>;\r\n disabled?: boolean;\r\n size?: 'sm' | 'default';\r\n}\r\n\r\n// Status configuration\r\nconst statusConfig: Record<\r\n TaskStatus,\r\n {\r\n label: string;\r\n variant: 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'info' | null;\r\n icon: React.ComponentType<{ className?: string }>;\r\n }\r\n> = {\r\n pending: {\r\n label: 'sessionDetail.tasks.status.pending',\r\n variant: 'secondary',\r\n icon: Circle,\r\n },\r\n in_progress: {\r\n label: 'sessionDetail.tasks.status.inProgress',\r\n variant: 'warning',\r\n icon: Loader2,\r\n },\r\n completed: {\r\n label: 'sessionDetail.tasks.status.completed',\r\n variant: 'success',\r\n icon: CheckCircle,\r\n },\r\n blocked: {\r\n label: 'sessionDetail.tasks.status.blocked',\r\n variant: 'destructive',\r\n icon: CircleX,\r\n },\r\n skipped: {\r\n label: 'sessionDetail.tasks.status.skipped',\r\n variant: 'default',\r\n icon: Forward,\r\n },\r\n};\r\n\r\n/**\r\n * TaskStatusDropdown component - Inline status selector with optimistic UI\r\n */\r\nexport function TaskStatusDropdown({\r\n currentStatus,\r\n onStatusChange,\r\n disabled = false,\r\n size = 'sm',\r\n}: TaskStatusDropdownProps) {\r\n const { formatMessage } = useIntl();\r\n const [isChanging, setIsChanging] = useState(false);\r\n\r\n const handleStatusChange = async (newStatus: TaskStatus) => {\r\n if (newStatus === currentStatus || isChanging) return;\r\n\r\n setIsChanging(true);\r\n try {\r\n await onStatusChange(newStatus);\r\n } catch (error) {\r\n console.error('[TaskStatusDropdown] Failed to update status:', error);\r\n } finally {\r\n setIsChanging(false);\r\n }\r\n };\r\n\r\n const currentConfig = statusConfig[currentStatus] || statusConfig.pending;\r\n const StatusIcon = currentConfig.icon;\r\n const badgeSize = size === 'sm' ? 'text-xs' : 'text-sm';\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n asChild\r\n disabled={disabled || isChanging}\r\n className=\"cursor-pointer\"\r\n >\r\n <Badge\r\n variant={currentConfig.variant}\r\n className={`gap-1 ${badgeSize} ${isChanging ? 'opacity-50' : ''}`}\r\n >\r\n {isChanging ? (\r\n <Loader2 className=\"h-3 w-3 animate-spin\" />\r\n ) : (\r\n <StatusIcon className=\"h-3 w-3\" />\r\n )}\r\n {formatMessage({ id: currentConfig.label })}\r\n </Badge>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\" className=\"min-w-[160px]\">\r\n {(Object.keys(statusConfig) as TaskStatus[]).map((status) => {\r\n const config = statusConfig[status];\r\n const Icon = config.icon;\r\n return (\r\n <DropdownMenuItem\r\n key={status}\r\n onClick={() => handleStatusChange(status)}\r\n disabled={status === currentStatus || isChanging}\r\n className=\"gap-2\"\r\n >\r\n <Icon className=\"h-4 w-4\" />\r\n <span>{formatMessage({ id: config.label })}</span>\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n","// ========================================\r\n// TaskListTab Component\r\n// ========================================\r\n// Tasks tab for session detail page\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n ListChecks,\r\n GitBranch,\r\n Calendar,\r\n FileCode,\r\n Layers,\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { TaskStatsBar, TaskStatusDropdown } from '@/components/session-detail/tasks';\r\nimport type { SessionMetadata, TaskData } from '@/types/store';\r\nimport type { TaskStatus, FlowControl } from '@/lib/api';\r\nimport { bulkUpdateTaskStatus, updateTaskStatus } from '@/lib/api';\r\n\r\n// Extended task type with all possible fields from JSON\r\ninterface ExtendedTask extends TaskData {\r\n meta?: {\r\n type?: string;\r\n scope?: string;\r\n };\r\n context?: {\r\n focus_paths?: string[];\r\n acceptance?: string[];\r\n depends_on?: string[];\r\n };\r\n flow_control?: FlowControl;\r\n}\r\n\r\nexport interface TaskListTabProps {\r\n session: SessionMetadata;\r\n onTaskClick?: (task: TaskData) => void;\r\n}\r\n\r\n/**\r\n * TaskListTab component - Display tasks in a list format\r\n */\r\nexport function TaskListTab({ session, onTaskClick }: TaskListTabProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n const tasks = session.tasks || [];\r\n\r\n // Detect if session tasks support status tracking (new format has explicit status/status_history in raw data)\r\n const hasStatusTracking = tasks.some((t) => {\r\n const raw = (t as unknown as Record<string, unknown>)._raw as Record<string, unknown> | undefined;\r\n const source = (raw?._raw as Record<string, unknown>) || raw;\r\n return source ? (source.status !== undefined || source.status_history !== undefined) : false;\r\n });\r\n\r\n const completed = tasks.filter((t) => t.status === 'completed').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\r\n // Loading states for bulk actions\r\n const [isLoadingPending, setIsLoadingPending] = useState(false);\r\n const [isLoadingInProgress, setIsLoadingInProgress] = useState(false);\r\n const [isLoadingCompleted, setIsLoadingCompleted] = useState(false);\r\n\r\n // Local task state for optimistic updates\r\n const [localTasks, setLocalTasks] = useState<TaskData[]>(tasks);\r\n\r\n // Update local tasks when session tasks change\r\n if (tasks !== localTasks && !isLoadingPending && !isLoadingInProgress && !isLoadingCompleted) {\r\n setLocalTasks(tasks);\r\n }\r\n\r\n // Get session path for API calls\r\n const sessionPath = (session as any).path || session.session_id;\r\n\r\n // Bulk action handlers - mark ALL tasks (not just filtered ones) to the target status\r\n const handleMarkAllPending = async () => {\r\n // Mark all non-pending tasks as pending\r\n const targetTasks = localTasks.filter((t) => t.status !== 'pending');\r\n if (targetTasks.length === 0) return;\r\n\r\n setIsLoadingPending(true);\r\n // Optimistic update\r\n setLocalTasks((prev) => prev.map((t) => ({ ...t, status: 'pending' as const })));\r\n try {\r\n const taskIds = targetTasks.map((t) => t.task_id);\r\n const result = await bulkUpdateTaskStatus(sessionPath, taskIds, 'pending');\r\n if (!result.success) {\r\n console.error('[TaskListTab] Failed to mark all as pending:', result.error);\r\n // Rollback on error\r\n setLocalTasks(tasks);\r\n }\r\n } catch (error) {\r\n console.error('[TaskListTab] Failed to mark all as pending:', error);\r\n setLocalTasks(tasks);\r\n } finally {\r\n setIsLoadingPending(false);\r\n }\r\n };\r\n\r\n const handleMarkAllInProgress = async () => {\r\n // Mark all non-in_progress tasks as in_progress\r\n const targetTasks = localTasks.filter((t) => t.status !== 'in_progress');\r\n if (targetTasks.length === 0) return;\r\n\r\n setIsLoadingInProgress(true);\r\n // Optimistic update\r\n setLocalTasks((prev) => prev.map((t) => ({ ...t, status: 'in_progress' as const })));\r\n try {\r\n const taskIds = targetTasks.map((t) => t.task_id);\r\n const result = await bulkUpdateTaskStatus(sessionPath, taskIds, 'in_progress');\r\n if (!result.success) {\r\n console.error('[TaskListTab] Failed to mark all as in_progress:', result.error);\r\n setLocalTasks(tasks);\r\n }\r\n } catch (error) {\r\n console.error('[TaskListTab] Failed to mark all as in_progress:', error);\r\n setLocalTasks(tasks);\r\n } finally {\r\n setIsLoadingInProgress(false);\r\n }\r\n };\r\n\r\n const handleMarkAllCompleted = async () => {\r\n // Mark all non-completed tasks as completed\r\n const targetTasks = localTasks.filter((t) => t.status !== 'completed');\r\n if (targetTasks.length === 0) return;\r\n\r\n setIsLoadingCompleted(true);\r\n // Optimistic update\r\n setLocalTasks((prev) => prev.map((t) => ({ ...t, status: 'completed' as const })));\r\n try {\r\n const taskIds = targetTasks.map((t) => t.task_id);\r\n const result = await bulkUpdateTaskStatus(sessionPath, taskIds, 'completed');\r\n if (!result.success) {\r\n console.error('[TaskListTab] Failed to mark all as completed:', result.error);\r\n setLocalTasks(tasks);\r\n }\r\n } catch (error) {\r\n console.error('[TaskListTab] Failed to mark all as completed:', error);\r\n setLocalTasks(tasks);\r\n } finally {\r\n setIsLoadingCompleted(false);\r\n }\r\n };\r\n\r\n // Individual task status change handler\r\n const handleTaskStatusChange = async (taskId: string, newStatus: TaskStatus) => {\r\n const previousTasks = [...localTasks];\r\n const previousTask = previousTasks.find((t) => t.task_id === taskId);\r\n\r\n if (!previousTask) return;\r\n\r\n // Optimistic update\r\n setLocalTasks((prev) =>\r\n prev.map((t) =>\r\n t.task_id === taskId ? { ...t, status: newStatus } : t\r\n )\r\n );\r\n\r\n try {\r\n const result = await updateTaskStatus(sessionPath, taskId, newStatus);\r\n if (!result.success) {\r\n // Rollback on error\r\n setLocalTasks(previousTasks);\r\n console.error('[TaskListTab] Failed to update task status:', result.error);\r\n }\r\n } catch (error) {\r\n // Rollback on error\r\n setLocalTasks(previousTasks);\r\n console.error('[TaskListTab] Failed to update task status:', error);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Stats Bar with Bulk Actions (only for tasks with status tracking) */}\r\n {hasStatusTracking && (\r\n <TaskStatsBar\r\n completed={completed}\r\n inProgress={inProgress}\r\n pending={pending}\r\n onMarkAllPending={handleMarkAllPending}\r\n onMarkAllInProgress={handleMarkAllInProgress}\r\n onMarkAllCompleted={handleMarkAllCompleted}\r\n isLoadingPending={isLoadingPending}\r\n isLoadingInProgress={isLoadingInProgress}\r\n isLoadingCompleted={isLoadingCompleted}\r\n />\r\n )}\r\n\r\n {/* Tasks List */}\r\n {localTasks.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <ListChecks className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.tasks.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.tasks.empty.message' })}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2\">\r\n {localTasks.map((task, index) => {\r\n // Cast to extended type to access all possible fields\r\n const extTask = task as unknown as ExtendedTask;\r\n\r\n // Get depends_on from either root level or context\r\n const dependsOn = extTask.depends_on || extTask.context?.depends_on || [];\r\n const dependsCount = dependsOn.length;\r\n\r\n // Get meta info\r\n const taskType = extTask.meta?.type;\r\n const taskScope = extTask.meta?.scope;\r\n\r\n // Get implementation steps count from flow_control\r\n const stepsCount = extTask.flow_control?.implementation_approach?.length || 0;\r\n\r\n // Get target files count\r\n const filesCount = extTask.flow_control?.target_files?.length || 0;\r\n\r\n return (\r\n <Card\r\n key={`${task.task_id}-${index}`}\r\n className={`hover:shadow-sm transition-shadow ${onTaskClick ? 'cursor-pointer hover:shadow-md' : ''}`}\r\n onClick={() => onTaskClick?.(task as TaskData)}\r\n >\r\n <CardContent className=\"p-4\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n {/* Left: Task ID, Title, Description */}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-mono font-semibold bg-primary/10 text-primary border border-primary/20\">\r\n {task.task_id}\r\n </span>\r\n </div>\r\n <h4 className=\"font-medium text-foreground text-sm\">\r\n {task.title || formatMessage({ id: 'sessionDetail.tasks.untitled' })}\r\n </h4>\r\n {task.description && (\r\n <p className=\"text-sm text-muted-foreground mt-1 line-clamp-2\">\r\n {task.description}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {/* Right: Status and Meta info */}\r\n <div className=\"flex flex-col items-end gap-2 flex-shrink-0\">\r\n {/* Row 1: Status dropdown (only for tasks with status tracking) */}\r\n {hasStatusTracking && (\r\n <TaskStatusDropdown\r\n currentStatus={task.status as TaskStatus}\r\n onStatusChange={(newStatus) => handleTaskStatusChange(task.task_id, newStatus)}\r\n size=\"sm\"\r\n />\r\n )}\r\n\r\n {/* Row 2: Meta info */}\r\n <div className=\"flex items-center gap-3 flex-wrap justify-end text-xs text-muted-foreground\">\r\n {taskType && (\r\n <span className=\"bg-muted px-1.5 py-0.5 rounded\">{taskType}</span>\r\n )}\r\n {stepsCount > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <Layers className=\"h-3 w-3\" />\r\n {stepsCount} {formatMessage({ id: 'sessionDetail.tasks.steps' })}\r\n </span>\r\n )}\r\n {filesCount > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <FileCode className=\"h-3 w-3\" />\r\n {filesCount} {formatMessage({ id: 'sessionDetail.tasks.files' })}\r\n </span>\r\n )}\r\n {dependsCount > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <GitBranch className=\"h-3 w-3\" />\r\n {dependsCount} {formatMessage({ id: 'sessionDetail.tasks.deps' })}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Row 3: Scope or Date */}\r\n {(taskScope || task.created_at) && (\r\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\r\n {taskScope && (\r\n <span className=\"bg-muted px-1.5 py-0.5 rounded\">{taskScope}</span>\r\n )}\r\n {task.created_at && (\r\n <span className=\"flex items-center gap-1\">\r\n <Calendar className=\"h-3 w-3\" />\r\n {new Date(task.created_at).toLocaleDateString()}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// DependenciesCard Component\r\n// ========================================\r\n// Displays internal and external dependencies\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { GitBranch, Package } from 'lucide-react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\n\r\nexport interface InternalDependency {\r\n from: string;\r\n type: string;\r\n to: string;\r\n}\r\n\r\nexport interface ExternalDependency {\r\n package: string;\r\n version?: string;\r\n usage?: string;\r\n}\r\n\r\nexport interface DependenciesData {\r\n internal?: InternalDependency[];\r\n external?: ExternalDependency[];\r\n}\r\n\r\nexport interface DependenciesCardProps {\r\n data?: DependenciesData;\r\n}\r\n\r\n/**\r\n * DependenciesCard component - Displays project dependencies\r\n */\r\nexport function DependenciesCard({ data }: DependenciesCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || (!data.internal?.length && !data.external?.length)) {\r\n return null;\r\n }\r\n\r\n const internalCount = data.internal?.length || 0;\r\n const externalCount = data.external?.length || 0;\r\n\r\n return (\r\n <Card>\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2\">\r\n <GitBranch className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.title' })}\r\n <Badge variant=\"secondary\">{internalCount + externalCount}</Badge>\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-6\">\r\n {data.internal && data.internal.length > 0 && (\r\n <InternalDependenciesSection dependencies={data.internal} />\r\n )}\r\n\r\n {data.external && data.external.length > 0 && (\r\n <ExternalDependenciesSection dependencies={data.external} />\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface InternalDependenciesSectionProps {\r\n dependencies: InternalDependency[];\r\n}\r\n\r\nfunction InternalDependenciesSection({ dependencies }: InternalDependenciesSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-3 flex items-center gap-2\">\r\n <GitBranch className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.internal' })} ({dependencies.length})\r\n </h4>\r\n <div className=\"border rounded-lg overflow-hidden\">\r\n <table className=\"w-full text-sm\">\r\n <thead className=\"bg-muted\">\r\n <tr>\r\n <th className=\"px-4 py-2 text-left font-medium text-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.from' })}\r\n </th>\r\n <th className=\"px-4 py-2 text-left font-medium text-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.type' })}\r\n </th>\r\n <th className=\"px-4 py-2 text-left font-medium text-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.to' })}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y\">\r\n {dependencies.map((dep, index) => (\r\n <tr key={index} className=\"hover:bg-muted/50\">\r\n <td className=\"px-4 py-2 font-mono text-foreground\">{dep.from}</td>\r\n <td className=\"px-4 py-2\">\r\n <Badge variant=\"outline\">{dep.type}</Badge>\r\n </td>\r\n <td className=\"px-4 py-2 font-mono text-foreground\">{dep.to}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ExternalDependenciesSectionProps {\r\n dependencies: ExternalDependency[];\r\n}\r\n\r\nfunction ExternalDependenciesSection({ dependencies }: ExternalDependenciesSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-3 flex items-center gap-2\">\r\n <Package className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.external' })} ({dependencies.length})\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {dependencies.map((dep, index) => (\r\n <Badge key={index} variant=\"secondary\" className=\"px-3 py-1.5\">\r\n {dep.package}\r\n {dep.version && <span className=\"ml-1 text-foreground\">@{dep.version}</span>}\r\n </Badge>\r\n ))}\r\n </div>\r\n {dependencies.some(d => d.usage) && (\r\n <div className=\"mt-3 space-y-1\">\r\n {dependencies\r\n .filter(d => d.usage)\r\n .map((dep, index) => (\r\n <div key={index} className=\"text-xs text-muted-foreground\">\r\n <span className=\"font-medium\">{dep.package}:</span> {dep.usage}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// TestContextCard Component\r\n// ========================================\r\n// Displays test context with stats and framework info\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { TestTube, CheckCircle, AlertCircle } from 'lucide-react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { FieldRenderer } from './FieldRenderer';\r\n\r\nexport interface TestFramework {\r\n name?: string;\r\n plugins?: string[];\r\n}\r\n\r\nexport interface FrameworkConfig {\r\n backend?: TestFramework;\r\n frontend?: TestFramework;\r\n}\r\n\r\nexport interface TestContextData {\r\n frameworks?: FrameworkConfig;\r\n existing_tests?: string[];\r\n coverage_config?: Record<string, unknown>;\r\n test_markers?: string[];\r\n}\r\n\r\nexport interface TestContextCardProps {\r\n data?: TestContextData;\r\n}\r\n\r\n/**\r\n * TestContextCard component - Displays testing context and frameworks\r\n */\r\nexport function TestContextCard({ data }: TestContextCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || (!data.frameworks && !data.existing_tests?.length && !data.test_markers?.length)) {\r\n return null;\r\n }\r\n\r\n const testCount = data.existing_tests?.length || 0;\r\n const markerCount = data.test_markers?.length || 0;\r\n\r\n return (\r\n <Card>\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2\">\r\n <TestTube className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.testContext.title' })}\r\n {testCount > 0 && (\r\n <Badge variant=\"secondary\">{testCount} {formatMessage({ id: 'sessionDetail.context.testContext.tests' })}</Badge>\r\n )}\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n {/* Stats Row */}\r\n {(testCount > 0 || markerCount > 0) && (\r\n <div className=\"flex gap-4\">\r\n {testCount > 0 && (\r\n <div className=\"flex items-center gap-2\">\r\n <CheckCircle className=\"w-4 h-4 text-success\" />\r\n <span className=\"text-sm text-foreground\">\r\n {testCount} {formatMessage({ id: 'sessionDetail.context.testContext.existingTests' })}\r\n </span>\r\n </div>\r\n )}\r\n {markerCount > 0 && (\r\n <div className=\"flex items-center gap-2\">\r\n <AlertCircle className=\"w-4 h-4 text-warning\" />\r\n <span className=\"text-sm text-foreground\">\r\n {markerCount} {formatMessage({ id: 'sessionDetail.context.testContext.markers' })}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Framework Cards */}\r\n {data.frameworks && (\r\n <FrameworkSection frameworks={data.frameworks} />\r\n )}\r\n\r\n {/* Test Markers */}\r\n {data.test_markers && data.test_markers.length > 0 && (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.testContext.markers' })}\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {data.test_markers.map((marker, index) => (\r\n <Badge key={index} variant=\"info\" className=\"px-2 py-0.5\">\r\n {marker}\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Coverage Config */}\r\n {data.coverage_config && Object.keys(data.coverage_config).length > 0 && (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.testContext.coverage' })}\r\n </h4>\r\n <FieldRenderer value={data.coverage_config} type=\"object\" />\r\n </div>\r\n )}\r\n\r\n {/* Existing Tests List */}\r\n {data.existing_tests && data.existing_tests.length > 0 && (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.testContext.existingTests' })}\r\n </h4>\r\n <FieldRenderer value={data.existing_tests} type=\"array\" />\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface FrameworkSectionProps {\r\n frameworks: FrameworkConfig;\r\n}\r\n\r\nfunction FrameworkSection({ frameworks }: FrameworkSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div className=\"grid gap-3 md:grid-cols-2\">\r\n {frameworks.backend && (\r\n <FrameworkCard\r\n title={formatMessage({ id: 'sessionDetail.context.testContext.backend' })}\r\n framework={frameworks.backend}\r\n />\r\n )}\r\n {frameworks.frontend && (\r\n <FrameworkCard\r\n title={formatMessage({ id: 'sessionDetail.context.testContext.frontend' })}\r\n framework={frameworks.frontend}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface FrameworkCardProps {\r\n title: string;\r\n framework: TestFramework;\r\n}\r\n\r\nfunction FrameworkCard({ title, framework }: FrameworkCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div className=\"p-3 border rounded-lg\">\r\n <div className=\"text-sm font-medium text-foreground mb-2\">{title}</div>\r\n <div className=\"space-y-1\">\r\n {framework.name && (\r\n <div className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.testContext.framework' })}: {framework.name}\r\n </div>\r\n )}\r\n {framework.plugins && framework.plugins.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1\">\r\n {framework.plugins.map((plugin, index) => (\r\n <Badge key={index} variant=\"outline\" className=\"text-xs\">\r\n {plugin}\r\n </Badge>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// ContextTab Component\r\n// ========================================\r\n// Context tab for session detail page\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Package,\r\n FileCode,\r\n Tag,\r\n Settings,\r\n BookOpen,\r\n CheckSquare,\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport type { SessionDetailContext } from '@/lib/api';\r\nimport {\r\n ExplorationsSection,\r\n AssetsCard,\r\n DependenciesCard,\r\n TestContextCard,\r\n ConflictDetectionCard,\r\n} from '@/components/session-detail/context';\r\n\r\nexport interface ContextTabProps {\r\n context?: SessionDetailContext;\r\n}\r\n\r\n/**\r\n * ContextTab component - Display session context information\r\n */\r\nexport function ContextTab({ context }: ContextTabProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!context) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Package className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n const hasRequirements = context.requirements && context.requirements.length > 0;\r\n const hasFocusPaths = context.focus_paths && context.focus_paths.length > 0;\r\n const hasArtifacts = context.artifacts && context.artifacts.length > 0;\r\n const hasSharedContext = context.shared_context;\r\n const hasExtendedContext = context.context;\r\n const hasExplorations = context.explorations;\r\n\r\n if (\r\n !hasRequirements &&\r\n !hasFocusPaths &&\r\n !hasArtifacts &&\r\n !hasSharedContext &&\r\n !hasExtendedContext &&\r\n !hasExplorations\r\n ) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Package className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Original Context Sections - Maintained for backward compatibility */}\r\n {hasRequirements && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4 flex items-center gap-2\">\r\n <CheckSquare className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.requirements' })}\r\n <Badge variant=\"secondary\">{context.requirements!.length}</Badge>\r\n </h3>\r\n <ul className=\"space-y-2\">\r\n {context.requirements!.map((req, i) => (\r\n <li\r\n key={i}\r\n className=\"flex items-start gap-2 p-3 bg-background rounded-lg border\"\r\n >\r\n <span className=\"text-primary font-bold\">{i + 1}.</span>\r\n <span className=\"text-sm text-foreground flex-1\">{req}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {hasFocusPaths && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4 flex items-center gap-2\">\r\n <FileCode className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.focusPaths' })}\r\n <Badge variant=\"secondary\">{context.focus_paths!.length}</Badge>\r\n </h3>\r\n <div className=\"space-y-2\">\r\n {context.focus_paths!.map((path, i) => (\r\n <div\r\n key={i}\r\n className=\"p-3 bg-background rounded-lg border font-mono text-sm text-foreground\"\r\n >\r\n {path}\r\n </div>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {hasArtifacts && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4 flex items-center gap-2\">\r\n <Tag className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.artifacts' })}\r\n <Badge variant=\"secondary\">{context.artifacts!.length}</Badge>\r\n </h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {context.artifacts!.map((artifact, i) => (\r\n <Badge key={i} variant=\"outline\" className=\"px-3 py-1.5\">\r\n {artifact}\r\n </Badge>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {hasSharedContext && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4 flex items-center gap-2\">\r\n <Settings className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.sharedContext' })}\r\n </h3>\r\n\r\n {context.shared_context!.tech_stack && context.shared_context!.tech_stack.length > 0 && (\r\n <div className=\"mb-4\">\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.techStack' })}\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {context.shared_context!.tech_stack!.map((tech, i) => (\r\n <Badge key={i} variant=\"success\" className=\"px-3 py-1.5\">\r\n {tech}\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {context.shared_context!.conventions && context.shared_context!.conventions.length > 0 && (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.conventions' })}\r\n </h4>\r\n <ul className=\"space-y-1\">\r\n {context.shared_context!.conventions!.map((conv, i) => (\r\n <li key={i} className=\"text-sm text-foreground flex items-start gap-2\">\r\n <BookOpen className=\"h-4 w-4 text-muted-foreground mt-0.5 flex-shrink-0\" />\r\n <span>{conv}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {/* New Extended Context Sections from context-package.json */}\r\n {hasExplorations && <ExplorationsSection data={context.explorations} />}\r\n\r\n {hasExtendedContext && context.context!.assets && (\r\n <AssetsCard data={context.context!.assets} />\r\n )}\r\n\r\n {hasExtendedContext && context.context!.dependencies && (\r\n <DependenciesCard data={context.context!.dependencies} />\r\n )}\r\n\r\n {hasExtendedContext && context.context!.test_context && (\r\n <TestContextCard data={context.context!.test_context} />\r\n )}\r\n\r\n {hasExtendedContext && context.context!.conflict_detection && (\r\n <ConflictDetectionCard data={context.context!.conflict_detection} />\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\n// MarkdownModal Component\n// ========================================\n// Modal for viewing markdown, JSON, or text content with copy and download actions\n\nimport * as React from 'react';\nimport { FileText, Copy, Download, Loader2 } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport { cn } from '@/lib/utils';\n\n// ========================================\n// Types\n// ========================================\n\nexport type ContentType = 'markdown' | 'json' | 'text';\n\nexport interface MarkdownModalProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Called when modal is closed */\n onClose: () => void;\n /** Title displayed in modal header */\n title: string;\n /** Content to display */\n content: string;\n /** Type of content for appropriate rendering */\n contentType?: ContentType;\n /** Maximum width of the modal */\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n /** Maximum height of content area */\n maxHeight?: string;\n /** Optional custom actions */\n actions?: ModalAction[];\n /** Whether content is loading */\n isLoading?: boolean;\n}\n\nexport interface ModalAction {\n label: string;\n icon?: React.ComponentType<{ className?: string }>;\n onClick: (content: string) => void | Promise<void>;\n variant?: 'default' | 'outline' | 'ghost' | 'destructive' | 'secondary';\n disabled?: boolean;\n}\n\n// ========================================\n// Component\n// ========================================\n\n/**\n * Modal for viewing markdown, JSON, or text content\n * \n * @example\n * ```tsx\n * <MarkdownModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"IMPL_PLAN.md\"\n * content={implPlanContent}\n * contentType=\"markdown\"\n * />\n * ```\n */\nexport function MarkdownModal({\n isOpen,\n onClose,\n title,\n content,\n contentType = 'markdown',\n maxWidth = '2xl',\n maxHeight = '60vh',\n actions,\n isLoading = false,\n}: MarkdownModalProps) {\n const { success, error } = useNotifications();\n const [isCopying, setIsCopying] = React.useState(false);\n const [isDownloading, setIsDownloading] = React.useState(false);\n\n const handleCopy = async () => {\n setIsCopying(true);\n try {\n await navigator.clipboard.writeText(content);\n success('Copied', 'Content copied to clipboard');\n } catch (err) {\n error('Error', 'Failed to copy content');\n } finally {\n setIsCopying(false);\n }\n };\n\n const handleDownload = () => {\n setIsDownloading(true);\n try {\n const blob = new Blob([content], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const extension = contentType === 'json' ? 'json' : 'md';\n a.download = `${title.replace(/[^a-z0-9]/gi, '-')}.${extension}`;\n a.click();\n URL.revokeObjectURL(url);\n success('Downloaded', `File ${title} downloaded`);\n } catch (err) {\n error('Error', 'Failed to download content');\n } finally {\n setIsDownloading(false);\n }\n };\n\n const defaultActions: ModalAction[] = [\n {\n label: 'Copy',\n icon: Copy,\n onClick: handleCopy,\n variant: 'outline',\n disabled: isCopying || isLoading || !content,\n },\n {\n label: 'Download',\n icon: Download,\n onClick: handleDownload,\n variant: 'outline',\n disabled: isDownloading || isLoading || !content,\n },\n ];\n\n const modalActions = actions || defaultActions;\n\n const renderContent = () => {\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n <span className=\"ml-3 text-muted-foreground\">Loading...</span>\n </div>\n );\n }\n\n if (!content) {\n return (\n <div className=\"flex items-center justify-center py-12 text-center\">\n <FileText className=\"h-12 w-12 text-muted-foreground mb-4\" />\n <div>\n <p className=\"text-muted-foreground\">No content available</p>\n </div>\n </div>\n );\n }\n\n switch (contentType) {\n case 'markdown':\n return (\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n <pre className=\"whitespace-pre-wrap break-words font-sans text-sm leading-relaxed\">\n {content}\n </pre>\n </div>\n );\n case 'json':\n return (\n <pre className=\"text-sm bg-muted p-4 rounded-lg overflow-x-auto font-mono\">\n {JSON.stringify(JSON.parse(content), null, 2)}\n </pre>\n );\n case 'text':\n return (\n <pre className=\"text-sm whitespace-pre-wrap break-words font-sans leading-relaxed\">\n {content}\n </pre>\n );\n default:\n return <pre className=\"text-sm\">{content}</pre>;\n }\n };\n\n const maxWidthClass = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n '2xl': 'max-w-2xl',\n '3xl': 'max-w-3xl',\n '4xl': 'max-w-4xl',\n }[maxWidth];\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent className={cn('flex flex-col', maxWidthClass)}>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <FileText className=\"w-5 h-5\" />\n {title}\n </DialogTitle>\n </DialogHeader>\n\n <div \n className=\"flex-1 overflow-auto py-4\" \n style={{ maxHeight }}\n >\n {renderContent()}\n </div>\n\n <DialogFooter className=\"gap-2\">\n {modalActions.map((action, index) => {\n const Icon = action.icon;\n return (\n <Button\n key={index}\n variant={action.variant || 'default'}\n onClick={() => action.onClick(content)}\n disabled={action.disabled || isLoading}\n >\n {Icon && <Icon className=\"w-4 h-4 mr-2\" />}\n {action.label}\n {(isCopying && action.label === 'Copy') && (\n <Loader2 className=\"w-4 h-4 ml-2 animate-spin\" />\n )}\n {(isDownloading && action.label === 'Download') && (\n <Loader2 className=\"w-4 h-4 ml-2 animate-spin\" />\n )}\n </Button>\n );\n })}\n <Button variant=\"ghost\" onClick={onClose} disabled={isLoading}>\n Close\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ========================================\n// Exports\n// ========================================\n\nexport default MarkdownModal;\n","// ========================================\r\n// SummaryTab Component\r\n// ========================================\r\n// Summary tab for session detail page with multiple summaries support\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { FileText, Eye } from 'lucide-react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport MarkdownModal from '@/components/shared/MarkdownModal';\r\n\r\n// ========================================\r\n// Types\r\n// ========================================\r\n\r\nexport interface SummaryItem {\r\n name: string;\r\n content: string;\r\n}\r\n\r\nexport interface SummaryTabProps {\r\n summary?: string;\r\n summaries?: SummaryItem[];\r\n}\r\n\r\n// ========================================\r\n// Component\r\n// ========================================\r\n\r\n/**\r\n * SummaryTab component - Display session summary/summaries with modal viewer\r\n * \r\n * @example\r\n * ```tsx\r\n * <SummaryTab \r\n * summaries={[{ name: 'Plan Summary', content: '...' }]} \r\n * />\r\n * ```\r\n */\r\nexport function SummaryTab({ summary, summaries }: SummaryTabProps) {\r\n const { formatMessage } = useIntl();\r\n const [selectedSummary, setSelectedSummary] = React.useState<SummaryItem | null>(null);\r\n\r\n // Use summaries array if available, otherwise fallback to single summary\r\n const summaryList: SummaryItem[] = React.useMemo(() => {\r\n if (summaries && summaries.length > 0) {\r\n return summaries;\r\n }\r\n if (summary) {\r\n return [{ name: formatMessage({ id: 'sessionDetail.summary.default' }), content: summary }];\r\n }\r\n return [];\r\n }, [summaries, summary, formatMessage]);\r\n\r\n if (summaryList.length === 0) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <FileText className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.summary.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.summary.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"space-y-4\">\r\n {/* Always use truncated card display with modal viewer */}\r\n {summaryList.map((item, index) => (\r\n <SummaryCard\r\n key={index}\r\n summary={item}\r\n onClick={() => setSelectedSummary(item)}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Modal Viewer */}\r\n <MarkdownModal\r\n isOpen={!!selectedSummary}\r\n onClose={() => setSelectedSummary(null)}\r\n title={selectedSummary?.name || ''}\r\n content={selectedSummary?.content || ''}\r\n contentType=\"markdown\"\r\n />\r\n </>\r\n );\r\n}\r\n\r\n// ========================================\r\n// Sub-Components\r\n// ========================================\r\n\r\ninterface SummaryCardProps {\r\n summary: SummaryItem;\r\n onClick: () => void;\r\n}\r\n\r\nfunction SummaryCard({ summary, onClick }: SummaryCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n // Get preview (first 5 lines, matching ImplPlanTab style)\r\n const lines = summary.content.split('\\n');\r\n const preview = lines.slice(0, 5).join('\\n');\r\n const hasMore = lines.length > 5;\r\n\r\n return (\r\n <Card>\r\n <CardHeader>\r\n <div className=\"flex items-center justify-between\">\r\n <CardTitle className=\"flex items-center gap-2 text-lg\">\r\n <FileText className=\"w-5 h-5\" />\r\n {summary.name}\r\n </CardTitle>\r\n <Button variant=\"outline\" size=\"sm\" onClick={onClick}>\r\n <Eye className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'common.actions.view' })}\r\n </Button>\r\n </div>\r\n </CardHeader>\r\n <CardContent>\r\n <pre className=\"text-sm text-muted-foreground whitespace-pre-wrap\">\r\n {preview}{hasMore && '\\n...'}\r\n </pre>\r\n {hasMore && (\r\n <div className=\"mt-4\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={onClick}\r\n className=\"w-full\"\r\n >\r\n {formatMessage({ id: 'sessionDetail.summary.viewFull' }, { count: lines.length })}\r\n </Button>\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\n// ========================================\r\n// Exports\r\n// ========================================\r\n\r\nexport default SummaryTab;\r\n","// ========================================\n// ImplPlanTab Component\n// ========================================\n// IMPL Plan tab for session detail page\n\nimport * as React from 'react';\nimport { useIntl } from 'react-intl';\nimport { Ruler, Eye } from 'lucide-react';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport MarkdownModal from '@/components/shared/MarkdownModal';\n\n// ========================================\n// Types\n// ========================================\n\nexport interface ImplPlanTabProps {\n implPlan?: string;\n}\n\n// ========================================\n// Component\n// ========================================\n\n/**\n * ImplPlanTab component - Display IMPL_PLAN.md content with modal viewer\n * \n * @example\n * ```tsx\n * <ImplPlanTab \n * implPlan=\"# Implementation Plan\\n\\n## Steps...\"}\n * />\n * ```\n */\nexport function ImplPlanTab({ implPlan }: ImplPlanTabProps) {\n const { formatMessage } = useIntl();\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n\n if (!implPlan) {\n return (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Ruler className=\"h-12 w-12 text-muted-foreground mb-4\" />\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\n {formatMessage({ id: 'sessionDetail.implPlan.empty.title' })}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {formatMessage({ id: 'sessionDetail.implPlan.empty.message' })}\n </p>\n </div>\n );\n }\n\n // Get preview (first 5 lines)\n const lines = implPlan.split('\\n');\n const preview = lines.slice(0, 5).join('\\n');\n const hasMore = lines.length > 5;\n\n return (\n <>\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"flex items-center gap-2\">\n <Ruler className=\"w-5 h-5\" />\n {formatMessage({ id: 'sessionDetail.implPlan.title' })}\n </CardTitle>\n <Button \n variant=\"outline\" \n size=\"sm\" \n onClick={() => setIsModalOpen(true)}\n >\n <Eye className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'common.actions.view' })}\n </Button>\n </div>\n </CardHeader>\n <CardContent>\n <pre className=\"text-sm text-muted-foreground whitespace-pre-wrap\">\n {preview}{hasMore && '\\n...'}\n </pre>\n {hasMore && (\n <div className=\"mt-4\">\n <Button \n variant=\"outline\" \n size=\"sm\" \n onClick={() => setIsModalOpen(true)}\n className=\"w-full\"\n >\n {formatMessage({ id: 'sessionDetail.implPlan.viewFull' }, { count: lines.length })}\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Modal Viewer */}\n <MarkdownModal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n title=\"IMPL_PLAN.md\"\n content={implPlan}\n contentType=\"markdown\"\n maxWidth=\"3xl\"\n />\n </>\n );\n}\n\n// ========================================\n// Exports\n// ========================================\n\nexport default ImplPlanTab;\n","// ========================================\r\n// ConflictTab Component\r\n// ========================================\r\n// Conflict tab for session detail page - displays conflict resolution decisions\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Scale,\r\n ChevronDown,\r\n ChevronRight,\r\n CheckCircle2,\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from '@/components/ui/Collapsible';\r\n\r\n// Type definitions for conflict resolution data\r\nexport interface UserDecision {\r\n choice: string;\r\n description?: string;\r\n implications?: string;\r\n}\r\n\r\nexport interface ResolvedConflict {\r\n id: string;\r\n category?: string;\r\n brief?: string;\r\n strategy?: string;\r\n}\r\n\r\nexport interface ConflictResolutionData {\r\n session_id: string;\r\n resolved_at?: string;\r\n user_decisions?: Record<string, UserDecision>;\r\n resolved_conflicts?: ResolvedConflict[];\r\n}\r\n\r\nexport interface ConflictTabProps {\r\n conflicts?: ConflictResolutionData;\r\n}\r\n\r\n/**\r\n * ConflictTab component - Display conflict resolution decisions\r\n */\r\nexport function ConflictTab({ conflicts }: ConflictTabProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!conflicts) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Scale className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.conflict.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.conflict.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n const hasUserDecisions = conflicts.user_decisions && Object.keys(conflicts.user_decisions).length > 0;\r\n const hasResolvedConflicts = conflicts.resolved_conflicts && conflicts.resolved_conflicts.length > 0;\r\n\r\n if (!hasUserDecisions && !hasResolvedConflicts) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Scale className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.conflict.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.conflict.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Resolved At */}\r\n {conflicts.resolved_at && (\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\r\n <CheckCircle2 className=\"h-4 w-4 text-success\" />\r\n <span>\r\n {formatMessage({ id: 'sessionDetail.conflict.resolvedAt' })}:{' '}\r\n {new Date(conflicts.resolved_at).toLocaleString()}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* User Decisions Section */}\r\n {hasUserDecisions && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">\r\n {formatMessage({ id: 'sessionDetail.conflict.userDecisions' })}\r\n </h3>\r\n <div className=\"space-y-3\">\r\n {Object.entries(conflicts.user_decisions!).map(([key, decision], index) => (\r\n <Collapsible key={key} defaultOpen={index < 3}>\r\n <CollapsibleTrigger className=\"flex items-center gap-2 w-full text-left p-3 rounded-lg hover:bg-accent/50 transition-colors\">\r\n <ChevronRight className=\"h-4 w-4 transition-transform data-[state=open]:rotate-90\" />\r\n <span className=\"font-medium text-sm flex-1\">{key}</span>\r\n <Badge variant=\"success\" className=\"text-xs\">\r\n {decision.choice}\r\n </Badge>\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className=\"pl-6 pr-3 pb-3 space-y-2\">\r\n {decision.description && (\r\n <div className=\"text-sm text-foreground\">\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.conflict.description' })}:</span>{' '}\r\n {decision.description}\r\n </div>\r\n )}\r\n {decision.implications && (\r\n <div className=\"text-sm text-muted-foreground\">\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.conflict.implications' })}:</span>{' '}\r\n {decision.implications}\r\n </div>\r\n )}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {/* Resolved Conflicts Section */}\r\n {hasResolvedConflicts && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">\r\n {formatMessage({ id: 'sessionDetail.conflict.resolvedConflicts' })}\r\n </h3>\r\n <div className=\"space-y-3\">\r\n {conflicts.resolved_conflicts!.map((conflict) => (\r\n <Collapsible key={conflict.id}>\r\n <CollapsibleTrigger className=\"flex items-center gap-2 w-full text-left p-3 rounded-lg hover:bg-accent/50 transition-colors\">\r\n <ChevronDown className=\"h-4 w-4 transition-transform data-[state=closed]:rotate-[-90deg]\" />\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-sm\">{conflict.id}</span>\r\n {conflict.category && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {conflict.category}\r\n </Badge>\r\n )}\r\n </div>\r\n {conflict.brief && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">{conflict.brief}</p>\r\n )}\r\n </div>\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className=\"pl-6 pr-3 pb-3\">\r\n {conflict.strategy && (\r\n <div className=\"text-sm text-foreground\">\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.conflict.strategy' })}:</span>{' '}\r\n {conflict.strategy}\r\n </div>\r\n )}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// ReviewTab Component\r\n// ========================================\r\n// Review tab for session detail page - displays review findings by dimension\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Search,\r\n ChevronRight,\r\n AlertCircle,\r\n AlertTriangle,\r\n Info,\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport {\r\n Select,\r\n SelectTrigger,\r\n SelectValue,\r\n SelectContent,\r\n SelectItem,\r\n} from '@/components/ui/Select';\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from '@/components/ui/Collapsible';\r\n\r\n// Type definitions for review data\r\nexport interface ReviewFinding {\r\n severity: 'critical' | 'high' | 'medium' | 'low';\r\n title: string;\r\n description?: string;\r\n location?: string;\r\n code?: string;\r\n}\r\n\r\nexport interface ReviewDimension {\r\n name: string;\r\n findings?: ReviewFinding[];\r\n summary?: string;\r\n}\r\n\r\nexport interface ReviewTabProps {\r\n review?: {\r\n dimensions?: ReviewDimension[];\r\n };\r\n}\r\n\r\ntype SeverityFilter = 'all' | 'critical' | 'high' | 'medium' | 'low';\r\n\r\n/**\r\n * Get severity color variant for badges\r\n */\r\nfunction getSeverityVariant(severity: string): 'destructive' | 'warning' | 'default' | 'secondary' {\r\n switch (severity) {\r\n case 'critical':\r\n return 'destructive';\r\n case 'high':\r\n return 'warning';\r\n case 'medium':\r\n return 'default';\r\n case 'low':\r\n return 'secondary';\r\n default:\r\n return 'secondary';\r\n }\r\n}\r\n\r\n/**\r\n * Get border color class for severity\r\n */\r\nfunction getSeverityBorderClass(severity: string): string {\r\n switch (severity) {\r\n case 'critical':\r\n return 'border-destructive';\r\n case 'high':\r\n return 'border-orange-500';\r\n case 'medium':\r\n return 'border-yellow-500';\r\n case 'low':\r\n return 'border-blue-500';\r\n default:\r\n return 'border-border';\r\n }\r\n}\r\n\r\n/**\r\n * Get severity icon\r\n */\r\nfunction getSeverityIcon(severity: string) {\r\n switch (severity) {\r\n case 'critical':\r\n case 'high':\r\n return <AlertCircle className=\"h-4 w-4\" />;\r\n case 'medium':\r\n return <AlertTriangle className=\"h-4 w-4\" />;\r\n case 'low':\r\n return <Info className=\"h-4 w-4\" />;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * ReviewTab component - Display review findings by dimension\r\n */\r\nexport function ReviewTab({ review }: ReviewTabProps) {\r\n const { formatMessage } = useIntl();\r\n const [severityFilter, setSeverityFilter] = useState<SeverityFilter>('all');\r\n\r\n if (!review || !review.dimensions || review.dimensions.length === 0) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Search className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.review.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.review.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // Filter findings by severity\r\n const filteredDimensions = review.dimensions.map((dimension) => ({\r\n ...dimension,\r\n findings: dimension.findings?.filter((finding) =>\r\n severityFilter === 'all' || finding.severity === severityFilter\r\n ),\r\n })).filter((dimension) => dimension.findings && dimension.findings.length > 0);\r\n\r\n const hasFindings = filteredDimensions.some((d) => d.findings && d.findings.length > 0);\r\n\r\n if (!hasFindings) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Search className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.review.noFindings.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.review.noFindings.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Severity Filter */}\r\n <div className=\"flex items-center gap-4\">\r\n <span className=\"text-sm font-medium text-foreground\">\r\n {formatMessage({ id: 'sessionDetail.review.filterBySeverity' })}\r\n </span>\r\n <Select value={severityFilter} onValueChange={(v) => setSeverityFilter(v as SeverityFilter)}>\r\n <SelectTrigger className=\"w-48\">\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"all\">{formatMessage({ id: 'sessionDetail.review.severity.all' })}</SelectItem>\r\n <SelectItem value=\"critical\">{formatMessage({ id: 'sessionDetail.review.severity.critical' })}</SelectItem>\r\n <SelectItem value=\"high\">{formatMessage({ id: 'sessionDetail.review.severity.high' })}</SelectItem>\r\n <SelectItem value=\"medium\">{formatMessage({ id: 'sessionDetail.review.severity.medium' })}</SelectItem>\r\n <SelectItem value=\"low\">{formatMessage({ id: 'sessionDetail.review.severity.low' })}</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n\r\n {/* Dimensions with Findings */}\r\n {filteredDimensions.map((dimension) => {\r\n if (!dimension.findings || dimension.findings.length === 0) return null;\r\n\r\n return (\r\n <Card key={dimension.name}>\r\n <CardContent className=\"p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold text-foreground\">{dimension.name}</h3>\r\n <Badge variant=\"secondary\">{dimension.findings.length}</Badge>\r\n </div>\r\n\r\n {dimension.summary && (\r\n <p className=\"text-sm text-muted-foreground mb-4\">{dimension.summary}</p>\r\n )}\r\n\r\n <div className=\"space-y-3\">\r\n {dimension.findings.map((finding, findingIndex) => (\r\n <Collapsible key={`${dimension.name}-${findingIndex}`} className={`border-l-4 ${getSeverityBorderClass(finding.severity)} rounded-r-lg`}>\r\n <CollapsibleTrigger className=\"flex items-center gap-2 w-full text-left p-3 hover:bg-accent/50 transition-colors\">\r\n <ChevronRight className=\"h-4 w-4 transition-transform data-[state=open]:rotate-90\" />\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {getSeverityIcon(finding.severity)}\r\n <span className=\"font-medium text-sm\">{finding.title}</span>\r\n <Badge variant={getSeverityVariant(finding.severity)} className=\"text-xs\">\r\n {formatMessage({ id: `sessionDetail.review.severity.${finding.severity}` })}\r\n </Badge>\r\n </div>\r\n {finding.location && (\r\n <p className=\"text-xs text-muted-foreground mt-1 font-mono\">{finding.location}</p>\r\n )}\r\n </div>\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className=\"px-6 pb-3 space-y-2\">\r\n {finding.description && (\r\n <div className=\"text-sm text-foreground\">\r\n {finding.description}\r\n </div>\r\n )}\r\n {finding.code && (\r\n <pre className=\"text-xs bg-muted p-2 rounded overflow-x-auto\">\r\n <code>{finding.code}</code>\r\n </pre>\r\n )}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// SessionDetailPage Component\r\n// ========================================\r\n// Session detail page with tabs for tasks, context, summary, impl-plan, conflict, and review\r\n\r\nimport * as React from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n ArrowLeft,\r\n Calendar,\r\n ListChecks,\r\n Package,\r\n FileText,\r\n XCircle,\r\n Ruler,\r\n Scale,\r\n Search,\r\n} from 'lucide-react';\r\nimport { useSessionDetail } from '@/hooks/useSessionDetail';\r\nimport { TaskListTab } from './session-detail/TaskListTab';\r\nimport { ContextTab } from './session-detail/ContextTab';\r\nimport { SummaryTab } from './session-detail/SummaryTab';\r\nimport ImplPlanTab from './session-detail/ImplPlanTab';\r\nimport { ConflictTab } from './session-detail/ConflictTab';\r\nimport { ReviewTab } from './session-detail/ReviewTab';\r\nimport { TaskDrawer } from '@/components/shared/TaskDrawer';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { TabsNavigation, type TabItem } from '@/components/ui/TabsNavigation';\r\nimport type { TaskData, SessionMetadata } from '@/types/store';\r\n\r\ntype TabValue = 'tasks' | 'context' | 'summary' | 'impl-plan' | 'conflict' | 'review';\r\n\r\n// Status label keys for i18n (maps snake_case status to camelCase translation keys)\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/**\r\n * SessionDetailPage component - Main session detail page with tabs\r\n */\r\nexport function SessionDetailPage() {\r\n const { sessionId } = useParams<{ sessionId: string }>();\r\n const navigate = useNavigate();\r\n const { formatMessage } = useIntl();\r\n const { sessionDetail, isLoading, error, refetch } = useSessionDetail(sessionId!);\r\n const [activeTab, setActiveTab] = React.useState<TabValue>('tasks');\r\n const [selectedTask, setSelectedTask] = React.useState<TaskData | null>(null);\r\n\r\n const handleBack = () => {\r\n navigate('/sessions');\r\n };\r\n\r\n // Loading state\r\n if (isLoading) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center gap-4\">\r\n <Button variant=\"ghost\" size=\"sm\" disabled>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n <div className=\"h-8 w-64 rounded bg-muted animate-pulse\" />\r\n </div>\r\n <div className=\"h-64 rounded-lg bg-muted animate-pulse\" />\r\n </div>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <XCircle className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{error.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n {formatMessage({ id: 'common.actions.retry' })}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n // Session not found\r\n if (!sessionDetail) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n <Package className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.notFound.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {formatMessage({ id: 'sessionDetail.notFound.message' })}\r\n </p>\r\n <Button onClick={handleBack}>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n const { session, context, summary, summaries, implPlan, conflicts, review } = sessionDetail;\r\n const tasks = session.tasks || [];\r\n const completedTasks = tasks.filter((t) => t.status === 'completed').length;\r\n const hasReview = session.has_review || session.review;\r\n\r\n const tabs: TabItem[] = [\r\n {\r\n value: 'tasks',\r\n label: formatMessage({ id: 'sessionDetail.tabs.tasks' }),\r\n icon: <ListChecks className=\"h-4 w-4\" />,\r\n badge: <Badge variant=\"secondary\" className=\"ml-2\">{tasks.length}</Badge>,\r\n },\r\n {\r\n value: 'context',\r\n label: formatMessage({ id: 'sessionDetail.tabs.context' }),\r\n icon: <Package className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'summary',\r\n label: formatMessage({ id: 'sessionDetail.tabs.summary' }),\r\n icon: <FileText className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'impl-plan',\r\n label: formatMessage({ id: 'sessionDetail.tabs.implPlan' }),\r\n icon: <Ruler className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'conflict',\r\n label: formatMessage({ id: 'sessionDetail.tabs.conflict' }),\r\n icon: <Scale className=\"h-4 w-4\" />,\r\n },\r\n ];\r\n\r\n if (hasReview) {\r\n tabs.push({\r\n value: 'review',\r\n label: formatMessage({ id: 'sessionDetail.tabs.review' }),\r\n icon: <Search className=\"h-4 w-4\" />,\r\n });\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n <Button variant=\"ghost\" size=\"sm\" onClick={handleBack}>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n <div>\r\n <h1 className=\"text-2xl font-semibold text-foreground\">\r\n {session.title || session.session_id}\r\n </h1>\r\n {session.title && session.title !== session.session_id && (\r\n <p className=\"text-sm text-muted-foreground mt-0.5\">{session.session_id}</p>\r\n )}\r\n </div>\r\n </div>\r\n <Badge variant={session.status === 'completed' ? 'success' : 'secondary'}>\r\n {formatMessage({ id: statusLabelKeys[session.status] ?? 'sessions.status.inProgress' })}\r\n </Badge>\r\n </div>\r\n\r\n {/* Info Bar */}\r\n <div className=\"flex flex-wrap gap-4 text-sm text-muted-foreground p-4 bg-background rounded-lg border\">\r\n <div className=\"flex items-center gap-1\">\r\n <Calendar className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.info.created' })}:</span>{' '}\r\n {new Date(session.created_at).toLocaleString()}\r\n </div>\r\n {session.updated_at && (\r\n <div className=\"flex items-center gap-1\">\r\n <Calendar className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.info.updated' })}:</span>{' '}\r\n {new Date(session.updated_at).toLocaleString()}\r\n </div>\r\n )}\r\n <div className=\"flex items-center gap-1\">\r\n <ListChecks className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.info.tasks' })}:</span>{' '}\r\n {completedTasks}/{tasks.length}\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <TabsNavigation\r\n value={activeTab}\r\n onValueChange={(v) => setActiveTab(v as TabValue)}\r\n tabs={tabs}\r\n />\r\n\r\n {/* Tab Content */}\r\n {activeTab === 'tasks' && (\r\n <div className=\"mt-4\">\r\n <TaskListTab session={session} onTaskClick={setSelectedTask} />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'context' && (\r\n <div className=\"mt-4\">\r\n <ContextTab context={context} />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'summary' && (\r\n <div className=\"mt-4\">\r\n <SummaryTab summary={summary} summaries={summaries} />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'impl-plan' && (\r\n <div className=\"mt-4\">\r\n <ImplPlanTab implPlan={implPlan as string | undefined} />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'conflict' && (\r\n <div className=\"mt-4\">\r\n <ConflictTab conflicts={conflicts as any} />\r\n </div>\r\n )}\r\n\r\n {hasReview && activeTab === 'review' && (\r\n <div className=\"mt-4\">\r\n <ReviewTab review={review as any} />\r\n </div>\r\n )}\r\n\r\n {/* Description (if exists) */}\r\n {session.description && (\r\n <div className=\"p-4 bg-background rounded-lg border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.info.description' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">{session.description}</p>\r\n </div>\r\n )}\r\n\r\n {/* TaskDrawer */}\r\n <TaskDrawer\r\n task={selectedTask}\r\n isOpen={!!selectedTask}\r\n onClose={() => setSelectedTask(null)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default SessionDetailPage;\r\n"],"names":["Forward","createLucideIcon","Ruler","Scale","sessionDetailKeys","id","projectPath","STALE_TIME","useSessionDetail","sessionId","options","staleTime","enabled","useWorkflowStore","selectProjectPath","queryEnabled","query","useQuery","fetchSessionDetail","attemptIndex","BulkActionButton","Icon","label","isLoading","disabled","variant","size","className","props","jsxs","Button","jsx","Loader2","TaskStatsBar","completed","inProgress","pending","onMarkAllPending","onMarkAllInProgress","onMarkAllCompleted","isLoadingPending","isLoadingInProgress","isLoadingCompleted","formatMessage","useIntl","cn","CheckCircle","Circle","statusConfig","CircleX","TaskStatusDropdown","currentStatus","onStatusChange","isChanging","setIsChanging","useState","handleStatusChange","newStatus","error","currentConfig","StatusIcon","badgeSize","DropdownMenu","DropdownMenuTrigger","Badge","DropdownMenuContent","status","config","DropdownMenuItem","TaskListTab","session","onTaskClick","tasks","hasStatusTracking","t","raw","source","setIsLoadingPending","setIsLoadingInProgress","setIsLoadingCompleted","localTasks","setLocalTasks","sessionPath","handleMarkAllPending","targetTasks","prev","taskIds","result","bulkUpdateTaskStatus","handleMarkAllInProgress","handleMarkAllCompleted","handleTaskStatusChange","taskId","previousTasks","updateTaskStatus","ListChecks","task","index","extTask","dependsCount","_a","taskType","_b","taskScope","_c","stepsCount","_e","_d","filesCount","_g","_f","Card","CardContent","Layers","FileCode","GitBranch","Calendar","DependenciesCard","data","internalCount","externalCount","CardHeader","CardTitle","InternalDependenciesSection","ExternalDependenciesSection","dependencies","dep","Package","d","TestContextCard","testCount","markerCount","TestTube","AlertCircle","FrameworkSection","marker","FieldRenderer","frameworks","FrameworkCard","title","framework","plugin","ContextTab","context","hasRequirements","hasFocusPaths","hasArtifacts","hasSharedContext","hasExtendedContext","hasExplorations","CheckSquare","req","i","path","Tag","artifact","Settings","tech","conv","BookOpen","ExplorationsSection","AssetsCard","ConflictDetectionCard","MarkdownModal","isOpen","onClose","content","contentType","maxWidth","maxHeight","actions","success","useNotifications","isCopying","setIsCopying","React.useState","isDownloading","setIsDownloading","modalActions","Copy","Download","blob","url","a","extension","renderContent","FileText","maxWidthClass","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","action","SummaryTab","summary","summaries","selectedSummary","setSelectedSummary","summaryList","React.useMemo","Fragment","item","SummaryCard","onClick","lines","preview","hasMore","Eye","ImplPlanTab","implPlan","isModalOpen","setIsModalOpen","ConflictTab","conflicts","hasUserDecisions","hasResolvedConflicts","CheckCircle2","key","decision","Collapsible","CollapsibleTrigger","ChevronRight","CollapsibleContent","conflict","ChevronDown","getSeverityVariant","severity","getSeverityBorderClass","getSeverityIcon","AlertTriangle","Info","ReviewTab","review","severityFilter","setSeverityFilter","Search","filteredDimensions","dimension","finding","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","findingIndex","statusLabelKeys","SessionDetailPage","useParams","navigate","useNavigate","sessionDetail","refetch","activeTab","setActiveTab","selectedTask","setSelectedTask","handleBack","ArrowLeft","XCircle","completedTasks","hasReview","tabs","TabsNavigation","TaskDrawer"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"SessionDetailPage-C5Btktmp.js","sources":["../../../../node_modules/lucide-react/dist/esm/icons/forward.js","../../../../node_modules/lucide-react/dist/esm/icons/ruler.js","../../../../node_modules/lucide-react/dist/esm/icons/scale.js","../../src/hooks/useSessionDetail.ts","../../src/components/session-detail/tasks/BulkActionButton.tsx","../../src/components/session-detail/tasks/TaskStatsBar.tsx","../../src/components/session-detail/tasks/TaskStatusDropdown.tsx","../../src/pages/session-detail/TaskListTab.tsx","../../src/components/session-detail/context/DependenciesCard.tsx","../../src/components/session-detail/context/TestContextCard.tsx","../../src/pages/session-detail/ContextTab.tsx","../../src/components/shared/MarkdownModal.tsx","../../src/pages/session-detail/SummaryTab.tsx","../../src/pages/session-detail/ImplPlanTab.tsx","../../src/pages/session-detail/ConflictTab.tsx","../../src/pages/session-detail/ReviewTab.tsx","../../src/pages/SessionDetailPage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Forward = createLucideIcon(\"Forward\", [\n [\"polyline\", { points: \"15 17 20 12 15 7\", key: \"1w3sku\" }],\n [\"path\", { d: \"M4 18v-2a4 4 0 0 1 4-4h12\", key: \"jmiej9\" }]\n]);\n\nexport { Forward as default };\n//# sourceMappingURL=forward.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Ruler = createLucideIcon(\"Ruler\", [\n [\n \"path\",\n {\n d: \"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z\",\n key: \"icamh8\"\n }\n ],\n [\"path\", { d: \"m14.5 12.5 2-2\", key: \"inckbg\" }],\n [\"path\", { d: \"m11.5 9.5 2-2\", key: \"fmmyf7\" }],\n [\"path\", { d: \"m8.5 6.5 2-2\", key: \"vc6u1g\" }],\n [\"path\", { d: \"m17.5 15.5 2-2\", key: \"wo5hmg\" }]\n]);\n\nexport { Ruler as default };\n//# sourceMappingURL=ruler.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Scale = createLucideIcon(\"Scale\", [\n [\"path\", { d: \"m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z\", key: \"7g6ntu\" }],\n [\"path\", { d: \"m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z\", key: \"ijws7r\" }],\n [\"path\", { d: \"M7 21h10\", key: \"1b0cd5\" }],\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }],\n [\"path\", { d: \"M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2\", key: \"3gwbw2\" }]\n]);\n\nexport { Scale as default };\n//# sourceMappingURL=scale.js.map\n","// ========================================\r\n// useSessionDetail Hook\r\n// ========================================\r\n// TanStack Query hook for session detail data\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport { fetchSessionDetail } from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\n// Query key factory - include projectPath as part of the key\r\nexport const sessionDetailKeys = {\r\n all: ['sessionDetail'] as const,\r\n detail: (id: string, projectPath: string) => [...sessionDetailKeys.all, 'detail', id, projectPath] as const,\r\n};\r\n\r\n// Default stale time: 30 seconds\r\nconst STALE_TIME = 30 * 1000;\r\n\r\nexport interface UseSessionDetailOptions {\r\n /** Override default stale time (ms) */\r\n staleTime?: number;\r\n /** Enable/disable the query */\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Hook for fetching session detail data\r\n *\r\n * @example\r\n * ```tsx\r\n * const { sessionDetail, isLoading } = useSessionDetail(sessionId);\r\n * ```\r\n */\r\nexport function useSessionDetail(sessionId: string, options: UseSessionDetailOptions = {}) {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n const queryEnabled = enabled && !!sessionId && !!projectPath;\r\n\r\n const query = useQuery({\r\n queryKey: sessionDetailKeys.detail(sessionId, projectPath),\r\n queryFn: () => fetchSessionDetail(sessionId, projectPath),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n return {\r\n sessionDetail: query.data,\r\n isLoading: query.isLoading,\r\n error: query.error,\r\n refetch: query.refetch,\r\n };\r\n}\r\n","// ========================================\r\n// BulkActionButton Component\r\n// ========================================\r\n// Reusable button component for bulk actions\r\n\r\nimport { Loader2 } from 'lucide-react';\r\nimport { Button, ButtonProps } from '@/components/ui/Button';\r\nimport type { LucideIcon } from 'lucide-react';\r\n\r\nexport interface BulkActionButtonProps extends Omit<ButtonProps, 'leftIcon'> {\r\n icon: LucideIcon;\r\n label: string;\r\n isLoading?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * BulkActionButton component - Button with icon for bulk actions\r\n */\r\nexport function BulkActionButton({\r\n icon: Icon,\r\n label,\r\n isLoading = false,\r\n disabled = false,\r\n variant = 'default',\r\n size = 'sm',\r\n className = '',\r\n ...props\r\n}: BulkActionButtonProps) {\r\n return (\r\n <Button\r\n variant={variant}\r\n size={size}\r\n disabled={disabled || isLoading}\r\n className={className}\r\n {...props}\r\n >\r\n {isLoading ? (\r\n <Loader2 className=\"h-4 w-4 mr-1.5 animate-spin\" />\r\n ) : (\r\n <Icon className=\"h-4 w-4 mr-1.5\" />\r\n )}\r\n {label}\r\n </Button>\r\n );\r\n}\r\n","// ========================================\r\n// TaskStatsBar Component\r\n// ========================================\r\n// Statistics bar with bulk action buttons for tasks\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { CheckCircle, Loader2, Circle } from 'lucide-react';\r\nimport { BulkActionButton } from './BulkActionButton';\r\nimport { cn } from '@/lib/utils';\r\n\r\nexport interface TaskStatsBarProps {\r\n completed: number;\r\n inProgress: number;\r\n pending: number;\r\n onMarkAllPending?: () => void | Promise<void>;\r\n onMarkAllInProgress?: () => void | Promise<void>;\r\n onMarkAllCompleted?: () => void | Promise<void>;\r\n isLoadingPending?: boolean;\r\n isLoadingInProgress?: boolean;\r\n isLoadingCompleted?: boolean;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * TaskStatsBar component - Display task statistics with bulk action buttons\r\n */\r\nexport function TaskStatsBar({\r\n completed,\r\n inProgress,\r\n pending,\r\n onMarkAllPending,\r\n onMarkAllInProgress,\r\n onMarkAllCompleted,\r\n isLoadingPending = false,\r\n isLoadingInProgress = false,\r\n isLoadingCompleted = false,\r\n className = '',\r\n}: TaskStatsBarProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div className={cn('flex flex-wrap items-center gap-4 p-4 bg-background rounded-lg border', className)}>\r\n {/* Statistics */}\r\n <div className=\"flex flex-wrap items-center gap-4 flex-1\">\r\n <span className=\"flex items-center gap-1.5 text-sm\">\r\n <CheckCircle className=\"h-4 w-4 text-success\" />\r\n <strong>{completed}</strong> {formatMessage({ id: 'sessionDetail.tasks.completed' })}\r\n </span>\r\n <span className=\"flex items-center gap-1.5 text-sm\">\r\n <Loader2 className=\"h-4 w-4 text-warning\" />\r\n <strong>{inProgress}</strong> {formatMessage({ id: 'sessionDetail.tasks.inProgress' })}\r\n </span>\r\n <span className=\"flex items-center gap-1.5 text-sm\">\r\n <Circle className=\"h-4 w-4 text-muted-foreground\" />\r\n <strong>{pending}</strong> {formatMessage({ id: 'sessionDetail.tasks.pending' })}\r\n </span>\r\n </div>\r\n\r\n {/* Bulk Action Buttons */}\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n {onMarkAllPending && (\r\n <BulkActionButton\r\n icon={Circle}\r\n label={formatMessage({ id: 'sessionDetail.tasks.quickActions.markAllPending' })}\r\n onClick={onMarkAllPending}\r\n isLoading={isLoadingPending}\r\n disabled={pending === 0}\r\n variant=\"outline\"\r\n />\r\n )}\r\n {onMarkAllInProgress && (\r\n <BulkActionButton\r\n icon={Loader2}\r\n label={formatMessage({ id: 'sessionDetail.tasks.quickActions.markAllInProgress' })}\r\n onClick={onMarkAllInProgress}\r\n isLoading={isLoadingInProgress}\r\n disabled={inProgress === 0}\r\n variant=\"outline\"\r\n />\r\n )}\r\n {onMarkAllCompleted && (\r\n <BulkActionButton\r\n icon={CheckCircle}\r\n label={formatMessage({ id: 'sessionDetail.tasks.quickActions.markAllCompleted' })}\r\n onClick={onMarkAllCompleted}\r\n isLoading={isLoadingCompleted}\r\n disabled={completed === 0}\r\n variant=\"outline\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// TaskStatusDropdown Component\r\n// ========================================\r\n// Inline status dropdown for task items\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Circle,\r\n Loader2,\r\n CheckCircle,\r\n CircleX,\r\n Forward,\r\n} from 'lucide-react';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from '@/components/ui/Dropdown';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport type { TaskStatus } from '@/lib/api';\r\n\r\nexport interface TaskStatusDropdownProps {\r\n currentStatus: TaskStatus;\r\n onStatusChange: (newStatus: TaskStatus) => void | Promise<void>;\r\n disabled?: boolean;\r\n size?: 'sm' | 'default';\r\n}\r\n\r\n// Status configuration\r\nconst statusConfig: Record<\r\n TaskStatus,\r\n {\r\n label: string;\r\n variant: 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'info' | null;\r\n icon: React.ComponentType<{ className?: string }>;\r\n }\r\n> = {\r\n pending: {\r\n label: 'sessionDetail.tasks.status.pending',\r\n variant: 'secondary',\r\n icon: Circle,\r\n },\r\n in_progress: {\r\n label: 'sessionDetail.tasks.status.inProgress',\r\n variant: 'warning',\r\n icon: Loader2,\r\n },\r\n completed: {\r\n label: 'sessionDetail.tasks.status.completed',\r\n variant: 'success',\r\n icon: CheckCircle,\r\n },\r\n blocked: {\r\n label: 'sessionDetail.tasks.status.blocked',\r\n variant: 'destructive',\r\n icon: CircleX,\r\n },\r\n skipped: {\r\n label: 'sessionDetail.tasks.status.skipped',\r\n variant: 'default',\r\n icon: Forward,\r\n },\r\n};\r\n\r\n/**\r\n * TaskStatusDropdown component - Inline status selector with optimistic UI\r\n */\r\nexport function TaskStatusDropdown({\r\n currentStatus,\r\n onStatusChange,\r\n disabled = false,\r\n size = 'sm',\r\n}: TaskStatusDropdownProps) {\r\n const { formatMessage } = useIntl();\r\n const [isChanging, setIsChanging] = useState(false);\r\n\r\n const handleStatusChange = async (newStatus: TaskStatus) => {\r\n if (newStatus === currentStatus || isChanging) return;\r\n\r\n setIsChanging(true);\r\n try {\r\n await onStatusChange(newStatus);\r\n } catch (error) {\r\n console.error('[TaskStatusDropdown] Failed to update status:', error);\r\n } finally {\r\n setIsChanging(false);\r\n }\r\n };\r\n\r\n const currentConfig = statusConfig[currentStatus] || statusConfig.pending;\r\n const StatusIcon = currentConfig.icon;\r\n const badgeSize = size === 'sm' ? 'text-xs' : 'text-sm';\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n asChild\r\n disabled={disabled || isChanging}\r\n className=\"cursor-pointer\"\r\n >\r\n <Badge\r\n variant={currentConfig.variant}\r\n className={`gap-1 ${badgeSize} ${isChanging ? 'opacity-50' : ''}`}\r\n >\r\n {isChanging ? (\r\n <Loader2 className=\"h-3 w-3 animate-spin\" />\r\n ) : (\r\n <StatusIcon className=\"h-3 w-3\" />\r\n )}\r\n {formatMessage({ id: currentConfig.label })}\r\n </Badge>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\" className=\"min-w-[160px]\">\r\n {(Object.keys(statusConfig) as TaskStatus[]).map((status) => {\r\n const config = statusConfig[status];\r\n const Icon = config.icon;\r\n return (\r\n <DropdownMenuItem\r\n key={status}\r\n onClick={() => handleStatusChange(status)}\r\n disabled={status === currentStatus || isChanging}\r\n className=\"gap-2\"\r\n >\r\n <Icon className=\"h-4 w-4\" />\r\n <span>{formatMessage({ id: config.label })}</span>\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n","// ========================================\r\n// TaskListTab Component\r\n// ========================================\r\n// Tasks tab for session detail page\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n ListChecks,\r\n GitBranch,\r\n Calendar,\r\n FileCode,\r\n Layers,\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { TaskStatsBar, TaskStatusDropdown } from '@/components/session-detail/tasks';\r\nimport type { SessionMetadata, TaskData } from '@/types/store';\r\nimport type { TaskStatus, FlowControl } from '@/lib/api';\r\nimport { bulkUpdateTaskStatus, updateTaskStatus } from '@/lib/api';\r\n\r\n// Extended task type with all possible fields from JSON\r\ninterface ExtendedTask extends TaskData {\r\n meta?: {\r\n type?: string;\r\n scope?: string;\r\n };\r\n context?: {\r\n focus_paths?: string[];\r\n acceptance?: string[];\r\n depends_on?: string[];\r\n };\r\n flow_control?: FlowControl;\r\n}\r\n\r\nexport interface TaskListTabProps {\r\n session: SessionMetadata;\r\n onTaskClick?: (task: TaskData) => void;\r\n}\r\n\r\n/**\r\n * TaskListTab component - Display tasks in a list format\r\n */\r\nexport function TaskListTab({ session, onTaskClick }: TaskListTabProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n const tasks = session.tasks || [];\r\n\r\n // Detect if session tasks support status tracking (new format has explicit status/status_history in raw data)\r\n const hasStatusTracking = tasks.some((t) => {\r\n const raw = (t as unknown as Record<string, unknown>)._raw as Record<string, unknown> | undefined;\r\n const source = (raw?._raw as Record<string, unknown>) || raw;\r\n return source ? (source.status !== undefined || source.status_history !== undefined) : false;\r\n });\r\n\r\n const completed = tasks.filter((t) => t.status === 'completed').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\r\n // Loading states for bulk actions\r\n const [isLoadingPending, setIsLoadingPending] = useState(false);\r\n const [isLoadingInProgress, setIsLoadingInProgress] = useState(false);\r\n const [isLoadingCompleted, setIsLoadingCompleted] = useState(false);\r\n\r\n // Local task state for optimistic updates\r\n const [localTasks, setLocalTasks] = useState<TaskData[]>(tasks);\r\n\r\n // Update local tasks when session tasks change\r\n if (tasks !== localTasks && !isLoadingPending && !isLoadingInProgress && !isLoadingCompleted) {\r\n setLocalTasks(tasks);\r\n }\r\n\r\n // Get session path for API calls\r\n const sessionPath = (session as any).path || session.session_id;\r\n\r\n // Bulk action handlers - mark ALL tasks (not just filtered ones) to the target status\r\n const handleMarkAllPending = async () => {\r\n // Mark all non-pending tasks as pending\r\n const targetTasks = localTasks.filter((t) => t.status !== 'pending');\r\n if (targetTasks.length === 0) return;\r\n\r\n setIsLoadingPending(true);\r\n // Optimistic update\r\n setLocalTasks((prev) => prev.map((t) => ({ ...t, status: 'pending' as const })));\r\n try {\r\n const taskIds = targetTasks.map((t) => t.task_id);\r\n const result = await bulkUpdateTaskStatus(sessionPath, taskIds, 'pending');\r\n if (!result.success) {\r\n console.error('[TaskListTab] Failed to mark all as pending:', result.error);\r\n // Rollback on error\r\n setLocalTasks(tasks);\r\n }\r\n } catch (error) {\r\n console.error('[TaskListTab] Failed to mark all as pending:', error);\r\n setLocalTasks(tasks);\r\n } finally {\r\n setIsLoadingPending(false);\r\n }\r\n };\r\n\r\n const handleMarkAllInProgress = async () => {\r\n // Mark all non-in_progress tasks as in_progress\r\n const targetTasks = localTasks.filter((t) => t.status !== 'in_progress');\r\n if (targetTasks.length === 0) return;\r\n\r\n setIsLoadingInProgress(true);\r\n // Optimistic update\r\n setLocalTasks((prev) => prev.map((t) => ({ ...t, status: 'in_progress' as const })));\r\n try {\r\n const taskIds = targetTasks.map((t) => t.task_id);\r\n const result = await bulkUpdateTaskStatus(sessionPath, taskIds, 'in_progress');\r\n if (!result.success) {\r\n console.error('[TaskListTab] Failed to mark all as in_progress:', result.error);\r\n setLocalTasks(tasks);\r\n }\r\n } catch (error) {\r\n console.error('[TaskListTab] Failed to mark all as in_progress:', error);\r\n setLocalTasks(tasks);\r\n } finally {\r\n setIsLoadingInProgress(false);\r\n }\r\n };\r\n\r\n const handleMarkAllCompleted = async () => {\r\n // Mark all non-completed tasks as completed\r\n const targetTasks = localTasks.filter((t) => t.status !== 'completed');\r\n if (targetTasks.length === 0) return;\r\n\r\n setIsLoadingCompleted(true);\r\n // Optimistic update\r\n setLocalTasks((prev) => prev.map((t) => ({ ...t, status: 'completed' as const })));\r\n try {\r\n const taskIds = targetTasks.map((t) => t.task_id);\r\n const result = await bulkUpdateTaskStatus(sessionPath, taskIds, 'completed');\r\n if (!result.success) {\r\n console.error('[TaskListTab] Failed to mark all as completed:', result.error);\r\n setLocalTasks(tasks);\r\n }\r\n } catch (error) {\r\n console.error('[TaskListTab] Failed to mark all as completed:', error);\r\n setLocalTasks(tasks);\r\n } finally {\r\n setIsLoadingCompleted(false);\r\n }\r\n };\r\n\r\n // Individual task status change handler\r\n const handleTaskStatusChange = async (taskId: string, newStatus: TaskStatus) => {\r\n const previousTasks = [...localTasks];\r\n const previousTask = previousTasks.find((t) => t.task_id === taskId);\r\n\r\n if (!previousTask) return;\r\n\r\n // Optimistic update\r\n setLocalTasks((prev) =>\r\n prev.map((t) =>\r\n t.task_id === taskId ? { ...t, status: newStatus } : t\r\n )\r\n );\r\n\r\n try {\r\n const result = await updateTaskStatus(sessionPath, taskId, newStatus);\r\n if (!result.success) {\r\n // Rollback on error\r\n setLocalTasks(previousTasks);\r\n console.error('[TaskListTab] Failed to update task status:', result.error);\r\n }\r\n } catch (error) {\r\n // Rollback on error\r\n setLocalTasks(previousTasks);\r\n console.error('[TaskListTab] Failed to update task status:', error);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Stats Bar with Bulk Actions (only for tasks with status tracking) */}\r\n {hasStatusTracking && (\r\n <TaskStatsBar\r\n completed={completed}\r\n inProgress={inProgress}\r\n pending={pending}\r\n onMarkAllPending={handleMarkAllPending}\r\n onMarkAllInProgress={handleMarkAllInProgress}\r\n onMarkAllCompleted={handleMarkAllCompleted}\r\n isLoadingPending={isLoadingPending}\r\n isLoadingInProgress={isLoadingInProgress}\r\n isLoadingCompleted={isLoadingCompleted}\r\n />\r\n )}\r\n\r\n {/* Tasks List */}\r\n {localTasks.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <ListChecks className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.tasks.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.tasks.empty.message' })}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2\">\r\n {localTasks.map((task, index) => {\r\n // Cast to extended type to access all possible fields\r\n const extTask = task as unknown as ExtendedTask;\r\n\r\n // Get depends_on from either root level or context\r\n const dependsOn = extTask.depends_on || extTask.context?.depends_on || [];\r\n const dependsCount = dependsOn.length;\r\n\r\n // Get meta info\r\n const taskType = extTask.meta?.type;\r\n const taskScope = extTask.meta?.scope;\r\n\r\n // Get implementation steps count from flow_control\r\n const stepsCount = extTask.flow_control?.implementation_approach?.length || 0;\r\n\r\n // Get target files count\r\n const filesCount = extTask.flow_control?.target_files?.length || 0;\r\n\r\n return (\r\n <Card\r\n key={`${task.task_id}-${index}`}\r\n className={`hover:shadow-sm transition-shadow ${onTaskClick ? 'cursor-pointer hover:shadow-md' : ''}`}\r\n onClick={() => onTaskClick?.(task as TaskData)}\r\n >\r\n <CardContent className=\"p-4\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n {/* Left: Task ID, Title, Description */}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-mono font-semibold bg-primary/10 text-primary border border-primary/20\">\r\n {task.task_id}\r\n </span>\r\n </div>\r\n <h4 className=\"font-medium text-foreground text-sm\">\r\n {task.title || formatMessage({ id: 'sessionDetail.tasks.untitled' })}\r\n </h4>\r\n {task.description && (\r\n <p className=\"text-sm text-muted-foreground mt-1 line-clamp-2\">\r\n {task.description}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {/* Right: Status and Meta info */}\r\n <div className=\"flex flex-col items-end gap-2 flex-shrink-0\">\r\n {/* Row 1: Status dropdown (only for tasks with status tracking) */}\r\n {hasStatusTracking && (\r\n <TaskStatusDropdown\r\n currentStatus={task.status as TaskStatus}\r\n onStatusChange={(newStatus) => handleTaskStatusChange(task.task_id, newStatus)}\r\n size=\"sm\"\r\n />\r\n )}\r\n\r\n {/* Row 2: Meta info */}\r\n <div className=\"flex items-center gap-3 flex-wrap justify-end text-xs text-muted-foreground\">\r\n {taskType && (\r\n <span className=\"bg-muted px-1.5 py-0.5 rounded\">{taskType}</span>\r\n )}\r\n {stepsCount > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <Layers className=\"h-3 w-3\" />\r\n {stepsCount} {formatMessage({ id: 'sessionDetail.tasks.steps' })}\r\n </span>\r\n )}\r\n {filesCount > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <FileCode className=\"h-3 w-3\" />\r\n {filesCount} {formatMessage({ id: 'sessionDetail.tasks.files' })}\r\n </span>\r\n )}\r\n {dependsCount > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <GitBranch className=\"h-3 w-3\" />\r\n {dependsCount} {formatMessage({ id: 'sessionDetail.tasks.deps' })}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Row 3: Scope or Date */}\r\n {(taskScope || task.created_at) && (\r\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\r\n {taskScope && (\r\n <span className=\"bg-muted px-1.5 py-0.5 rounded\">{taskScope}</span>\r\n )}\r\n {task.created_at && (\r\n <span className=\"flex items-center gap-1\">\r\n <Calendar className=\"h-3 w-3\" />\r\n {new Date(task.created_at).toLocaleDateString()}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// DependenciesCard Component\r\n// ========================================\r\n// Displays internal and external dependencies\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { GitBranch, Package } from 'lucide-react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\n\r\nexport interface InternalDependency {\r\n from: string;\r\n type: string;\r\n to: string;\r\n}\r\n\r\nexport interface ExternalDependency {\r\n package: string;\r\n version?: string;\r\n usage?: string;\r\n}\r\n\r\nexport interface DependenciesData {\r\n internal?: InternalDependency[];\r\n external?: ExternalDependency[];\r\n}\r\n\r\nexport interface DependenciesCardProps {\r\n data?: DependenciesData;\r\n}\r\n\r\n/**\r\n * DependenciesCard component - Displays project dependencies\r\n */\r\nexport function DependenciesCard({ data }: DependenciesCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || (!data.internal?.length && !data.external?.length)) {\r\n return null;\r\n }\r\n\r\n const internalCount = data.internal?.length || 0;\r\n const externalCount = data.external?.length || 0;\r\n\r\n return (\r\n <Card>\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2\">\r\n <GitBranch className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.title' })}\r\n <Badge variant=\"secondary\">{internalCount + externalCount}</Badge>\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-6\">\r\n {data.internal && data.internal.length > 0 && (\r\n <InternalDependenciesSection dependencies={data.internal} />\r\n )}\r\n\r\n {data.external && data.external.length > 0 && (\r\n <ExternalDependenciesSection dependencies={data.external} />\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface InternalDependenciesSectionProps {\r\n dependencies: InternalDependency[];\r\n}\r\n\r\nfunction InternalDependenciesSection({ dependencies }: InternalDependenciesSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-3 flex items-center gap-2\">\r\n <GitBranch className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.internal' })} ({dependencies.length})\r\n </h4>\r\n <div className=\"border rounded-lg overflow-hidden\">\r\n <table className=\"w-full text-sm\">\r\n <thead className=\"bg-muted\">\r\n <tr>\r\n <th className=\"px-4 py-2 text-left font-medium text-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.from' })}\r\n </th>\r\n <th className=\"px-4 py-2 text-left font-medium text-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.type' })}\r\n </th>\r\n <th className=\"px-4 py-2 text-left font-medium text-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.to' })}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y\">\r\n {dependencies.map((dep, index) => (\r\n <tr key={index} className=\"hover:bg-muted/50\">\r\n <td className=\"px-4 py-2 font-mono text-foreground\">{dep.from}</td>\r\n <td className=\"px-4 py-2\">\r\n <Badge variant=\"outline\">{dep.type}</Badge>\r\n </td>\r\n <td className=\"px-4 py-2 font-mono text-foreground\">{dep.to}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ExternalDependenciesSectionProps {\r\n dependencies: ExternalDependency[];\r\n}\r\n\r\nfunction ExternalDependenciesSection({ dependencies }: ExternalDependenciesSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-3 flex items-center gap-2\">\r\n <Package className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'sessionDetail.context.dependencies.external' })} ({dependencies.length})\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {dependencies.map((dep, index) => (\r\n <Badge key={index} variant=\"secondary\" className=\"px-3 py-1.5\">\r\n {dep.package}\r\n {dep.version && <span className=\"ml-1 text-foreground\">@{dep.version}</span>}\r\n </Badge>\r\n ))}\r\n </div>\r\n {dependencies.some(d => d.usage) && (\r\n <div className=\"mt-3 space-y-1\">\r\n {dependencies\r\n .filter(d => d.usage)\r\n .map((dep, index) => (\r\n <div key={index} className=\"text-xs text-muted-foreground\">\r\n <span className=\"font-medium\">{dep.package}:</span> {dep.usage}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// TestContextCard Component\r\n// ========================================\r\n// Displays test context with stats and framework info\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { TestTube, CheckCircle, AlertCircle } from 'lucide-react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { FieldRenderer } from './FieldRenderer';\r\n\r\nexport interface TestFramework {\r\n name?: string;\r\n plugins?: string[];\r\n}\r\n\r\nexport interface FrameworkConfig {\r\n backend?: TestFramework;\r\n frontend?: TestFramework;\r\n}\r\n\r\nexport interface TestContextData {\r\n frameworks?: FrameworkConfig;\r\n existing_tests?: string[];\r\n coverage_config?: Record<string, unknown>;\r\n test_markers?: string[];\r\n}\r\n\r\nexport interface TestContextCardProps {\r\n data?: TestContextData;\r\n}\r\n\r\n/**\r\n * TestContextCard component - Displays testing context and frameworks\r\n */\r\nexport function TestContextCard({ data }: TestContextCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || (!data.frameworks && !data.existing_tests?.length && !data.test_markers?.length)) {\r\n return null;\r\n }\r\n\r\n const testCount = data.existing_tests?.length || 0;\r\n const markerCount = data.test_markers?.length || 0;\r\n\r\n return (\r\n <Card>\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2\">\r\n <TestTube className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.testContext.title' })}\r\n {testCount > 0 && (\r\n <Badge variant=\"secondary\">{testCount} {formatMessage({ id: 'sessionDetail.context.testContext.tests' })}</Badge>\r\n )}\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n {/* Stats Row */}\r\n {(testCount > 0 || markerCount > 0) && (\r\n <div className=\"flex gap-4\">\r\n {testCount > 0 && (\r\n <div className=\"flex items-center gap-2\">\r\n <CheckCircle className=\"w-4 h-4 text-success\" />\r\n <span className=\"text-sm text-foreground\">\r\n {testCount} {formatMessage({ id: 'sessionDetail.context.testContext.existingTests' })}\r\n </span>\r\n </div>\r\n )}\r\n {markerCount > 0 && (\r\n <div className=\"flex items-center gap-2\">\r\n <AlertCircle className=\"w-4 h-4 text-warning\" />\r\n <span className=\"text-sm text-foreground\">\r\n {markerCount} {formatMessage({ id: 'sessionDetail.context.testContext.markers' })}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Framework Cards */}\r\n {data.frameworks && (\r\n <FrameworkSection frameworks={data.frameworks} />\r\n )}\r\n\r\n {/* Test Markers */}\r\n {data.test_markers && data.test_markers.length > 0 && (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.testContext.markers' })}\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {data.test_markers.map((marker, index) => (\r\n <Badge key={index} variant=\"info\" className=\"px-2 py-0.5\">\r\n {marker}\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Coverage Config */}\r\n {data.coverage_config && Object.keys(data.coverage_config).length > 0 && (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.testContext.coverage' })}\r\n </h4>\r\n <FieldRenderer value={data.coverage_config} type=\"object\" />\r\n </div>\r\n )}\r\n\r\n {/* Existing Tests List */}\r\n {data.existing_tests && data.existing_tests.length > 0 && (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.testContext.existingTests' })}\r\n </h4>\r\n <FieldRenderer value={data.existing_tests} type=\"array\" />\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface FrameworkSectionProps {\r\n frameworks: FrameworkConfig;\r\n}\r\n\r\nfunction FrameworkSection({ frameworks }: FrameworkSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div className=\"grid gap-3 md:grid-cols-2\">\r\n {frameworks.backend && (\r\n <FrameworkCard\r\n title={formatMessage({ id: 'sessionDetail.context.testContext.backend' })}\r\n framework={frameworks.backend}\r\n />\r\n )}\r\n {frameworks.frontend && (\r\n <FrameworkCard\r\n title={formatMessage({ id: 'sessionDetail.context.testContext.frontend' })}\r\n framework={frameworks.frontend}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface FrameworkCardProps {\r\n title: string;\r\n framework: TestFramework;\r\n}\r\n\r\nfunction FrameworkCard({ title, framework }: FrameworkCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div className=\"p-3 border rounded-lg\">\r\n <div className=\"text-sm font-medium text-foreground mb-2\">{title}</div>\r\n <div className=\"space-y-1\">\r\n {framework.name && (\r\n <div className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.testContext.framework' })}: {framework.name}\r\n </div>\r\n )}\r\n {framework.plugins && framework.plugins.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1\">\r\n {framework.plugins.map((plugin, index) => (\r\n <Badge key={index} variant=\"outline\" className=\"text-xs\">\r\n {plugin}\r\n </Badge>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// ContextTab Component\r\n// ========================================\r\n// Context tab for session detail page\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Package,\r\n FileCode,\r\n Tag,\r\n Settings,\r\n BookOpen,\r\n CheckSquare,\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport type { SessionDetailContext } from '@/lib/api';\r\nimport {\r\n ExplorationsSection,\r\n AssetsCard,\r\n DependenciesCard,\r\n TestContextCard,\r\n ConflictDetectionCard,\r\n} from '@/components/session-detail/context';\r\n\r\nexport interface ContextTabProps {\r\n context?: SessionDetailContext;\r\n}\r\n\r\n/**\r\n * ContextTab component - Display session context information\r\n */\r\nexport function ContextTab({ context }: ContextTabProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!context) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Package className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n const hasRequirements = context.requirements && context.requirements.length > 0;\r\n const hasFocusPaths = context.focus_paths && context.focus_paths.length > 0;\r\n const hasArtifacts = context.artifacts && context.artifacts.length > 0;\r\n const hasSharedContext = context.shared_context;\r\n const hasExtendedContext = context.context;\r\n const hasExplorations = context.explorations;\r\n\r\n if (\r\n !hasRequirements &&\r\n !hasFocusPaths &&\r\n !hasArtifacts &&\r\n !hasSharedContext &&\r\n !hasExtendedContext &&\r\n !hasExplorations\r\n ) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Package className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Original Context Sections - Maintained for backward compatibility */}\r\n {hasRequirements && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4 flex items-center gap-2\">\r\n <CheckSquare className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.requirements' })}\r\n <Badge variant=\"secondary\">{context.requirements!.length}</Badge>\r\n </h3>\r\n <ul className=\"space-y-2\">\r\n {context.requirements!.map((req, i) => (\r\n <li\r\n key={i}\r\n className=\"flex items-start gap-2 p-3 bg-background rounded-lg border\"\r\n >\r\n <span className=\"text-primary font-bold\">{i + 1}.</span>\r\n <span className=\"text-sm text-foreground flex-1\">{req}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {hasFocusPaths && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4 flex items-center gap-2\">\r\n <FileCode className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.focusPaths' })}\r\n <Badge variant=\"secondary\">{context.focus_paths!.length}</Badge>\r\n </h3>\r\n <div className=\"space-y-2\">\r\n {context.focus_paths!.map((path, i) => (\r\n <div\r\n key={i}\r\n className=\"p-3 bg-background rounded-lg border font-mono text-sm text-foreground\"\r\n >\r\n {path}\r\n </div>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {hasArtifacts && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4 flex items-center gap-2\">\r\n <Tag className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.artifacts' })}\r\n <Badge variant=\"secondary\">{context.artifacts!.length}</Badge>\r\n </h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {context.artifacts!.map((artifact, i) => (\r\n <Badge key={i} variant=\"outline\" className=\"px-3 py-1.5\">\r\n {artifact}\r\n </Badge>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {hasSharedContext && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4 flex items-center gap-2\">\r\n <Settings className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.sharedContext' })}\r\n </h3>\r\n\r\n {context.shared_context!.tech_stack && context.shared_context!.tech_stack.length > 0 && (\r\n <div className=\"mb-4\">\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.techStack' })}\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {context.shared_context!.tech_stack!.map((tech, i) => (\r\n <Badge key={i} variant=\"success\" className=\"px-3 py-1.5\">\r\n {tech}\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {context.shared_context!.conventions && context.shared_context!.conventions.length > 0 && (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2\">\r\n {formatMessage({ id: 'sessionDetail.context.conventions' })}\r\n </h4>\r\n <ul className=\"space-y-1\">\r\n {context.shared_context!.conventions!.map((conv, i) => (\r\n <li key={i} className=\"text-sm text-foreground flex items-start gap-2\">\r\n <BookOpen className=\"h-4 w-4 text-muted-foreground mt-0.5 flex-shrink-0\" />\r\n <span>{conv}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {/* New Extended Context Sections from context-package.json */}\r\n {hasExplorations && <ExplorationsSection data={context.explorations} />}\r\n\r\n {hasExtendedContext && context.context!.assets && (\r\n <AssetsCard data={context.context!.assets} />\r\n )}\r\n\r\n {hasExtendedContext && context.context!.dependencies && (\r\n <DependenciesCard data={context.context!.dependencies} />\r\n )}\r\n\r\n {hasExtendedContext && context.context!.test_context && (\r\n <TestContextCard data={context.context!.test_context} />\r\n )}\r\n\r\n {hasExtendedContext && context.context!.conflict_detection && (\r\n <ConflictDetectionCard data={context.context!.conflict_detection} />\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\n// MarkdownModal Component\n// ========================================\n// Modal for viewing markdown, JSON, or text content with copy and download actions\n\nimport * as React from 'react';\nimport { FileText, Copy, Download, Loader2 } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport { cn } from '@/lib/utils';\n\n// ========================================\n// Types\n// ========================================\n\nexport type ContentType = 'markdown' | 'json' | 'text';\n\nexport interface MarkdownModalProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Called when modal is closed */\n onClose: () => void;\n /** Title displayed in modal header */\n title: string;\n /** Content to display */\n content: string;\n /** Type of content for appropriate rendering */\n contentType?: ContentType;\n /** Maximum width of the modal */\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n /** Maximum height of content area */\n maxHeight?: string;\n /** Optional custom actions */\n actions?: ModalAction[];\n /** Whether content is loading */\n isLoading?: boolean;\n}\n\nexport interface ModalAction {\n label: string;\n icon?: React.ComponentType<{ className?: string }>;\n onClick: (content: string) => void | Promise<void>;\n variant?: 'default' | 'outline' | 'ghost' | 'destructive' | 'secondary';\n disabled?: boolean;\n}\n\n// ========================================\n// Component\n// ========================================\n\n/**\n * Modal for viewing markdown, JSON, or text content\n * \n * @example\n * ```tsx\n * <MarkdownModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"IMPL_PLAN.md\"\n * content={implPlanContent}\n * contentType=\"markdown\"\n * />\n * ```\n */\nexport function MarkdownModal({\n isOpen,\n onClose,\n title,\n content,\n contentType = 'markdown',\n maxWidth = '2xl',\n maxHeight = '60vh',\n actions,\n isLoading = false,\n}: MarkdownModalProps) {\n const { success, error } = useNotifications();\n const [isCopying, setIsCopying] = React.useState(false);\n const [isDownloading, setIsDownloading] = React.useState(false);\n\n const handleCopy = async () => {\n setIsCopying(true);\n try {\n await navigator.clipboard.writeText(content);\n success('Copied', 'Content copied to clipboard');\n } catch (err) {\n error('Error', 'Failed to copy content');\n } finally {\n setIsCopying(false);\n }\n };\n\n const handleDownload = () => {\n setIsDownloading(true);\n try {\n const blob = new Blob([content], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const extension = contentType === 'json' ? 'json' : 'md';\n a.download = `${title.replace(/[^a-z0-9]/gi, '-')}.${extension}`;\n a.click();\n URL.revokeObjectURL(url);\n success('Downloaded', `File ${title} downloaded`);\n } catch (err) {\n error('Error', 'Failed to download content');\n } finally {\n setIsDownloading(false);\n }\n };\n\n const defaultActions: ModalAction[] = [\n {\n label: 'Copy',\n icon: Copy,\n onClick: handleCopy,\n variant: 'outline',\n disabled: isCopying || isLoading || !content,\n },\n {\n label: 'Download',\n icon: Download,\n onClick: handleDownload,\n variant: 'outline',\n disabled: isDownloading || isLoading || !content,\n },\n ];\n\n const modalActions = actions || defaultActions;\n\n const renderContent = () => {\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n <span className=\"ml-3 text-muted-foreground\">Loading...</span>\n </div>\n );\n }\n\n if (!content) {\n return (\n <div className=\"flex items-center justify-center py-12 text-center\">\n <FileText className=\"h-12 w-12 text-muted-foreground mb-4\" />\n <div>\n <p className=\"text-muted-foreground\">No content available</p>\n </div>\n </div>\n );\n }\n\n switch (contentType) {\n case 'markdown':\n return (\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n <pre className=\"whitespace-pre-wrap break-words font-sans text-sm leading-relaxed\">\n {content}\n </pre>\n </div>\n );\n case 'json':\n return (\n <pre className=\"text-sm bg-muted p-4 rounded-lg overflow-x-auto font-mono\">\n {JSON.stringify(JSON.parse(content), null, 2)}\n </pre>\n );\n case 'text':\n return (\n <pre className=\"text-sm whitespace-pre-wrap break-words font-sans leading-relaxed\">\n {content}\n </pre>\n );\n default:\n return <pre className=\"text-sm\">{content}</pre>;\n }\n };\n\n const maxWidthClass = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n '2xl': 'max-w-2xl',\n '3xl': 'max-w-3xl',\n '4xl': 'max-w-4xl',\n }[maxWidth];\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent className={cn('flex flex-col', maxWidthClass)}>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <FileText className=\"w-5 h-5\" />\n {title}\n </DialogTitle>\n </DialogHeader>\n\n <div \n className=\"flex-1 overflow-auto py-4\" \n style={{ maxHeight }}\n >\n {renderContent()}\n </div>\n\n <DialogFooter className=\"gap-2\">\n {modalActions.map((action, index) => {\n const Icon = action.icon;\n return (\n <Button\n key={index}\n variant={action.variant || 'default'}\n onClick={() => action.onClick(content)}\n disabled={action.disabled || isLoading}\n >\n {Icon && <Icon className=\"w-4 h-4 mr-2\" />}\n {action.label}\n {(isCopying && action.label === 'Copy') && (\n <Loader2 className=\"w-4 h-4 ml-2 animate-spin\" />\n )}\n {(isDownloading && action.label === 'Download') && (\n <Loader2 className=\"w-4 h-4 ml-2 animate-spin\" />\n )}\n </Button>\n );\n })}\n <Button variant=\"ghost\" onClick={onClose} disabled={isLoading}>\n Close\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ========================================\n// Exports\n// ========================================\n\nexport default MarkdownModal;\n","// ========================================\r\n// SummaryTab Component\r\n// ========================================\r\n// Summary tab for session detail page with multiple summaries support\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { FileText, Eye } from 'lucide-react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport MarkdownModal from '@/components/shared/MarkdownModal';\r\n\r\n// ========================================\r\n// Types\r\n// ========================================\r\n\r\nexport interface SummaryItem {\r\n name: string;\r\n content: string;\r\n}\r\n\r\nexport interface SummaryTabProps {\r\n summary?: string;\r\n summaries?: SummaryItem[];\r\n}\r\n\r\n// ========================================\r\n// Component\r\n// ========================================\r\n\r\n/**\r\n * SummaryTab component - Display session summary/summaries with modal viewer\r\n * \r\n * @example\r\n * ```tsx\r\n * <SummaryTab \r\n * summaries={[{ name: 'Plan Summary', content: '...' }]} \r\n * />\r\n * ```\r\n */\r\nexport function SummaryTab({ summary, summaries }: SummaryTabProps) {\r\n const { formatMessage } = useIntl();\r\n const [selectedSummary, setSelectedSummary] = React.useState<SummaryItem | null>(null);\r\n\r\n // Use summaries array if available, otherwise fallback to single summary\r\n const summaryList: SummaryItem[] = React.useMemo(() => {\r\n if (summaries && summaries.length > 0) {\r\n return summaries;\r\n }\r\n if (summary) {\r\n return [{ name: formatMessage({ id: 'sessionDetail.summary.default' }), content: summary }];\r\n }\r\n return [];\r\n }, [summaries, summary, formatMessage]);\r\n\r\n if (summaryList.length === 0) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <FileText className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.summary.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.summary.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"space-y-4\">\r\n {/* Always use truncated card display with modal viewer */}\r\n {summaryList.map((item, index) => (\r\n <SummaryCard\r\n key={index}\r\n summary={item}\r\n onClick={() => setSelectedSummary(item)}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Modal Viewer */}\r\n <MarkdownModal\r\n isOpen={!!selectedSummary}\r\n onClose={() => setSelectedSummary(null)}\r\n title={selectedSummary?.name || ''}\r\n content={selectedSummary?.content || ''}\r\n contentType=\"markdown\"\r\n />\r\n </>\r\n );\r\n}\r\n\r\n// ========================================\r\n// Sub-Components\r\n// ========================================\r\n\r\ninterface SummaryCardProps {\r\n summary: SummaryItem;\r\n onClick: () => void;\r\n}\r\n\r\nfunction SummaryCard({ summary, onClick }: SummaryCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n // Get preview (first 5 lines, matching ImplPlanTab style)\r\n const lines = summary.content.split('\\n');\r\n const preview = lines.slice(0, 5).join('\\n');\r\n const hasMore = lines.length > 5;\r\n\r\n return (\r\n <Card>\r\n <CardHeader>\r\n <div className=\"flex items-center justify-between\">\r\n <CardTitle className=\"flex items-center gap-2 text-lg\">\r\n <FileText className=\"w-5 h-5\" />\r\n {summary.name}\r\n </CardTitle>\r\n <Button variant=\"outline\" size=\"sm\" onClick={onClick}>\r\n <Eye className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'common.actions.view' })}\r\n </Button>\r\n </div>\r\n </CardHeader>\r\n <CardContent>\r\n <pre className=\"text-sm text-muted-foreground whitespace-pre-wrap\">\r\n {preview}{hasMore && '\\n...'}\r\n </pre>\r\n {hasMore && (\r\n <div className=\"mt-4\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={onClick}\r\n className=\"w-full\"\r\n >\r\n {formatMessage({ id: 'sessionDetail.summary.viewFull' }, { count: lines.length })}\r\n </Button>\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\n// ========================================\r\n// Exports\r\n// ========================================\r\n\r\nexport default SummaryTab;\r\n","// ========================================\n// ImplPlanTab Component\n// ========================================\n// IMPL Plan tab for session detail page\n\nimport * as React from 'react';\nimport { useIntl } from 'react-intl';\nimport { Ruler, Eye } from 'lucide-react';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport MarkdownModal from '@/components/shared/MarkdownModal';\n\n// ========================================\n// Types\n// ========================================\n\nexport interface ImplPlanTabProps {\n implPlan?: string;\n}\n\n// ========================================\n// Component\n// ========================================\n\n/**\n * ImplPlanTab component - Display IMPL_PLAN.md content with modal viewer\n * \n * @example\n * ```tsx\n * <ImplPlanTab \n * implPlan=\"# Implementation Plan\\n\\n## Steps...\"}\n * />\n * ```\n */\nexport function ImplPlanTab({ implPlan }: ImplPlanTabProps) {\n const { formatMessage } = useIntl();\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n\n if (!implPlan) {\n return (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Ruler className=\"h-12 w-12 text-muted-foreground mb-4\" />\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\n {formatMessage({ id: 'sessionDetail.implPlan.empty.title' })}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {formatMessage({ id: 'sessionDetail.implPlan.empty.message' })}\n </p>\n </div>\n );\n }\n\n // Get preview (first 5 lines)\n const lines = implPlan.split('\\n');\n const preview = lines.slice(0, 5).join('\\n');\n const hasMore = lines.length > 5;\n\n return (\n <>\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"flex items-center gap-2\">\n <Ruler className=\"w-5 h-5\" />\n {formatMessage({ id: 'sessionDetail.implPlan.title' })}\n </CardTitle>\n <Button \n variant=\"outline\" \n size=\"sm\" \n onClick={() => setIsModalOpen(true)}\n >\n <Eye className=\"w-4 h-4 mr-1\" />\n {formatMessage({ id: 'common.actions.view' })}\n </Button>\n </div>\n </CardHeader>\n <CardContent>\n <pre className=\"text-sm text-muted-foreground whitespace-pre-wrap\">\n {preview}{hasMore && '\\n...'}\n </pre>\n {hasMore && (\n <div className=\"mt-4\">\n <Button \n variant=\"outline\" \n size=\"sm\" \n onClick={() => setIsModalOpen(true)}\n className=\"w-full\"\n >\n {formatMessage({ id: 'sessionDetail.implPlan.viewFull' }, { count: lines.length })}\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Modal Viewer */}\n <MarkdownModal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n title=\"IMPL_PLAN.md\"\n content={implPlan}\n contentType=\"markdown\"\n maxWidth=\"3xl\"\n />\n </>\n );\n}\n\n// ========================================\n// Exports\n// ========================================\n\nexport default ImplPlanTab;\n","// ========================================\r\n// ConflictTab Component\r\n// ========================================\r\n// Conflict tab for session detail page - displays conflict resolution decisions\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Scale,\r\n ChevronDown,\r\n ChevronRight,\r\n CheckCircle2,\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from '@/components/ui/Collapsible';\r\n\r\n// Type definitions for conflict resolution data\r\nexport interface UserDecision {\r\n choice: string;\r\n description?: string;\r\n implications?: string;\r\n}\r\n\r\nexport interface ResolvedConflict {\r\n id: string;\r\n category?: string;\r\n brief?: string;\r\n strategy?: string;\r\n}\r\n\r\nexport interface ConflictResolutionData {\r\n session_id: string;\r\n resolved_at?: string;\r\n user_decisions?: Record<string, UserDecision>;\r\n resolved_conflicts?: ResolvedConflict[];\r\n}\r\n\r\nexport interface ConflictTabProps {\r\n conflicts?: ConflictResolutionData;\r\n}\r\n\r\n/**\r\n * ConflictTab component - Display conflict resolution decisions\r\n */\r\nexport function ConflictTab({ conflicts }: ConflictTabProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!conflicts) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Scale className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.conflict.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.conflict.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n const hasUserDecisions = conflicts.user_decisions && Object.keys(conflicts.user_decisions).length > 0;\r\n const hasResolvedConflicts = conflicts.resolved_conflicts && conflicts.resolved_conflicts.length > 0;\r\n\r\n if (!hasUserDecisions && !hasResolvedConflicts) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Scale className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.conflict.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.conflict.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Resolved At */}\r\n {conflicts.resolved_at && (\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\r\n <CheckCircle2 className=\"h-4 w-4 text-success\" />\r\n <span>\r\n {formatMessage({ id: 'sessionDetail.conflict.resolvedAt' })}:{' '}\r\n {new Date(conflicts.resolved_at).toLocaleString()}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* User Decisions Section */}\r\n {hasUserDecisions && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">\r\n {formatMessage({ id: 'sessionDetail.conflict.userDecisions' })}\r\n </h3>\r\n <div className=\"space-y-3\">\r\n {Object.entries(conflicts.user_decisions!).map(([key, decision], index) => (\r\n <Collapsible key={key} defaultOpen={index < 3}>\r\n <CollapsibleTrigger className=\"flex items-center gap-2 w-full text-left p-3 rounded-lg hover:bg-accent/50 transition-colors\">\r\n <ChevronRight className=\"h-4 w-4 transition-transform data-[state=open]:rotate-90\" />\r\n <span className=\"font-medium text-sm flex-1\">{key}</span>\r\n <Badge variant=\"success\" className=\"text-xs\">\r\n {decision.choice}\r\n </Badge>\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className=\"pl-6 pr-3 pb-3 space-y-2\">\r\n {decision.description && (\r\n <div className=\"text-sm text-foreground\">\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.conflict.description' })}:</span>{' '}\r\n {decision.description}\r\n </div>\r\n )}\r\n {decision.implications && (\r\n <div className=\"text-sm text-muted-foreground\">\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.conflict.implications' })}:</span>{' '}\r\n {decision.implications}\r\n </div>\r\n )}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n\r\n {/* Resolved Conflicts Section */}\r\n {hasResolvedConflicts && (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">\r\n {formatMessage({ id: 'sessionDetail.conflict.resolvedConflicts' })}\r\n </h3>\r\n <div className=\"space-y-3\">\r\n {conflicts.resolved_conflicts!.map((conflict) => (\r\n <Collapsible key={conflict.id}>\r\n <CollapsibleTrigger className=\"flex items-center gap-2 w-full text-left p-3 rounded-lg hover:bg-accent/50 transition-colors\">\r\n <ChevronDown className=\"h-4 w-4 transition-transform data-[state=closed]:rotate-[-90deg]\" />\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-sm\">{conflict.id}</span>\r\n {conflict.category && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {conflict.category}\r\n </Badge>\r\n )}\r\n </div>\r\n {conflict.brief && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">{conflict.brief}</p>\r\n )}\r\n </div>\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className=\"pl-6 pr-3 pb-3\">\r\n {conflict.strategy && (\r\n <div className=\"text-sm text-foreground\">\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.conflict.strategy' })}:</span>{' '}\r\n {conflict.strategy}\r\n </div>\r\n )}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// ReviewTab Component\r\n// ========================================\r\n// Review tab for session detail page - displays review findings by dimension\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Search,\r\n ChevronRight,\r\n AlertCircle,\r\n AlertTriangle,\r\n Info,\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport {\r\n Select,\r\n SelectTrigger,\r\n SelectValue,\r\n SelectContent,\r\n SelectItem,\r\n} from '@/components/ui/Select';\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from '@/components/ui/Collapsible';\r\n\r\n// Type definitions for review data\r\nexport interface ReviewFinding {\r\n severity: 'critical' | 'high' | 'medium' | 'low';\r\n title: string;\r\n description?: string;\r\n location?: string;\r\n code?: string;\r\n}\r\n\r\nexport interface ReviewDimension {\r\n name: string;\r\n findings?: ReviewFinding[];\r\n summary?: string;\r\n}\r\n\r\nexport interface ReviewTabProps {\r\n review?: {\r\n dimensions?: ReviewDimension[];\r\n };\r\n}\r\n\r\ntype SeverityFilter = 'all' | 'critical' | 'high' | 'medium' | 'low';\r\n\r\n/**\r\n * Get severity color variant for badges\r\n */\r\nfunction getSeverityVariant(severity: string): 'destructive' | 'warning' | 'default' | 'secondary' {\r\n switch (severity) {\r\n case 'critical':\r\n return 'destructive';\r\n case 'high':\r\n return 'warning';\r\n case 'medium':\r\n return 'default';\r\n case 'low':\r\n return 'secondary';\r\n default:\r\n return 'secondary';\r\n }\r\n}\r\n\r\n/**\r\n * Get border color class for severity\r\n */\r\nfunction getSeverityBorderClass(severity: string): string {\r\n switch (severity) {\r\n case 'critical':\r\n return 'border-destructive';\r\n case 'high':\r\n return 'border-orange-500';\r\n case 'medium':\r\n return 'border-yellow-500';\r\n case 'low':\r\n return 'border-blue-500';\r\n default:\r\n return 'border-border';\r\n }\r\n}\r\n\r\n/**\r\n * Get severity icon\r\n */\r\nfunction getSeverityIcon(severity: string) {\r\n switch (severity) {\r\n case 'critical':\r\n case 'high':\r\n return <AlertCircle className=\"h-4 w-4\" />;\r\n case 'medium':\r\n return <AlertTriangle className=\"h-4 w-4\" />;\r\n case 'low':\r\n return <Info className=\"h-4 w-4\" />;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * ReviewTab component - Display review findings by dimension\r\n */\r\nexport function ReviewTab({ review }: ReviewTabProps) {\r\n const { formatMessage } = useIntl();\r\n const [severityFilter, setSeverityFilter] = useState<SeverityFilter>('all');\r\n\r\n if (!review || !review.dimensions || review.dimensions.length === 0) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Search className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.review.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.review.empty.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // Filter findings by severity\r\n const filteredDimensions = review.dimensions.map((dimension) => ({\r\n ...dimension,\r\n findings: dimension.findings?.filter((finding) =>\r\n severityFilter === 'all' || finding.severity === severityFilter\r\n ),\r\n })).filter((dimension) => dimension.findings && dimension.findings.length > 0);\r\n\r\n const hasFindings = filteredDimensions.some((d) => d.findings && d.findings.length > 0);\r\n\r\n if (!hasFindings) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <Search className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.review.noFindings.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.review.noFindings.message' })}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Severity Filter */}\r\n <div className=\"flex items-center gap-4\">\r\n <span className=\"text-sm font-medium text-foreground\">\r\n {formatMessage({ id: 'sessionDetail.review.filterBySeverity' })}\r\n </span>\r\n <Select value={severityFilter} onValueChange={(v) => setSeverityFilter(v as SeverityFilter)}>\r\n <SelectTrigger className=\"w-48\">\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"all\">{formatMessage({ id: 'sessionDetail.review.severity.all' })}</SelectItem>\r\n <SelectItem value=\"critical\">{formatMessage({ id: 'sessionDetail.review.severity.critical' })}</SelectItem>\r\n <SelectItem value=\"high\">{formatMessage({ id: 'sessionDetail.review.severity.high' })}</SelectItem>\r\n <SelectItem value=\"medium\">{formatMessage({ id: 'sessionDetail.review.severity.medium' })}</SelectItem>\r\n <SelectItem value=\"low\">{formatMessage({ id: 'sessionDetail.review.severity.low' })}</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n\r\n {/* Dimensions with Findings */}\r\n {filteredDimensions.map((dimension) => {\r\n if (!dimension.findings || dimension.findings.length === 0) return null;\r\n\r\n return (\r\n <Card key={dimension.name}>\r\n <CardContent className=\"p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold text-foreground\">{dimension.name}</h3>\r\n <Badge variant=\"secondary\">{dimension.findings.length}</Badge>\r\n </div>\r\n\r\n {dimension.summary && (\r\n <p className=\"text-sm text-muted-foreground mb-4\">{dimension.summary}</p>\r\n )}\r\n\r\n <div className=\"space-y-3\">\r\n {dimension.findings.map((finding, findingIndex) => (\r\n <Collapsible key={`${dimension.name}-${findingIndex}`} className={`border-l-4 ${getSeverityBorderClass(finding.severity)} rounded-r-lg`}>\r\n <CollapsibleTrigger className=\"flex items-center gap-2 w-full text-left p-3 hover:bg-accent/50 transition-colors\">\r\n <ChevronRight className=\"h-4 w-4 transition-transform data-[state=open]:rotate-90\" />\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {getSeverityIcon(finding.severity)}\r\n <span className=\"font-medium text-sm\">{finding.title}</span>\r\n <Badge variant={getSeverityVariant(finding.severity)} className=\"text-xs\">\r\n {formatMessage({ id: `sessionDetail.review.severity.${finding.severity}` })}\r\n </Badge>\r\n </div>\r\n {finding.location && (\r\n <p className=\"text-xs text-muted-foreground mt-1 font-mono\">{finding.location}</p>\r\n )}\r\n </div>\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className=\"px-6 pb-3 space-y-2\">\r\n {finding.description && (\r\n <div className=\"text-sm text-foreground\">\r\n {finding.description}\r\n </div>\r\n )}\r\n {finding.code && (\r\n <pre className=\"text-xs bg-muted p-2 rounded overflow-x-auto\">\r\n <code>{finding.code}</code>\r\n </pre>\r\n )}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// SessionDetailPage Component\r\n// ========================================\r\n// Session detail page with tabs for tasks, context, summary, impl-plan, conflict, and review\r\n\r\nimport * as React from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n ArrowLeft,\r\n Calendar,\r\n ListChecks,\r\n Package,\r\n FileText,\r\n XCircle,\r\n Ruler,\r\n Scale,\r\n Search,\r\n} from 'lucide-react';\r\nimport { useSessionDetail } from '@/hooks/useSessionDetail';\r\nimport { TaskListTab } from './session-detail/TaskListTab';\r\nimport { ContextTab } from './session-detail/ContextTab';\r\nimport { SummaryTab } from './session-detail/SummaryTab';\r\nimport ImplPlanTab from './session-detail/ImplPlanTab';\r\nimport { ConflictTab } from './session-detail/ConflictTab';\r\nimport { ReviewTab } from './session-detail/ReviewTab';\r\nimport { TaskDrawer } from '@/components/shared/TaskDrawer';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { TabsNavigation, type TabItem } from '@/components/ui/TabsNavigation';\r\nimport type { TaskData, SessionMetadata } from '@/types/store';\r\n\r\ntype TabValue = 'tasks' | 'context' | 'summary' | 'impl-plan' | 'conflict' | 'review';\r\n\r\n// Status label keys for i18n (maps snake_case status to camelCase translation keys)\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/**\r\n * SessionDetailPage component - Main session detail page with tabs\r\n */\r\nexport function SessionDetailPage() {\r\n const { sessionId } = useParams<{ sessionId: string }>();\r\n const navigate = useNavigate();\r\n const { formatMessage } = useIntl();\r\n const { sessionDetail, isLoading, error, refetch } = useSessionDetail(sessionId!);\r\n const [activeTab, setActiveTab] = React.useState<TabValue>('tasks');\r\n const [selectedTask, setSelectedTask] = React.useState<TaskData | null>(null);\r\n\r\n const handleBack = () => {\r\n navigate('/sessions');\r\n };\r\n\r\n // Loading state\r\n if (isLoading) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center gap-4\">\r\n <Button variant=\"ghost\" size=\"sm\" disabled>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n <div className=\"h-8 w-64 rounded bg-muted animate-pulse\" />\r\n </div>\r\n <div className=\"h-64 rounded-lg bg-muted animate-pulse\" />\r\n </div>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <XCircle className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{error.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n {formatMessage({ id: 'common.actions.retry' })}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n // Session not found\r\n if (!sessionDetail) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n <Package className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.notFound.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {formatMessage({ id: 'sessionDetail.notFound.message' })}\r\n </p>\r\n <Button onClick={handleBack}>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n const { session, context, summary, summaries, implPlan, conflicts, review } = sessionDetail;\r\n const tasks = session.tasks || [];\r\n const completedTasks = tasks.filter((t) => t.status === 'completed').length;\r\n const hasReview = session.has_review || session.review;\r\n\r\n const tabs: TabItem[] = [\r\n {\r\n value: 'tasks',\r\n label: formatMessage({ id: 'sessionDetail.tabs.tasks' }),\r\n icon: <ListChecks className=\"h-4 w-4\" />,\r\n badge: <Badge variant=\"secondary\" className=\"ml-2\">{tasks.length}</Badge>,\r\n },\r\n {\r\n value: 'context',\r\n label: formatMessage({ id: 'sessionDetail.tabs.context' }),\r\n icon: <Package className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'summary',\r\n label: formatMessage({ id: 'sessionDetail.tabs.summary' }),\r\n icon: <FileText className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'impl-plan',\r\n label: formatMessage({ id: 'sessionDetail.tabs.implPlan' }),\r\n icon: <Ruler className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'conflict',\r\n label: formatMessage({ id: 'sessionDetail.tabs.conflict' }),\r\n icon: <Scale className=\"h-4 w-4\" />,\r\n },\r\n ];\r\n\r\n if (hasReview) {\r\n tabs.push({\r\n value: 'review',\r\n label: formatMessage({ id: 'sessionDetail.tabs.review' }),\r\n icon: <Search className=\"h-4 w-4\" />,\r\n });\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n <Button variant=\"ghost\" size=\"sm\" onClick={handleBack}>\r\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'common.actions.back' })}\r\n </Button>\r\n <div>\r\n <h1 className=\"text-2xl font-semibold text-foreground\">\r\n {session.title || session.session_id}\r\n </h1>\r\n {session.title && session.title !== session.session_id && (\r\n <p className=\"text-sm text-muted-foreground mt-0.5\">{session.session_id}</p>\r\n )}\r\n </div>\r\n </div>\r\n <Badge variant={session.status === 'completed' ? 'success' : 'secondary'}>\r\n {formatMessage({ id: statusLabelKeys[session.status] ?? 'sessions.status.inProgress' })}\r\n </Badge>\r\n </div>\r\n\r\n {/* Info Bar */}\r\n <div className=\"flex flex-wrap gap-4 text-sm text-muted-foreground p-4 bg-background rounded-lg border\">\r\n <div className=\"flex items-center gap-1\">\r\n <Calendar className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.info.created' })}:</span>{' '}\r\n {new Date(session.created_at).toLocaleString()}\r\n </div>\r\n {session.updated_at && (\r\n <div className=\"flex items-center gap-1\">\r\n <Calendar className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.info.updated' })}:</span>{' '}\r\n {new Date(session.updated_at).toLocaleString()}\r\n </div>\r\n )}\r\n <div className=\"flex items-center gap-1\">\r\n <ListChecks className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'sessionDetail.info.tasks' })}:</span>{' '}\r\n {completedTasks}/{tasks.length}\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <TabsNavigation\r\n value={activeTab}\r\n onValueChange={(v) => setActiveTab(v as TabValue)}\r\n tabs={tabs}\r\n />\r\n\r\n {/* Tab Content */}\r\n {activeTab === 'tasks' && (\r\n <div className=\"mt-4\">\r\n <TaskListTab session={session} onTaskClick={setSelectedTask} />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'context' && (\r\n <div className=\"mt-4\">\r\n <ContextTab context={context} />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'summary' && (\r\n <div className=\"mt-4\">\r\n <SummaryTab summary={summary} summaries={summaries} />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'impl-plan' && (\r\n <div className=\"mt-4\">\r\n <ImplPlanTab implPlan={implPlan as string | undefined} />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'conflict' && (\r\n <div className=\"mt-4\">\r\n <ConflictTab conflicts={conflicts as any} />\r\n </div>\r\n )}\r\n\r\n {hasReview && activeTab === 'review' && (\r\n <div className=\"mt-4\">\r\n <ReviewTab review={review as any} />\r\n </div>\r\n )}\r\n\r\n {/* Description (if exists) */}\r\n {session.description && (\r\n <div className=\"p-4 bg-background rounded-lg border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-2\">\r\n {formatMessage({ id: 'sessionDetail.info.description' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">{session.description}</p>\r\n </div>\r\n )}\r\n\r\n {/* TaskDrawer */}\r\n <TaskDrawer\r\n task={selectedTask}\r\n isOpen={!!selectedTask}\r\n onClose={() => setSelectedTask(null)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default SessionDetailPage;\r\n"],"names":["Forward","createLucideIcon","Ruler","Scale","sessionDetailKeys","id","projectPath","STALE_TIME","useSessionDetail","sessionId","options","staleTime","enabled","useWorkflowStore","selectProjectPath","queryEnabled","query","useQuery","fetchSessionDetail","attemptIndex","BulkActionButton","Icon","label","isLoading","disabled","variant","size","className","props","jsxs","Button","jsx","Loader2","TaskStatsBar","completed","inProgress","pending","onMarkAllPending","onMarkAllInProgress","onMarkAllCompleted","isLoadingPending","isLoadingInProgress","isLoadingCompleted","formatMessage","useIntl","cn","CheckCircle","Circle","statusConfig","CircleX","TaskStatusDropdown","currentStatus","onStatusChange","isChanging","setIsChanging","useState","handleStatusChange","newStatus","error","currentConfig","StatusIcon","badgeSize","DropdownMenu","DropdownMenuTrigger","Badge","DropdownMenuContent","status","config","DropdownMenuItem","TaskListTab","session","onTaskClick","tasks","hasStatusTracking","t","raw","source","setIsLoadingPending","setIsLoadingInProgress","setIsLoadingCompleted","localTasks","setLocalTasks","sessionPath","handleMarkAllPending","targetTasks","prev","taskIds","result","bulkUpdateTaskStatus","handleMarkAllInProgress","handleMarkAllCompleted","handleTaskStatusChange","taskId","previousTasks","updateTaskStatus","ListChecks","task","index","extTask","dependsCount","_a","taskType","_b","taskScope","_c","stepsCount","_e","_d","filesCount","_g","_f","Card","CardContent","Layers","FileCode","GitBranch","Calendar","DependenciesCard","data","internalCount","externalCount","CardHeader","CardTitle","InternalDependenciesSection","ExternalDependenciesSection","dependencies","dep","Package","d","TestContextCard","testCount","markerCount","TestTube","AlertCircle","FrameworkSection","marker","FieldRenderer","frameworks","FrameworkCard","title","framework","plugin","ContextTab","context","hasRequirements","hasFocusPaths","hasArtifacts","hasSharedContext","hasExtendedContext","hasExplorations","CheckSquare","req","i","path","Tag","artifact","Settings","tech","conv","BookOpen","ExplorationsSection","AssetsCard","ConflictDetectionCard","MarkdownModal","isOpen","onClose","content","contentType","maxWidth","maxHeight","actions","success","useNotifications","isCopying","setIsCopying","React.useState","isDownloading","setIsDownloading","modalActions","Copy","Download","blob","url","a","extension","renderContent","FileText","maxWidthClass","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","action","SummaryTab","summary","summaries","selectedSummary","setSelectedSummary","summaryList","React.useMemo","Fragment","item","SummaryCard","onClick","lines","preview","hasMore","Eye","ImplPlanTab","implPlan","isModalOpen","setIsModalOpen","ConflictTab","conflicts","hasUserDecisions","hasResolvedConflicts","CheckCircle2","key","decision","Collapsible","CollapsibleTrigger","ChevronRight","CollapsibleContent","conflict","ChevronDown","getSeverityVariant","severity","getSeverityBorderClass","getSeverityIcon","AlertTriangle","Info","ReviewTab","review","severityFilter","setSeverityFilter","Search","filteredDimensions","dimension","finding","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","findingIndex","statusLabelKeys","SessionDetailPage","useParams","navigate","useNavigate","sessionDetail","refetch","activeTab","setActiveTab","selectedTask","setSelectedTask","handleBack","ArrowLeft","XCircle","completedTasks","hasReview","tabs","TabsNavigation","TaskDrawer"],"mappings":"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","x_google_ignoreList":[0,1,2]}