claude-code-workflow 7.2.9 → 7.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.claude/agents/cli-planning-agent.md +3 -0
  2. package/.claude/agents/debug-explore-agent.md +1 -0
  3. package/.claude/agents/tdd-developer.md +1 -0
  4. package/.claude/agents/team-worker.md +1 -1
  5. package/.claude/agents/test-action-planning-agent.md +3 -0
  6. package/.claude/agents/test-context-search-agent.md +1 -0
  7. package/.claude/agents/test-fix-agent.md +3 -0
  8. package/.claude/skills/review-code/SKILL.md +2 -0
  9. package/.claude/skills/review-cycle/SKILL.md +4 -0
  10. package/.claude/skills/skill-simplify/phases/02-optimize.md +4 -0
  11. package/.claude/skills/spec-generator/phases/05-epics-stories.md +4 -0
  12. package/.claude/skills/team-arch-opt/specs/team-config.json +5 -5
  13. package/.claude/skills/team-frontend-debug/roles/analyzer/role.md +3 -2
  14. package/.claude/skills/team-perf-opt/roles/coordinator/commands/monitor.md +1 -1
  15. package/.claude/skills/team-perf-opt/specs/team-config.json +5 -5
  16. package/.claude/skills/team-quality-assurance/roles/executor/role.md +2 -1
  17. package/.claude/skills/team-review/roles/reviewer/role.md +2 -1
  18. package/.claude/skills/team-tech-debt/roles/scanner/role.md +2 -1
  19. package/.claude/skills/team-testing/roles/executor/role.md +2 -1
  20. package/.claude/skills/team-testing/roles/generator/role.md +2 -1
  21. package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +2 -1
  22. package/.claude/skills/team-ux-improve/specs/team-config.json +6 -6
  23. package/.claude/skills/workflow-execute/phases/06-review.md +4 -4
  24. package/.claude/skills/workflow-lite-test-review/SKILL.md +2 -0
  25. package/.claude/skills/workflow-plan/phases/05-plan-verify.md +4 -0
  26. package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +1 -0
  27. package/.claude/skills/workflow-tdd-plan/phases/05-tdd-task-generation.md +2 -1
  28. package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +1 -0
  29. package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +2 -1
  30. package/.claude/skills/workflow-tune/SKILL.md +487 -0
  31. package/.claude/skills/workflow-tune/phases/01-setup.md +548 -0
  32. package/.claude/skills/workflow-tune/phases/02-step-execute.md +197 -0
  33. package/.claude/skills/workflow-tune/phases/03-step-analyze.md +386 -0
  34. package/.claude/skills/workflow-tune/phases/04-synthesize.md +257 -0
  35. package/.claude/skills/workflow-tune/phases/05-optimize-report.md +246 -0
  36. package/.claude/skills/workflow-tune/specs/workflow-eval-criteria.md +57 -0
  37. package/.claude/skills/workflow-tune/templates/step-analysis-prompt.md +88 -0
  38. package/.claude/skills/workflow-tune/templates/synthesis-prompt.md +90 -0
  39. package/.codex/skills/analyze-with-file/SKILL.md +64 -103
  40. package/.codex/skills/debug-with-file/SKILL.md +4 -0
  41. package/.codex/skills/issue-discover/SKILL.md +1 -0
  42. package/.codex/skills/review-cycle/phases/02-parallel-review.md +3 -0
  43. package/.codex/skills/roadmap-with-file/SKILL.md +11 -17
  44. package/.codex/skills/team-designer/agents/validation-reporter.md +186 -0
  45. package/.codex/skills/team-iterdev/agents/gc-controller.md +193 -0
  46. package/.codex/skills/team-iterdev/agents/task-analyzer.md +206 -0
  47. package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +165 -0
  48. package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +163 -0
  49. package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +182 -0
  50. package/.codex/skills/team-uidesign/agents/completion-handler.md +177 -0
  51. package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +162 -0
  52. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +4 -0
  53. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +2 -0
  54. package/ccw/dist/commands/spec.d.ts.map +1 -1
  55. package/ccw/dist/commands/spec.js +9 -4
  56. package/ccw/dist/commands/spec.js.map +1 -1
  57. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  58. package/ccw/dist/core/routes/codexlens-routes.js +3 -1
  59. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  60. package/ccw/dist/tools/spec-index-builder.d.ts +8 -4
  61. package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -1
  62. package/ccw/dist/tools/spec-index-builder.js +8 -4
  63. package/ccw/dist/tools/spec-index-builder.js.map +1 -1
  64. package/ccw/dist/tools/spec-init.d.ts +1 -1
  65. package/ccw/dist/tools/spec-init.d.ts.map +1 -1
  66. package/ccw/dist/tools/spec-init.js +127 -0
  67. package/ccw/dist/tools/spec-init.js.map +1 -1
  68. package/ccw/dist/tools/spec-loader.d.ts.map +1 -1
  69. package/ccw/dist/tools/spec-loader.js +2 -1
  70. package/ccw/dist/tools/spec-loader.js.map +1 -1
  71. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js → AlertDialog-BW9jiZ-p.js} +2 -2
  72. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js.map → AlertDialog-BW9jiZ-p.js.map} +1 -1
  73. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js → AnalysisPage-ds-w_nVO.js} +2 -2
  74. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js.map → AnalysisPage-ds-w_nVO.js.map} +1 -1
  75. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js → ApiSettingsPage-DlCbXxTz.js} +2 -2
  76. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js.map → ApiSettingsPage-DlCbXxTz.js.map} +1 -1
  77. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js → CliModeToggle-Dq3nL4fF.js} +2 -2
  78. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js.map → CliModeToggle-Dq3nL4fF.js.map} +1 -1
  79. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js → CliSessionSharePage-BNDkEE4u.js} +2 -2
  80. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js.map → CliSessionSharePage-BNDkEE4u.js.map} +1 -1
  81. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js → CliViewerPage-ChM-uNx_.js} +2 -2
  82. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js.map → CliViewerPage-ChM-uNx_.js.map} +1 -1
  83. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js +2 -0
  84. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js.map +1 -0
  85. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js → Collapsible-CRNbykXN.js} +2 -2
  86. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js.map → Collapsible-CRNbykXN.js.map} +1 -1
  87. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js → CommandsManagerPage-C2JWcemF.js} +2 -2
  88. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js.map → CommandsManagerPage-C2JWcemF.js.map} +1 -1
  89. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js → DeepWikiPage-CvleOtJy.js} +2 -2
  90. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js.map → DeepWikiPage-CvleOtJy.js.map} +1 -1
  91. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js → EndpointsPage-CMOWQG64.js} +2 -2
  92. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js.map → EndpointsPage-CMOWQG64.js.map} +1 -1
  93. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js → ExplorerPage-DaFPRlNo.js} +2 -2
  94. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js.map → ExplorerPage-DaFPRlNo.js.map} +1 -1
  95. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js → FixSessionPage-CC4p04Az.js} +2 -2
  96. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js.map → FixSessionPage-CC4p04Az.js.map} +1 -1
  97. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js → FloatingFileBrowser-DROn1xZ5.js} +2 -2
  98. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js.map → FloatingFileBrowser-DROn1xZ5.js.map} +1 -1
  99. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js → FloatingPanel-CmL_yhDv.js} +2 -2
  100. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js.map → FloatingPanel-CmL_yhDv.js.map} +1 -1
  101. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js → GraphExplorerPage-DCV5ybKE.js} +2 -2
  102. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js.map → GraphExplorerPage-DCV5ybKE.js.map} +1 -1
  103. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js → HistoryPage-D0fYQZgc.js} +2 -2
  104. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js.map → HistoryPage-D0fYQZgc.js.map} +1 -1
  105. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js → HookManagerPage-D2FuJfsM.js} +2 -2
  106. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js.map → HookManagerPage-D2FuJfsM.js.map} +1 -1
  107. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js → InstallationsPage-tjklillZ.js} +2 -2
  108. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js.map → InstallationsPage-tjklillZ.js.map} +1 -1
  109. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js → IssueHubPage-E4JVrhO1.js} +2 -2
  110. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js.map → IssueHubPage-E4JVrhO1.js.map} +1 -1
  111. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js → LiteTasksPage-aJuRoyLt.js} +2 -2
  112. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js.map → LiteTasksPage-aJuRoyLt.js.map} +1 -1
  113. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js → McpManagerPage-BJeuWJv1.js} +2 -2
  114. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js.map → McpManagerPage-BJeuWJv1.js.map} +1 -1
  115. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js → MemoryPage-BI4FAXhs.js} +2 -2
  116. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js.map → MemoryPage-BI4FAXhs.js.map} +1 -1
  117. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js → NotFoundPage-DD2svchp.js} +2 -2
  118. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js.map → NotFoundPage-DD2svchp.js.map} +1 -1
  119. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js → OrchestratorPage-FC__7yYa.js} +2 -2
  120. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js.map → OrchestratorPage-FC__7yYa.js.map} +1 -1
  121. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js → ProjectOverviewPage-DBB_-FzV.js} +2 -2
  122. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js.map → ProjectOverviewPage-DBB_-FzV.js.map} +1 -1
  123. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js → PromptHistoryPage-BwOAvCH8.js} +2 -2
  124. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js.map → PromptHistoryPage-BwOAvCH8.js.map} +1 -1
  125. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js → ReviewSessionPage-Dd1-g_gp.js} +2 -2
  126. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js.map → ReviewSessionPage-Dd1-g_gp.js.map} +1 -1
  127. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js → RulesManagerPage-B3RGdsKD.js} +2 -2
  128. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js.map → RulesManagerPage-B3RGdsKD.js.map} +1 -1
  129. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js → SessionDetailPage-DM-W5R8K.js} +2 -2
  130. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js.map → SessionDetailPage-DM-W5R8K.js.map} +1 -1
  131. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js → SessionsPage-BVz1KCc7.js} +2 -2
  132. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js.map → SessionsPage-BVz1KCc7.js.map} +1 -1
  133. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js → SettingsPage-ComW7EZS.js} +4 -4
  134. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js.map → SettingsPage-ComW7EZS.js.map} +1 -1
  135. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js → SkillsManagerPage-CKom9XwV.js} +2 -2
  136. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js.map → SkillsManagerPage-CKom9XwV.js.map} +1 -1
  137. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js → SpecsSettingsPage-DQz7WP2s.js} +2 -2
  138. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js.map → SpecsSettingsPage-DQz7WP2s.js.map} +1 -1
  139. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js → Switch-BPMdND9H.js} +2 -2
  140. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js.map → Switch-BPMdND9H.js.map} +1 -1
  141. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js → TabsNavigation-qqt70VYL.js} +2 -2
  142. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js.map → TabsNavigation-qqt70VYL.js.map} +1 -1
  143. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js → TaskDrawer-BqK_qiHX.js} +2 -2
  144. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js.map → TaskDrawer-BqK_qiHX.js.map} +1 -1
  145. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js → TeamPage-u5_i0Rgh.js} +2 -2
  146. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js.map → TeamPage-u5_i0Rgh.js.map} +1 -1
  147. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js → TerminalDashboardPage-rUtC9e40.js} +2 -2
  148. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js.map → TerminalDashboardPage-rUtC9e40.js.map} +1 -1
  149. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js → archive-C3u8YNQF.js} +2 -2
  150. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js.map → archive-C3u8YNQF.js.map} +1 -1
  151. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js → archive-restore-DfQ998g5.js} +2 -2
  152. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js.map → archive-restore-DfQ998g5.js.map} +1 -1
  153. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js → arrow-right-BshJM9Po.js} +2 -2
  154. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js.map → arrow-right-BshJM9Po.js.map} +1 -1
  155. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js → bookmark-plus-D03qJyOZ.js} +2 -2
  156. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js.map → bookmark-plus-D03qJyOZ.js.map} +1 -1
  157. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js → bot-CyzWuwq0.js} +2 -2
  158. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js.map → bot-CyzWuwq0.js.map} +1 -1
  159. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js → braces-BPgtyjsG.js} +2 -2
  160. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js.map → braces-BPgtyjsG.js.map} +1 -1
  161. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js → circle-stop-Dix1AOmw.js} +2 -2
  162. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js.map → circle-stop-Dix1AOmw.js.map} +1 -1
  163. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js → cpu-CCQ4Q0Zh.js} +2 -2
  164. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js.map → cpu-CCQ4Q0Zh.js.map} +1 -1
  165. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js → ellipsis-vertical-BpTysg-Y.js} +2 -2
  166. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js.map → ellipsis-vertical-BpTysg-Y.js.map} +1 -1
  167. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js → eye-DGY1rAZs.js} +2 -2
  168. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js.map → eye-DGY1rAZs.js.map} +1 -1
  169. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js → eye-off-D8t3JfWG.js} +2 -2
  170. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js.map → eye-off-D8t3JfWG.js.map} +1 -1
  171. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js → file-json-BAdJb0n8.js} +2 -2
  172. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js.map → file-json-BAdJb0n8.js.map} +1 -1
  173. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js → file-text-DrJFiOUB.js} +2 -2
  174. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js.map → file-text-DrJFiOUB.js.map} +1 -1
  175. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js → filter-CKqzYbz7.js} +2 -2
  176. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js.map → filter-CKqzYbz7.js.map} +1 -1
  177. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js → folder-CV8511y9.js} +2 -2
  178. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js.map → folder-CV8511y9.js.map} +1 -1
  179. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js → gauge-XKvmu_uU.js} +2 -2
  180. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js.map → gauge-XKvmu_uU.js.map} +1 -1
  181. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js → globe-C56cDUzX.js} +2 -2
  182. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js.map → globe-C56cDUzX.js.map} +1 -1
  183. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js → grid-3x3-Bya-suFW.js} +2 -2
  184. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js.map → grid-3x3-Bya-suFW.js.map} +1 -1
  185. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js → hard-drive-CmuTZpsB.js} +2 -2
  186. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js.map → hard-drive-CmuTZpsB.js.map} +1 -1
  187. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js → hash-CRPT_tJQ.js} +2 -2
  188. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js.map → hash-CRPT_tJQ.js.map} +1 -1
  189. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js → history-C1pJZQCL.js} +2 -2
  190. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js.map → history-C1pJZQCL.js.map} +1 -1
  191. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js → index-B6TpijCe.js} +2 -2
  192. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js.map → index-B6TpijCe.js.map} +1 -1
  193. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js → index-Bcq-7r6F.js} +2 -2
  194. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js.map → index-Bcq-7r6F.js.map} +1 -1
  195. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js → index-CI8-rBff.js} +2 -2
  196. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js.map → index-CI8-rBff.js.map} +1 -1
  197. package/ccw/frontend/dist/assets/{index-CY6Lueph.js → index-Dmt9OiEf.js} +2 -2
  198. package/ccw/frontend/dist/assets/{index-CY6Lueph.js.map → index-Dmt9OiEf.js.map} +1 -1
  199. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js → index-anSMmEF8.js} +2 -2
  200. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js.map → index-anSMmEF8.js.map} +1 -1
  201. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js → index-dWT2M6Ef.js} +4 -4
  202. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js.map → index-dWT2M6Ef.js.map} +1 -1
  203. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js → layout-grid-TSO0BFQE.js} +2 -2
  204. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js.map → layout-grid-TSO0BFQE.js.map} +1 -1
  205. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js → lightbulb-Caj6fIQD.js} +2 -2
  206. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js.map → lightbulb-Caj6fIQD.js.map} +1 -1
  207. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js → link-2-DE9lMxa-.js} +2 -2
  208. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js.map → link-2-DE9lMxa-.js.map} +1 -1
  209. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js → link-BZtPgLW0.js} +2 -2
  210. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js.map → link-BZtPgLW0.js.map} +1 -1
  211. package/ccw/frontend/dist/assets/{list-CDmYFcio.js → list-DubWyY-U.js} +2 -2
  212. package/ccw/frontend/dist/assets/{list-CDmYFcio.js.map → list-DubWyY-U.js.map} +1 -1
  213. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js → map-pin-DwN_48AF.js} +2 -2
  214. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js.map → map-pin-DwN_48AF.js.map} +1 -1
  215. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js → messages-square-bjxvaiM9.js} +2 -2
  216. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js.map → messages-square-bjxvaiM9.js.map} +1 -1
  217. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js → minimize-2-CGfBKD_V.js} +2 -2
  218. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js.map → minimize-2-CGfBKD_V.js.map} +1 -1
  219. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js → package-nzWY6ilt.js} +2 -2
  220. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js.map → package-nzWY6ilt.js.map} +1 -1
  221. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js → plug-CiLce49C.js} +2 -2
  222. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js.map → plug-CiLce49C.js.map} +1 -1
  223. package/ccw/frontend/dist/assets/{power-DmIojFl-.js → power-CFLmB-U9.js} +2 -2
  224. package/ccw/frontend/dist/assets/{power-DmIojFl-.js.map → power-CFLmB-U9.js.map} +1 -1
  225. package/ccw/frontend/dist/assets/{save-BFa03OnG.js → save-DuO6OF0C.js} +2 -2
  226. package/ccw/frontend/dist/assets/{save-BFa03OnG.js.map → save-DuO6OF0C.js.map} +1 -1
  227. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js → send-CZk9p0mM.js} +2 -2
  228. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js.map → send-CZk9p0mM.js.map} +1 -1
  229. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js → square-check-big-BY_1YQQg.js} +2 -2
  230. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js.map → square-check-big-BY_1YQQg.js.map} +1 -1
  231. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js → square-pen-CnZgm6g-.js} +2 -2
  232. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js.map → square-pen-CnZgm6g-.js.map} +1 -1
  233. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js → star-Cn1F0qy7.js} +2 -2
  234. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js.map → star-Cn1F0qy7.js.map} +1 -1
  235. package/ccw/frontend/dist/assets/{style-CJsrp48L.js → style-Dxs1iXCV.js} +2 -2
  236. package/ccw/frontend/dist/assets/{style-CJsrp48L.js.map → style-Dxs1iXCV.js.map} +1 -1
  237. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js → target-Bz1fLRKH.js} +2 -2
  238. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js.map → target-Bz1fLRKH.js.map} +1 -1
  239. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js → test-tube-C6qCYlDr.js} +2 -2
  240. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js.map → test-tube-C6qCYlDr.js.map} +1 -1
  241. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js → upload-C71kd4Qs.js} +2 -2
  242. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js.map → upload-C71kd4Qs.js.map} +1 -1
  243. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js → useApiSettings-CqP2BAJ7.js} +2 -2
  244. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js.map → useApiSettings-CqP2BAJ7.js.map} +1 -1
  245. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js → useCli-PCoPoVeM.js} +2 -2
  246. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js.map → useCli-PCoPoVeM.js.map} +1 -1
  247. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js → useCommands-3OfPQPw4.js} +2 -2
  248. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js.map → useCommands-3OfPQPw4.js.map} +1 -1
  249. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js → useDebounce-bXiFhQx9.js} +2 -2
  250. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js.map → useDebounce-bXiFhQx9.js.map} +1 -1
  251. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js → useFileExplorer-DEyUm46_.js} +2 -2
  252. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js.map → useFileExplorer-DEyUm46_.js.map} +1 -1
  253. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js → useLocale-sXTrdxcJ.js} +2 -2
  254. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js.map → useLocale-sXTrdxcJ.js.map} +1 -1
  255. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js → useSkills-D0W0kXYm.js} +3 -3
  256. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js.map → useSkills-D0W0kXYm.js.map} +1 -1
  257. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js → useSystemSettings-DZ-8lZsG.js} +2 -2
  258. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js.map → useSystemSettings-DZ-8lZsG.js.map} +1 -1
  259. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js → wand-sparkles-83GmAYuw.js} +2 -2
  260. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js.map → wand-sparkles-83GmAYuw.js.map} +1 -1
  261. package/ccw/frontend/dist/index.html +1 -1
  262. package/package.json +1 -1
  263. package/.claude/skills/team-arch-opt/role-specs/analyzer.md +0 -80
  264. package/.claude/skills/team-arch-opt/role-specs/designer.md +0 -118
  265. package/.claude/skills/team-arch-opt/role-specs/refactorer.md +0 -106
  266. package/.claude/skills/team-arch-opt/role-specs/reviewer.md +0 -116
  267. package/.claude/skills/team-arch-opt/role-specs/validator.md +0 -117
  268. package/.claude/skills/team-brainstorm/role-specs/challenger.md +0 -63
  269. package/.claude/skills/team-brainstorm/role-specs/evaluator.md +0 -58
  270. package/.claude/skills/team-brainstorm/role-specs/ideator.md +0 -71
  271. package/.claude/skills/team-brainstorm/role-specs/synthesizer.md +0 -59
  272. package/.claude/skills/team-frontend/role-specs/analyst.md +0 -91
  273. package/.claude/skills/team-frontend/role-specs/architect.md +0 -85
  274. package/.claude/skills/team-frontend/role-specs/developer.md +0 -92
  275. package/.claude/skills/team-frontend/role-specs/qa.md +0 -78
  276. package/.claude/skills/team-issue/role-specs/explorer.md +0 -95
  277. package/.claude/skills/team-issue/role-specs/implementer.md +0 -89
  278. package/.claude/skills/team-issue/role-specs/integrator.md +0 -86
  279. package/.claude/skills/team-issue/role-specs/planner.md +0 -83
  280. package/.claude/skills/team-issue/role-specs/reviewer.md +0 -89
  281. package/.claude/skills/team-iterdev/role-specs/architect.md +0 -64
  282. package/.claude/skills/team-iterdev/role-specs/developer.md +0 -73
  283. package/.claude/skills/team-iterdev/role-specs/reviewer.md +0 -65
  284. package/.claude/skills/team-iterdev/role-specs/tester.md +0 -87
  285. package/.claude/skills/team-perf-opt/role-specs/benchmarker.md +0 -110
  286. package/.claude/skills/team-perf-opt/role-specs/optimizer.md +0 -102
  287. package/.claude/skills/team-perf-opt/role-specs/profiler.md +0 -73
  288. package/.claude/skills/team-perf-opt/role-specs/reviewer.md +0 -91
  289. package/.claude/skills/team-perf-opt/role-specs/strategist.md +0 -114
  290. package/.claude/skills/team-planex/role-specs/executor.md +0 -90
  291. package/.claude/skills/team-planex/role-specs/planner.md +0 -110
  292. package/.claude/skills/team-quality-assurance/role-specs/analyst.md +0 -79
  293. package/.claude/skills/team-quality-assurance/role-specs/executor.md +0 -64
  294. package/.claude/skills/team-quality-assurance/role-specs/generator.md +0 -67
  295. package/.claude/skills/team-quality-assurance/role-specs/scout.md +0 -66
  296. package/.claude/skills/team-quality-assurance/role-specs/strategist.md +0 -70
  297. package/.claude/skills/team-review/role-specs/fixer.md +0 -75
  298. package/.claude/skills/team-review/role-specs/reviewer.md +0 -66
  299. package/.claude/skills/team-review/role-specs/scanner.md +0 -70
  300. package/.claude/skills/team-roadmap-dev/role-specs/executor.md +0 -71
  301. package/.claude/skills/team-roadmap-dev/role-specs/planner.md +0 -77
  302. package/.claude/skills/team-roadmap-dev/role-specs/verifier.md +0 -73
  303. package/.claude/skills/team-tech-debt/role-specs/assessor.md +0 -70
  304. package/.claude/skills/team-tech-debt/role-specs/executor.md +0 -80
  305. package/.claude/skills/team-tech-debt/role-specs/planner.md +0 -71
  306. package/.claude/skills/team-tech-debt/role-specs/scanner.md +0 -85
  307. package/.claude/skills/team-tech-debt/role-specs/validator.md +0 -83
  308. package/.claude/skills/team-testing/role-specs/analyst.md +0 -94
  309. package/.claude/skills/team-testing/role-specs/executor.md +0 -97
  310. package/.claude/skills/team-testing/role-specs/generator.md +0 -96
  311. package/.claude/skills/team-testing/role-specs/strategist.md +0 -82
  312. package/.claude/skills/team-uidesign/role-specs/designer.md +0 -72
  313. package/.claude/skills/team-uidesign/role-specs/implementer.md +0 -74
  314. package/.claude/skills/team-uidesign/role-specs/researcher.md +0 -84
  315. package/.claude/skills/team-uidesign/role-specs/reviewer.md +0 -70
  316. package/.claude/skills/team-ux-improve/role-specs/designer.md +0 -191
  317. package/.claude/skills/team-ux-improve/role-specs/diagnoser.md +0 -110
  318. package/.claude/skills/team-ux-improve/role-specs/explorer.md +0 -109
  319. package/.claude/skills/team-ux-improve/role-specs/implementer.md +0 -164
  320. package/.claude/skills/team-ux-improve/role-specs/scanner.md +0 -117
  321. package/.claude/skills/team-ux-improve/role-specs/tester.md +0 -163
  322. package/.codex/skills/analyze-with-file/EXECUTE.md +0 -716
  323. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js +0 -2
  324. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TaskDrawer-ePC__6-P.js","sources":["../../src/components/session-detail/context/FieldRenderer.tsx","../../src/components/session-detail/context/ExplorationCollapsible.tsx","../../src/components/session-detail/context/ExplorationsSection.tsx","../../src/components/session-detail/context/AssetsCard.tsx","../../src/components/session-detail/context/ConflictDetectionCard.tsx","../../src/components/shared/Flowchart.tsx","../../src/components/shared/TaskDrawer.tsx"],"sourcesContent":["// ========================================\r\n// FieldRenderer Component\r\n// ========================================\r\n// Renders various data types for context display\r\n\r\nimport { FileText } from 'lucide-react';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { cn } from '@/lib/utils';\r\n\r\nexport interface FieldRendererProps {\r\n value: unknown;\r\n type?: 'string' | 'array' | 'object' | 'files' | 'tags' | 'auto';\r\n className?: string;\r\n}\r\n\r\n/**\r\n * FieldRenderer component - Automatically renders different data types\r\n */\r\nexport function FieldRenderer({ value, type = 'auto', className }: FieldRendererProps) {\r\n if (value === null || value === undefined) {\r\n return <span className=\"text-muted-foreground italic\">-</span>;\r\n }\r\n\r\n const detectedType = type === 'auto' ? detectType(value) : type;\r\n\r\n switch (detectedType) {\r\n case 'array':\r\n return <ArrayRenderer value={value as unknown[]} className={className} />;\r\n case 'object':\r\n return <ObjectRenderer value={value as Record<string, unknown>} className={className} />;\r\n case 'files':\r\n return <FilesRenderer value={value as Array<{ path: string }>} className={className} />;\r\n case 'tags':\r\n return <TagsRenderer value={value as string[]} className={className} />;\r\n default:\r\n return <StringRenderer value={String(value)} className={className} />;\r\n }\r\n}\r\n\r\nfunction detectType(value: unknown): 'string' | 'array' | 'object' | 'files' | 'tags' {\r\n if (Array.isArray(value)) {\r\n if (value.length > 0 && typeof value[0] === 'object' && value[0] !== null && 'path' in value[0]) {\r\n return 'files';\r\n }\r\n if (value.length > 0 && typeof value[0] === 'string') {\r\n return 'tags';\r\n }\r\n return 'array';\r\n }\r\n if (typeof value === 'object' && value !== null) {\r\n return 'object';\r\n }\r\n return 'string';\r\n}\r\n\r\nfunction StringRenderer({ value, className }: { value: string; className?: string }) {\r\n return <span className={cn('text-foreground', className)}>{value}</span>;\r\n}\r\n\r\nfunction ArrayRenderer({ value, className }: { value: unknown[]; className?: string }) {\r\n if (!Array.isArray(value)) {\r\n return <FieldRenderer value={value} type=\"auto\" className={className} />;\r\n }\r\n\r\n if (value.length === 0) {\r\n return <span className=\"text-muted-foreground italic\">Empty</span>;\r\n }\r\n\r\n return (\r\n <ul className={cn('space-y-1', className)}>\r\n {value.map((item, index) => (\r\n <li key={index} className=\"text-sm text-foreground flex items-start gap-2\">\r\n <span className=\"text-muted-foreground\">{index + 1}.</span>\r\n <span className=\"flex-1\">{String(item)}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction ObjectRenderer({ value, className }: { value: Record<string, unknown>; className?: string }) {\r\n const entries = Object.entries(value).filter(([_, v]) => v !== null && v !== undefined);\r\n\r\n if (entries.length === 0) {\r\n return <span className=\"text-muted-foreground italic\">Empty</span>;\r\n }\r\n\r\n return (\r\n <div className={cn('space-y-2', className)}>\r\n {entries.map(([key, val]) => (\r\n <div key={key} className=\"flex items-start gap-2\">\r\n <span className=\"text-sm font-medium text-muted-foreground min-w-[100px] capitalize\">\r\n {formatLabel(key)}:\r\n </span>\r\n <span className=\"text-sm text-foreground flex-1\">\r\n {typeof val === 'object' ? JSON.stringify(val, null, 2) : String(val)}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction FilesRenderer({ value, className }: { value: Array<{ path: string }>; className?: string }) {\r\n if (!Array.isArray(value)) {\r\n return <FieldRenderer value={value} type=\"auto\" className={className} />;\r\n }\r\n\r\n if (value.length === 0) {\r\n return <span className=\"text-muted-foreground italic\">No files</span>;\r\n }\r\n\r\n return (\r\n <div className={cn('space-y-1', className)}>\r\n {value.map((file, index) => (\r\n <div\r\n key={index}\r\n className=\"flex items-center gap-2 p-2 bg-muted rounded text-sm font-mono text-foreground\"\r\n >\r\n <FileText className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />\r\n <span className=\"truncate\">{file.path}</span>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction TagsRenderer({ value, className }: { value: string[]; className?: string }) {\r\n if (!Array.isArray(value)) {\r\n return <FieldRenderer value={value} type=\"auto\" className={className} />;\r\n }\r\n\r\n if (value.length === 0) {\r\n return <span className=\"text-muted-foreground italic\">No tags</span>;\r\n }\r\n\r\n return (\r\n <div className={cn('flex flex-wrap gap-2', className)}>\r\n {value.map((tag, index) => (\r\n <Badge key={index} variant=\"outline\" className=\"px-2 py-0.5\">\r\n {tag}\r\n </Badge>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatLabel(key: string): string {\r\n return key\r\n .replace(/_/g, ' ')\r\n .replace(/([A-Z])/g, ' $1')\r\n .trim()\r\n .toLowerCase()\r\n .replace(/^\\w/, (c) => c.toUpperCase());\r\n}\r\n","// ========================================\r\n// ExplorationCollapsible Component\r\n// ========================================\r\n// Collapsible section for exploration angles\r\n\r\nimport * as React from 'react';\r\nimport { ChevronDown } from 'lucide-react';\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from '@/components/ui/Collapsible';\r\nimport { cn } from '@/lib/utils';\r\n\r\nexport interface ExplorationCollapsibleProps {\r\n title: string;\r\n icon?: React.ReactNode;\r\n defaultOpen?: boolean;\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * ExplorationCollapsible component - Collapsible section for exploration data\r\n */\r\nexport function ExplorationCollapsible({\r\n title,\r\n icon,\r\n defaultOpen = false,\r\n children,\r\n className,\r\n}: ExplorationCollapsibleProps) {\r\n const [isOpen, setIsOpen] = React.useState(defaultOpen);\r\n\r\n return (\r\n <Collapsible open={isOpen} onOpenChange={setIsOpen} className={cn('border rounded-lg', className)}>\r\n <CollapsibleTrigger className=\"flex items-center justify-between w-full p-3 hover:bg-muted/50 transition-colors\">\r\n <div className=\"flex items-center gap-2\">\r\n {icon}\r\n <span className=\"text-sm font-medium text-foreground\">{title}</span>\r\n </div>\r\n <ChevronDown\r\n className={cn(\r\n 'h-4 w-4 text-muted-foreground transition-transform',\r\n isOpen && 'transform rotate-180'\r\n )}\r\n />\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className=\"p-3 pt-0\">\r\n <div className=\"mt-2 space-y-2\">\r\n {children}\r\n </div>\r\n </CollapsibleContent>\r\n </Collapsible>\r\n );\r\n}\r\n","// ========================================\r\n// ExplorationsSection Component\r\n// ========================================\r\n// Displays exploration data with collapsible sections\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n GitBranch,\r\n Search,\r\n Link,\r\n TestTube,\r\n FolderOpen,\r\n FileText,\r\n Layers\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { ExplorationCollapsible } from './ExplorationCollapsible';\r\n\r\nexport interface ExplorationsData {\r\n manifest: {\r\n task_description: string;\r\n complexity?: string;\r\n exploration_count: number;\r\n };\r\n data: Record<string, {\r\n project_structure?: string[];\r\n relevant_files?: string[];\r\n patterns?: string[];\r\n dependencies?: string[];\r\n integration_points?: string[];\r\n testing?: string[];\r\n }>;\r\n}\r\n\r\nexport interface ExplorationsSectionProps {\r\n data?: ExplorationsData;\r\n}\r\n\r\n/**\r\n * ExplorationsSection component - Displays all exploration angles\r\n */\r\nexport function ExplorationsSection({ data }: ExplorationsSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || !data.data || Object.keys(data.data).length === 0) {\r\n return null;\r\n }\r\n\r\n const explorationEntries = Object.entries(data.data);\r\n\r\n return (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-sm font-medium text-foreground mb-4 flex items-center gap-2\">\r\n <Search className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'sessionDetail.context.explorations.title' })}\r\n <Badge variant=\"secondary\">\r\n {data.manifest.exploration_count} {formatMessage({ id: 'sessionDetail.context.explorations.angles' })}\r\n </Badge>\r\n </h3>\r\n <div className=\"space-y-3\">\r\n {explorationEntries.map(([angle, angleData]) => (\r\n <ExplorationCollapsible\r\n key={angle}\r\n title={formatAngleTitle(angle)}\r\n icon={<Search className=\"w-4 h-4 text-muted-foreground\" />}\r\n >\r\n <AngleContent data={angleData} />\r\n </ExplorationCollapsible>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface AngleContentProps {\r\n data: {\r\n project_structure?: unknown;\r\n relevant_files?: unknown;\r\n patterns?: unknown;\r\n dependencies?: unknown;\r\n integration_points?: unknown;\r\n testing?: unknown;\r\n [key: string]: unknown;\r\n };\r\n}\r\n\r\n/** Extract a displayable string from unknown value (handles objects with path/name/etc.) */\r\nfunction extractString(val: unknown): string {\r\n if (typeof val === 'string') return val;\r\n if (val && typeof val === 'object') {\r\n const obj = val as Record<string, unknown>;\r\n // Common field names for file-like objects\r\n if (typeof obj.path === 'string') return obj.path;\r\n if (typeof obj.name === 'string') return obj.name;\r\n if (typeof obj.file === 'string') return obj.file;\r\n if (typeof obj.title === 'string') return obj.title;\r\n // Fallback: first string-valued property\r\n for (const v of Object.values(obj)) {\r\n if (typeof v === 'string' && v.length > 0) return v;\r\n }\r\n }\r\n return String(val);\r\n}\r\n\r\n/** Extract a secondary description from an object (rationale, reason, description, etc.) */\r\nfunction extractReason(val: unknown): string | undefined {\r\n if (!val || typeof val !== 'object') return undefined;\r\n const obj = val as Record<string, unknown>;\r\n if (typeof obj.rationale === 'string') return obj.rationale;\r\n if (typeof obj.reason === 'string') return obj.reason;\r\n if (typeof obj.description === 'string') return obj.description;\r\n return undefined;\r\n}\r\n\r\n/** Safely coerce a field to items – preserving object metadata for files */\r\nfunction toItems(val: unknown): Array<{ text: string; reason?: string }> {\r\n if (Array.isArray(val)) {\r\n return val.map((item) => ({\r\n text: extractString(item),\r\n reason: extractReason(item),\r\n }));\r\n }\r\n if (typeof val === 'string' && val.length > 0) return [{ text: val }];\r\n return [];\r\n}\r\n\r\n/** Per-section color theme */\r\nconst sectionThemes: Record<string, { icon: string; border: string; bg: string; badge: string }> = {\r\n project_structure: { icon: 'text-blue-500', border: 'border-l-blue-500', bg: 'bg-blue-500/5', badge: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300' },\r\n relevant_files: { icon: 'text-violet-500', border: 'border-l-violet-500', bg: 'bg-violet-500/5', badge: 'bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-300' },\r\n patterns: { icon: 'text-amber-500', border: 'border-l-amber-500', bg: 'bg-amber-500/5', badge: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300' },\r\n dependencies: { icon: 'text-emerald-500', border: 'border-l-emerald-500', bg: 'bg-emerald-500/5', badge: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300' },\r\n integration_points: { icon: 'text-cyan-500', border: 'border-l-cyan-500', bg: 'bg-cyan-500/5', badge: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300' },\r\n testing: { icon: 'text-rose-500', border: 'border-l-rose-500', bg: 'bg-rose-500/5', badge: 'bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-300' },\r\n};\r\n\r\nconst defaultTheme = { icon: 'text-muted-foreground', border: 'border-l-border', bg: 'bg-muted/30', badge: 'bg-muted text-foreground' };\r\n\r\nfunction AngleContent({ data }: AngleContentProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n const sectionDefs: Array<{\r\n key: string;\r\n field: unknown;\r\n icon: JSX.Element;\r\n labelId: string;\r\n renderAs: 'paths' | 'text';\r\n }> = [\r\n { key: 'project_structure', field: data.project_structure, icon: <FolderOpen className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.projectStructure', renderAs: 'text' },\r\n { key: 'relevant_files', field: data.relevant_files, icon: <FileText className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.relevantFiles', renderAs: 'paths' },\r\n { key: 'patterns', field: data.patterns, icon: <Layers className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.patterns', renderAs: 'text' },\r\n { key: 'dependencies', field: data.dependencies, icon: <GitBranch className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.dependencies', renderAs: 'text' },\r\n { key: 'integration_points', field: data.integration_points, icon: <Link className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.integrationPoints', renderAs: 'text' },\r\n { key: 'testing', field: data.testing, icon: <TestTube className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.testing', renderAs: 'text' },\r\n ];\r\n\r\n const sections = sectionDefs\r\n .map((def) => ({ ...def, items: toItems(def.field) }))\r\n .filter((s) => s.items.length > 0);\r\n\r\n if (sections.length === 0) {\r\n return <p className=\"text-xs text-muted-foreground italic\">No data available</p>;\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {sections.map((section) => {\r\n const theme = sectionThemes[section.key] || defaultTheme;\r\n return (\r\n <div key={section.key} className={`border-l-2 ${theme.border} ${theme.bg} rounded-r pl-3 py-2 pr-2`}>\r\n <h4 className={`text-xs font-medium uppercase tracking-wide mb-1.5 flex items-center gap-1.5 ${theme.icon}`}>\r\n {section.icon}\r\n {formatMessage({ id: section.labelId })}\r\n <span className={`text-[10px] px-1.5 py-0.5 rounded-full font-normal normal-case tracking-normal ${theme.badge}`}>\r\n {section.items.length}\r\n </span>\r\n </h4>\r\n {section.renderAs === 'paths' ? (\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {section.items.map((item, i) => (\r\n <div\r\n key={i}\r\n className=\"flex items-center gap-1 px-2 py-1 bg-background rounded border text-[11px] font-mono text-foreground\"\r\n title={item.reason}\r\n >\r\n <FileText className={`w-3 h-3 flex-shrink-0 ${theme.icon}`} />\r\n {item.text}\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <ul className=\"space-y-1\">\r\n {section.items.map((item, i) => (\r\n <li key={i} className=\"flex items-start gap-1.5 text-xs text-foreground\">\r\n <span className={`mt-0.5 ${theme.icon}`}>•</span>\r\n <span className=\"flex-1\">\r\n <FormattedTextItem text={item.text} />\r\n </span>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\n/** Render text with inline code/path highlighting */\r\nfunction FormattedTextItem({ text }: { text: string }) {\r\n // Split on backtick-wrapped segments\r\n const parts = text.split(/(`[^`]+`)/g);\r\n if (parts.length === 1) {\r\n // No backtick segments – highlight embedded file paths\r\n const pathParts = text.split(/(\\S+\\/\\S+\\.\\w+)/g);\r\n if (pathParts.length === 1) return <>{text}</>;\r\n return (\r\n <>\r\n {pathParts.map((part, i) =>\r\n /\\S+\\/\\S+\\.\\w+/.test(part) ? (\r\n <code key={i} className=\"px-1 py-0.5 bg-muted rounded text-[10px] font-mono\">{part}</code>\r\n ) : (\r\n <span key={i}>{part}</span>\r\n )\r\n )}\r\n </>\r\n );\r\n }\r\n return (\r\n <>\r\n {parts.map((part, i) =>\r\n part.startsWith('`') && part.endsWith('`') ? (\r\n <code key={i} className=\"px-1 py-0.5 bg-muted rounded text-[10px] font-mono\">\r\n {part.slice(1, -1)}\r\n </code>\r\n ) : (\r\n <span key={i}>{part}</span>\r\n )\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nfunction formatAngleTitle(angle: string): string {\r\n return angle\r\n .replace(/_/g, ' ')\r\n .replace(/([A-Z])/g, ' $1')\r\n .trim()\r\n .toLowerCase()\r\n .replace(/^\\w/, (c) => c.toUpperCase());\r\n}\r\n","// ========================================\r\n// AssetsCard Component\r\n// ========================================\r\n// Displays assets with category tabs and card grid\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { FileText, Code, TestTube } from 'lucide-react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/Tabs';\r\n\r\nexport interface AssetItem {\r\n path: string;\r\n relevance_score?: number;\r\n scope?: string;\r\n contains?: string[];\r\n}\r\n\r\nexport interface AssetsData {\r\n documentation?: AssetItem[];\r\n source_code?: AssetItem[];\r\n tests?: AssetItem[];\r\n}\r\n\r\nexport interface AssetsCardProps {\r\n data?: AssetsData;\r\n}\r\n\r\n/**\r\n * AssetsCard component - Displays project assets with categorization\r\n */\r\nexport function AssetsCard({ data }: AssetsCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || (!data.documentation?.length && !data.source_code?.length && !data.tests?.length)) {\r\n return null;\r\n }\r\n\r\n const docCount = data.documentation?.length || 0;\r\n const sourceCount = data.source_code?.length || 0;\r\n const testCount = data.tests?.length || 0;\r\n const totalAssets = docCount + sourceCount + testCount;\r\n\r\n return (\r\n <Card>\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2\">\r\n <FileText className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.assets.title' })}\r\n <Badge variant=\"secondary\">{totalAssets}</Badge>\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent>\r\n <Tabs defaultValue={docCount > 0 ? 'documentation' : sourceCount > 0 ? 'source_code' : 'tests'}>\r\n <TabsList className=\"grid w-full grid-cols-3\">\r\n <TabsTrigger value=\"documentation\" disabled={!docCount}>\r\n <FileText className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'sessionDetail.context.categories.documentation' })}\r\n {docCount > 0 && <span className=\"ml-1 text-xs\">({docCount})</span>}\r\n </TabsTrigger>\r\n <TabsTrigger value=\"source_code\" disabled={!sourceCount}>\r\n <Code className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'sessionDetail.context.categories.sourceCode' })}\r\n {sourceCount > 0 && <span className=\"ml-1 text-xs\">({sourceCount})</span>}\r\n </TabsTrigger>\r\n <TabsTrigger value=\"tests\" disabled={!testCount}>\r\n <TestTube className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'sessionDetail.context.categories.tests' })}\r\n {testCount > 0 && <span className=\"ml-1 text-xs\">({testCount})</span>}\r\n </TabsTrigger>\r\n </TabsList>\r\n\r\n <TabsContent value=\"documentation\" className=\"mt-4\">\r\n <AssetGrid items={data.documentation || []} type=\"documentation\" />\r\n </TabsContent>\r\n\r\n <TabsContent value=\"source_code\" className=\"mt-4\">\r\n <AssetGrid items={data.source_code || []} type=\"source_code\" />\r\n </TabsContent>\r\n\r\n <TabsContent value=\"tests\" className=\"mt-4\">\r\n <AssetGrid items={data.tests || []} type=\"tests\" />\r\n </TabsContent>\r\n </Tabs>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface AssetGridProps {\r\n items: AssetItem[];\r\n type: string;\r\n}\r\n\r\nfunction AssetGrid({ items }: AssetGridProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (items.length === 0) {\r\n return (\r\n <div className=\"text-center py-8 text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.assets.noData' })}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"grid gap-3\">\r\n {items.map((item, index) => (\r\n <div\r\n key={index}\r\n className=\"p-3 border rounded-lg hover:bg-muted/50 transition-colors\"\r\n >\r\n <div className=\"flex items-start justify-between gap-2 mb-2\">\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-mono text-foreground truncate\">{item.path}</p>\r\n </div>\r\n {item.relevance_score !== undefined && (\r\n <Badge\r\n variant={item.relevance_score > 0.7 ? 'success' : item.relevance_score > 0.4 ? 'default' : 'secondary'}\r\n className=\"flex-shrink-0\"\r\n >\r\n {Math.round(item.relevance_score * 100)}%\r\n </Badge>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex flex-wrap gap-2 text-xs\">\r\n {item.scope && (\r\n <span className=\"text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.assets.scope' })}: {item.scope}\r\n </span>\r\n )}\r\n {item.contains && item.contains.length > 0 && (\r\n <span className=\"text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.assets.contains' })}: {item.contains.join(', ')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// ConflictDetectionCard Component\r\n// ========================================\r\n// Displays conflict detection results with risk levels\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { AlertTriangle, Shield, 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 RiskFactors {\r\n test_gaps?: string[];\r\n existing_implementations?: string[];\r\n}\r\n\r\nexport interface ConflictDetectionData {\r\n risk_level?: 'low' | 'medium' | 'high' | 'critical';\r\n mitigation_strategy?: string;\r\n risk_factors?: RiskFactors;\r\n affected_modules?: string[];\r\n}\r\n\r\nexport interface ConflictDetectionCardProps {\r\n data?: ConflictDetectionData;\r\n}\r\n\r\n/**\r\n * ConflictDetectionCard component - Displays conflict detection results\r\n */\r\nexport function ConflictDetectionCard({ data }: ConflictDetectionCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || !data.risk_level) {\r\n return null;\r\n }\r\n\r\n const riskConfig = getRiskConfig(data.risk_level);\r\n\r\n return (\r\n <Card className={riskConfig.borderClass}>\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2\">\r\n <AlertTriangle className={`w-5 h-5 ${riskConfig.iconColor}`} />\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.title' })}\r\n <Badge variant={riskConfig.badgeVariant} className={riskConfig.badgeClass}>\r\n {formatMessage({ id: `sessionDetail.context.conflictDetection.riskLevel.${data.risk_level}` })}\r\n </Badge>\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n {/* Mitigation Strategy */}\r\n {data.mitigation_strategy && (\r\n <div className=\"p-3 bg-muted/50 rounded-lg\">\r\n <div className=\"flex items-start gap-2\">\r\n <Shield className=\"w-4 h-4 text-muted-foreground mt-0.5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <h4 className=\"text-sm font-medium text-foreground mb-1\">\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.mitigation' })}\r\n </h4>\r\n <p className=\"text-sm text-muted-foreground\">{data.mitigation_strategy}</p>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Risk Factors */}\r\n {data.risk_factors && (\r\n <RiskFactorsSection factors={data.risk_factors} />\r\n )}\r\n\r\n {/* Affected Modules */}\r\n {data.affected_modules && data.affected_modules.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.conflictDetection.affectedModules' })}\r\n </h4>\r\n <FieldRenderer value={data.affected_modules} type=\"tags\" />\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface RiskFactorsSectionProps {\r\n factors: RiskFactors;\r\n}\r\n\r\nfunction RiskFactorsSection({ factors }: RiskFactorsSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n const hasTestGaps = factors.test_gaps && factors.test_gaps.length > 0;\r\n const hasExistingImpl = factors.existing_implementations && factors.existing_implementations.length > 0;\r\n\r\n if (!hasTestGaps && !hasExistingImpl) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2 flex items-center gap-2\">\r\n <AlertCircle className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.riskFactors' })}\r\n </h4>\r\n <div className=\"space-y-2\">\r\n {hasTestGaps && (\r\n <div className=\"p-2 border-l-2 border-warning bg-warning/5 rounded-r\">\r\n <p className=\"text-xs font-medium text-foreground mb-1\">\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.testGaps' })}\r\n </p>\r\n <FieldRenderer value={factors.test_gaps!} type=\"array\" />\r\n </div>\r\n )}\r\n {hasExistingImpl && (\r\n <div className=\"p-2 border-l-2 border-info bg-info/5 rounded-r\">\r\n <p className=\"text-xs font-medium text-foreground mb-1\">\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.existingImplementations' })}\r\n </p>\r\n <FieldRenderer value={factors.existing_implementations!} type=\"array\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction getRiskConfig(level: string) {\r\n switch (level) {\r\n case 'critical':\r\n return {\r\n borderClass: 'border-destructive',\r\n iconColor: 'text-destructive',\r\n badgeVariant: 'destructive' as const,\r\n badgeClass: 'bg-destructive text-destructive-foreground',\r\n };\r\n case 'high':\r\n return {\r\n borderClass: 'border-warning',\r\n iconColor: 'text-warning',\r\n badgeVariant: 'warning' as const,\r\n badgeClass: '',\r\n };\r\n case 'medium':\r\n return {\r\n borderClass: 'border-info',\r\n iconColor: 'text-info',\r\n badgeVariant: 'info' as const,\r\n badgeClass: '',\r\n };\r\n default:\r\n return {\r\n borderClass: '',\r\n iconColor: 'text-success',\r\n badgeVariant: 'success' as const,\r\n badgeClass: '',\r\n };\r\n }\r\n}\r\n","// ========================================\r\n// Flowchart Component\r\n// ========================================\r\n// Interactive flowchart component using @xyflow/react\r\n\r\nimport * as React from 'react';\r\nimport {\r\n ReactFlow,\r\n MiniMap,\r\n Controls,\r\n Background,\r\n Handle,\r\n Position,\r\n useNodesState,\r\n useEdgesState,\r\n type Node,\r\n type Edge,\r\n type Connection,\r\n type NodeTypes,\r\n} from '@xyflow/react';\r\nimport '@xyflow/react/dist/style.css';\r\nimport { CheckCircle, Circle, Loader2 } from 'lucide-react';\r\nimport type { FlowControl } from '@/lib/api';\r\n\r\n// Custom node types\r\ninterface FlowchartNodeData extends Record<string, unknown> {\r\n label: string;\r\n description?: string;\r\n step?: number | string;\r\n output?: string;\r\n type: 'pre-analysis' | 'implementation' | 'section';\r\n dependsOn?: string[];\r\n status?: 'pending' | 'in_progress' | 'completed' | 'blocked' | 'skipped';\r\n showStepStatus?: boolean;\r\n}\r\n\r\n// Status icon component\r\nconst StatusIcon: React.FC<{ status?: string; className?: string }> = ({ status, className = 'h-4 w-4' }) => {\r\n switch (status) {\r\n case 'completed':\r\n return <CheckCircle className={`${className} text-green-500`} />;\r\n case 'in_progress':\r\n return <Loader2 className={`${className} text-amber-500 animate-spin`} />;\r\n case 'blocked':\r\n return <Circle className={`${className} text-red-500`} />;\r\n case 'skipped':\r\n return <Circle className={`${className} text-gray-400`} />;\r\n default:\r\n return <Circle className={`${className} text-gray-300`} />;\r\n }\r\n};\r\n\r\n// Custom node component\r\nconst CustomNode: React.FC<{ data: FlowchartNodeData }> = ({ data }) => {\r\n const isPreAnalysis = data.type === 'pre-analysis';\r\n const isSection = data.type === 'section';\r\n const showStatus = data.showStepStatus !== false;\r\n const isCompleted = showStatus && data.status === 'completed';\r\n const isInProgress = showStatus && data.status === 'in_progress';\r\n\r\n if (isSection) {\r\n return (\r\n <div className=\"px-4 py-2 bg-muted rounded border-2 border-border relative\">\r\n <Handle type=\"target\" position={Position.Top} className=\"!bg-transparent !border-0 !w-0 !h-0\" />\r\n <span className=\"text-sm font-semibold text-foreground\">{data.label}</span>\r\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-transparent !border-0 !w-0 !h-0\" />\r\n </div>\r\n );\r\n }\r\n\r\n // Color scheme based on status\r\n let nodeColor = isPreAnalysis ? '#f59e0b' : '#3b82f6';\r\n let bgClass = isPreAnalysis\r\n ? 'bg-amber-50 border-amber-500 dark:bg-amber-950/30'\r\n : 'bg-blue-50 border-blue-500 dark:bg-blue-950/30';\r\n let stepBgClass = isPreAnalysis ? 'bg-amber-500 text-white' : 'bg-blue-500 text-white';\r\n\r\n // Override for completed status\r\n if (isCompleted) {\r\n nodeColor = '#22c55e'; // green-500\r\n bgClass = 'bg-green-50 border-green-500 dark:bg-green-950/30';\r\n stepBgClass = 'bg-green-500 text-white';\r\n } else if (isInProgress) {\r\n nodeColor = '#f59e0b'; // amber-500\r\n bgClass = 'bg-amber-50 border-amber-500 dark:bg-amber-950/30';\r\n stepBgClass = 'bg-amber-500 text-white';\r\n }\r\n\r\n return (\r\n <div\r\n className={`px-4 py-3 rounded-lg border-2 shadow-sm min-w-[280px] max-w-[400px] relative ${bgClass}`}\r\n >\r\n {/* Top handle for incoming edges */}\r\n <Handle\r\n type=\"target\"\r\n position={Position.Top}\r\n className=\"!w-3 !h-3 !-top-1.5\"\r\n style={{ background: nodeColor, border: `2px solid ${nodeColor}` }}\r\n />\r\n\r\n <div className=\"flex items-start gap-2\">\r\n <span\r\n className={`flex-shrink-0 w-6 h-6 rounded-full flex items-center justify-center text-xs font-bold ${stepBgClass}`}\r\n >\r\n {isCompleted && showStatus ? <CheckCircle className=\"h-4 w-4\" /> : data.step}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className={`text-sm font-semibold ${isCompleted ? 'text-green-700 dark:text-green-400' : 'text-foreground'}`}>\r\n {data.label}\r\n </span>\r\n {showStatus && data.status && data.status !== 'pending' && (\r\n <StatusIcon status={data.status} className=\"h-3.5 w-3.5\" />\r\n )}\r\n </div>\r\n {data.description && (\r\n <div className=\"text-xs text-muted-foreground mt-1 line-clamp-2\">{data.description}</div>\r\n )}\r\n {data.output && (\r\n <div className=\"text-xs text-green-600 dark:text-green-400 mt-1\">\r\n {'->'} {data.output}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Bottom handle for outgoing edges */}\r\n <Handle\r\n type=\"source\"\r\n position={Position.Bottom}\r\n className=\"!w-3 !h-3 !-bottom-1.5\"\r\n style={{ background: nodeColor, border: `2px solid ${nodeColor}` }}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nconst nodeTypes: NodeTypes = {\r\n custom: CustomNode,\r\n};\r\n\r\nexport interface FlowchartProps {\r\n flowControl: FlowControl;\r\n className?: string;\r\n showStepStatus?: boolean;\r\n}\r\n\r\n/**\r\n * Flowchart component for visualizing implementation approach\r\n */\r\nexport function Flowchart({ flowControl, className = '', showStepStatus = true }: FlowchartProps) {\r\n const preAnalysis = flowControl.pre_analysis || [];\r\n const implSteps = flowControl.implementation_approach || [];\r\n\r\n // Build nodes and edges\r\n const initialNodes: Node[] = [];\r\n const initialEdges: Edge[] = [];\r\n\r\n let currentY = 0;\r\n const nodeHeight = 100;\r\n const verticalGap = 80;\r\n const sectionGap = 60;\r\n\r\n // Add Pre-Analysis section\r\n if (preAnalysis.length > 0) {\r\n // Section header node\r\n initialNodes.push({\r\n id: 'pre-section',\r\n type: 'custom',\r\n position: { x: 0, y: currentY },\r\n data: {\r\n label: 'Pre-Analysis Steps',\r\n type: 'section' as const,\r\n },\r\n });\r\n currentY += sectionGap;\r\n\r\n preAnalysis.forEach((step, idx) => {\r\n const nodeId = `pre-${idx}`;\r\n initialNodes.push({\r\n id: nodeId,\r\n type: 'custom',\r\n position: { x: 0, y: currentY },\r\n data: {\r\n label: step.step || step.action || `Pre-step ${idx + 1}`,\r\n description: step.action,\r\n step: `P${idx + 1}`,\r\n output: step.output_to,\r\n type: 'pre-analysis' as const,\r\n showStepStatus,\r\n },\r\n });\r\n\r\n // Edge from previous node\r\n if (idx === 0) {\r\n initialEdges.push({\r\n id: `pre-section-${idx}`,\r\n source: 'pre-section',\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { stroke: '#f59e0b', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#f59e0b' },\r\n });\r\n } else {\r\n initialEdges.push({\r\n id: `pre-${idx - 1}-${idx}`,\r\n source: `pre-${idx - 1}`,\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { stroke: '#f59e0b', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#f59e0b' },\r\n });\r\n }\r\n\r\n currentY += nodeHeight + verticalGap;\r\n });\r\n\r\n currentY += sectionGap;\r\n }\r\n\r\n // Add Implementation section\r\n if (implSteps.length > 0) {\r\n // Section header node\r\n const implSectionId = 'impl-section';\r\n initialNodes.push({\r\n id: implSectionId,\r\n type: 'custom',\r\n position: { x: 0, y: currentY },\r\n data: {\r\n label: 'Implementation Steps',\r\n type: 'section' as const,\r\n },\r\n });\r\n\r\n // Edge from pre-analysis to impl section (if both exist)\r\n if (preAnalysis.length > 0) {\r\n initialEdges.push({\r\n id: `pre-impl-conn`,\r\n source: `pre-${preAnalysis.length - 1}`,\r\n target: implSectionId,\r\n type: 'smoothstep',\r\n animated: true,\r\n style: { stroke: '#3b82f6', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#3b82f6' },\r\n });\r\n }\r\n\r\n currentY += sectionGap;\r\n\r\n implSteps.forEach((step, idx) => {\r\n const nodeId = `impl-${idx}`;\r\n\r\n // Handle both string and ImplementationStep types\r\n const isString = typeof step === 'string';\r\n\r\n // Extract just the number from strings like \"Step 1\", \"step1\", etc.\r\n const rawStep = isString ? (idx + 1) : (step.step || idx + 1);\r\n const stepNumber = typeof rawStep === 'string'\r\n ? (rawStep.match(/\\d+/)?.[0] || idx + 1)\r\n : rawStep;\r\n\r\n // Try multiple fields for label (matching JS version priority)\r\n // Check for content in various possible field names\r\n let label: string;\r\n let description: string | undefined;\r\n\r\n if (isString) {\r\n label = step;\r\n } else {\r\n // Try title first (JS version uses this), then action, description, phase, or any string value\r\n label = step.title || step.action || step.phase || step.description || '';\r\n\r\n // If still empty, try to extract any non-empty string from the step object\r\n if (!label) {\r\n const stepKeys = Object.keys(step).filter(k =>\r\n k !== 'step' && k !== 'depends_on' && k !== 'modification_points' && k !== 'logic_flow'\r\n );\r\n for (const key of stepKeys) {\r\n const val = step[key as keyof typeof step];\r\n if (typeof val === 'string' && val.trim()) {\r\n label = val;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Final fallback\r\n if (!label) {\r\n label = `Step ${stepNumber}`;\r\n }\r\n\r\n // Set description if different from label\r\n description = step.description && step.description !== label ? step.description : undefined;\r\n }\r\n\r\n const dependsOn = isString ? undefined : step.depends_on?.map((d: number | string) => `impl-${Number(d) - 1}`);\r\n\r\n // Extract status from step (may be in 'status' field or other locations)\r\n const stepStatus = isString ? undefined : (step.status as string | undefined);\r\n\r\n initialNodes.push({\r\n id: nodeId,\r\n type: 'custom',\r\n position: { x: 0, y: currentY },\r\n data: {\r\n label,\r\n description,\r\n step: stepNumber,\r\n type: 'implementation' as const,\r\n dependsOn,\r\n status: stepStatus,\r\n showStepStatus,\r\n },\r\n });\r\n\r\n // Edge from section header to first step\r\n if (idx === 0) {\r\n initialEdges.push({\r\n id: `impl-section-${idx}`,\r\n source: implSectionId,\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { stroke: '#3b82f6', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#3b82f6' },\r\n });\r\n } else {\r\n // Sequential edge with styled connection\r\n initialEdges.push({\r\n id: `impl-${idx - 1}-${idx}`,\r\n source: `impl-${idx - 1}`,\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { stroke: '#3b82f6', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#3b82f6' },\r\n });\r\n }\r\n\r\n // Dependency edges\r\n if (!isString && step.depends_on && step.depends_on.length > 0) {\r\n step.depends_on.forEach((depIdx: number | string) => {\r\n const depNodeId = `impl-${Number(depIdx) - 1}`;\r\n initialEdges.push({\r\n id: `dep-${depIdx}-${idx}`,\r\n source: depNodeId,\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { strokeDasharray: '5,5', stroke: '#f59e0b', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#f59e0b' },\r\n });\r\n });\r\n }\r\n\r\n currentY += nodeHeight + verticalGap;\r\n });\r\n }\r\n\r\n const [nodes, , onNodesChange] = useNodesState(initialNodes);\r\n const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);\r\n\r\n // Handle new connections (disabled for this use case)\r\n const onConnect = React.useCallback(\r\n (connection: Connection) => {\r\n setEdges((eds) => [\r\n ...eds,\r\n {\r\n ...connection,\r\n id: `edge-${Date.now()}`,\r\n type: 'smoothstep',\r\n },\r\n ]);\r\n },\r\n [setEdges]\r\n );\r\n\r\n // If no data, show empty state\r\n if (preAnalysis.length === 0 && implSteps.length === 0) {\r\n return (\r\n <div className={`flex items-center justify-center p-8 text-center ${className}`}>\r\n <div>\r\n <p className=\"text-sm text-muted-foreground\">No flowchart data available</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={className} style={{ height: `${currentY + 100}px` }}>\r\n <ReactFlow\r\n nodes={nodes}\r\n edges={edges}\r\n onNodesChange={onNodesChange}\r\n onEdgesChange={onEdgesChange}\r\n onConnect={onConnect}\r\n nodeTypes={nodeTypes}\r\n fitView\r\n fitViewOptions={{ padding: 0.2 }}\r\n minZoom={0.3}\r\n maxZoom={1.5}\r\n defaultViewport={{ x: 0, y: 0, zoom: 0.8 }}\r\n nodesDraggable={false}\r\n nodesConnectable={false}\r\n elementsSelectable={true}\r\n selectNodesOnDrag={false}\r\n zoomOnScroll={true}\r\n panOnScroll={true}\r\n >\r\n <Background color=\"var(--color-border, #e0e0e0)\" style={{ backgroundColor: 'var(--color-background, white)' }} />\r\n <Controls className=\"bg-card border border-border rounded shadow-sm\" />\r\n <MiniMap\r\n nodeColor={(node) => {\r\n const data = node.data as FlowchartNodeData;\r\n if (data.type === 'section') return '#9ca3af';\r\n // Status-based colors (only when status tracking is enabled)\r\n if (data.showStepStatus !== false) {\r\n if (data.status === 'completed') return '#22c55e'; // green-500\r\n if (data.status === 'in_progress') return '#f59e0b'; // amber-500\r\n if (data.status === 'blocked') return '#ef4444'; // red-500\r\n }\r\n if (data.type === 'pre-analysis') return '#f59e0b';\r\n return '#3b82f6';\r\n }}\r\n className=\"!bg-card !border-border !rounded !shadow-sm\"\r\n />\r\n </ReactFlow>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Flowchart;\r\n","// ========================================\r\n// TaskDrawer Component\r\n// ========================================\r\n// Right-side task detail drawer with Overview/Flowchart/Files tabs\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { X, FileText, GitBranch, Folder, CheckCircle, Circle, Loader2, XCircle } from 'lucide-react';\r\nimport { Flowchart } from './Flowchart';\r\nimport { Badge } from '../ui/Badge';\r\nimport { Button } from '../ui/Button';\r\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '../ui/Tabs';\r\nimport type { NormalizedTask, LiteTask } from '@/lib/api';\r\nimport { buildFlowControl, normalizeTask } from '@/lib/api';\r\nimport type { TaskData } from '@/types/store';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface TaskDrawerProps {\r\n task: NormalizedTask | TaskData | LiteTask | null;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n}\r\n\r\ntype TabValue = 'overview' | 'flowchart' | 'files';\r\n\r\n// Status configuration\r\nconst taskStatusConfig: Record<string, { label: string; variant: 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'info' | null; icon: React.ComponentType<{ className?: string }> }> = {\r\n pending: {\r\n label: 'sessionDetail.taskDrawer.status.pending',\r\n variant: 'secondary',\r\n icon: Circle,\r\n },\r\n in_progress: {\r\n label: 'sessionDetail.taskDrawer.status.inProgress',\r\n variant: 'warning',\r\n icon: Loader2,\r\n },\r\n completed: {\r\n label: 'sessionDetail.taskDrawer.status.completed',\r\n variant: 'success',\r\n icon: CheckCircle,\r\n },\r\n blocked: {\r\n label: 'sessionDetail.taskDrawer.status.blocked',\r\n variant: 'destructive',\r\n icon: XCircle,\r\n },\r\n skipped: {\r\n label: 'sessionDetail.taskDrawer.status.skipped',\r\n variant: 'default',\r\n icon: Circle,\r\n },\r\n failed: {\r\n label: 'sessionDetail.taskDrawer.status.failed',\r\n variant: 'destructive',\r\n icon: XCircle,\r\n },\r\n};\r\n\r\n// ========== Component ==========\r\n\r\nexport function TaskDrawer({ task, isOpen, onClose }: TaskDrawerProps) {\r\n const { formatMessage } = useIntl();\r\n const [activeTab, setActiveTab] = React.useState<TabValue>('overview');\r\n\r\n // Reset to overview when task changes\r\n React.useEffect(() => {\r\n if (task) {\r\n setActiveTab('overview');\r\n }\r\n }, [task]);\r\n\r\n // ESC key to close\r\n React.useEffect(() => {\r\n const handleEsc = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && isOpen) {\r\n onClose();\r\n }\r\n };\r\n window.addEventListener('keydown', handleEsc);\r\n return () => window.removeEventListener('keydown', handleEsc);\r\n }, [isOpen, onClose]);\r\n\r\n // Normalize task to unified flat format (handles old nested, new flat, and raw LiteTask/TaskData)\r\n // MUST be called before early return to satisfy React hooks rules\r\n const nt = React.useMemo(\r\n () => task ? normalizeTask(task as unknown as Record<string, unknown>) : null,\r\n [task],\r\n );\r\n\r\n if (!task || !isOpen || !nt) {\r\n return null;\r\n }\r\n const taskId = nt.task_id || 'N/A';\r\n const taskTitle = nt.title || 'Untitled Task';\r\n const taskDescription = nt.description;\r\n const taskStatus = nt.status;\r\n const flowControl = buildFlowControl(nt);\r\n\r\n // Normalized flat fields\r\n const acceptanceCriteria = nt.convergence?.criteria || [];\r\n const focusPaths = nt.focus_paths || [];\r\n const dependsOn = nt.depends_on || [];\r\n const preAnalysis = nt.pre_analysis || flowControl?.pre_analysis || [];\r\n const implSteps = nt.implementation || flowControl?.implementation_approach || [];\r\n\r\n // Get files from multiple sources: nt.files, flowControl.target_files, or sourceRaw.file\r\n const rawData = nt._raw as Record<string, unknown> | undefined;\r\n const sourceRaw = (rawData?._raw as Record<string, unknown>) || rawData;\r\n const rawFile = sourceRaw?.file as string | undefined;\r\n const taskFiles = nt.files || flowControl?.target_files || (rawFile ? [{ path: rawFile }] : []);\r\n const taskScope = nt.scope;\r\n\r\n // Detect if task supports status tracking (new format has explicit status/status_history)\r\n const hasStatusTracking = sourceRaw\r\n ? (sourceRaw.status !== undefined || sourceRaw.status_history !== undefined)\r\n : false;\r\n\r\n const statusConfig = taskStatusConfig[taskStatus] || taskStatusConfig.pending;\r\n const StatusIcon = statusConfig.icon;\r\n\r\n const hasFlowchart = implSteps.length > 0;\r\n const hasFiles = taskFiles.length > 0;\r\n\r\n return (\r\n <>\r\n {/* Overlay */}\r\n <div\r\n className={`fixed inset-0 bg-black/40 transition-opacity z-40 ${\r\n isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none'\r\n }`}\r\n onClick={onClose}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n {/* Drawer */}\r\n <div\r\n className={`fixed top-0 right-0 h-full w-1/2 bg-background border-l border-border shadow-2xl z-50 flex flex-col transition-transform duration-300 ease-in-out ${\r\n isOpen ? 'translate-x-0' : 'translate-x-full'\r\n }`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"drawer-title\"\r\n style={{ minWidth: '400px', maxWidth: '800px' }}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between p-6 border-b border-border bg-card\">\r\n <div className=\"flex-1 min-w-0 mr-4\">\r\n <div className=\"flex items-center gap-2 mb-2\">\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\">{taskId}</span>\r\n {hasStatusTracking && (\r\n <Badge variant={statusConfig.variant} className=\"gap-1\">\r\n <StatusIcon className=\"h-3 w-3\" />\r\n {formatMessage({ id: statusConfig.label })}\r\n </Badge>\r\n )}\r\n </div>\r\n <h2 id=\"drawer-title\" className=\"text-lg font-semibold text-foreground\">\r\n {taskTitle}\r\n </h2>\r\n </div>\r\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose} className=\"flex-shrink-0 hover:bg-secondary\">\r\n <X className=\"h-5 w-5\" />\r\n <span className=\"sr-only\">{formatMessage({ id: 'common.actions.close' })}</span>\r\n </Button>\r\n </div>\r\n\r\n {/* Tabs Navigation */}\r\n <div className=\"px-6 pt-4 bg-card\">\r\n <Tabs value={activeTab} onValueChange={(v) => setActiveTab(v as TabValue)} className=\"w-full\">\r\n <TabsList className=\"w-full\">\r\n <TabsTrigger value=\"overview\" className=\"flex-1\">\r\n <FileText className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.tabs.overview' })}\r\n </TabsTrigger>\r\n {hasFlowchart && (\r\n <TabsTrigger value=\"flowchart\" className=\"flex-1\">\r\n <GitBranch className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.tabs.flowchart' })}\r\n </TabsTrigger>\r\n )}\r\n <TabsTrigger value=\"files\" className=\"flex-1\">\r\n <Folder className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.tabs.files' })}\r\n </TabsTrigger>\r\n </TabsList>\r\n\r\n {/* Tab Content (scrollable) */}\r\n <div className=\"overflow-y-auto pr-2\" style={{ height: 'calc(100vh - 200px)' }}>\r\n {/* Overview Tab - Rich display matching JS version */}\r\n <TabsContent value=\"overview\" className=\"mt-4 pb-6 focus-visible:outline-none\">\r\n <div className=\"space-y-4\">\r\n {/* Description Section */}\r\n {taskDescription && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-2 flex items-center gap-2\">\r\n <span>📝</span>\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.overview.description' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground whitespace-pre-wrap\">\r\n {taskDescription}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Scope Section */}\r\n {taskScope && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-2 flex items-center gap-2\">\r\n <span>📁</span>\r\n Scope\r\n </h3>\r\n <div className=\"pl-3 border-l-2 border-primary\">\r\n <code className=\"text-sm text-foreground\">{taskScope}</code>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Acceptance / Convergence Criteria Section */}\r\n {acceptanceCriteria.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>✅</span>\r\n {formatMessage({ id: 'liteTasks.acceptanceCriteria' })}\r\n </h3>\r\n <div className=\"space-y-2\">\r\n {acceptanceCriteria.map((criterion, i) => (\r\n <div key={i} className=\"flex items-start gap-2\">\r\n <span className=\"text-muted-foreground mt-0.5\">○</span>\r\n <span className=\"text-sm text-foreground\">{criterion}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Focus Paths / Reference Section */}\r\n {focusPaths.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>📚</span>\r\n {formatMessage({ id: 'liteTasks.focusPaths' })}\r\n </h3>\r\n <div className=\"space-y-1\">\r\n {focusPaths.map((path, i) => (\r\n <code key={i} className=\"block text-xs bg-muted px-3 py-1.5 rounded text-foreground font-mono\">\r\n {path}\r\n </code>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Dependencies Section */}\r\n {dependsOn.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>🔗</span>\r\n {formatMessage({ id: 'liteTasks.dependsOn' })}\r\n </h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {dependsOn.map((dep, i) => (\r\n <Badge key={i} variant=\"secondary\">{dep}</Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Pre-analysis Steps */}\r\n {preAnalysis.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>🔍</span>\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.overview.preAnalysis' })}\r\n </h3>\r\n <div className=\"space-y-3\">\r\n {preAnalysis.map((step, index) => (\r\n <div key={index} className=\"flex items-start gap-3\">\r\n <span className=\"flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full bg-primary text-primary-foreground text-xs font-medium\">\r\n {index + 1}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium text-foreground\">{step.step || step.action}</p>\r\n {step.action && step.action !== step.step && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">{step.action}</p>\r\n )}\r\n {step.commands && step.commands.length > 0 && (\r\n <div className=\"mt-2 flex flex-wrap gap-1\">\r\n {step.commands.map((cmd, i) => (\r\n <code key={i} className=\"text-xs bg-muted px-2 py-0.5 rounded\">{cmd}</code>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Implementation Steps */}\r\n {flowControl?.implementation_approach && flowControl.implementation_approach.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>📋</span>\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.overview.implementationSteps' })}\r\n </h3>\r\n <ol className=\"space-y-3\">\r\n {flowControl.implementation_approach.map((step, index) => {\r\n const isString = typeof step === 'string';\r\n // Extract just the number from strings like \"Step 1\", \"step1\", etc.\r\n const rawStep = isString ? (index + 1) : (step.step || index + 1);\r\n const stepNumber = typeof rawStep === 'string'\r\n ? (rawStep.match(/\\d+/)?.[0] || index + 1)\r\n : rawStep;\r\n\r\n // Try multiple fields for title (matching JS version)\r\n let stepTitle: string;\r\n let stepDesc: string | undefined;\r\n\r\n if (isString) {\r\n stepTitle = step;\r\n } else {\r\n // Try title first, then action, phase, description\r\n stepTitle = step.title || step.action || step.phase || '';\r\n\r\n // If empty, try any string value from the object\r\n if (!stepTitle) {\r\n const stepKeys = Object.keys(step).filter(k =>\r\n k !== 'step' && k !== 'depends_on' && k !== 'modification_points' && k !== 'logic_flow'\r\n );\r\n for (const key of stepKeys) {\r\n const val = step[key as keyof typeof step];\r\n if (typeof val === 'string' && val.trim()) {\r\n stepTitle = val;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Final fallback\r\n if (!stepTitle) {\r\n stepTitle = `Step ${stepNumber}`;\r\n }\r\n\r\n // Description if different from title\r\n stepDesc = step.description && step.description !== stepTitle ? step.description : undefined;\r\n }\r\n\r\n return (\r\n <li key={index} className=\"flex items-start gap-3\">\r\n <span className=\"flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full bg-primary text-primary-foreground text-xs font-medium\">\r\n {stepNumber}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium text-foreground\">{stepTitle}</p>\r\n {stepDesc && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">{stepDesc}</p>\r\n )}\r\n </div>\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </div>\r\n )}\r\n\r\n {/* Empty State */}\r\n {!taskDescription &&\r\n !taskScope &&\r\n !acceptanceCriteria.length &&\r\n !focusPaths.length &&\r\n !(flowControl?.pre_analysis?.length) &&\r\n !(flowControl?.implementation_approach?.length) && (\r\n <div className=\"text-center py-12\">\r\n <FileText className=\"h-12 w-12 text-muted-foreground mx-auto mb-4\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.overview.empty' })}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </TabsContent>\r\n\r\n {/* Flowchart Tab */}\r\n {hasFlowchart && (\r\n <TabsContent value=\"flowchart\" className=\"mt-4 pb-6\">\r\n <Flowchart flowControl={flowControl!} className=\"min-h-[400px]\" showStepStatus={hasStatusTracking} />\r\n </TabsContent>\r\n )}\r\n\r\n {/* Files Tab */}\r\n <TabsContent value=\"files\" className=\"mt-4 pb-6\">\r\n {hasFiles ? (\r\n <div className=\"space-y-3\">\r\n {taskFiles.map((file, index) => {\r\n // Support multiple file formats: string, { path: string }, { name: string }, { path, name }\r\n let displayPath: string;\r\n if (typeof file === 'string') {\r\n displayPath = file;\r\n } else if (file && typeof file === 'object') {\r\n displayPath = file.path || file.name || 'Unknown';\r\n } else {\r\n displayPath = 'Unknown';\r\n }\r\n\r\n return (\r\n <div\r\n key={index}\r\n className=\"flex items-center gap-2 p-3 bg-card rounded-md border border-border shadow-sm hover:shadow-md transition-shadow\"\r\n >\r\n <Folder className=\"h-4 w-4 text-primary flex-shrink-0\" />\r\n <span className=\"text-sm font-mono text-foreground\">{displayPath}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12\">\r\n <Folder className=\"h-12 w-12 text-muted-foreground mx-auto mb-4\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.files.empty' })}\r\n </p>\r\n </div>\r\n )}\r\n </TabsContent>\r\n </div>\r\n </Tabs>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":["FieldRenderer","value","type","className","jsx","detectType","ArrayRenderer","ObjectRenderer","FilesRenderer","TagsRenderer","StringRenderer","cn","item","index","jsxs","entries","_","v","key","val","formatLabel","file","FileText","tag","Badge","c","ExplorationCollapsible","title","icon","defaultOpen","children","isOpen","setIsOpen","React.useState","Collapsible","CollapsibleTrigger","ChevronDown","CollapsibleContent","ExplorationsSection","data","formatMessage","useIntl","explorationEntries","Card","CardContent","Search","angle","angleData","formatAngleTitle","AngleContent","extractString","obj","extractReason","toItems","sectionThemes","defaultTheme","sections","FolderOpen","Layers","GitBranch","Link","TestTube","def","s","section","theme","i","FormattedTextItem","text","parts","pathParts","part","AssetsCard","_a","_b","_c","docCount","_d","sourceCount","_e","testCount","_f","totalAssets","CardHeader","CardTitle","Tabs","TabsList","TabsTrigger","Code","TabsContent","AssetGrid","items","ConflictDetectionCard","riskConfig","getRiskConfig","AlertTriangle","Shield","RiskFactorsSection","factors","hasTestGaps","hasExistingImpl","AlertCircle","level","StatusIcon","status","CheckCircle","Loader2","Circle","CustomNode","isPreAnalysis","isSection","showStatus","isCompleted","isInProgress","Handle","Position","nodeColor","bgClass","stepBgClass","nodeTypes","Flowchart","flowControl","showStepStatus","preAnalysis","implSteps","initialNodes","initialEdges","currentY","nodeHeight","verticalGap","sectionGap","step","idx","nodeId","implSectionId","isString","rawStep","stepNumber","label","description","stepKeys","k","dependsOn","d","stepStatus","depIdx","depNodeId","nodes","onNodesChange","useNodesState","edges","setEdges","onEdgesChange","useEdgesState","onConnect","React.useCallback","connection","eds","ReactFlow","Background","Controls","MiniMap","node","taskStatusConfig","XCircle","TaskDrawer","task","onClose","activeTab","setActiveTab","React.useEffect","handleEsc","e","nt","React.useMemo","normalizeTask","taskId","taskTitle","taskDescription","taskStatus","buildFlowControl","acceptanceCriteria","focusPaths","rawData","sourceRaw","rawFile","taskFiles","taskScope","hasStatusTracking","statusConfig","hasFlowchart","hasFiles","Fragment","Button","X","Folder","criterion","path","dep","cmd","stepTitle","stepDesc","displayPath"],"mappings":"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"}
1
+ {"version":3,"file":"TaskDrawer-BqK_qiHX.js","sources":["../../src/components/session-detail/context/FieldRenderer.tsx","../../src/components/session-detail/context/ExplorationCollapsible.tsx","../../src/components/session-detail/context/ExplorationsSection.tsx","../../src/components/session-detail/context/AssetsCard.tsx","../../src/components/session-detail/context/ConflictDetectionCard.tsx","../../src/components/shared/Flowchart.tsx","../../src/components/shared/TaskDrawer.tsx"],"sourcesContent":["// ========================================\r\n// FieldRenderer Component\r\n// ========================================\r\n// Renders various data types for context display\r\n\r\nimport { FileText } from 'lucide-react';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { cn } from '@/lib/utils';\r\n\r\nexport interface FieldRendererProps {\r\n value: unknown;\r\n type?: 'string' | 'array' | 'object' | 'files' | 'tags' | 'auto';\r\n className?: string;\r\n}\r\n\r\n/**\r\n * FieldRenderer component - Automatically renders different data types\r\n */\r\nexport function FieldRenderer({ value, type = 'auto', className }: FieldRendererProps) {\r\n if (value === null || value === undefined) {\r\n return <span className=\"text-muted-foreground italic\">-</span>;\r\n }\r\n\r\n const detectedType = type === 'auto' ? detectType(value) : type;\r\n\r\n switch (detectedType) {\r\n case 'array':\r\n return <ArrayRenderer value={value as unknown[]} className={className} />;\r\n case 'object':\r\n return <ObjectRenderer value={value as Record<string, unknown>} className={className} />;\r\n case 'files':\r\n return <FilesRenderer value={value as Array<{ path: string }>} className={className} />;\r\n case 'tags':\r\n return <TagsRenderer value={value as string[]} className={className} />;\r\n default:\r\n return <StringRenderer value={String(value)} className={className} />;\r\n }\r\n}\r\n\r\nfunction detectType(value: unknown): 'string' | 'array' | 'object' | 'files' | 'tags' {\r\n if (Array.isArray(value)) {\r\n if (value.length > 0 && typeof value[0] === 'object' && value[0] !== null && 'path' in value[0]) {\r\n return 'files';\r\n }\r\n if (value.length > 0 && typeof value[0] === 'string') {\r\n return 'tags';\r\n }\r\n return 'array';\r\n }\r\n if (typeof value === 'object' && value !== null) {\r\n return 'object';\r\n }\r\n return 'string';\r\n}\r\n\r\nfunction StringRenderer({ value, className }: { value: string; className?: string }) {\r\n return <span className={cn('text-foreground', className)}>{value}</span>;\r\n}\r\n\r\nfunction ArrayRenderer({ value, className }: { value: unknown[]; className?: string }) {\r\n if (!Array.isArray(value)) {\r\n return <FieldRenderer value={value} type=\"auto\" className={className} />;\r\n }\r\n\r\n if (value.length === 0) {\r\n return <span className=\"text-muted-foreground italic\">Empty</span>;\r\n }\r\n\r\n return (\r\n <ul className={cn('space-y-1', className)}>\r\n {value.map((item, index) => (\r\n <li key={index} className=\"text-sm text-foreground flex items-start gap-2\">\r\n <span className=\"text-muted-foreground\">{index + 1}.</span>\r\n <span className=\"flex-1\">{String(item)}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction ObjectRenderer({ value, className }: { value: Record<string, unknown>; className?: string }) {\r\n const entries = Object.entries(value).filter(([_, v]) => v !== null && v !== undefined);\r\n\r\n if (entries.length === 0) {\r\n return <span className=\"text-muted-foreground italic\">Empty</span>;\r\n }\r\n\r\n return (\r\n <div className={cn('space-y-2', className)}>\r\n {entries.map(([key, val]) => (\r\n <div key={key} className=\"flex items-start gap-2\">\r\n <span className=\"text-sm font-medium text-muted-foreground min-w-[100px] capitalize\">\r\n {formatLabel(key)}:\r\n </span>\r\n <span className=\"text-sm text-foreground flex-1\">\r\n {typeof val === 'object' ? JSON.stringify(val, null, 2) : String(val)}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction FilesRenderer({ value, className }: { value: Array<{ path: string }>; className?: string }) {\r\n if (!Array.isArray(value)) {\r\n return <FieldRenderer value={value} type=\"auto\" className={className} />;\r\n }\r\n\r\n if (value.length === 0) {\r\n return <span className=\"text-muted-foreground italic\">No files</span>;\r\n }\r\n\r\n return (\r\n <div className={cn('space-y-1', className)}>\r\n {value.map((file, index) => (\r\n <div\r\n key={index}\r\n className=\"flex items-center gap-2 p-2 bg-muted rounded text-sm font-mono text-foreground\"\r\n >\r\n <FileText className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />\r\n <span className=\"truncate\">{file.path}</span>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction TagsRenderer({ value, className }: { value: string[]; className?: string }) {\r\n if (!Array.isArray(value)) {\r\n return <FieldRenderer value={value} type=\"auto\" className={className} />;\r\n }\r\n\r\n if (value.length === 0) {\r\n return <span className=\"text-muted-foreground italic\">No tags</span>;\r\n }\r\n\r\n return (\r\n <div className={cn('flex flex-wrap gap-2', className)}>\r\n {value.map((tag, index) => (\r\n <Badge key={index} variant=\"outline\" className=\"px-2 py-0.5\">\r\n {tag}\r\n </Badge>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatLabel(key: string): string {\r\n return key\r\n .replace(/_/g, ' ')\r\n .replace(/([A-Z])/g, ' $1')\r\n .trim()\r\n .toLowerCase()\r\n .replace(/^\\w/, (c) => c.toUpperCase());\r\n}\r\n","// ========================================\r\n// ExplorationCollapsible Component\r\n// ========================================\r\n// Collapsible section for exploration angles\r\n\r\nimport * as React from 'react';\r\nimport { ChevronDown } from 'lucide-react';\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from '@/components/ui/Collapsible';\r\nimport { cn } from '@/lib/utils';\r\n\r\nexport interface ExplorationCollapsibleProps {\r\n title: string;\r\n icon?: React.ReactNode;\r\n defaultOpen?: boolean;\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * ExplorationCollapsible component - Collapsible section for exploration data\r\n */\r\nexport function ExplorationCollapsible({\r\n title,\r\n icon,\r\n defaultOpen = false,\r\n children,\r\n className,\r\n}: ExplorationCollapsibleProps) {\r\n const [isOpen, setIsOpen] = React.useState(defaultOpen);\r\n\r\n return (\r\n <Collapsible open={isOpen} onOpenChange={setIsOpen} className={cn('border rounded-lg', className)}>\r\n <CollapsibleTrigger className=\"flex items-center justify-between w-full p-3 hover:bg-muted/50 transition-colors\">\r\n <div className=\"flex items-center gap-2\">\r\n {icon}\r\n <span className=\"text-sm font-medium text-foreground\">{title}</span>\r\n </div>\r\n <ChevronDown\r\n className={cn(\r\n 'h-4 w-4 text-muted-foreground transition-transform',\r\n isOpen && 'transform rotate-180'\r\n )}\r\n />\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className=\"p-3 pt-0\">\r\n <div className=\"mt-2 space-y-2\">\r\n {children}\r\n </div>\r\n </CollapsibleContent>\r\n </Collapsible>\r\n );\r\n}\r\n","// ========================================\r\n// ExplorationsSection Component\r\n// ========================================\r\n// Displays exploration data with collapsible sections\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n GitBranch,\r\n Search,\r\n Link,\r\n TestTube,\r\n FolderOpen,\r\n FileText,\r\n Layers\r\n} from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { ExplorationCollapsible } from './ExplorationCollapsible';\r\n\r\nexport interface ExplorationsData {\r\n manifest: {\r\n task_description: string;\r\n complexity?: string;\r\n exploration_count: number;\r\n };\r\n data: Record<string, {\r\n project_structure?: string[];\r\n relevant_files?: string[];\r\n patterns?: string[];\r\n dependencies?: string[];\r\n integration_points?: string[];\r\n testing?: string[];\r\n }>;\r\n}\r\n\r\nexport interface ExplorationsSectionProps {\r\n data?: ExplorationsData;\r\n}\r\n\r\n/**\r\n * ExplorationsSection component - Displays all exploration angles\r\n */\r\nexport function ExplorationsSection({ data }: ExplorationsSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || !data.data || Object.keys(data.data).length === 0) {\r\n return null;\r\n }\r\n\r\n const explorationEntries = Object.entries(data.data);\r\n\r\n return (\r\n <Card>\r\n <CardContent className=\"p-6\">\r\n <h3 className=\"text-sm font-medium text-foreground mb-4 flex items-center gap-2\">\r\n <Search className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'sessionDetail.context.explorations.title' })}\r\n <Badge variant=\"secondary\">\r\n {data.manifest.exploration_count} {formatMessage({ id: 'sessionDetail.context.explorations.angles' })}\r\n </Badge>\r\n </h3>\r\n <div className=\"space-y-3\">\r\n {explorationEntries.map(([angle, angleData]) => (\r\n <ExplorationCollapsible\r\n key={angle}\r\n title={formatAngleTitle(angle)}\r\n icon={<Search className=\"w-4 h-4 text-muted-foreground\" />}\r\n >\r\n <AngleContent data={angleData} />\r\n </ExplorationCollapsible>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface AngleContentProps {\r\n data: {\r\n project_structure?: unknown;\r\n relevant_files?: unknown;\r\n patterns?: unknown;\r\n dependencies?: unknown;\r\n integration_points?: unknown;\r\n testing?: unknown;\r\n [key: string]: unknown;\r\n };\r\n}\r\n\r\n/** Extract a displayable string from unknown value (handles objects with path/name/etc.) */\r\nfunction extractString(val: unknown): string {\r\n if (typeof val === 'string') return val;\r\n if (val && typeof val === 'object') {\r\n const obj = val as Record<string, unknown>;\r\n // Common field names for file-like objects\r\n if (typeof obj.path === 'string') return obj.path;\r\n if (typeof obj.name === 'string') return obj.name;\r\n if (typeof obj.file === 'string') return obj.file;\r\n if (typeof obj.title === 'string') return obj.title;\r\n // Fallback: first string-valued property\r\n for (const v of Object.values(obj)) {\r\n if (typeof v === 'string' && v.length > 0) return v;\r\n }\r\n }\r\n return String(val);\r\n}\r\n\r\n/** Extract a secondary description from an object (rationale, reason, description, etc.) */\r\nfunction extractReason(val: unknown): string | undefined {\r\n if (!val || typeof val !== 'object') return undefined;\r\n const obj = val as Record<string, unknown>;\r\n if (typeof obj.rationale === 'string') return obj.rationale;\r\n if (typeof obj.reason === 'string') return obj.reason;\r\n if (typeof obj.description === 'string') return obj.description;\r\n return undefined;\r\n}\r\n\r\n/** Safely coerce a field to items – preserving object metadata for files */\r\nfunction toItems(val: unknown): Array<{ text: string; reason?: string }> {\r\n if (Array.isArray(val)) {\r\n return val.map((item) => ({\r\n text: extractString(item),\r\n reason: extractReason(item),\r\n }));\r\n }\r\n if (typeof val === 'string' && val.length > 0) return [{ text: val }];\r\n return [];\r\n}\r\n\r\n/** Per-section color theme */\r\nconst sectionThemes: Record<string, { icon: string; border: string; bg: string; badge: string }> = {\r\n project_structure: { icon: 'text-blue-500', border: 'border-l-blue-500', bg: 'bg-blue-500/5', badge: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300' },\r\n relevant_files: { icon: 'text-violet-500', border: 'border-l-violet-500', bg: 'bg-violet-500/5', badge: 'bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-300' },\r\n patterns: { icon: 'text-amber-500', border: 'border-l-amber-500', bg: 'bg-amber-500/5', badge: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300' },\r\n dependencies: { icon: 'text-emerald-500', border: 'border-l-emerald-500', bg: 'bg-emerald-500/5', badge: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300' },\r\n integration_points: { icon: 'text-cyan-500', border: 'border-l-cyan-500', bg: 'bg-cyan-500/5', badge: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300' },\r\n testing: { icon: 'text-rose-500', border: 'border-l-rose-500', bg: 'bg-rose-500/5', badge: 'bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-300' },\r\n};\r\n\r\nconst defaultTheme = { icon: 'text-muted-foreground', border: 'border-l-border', bg: 'bg-muted/30', badge: 'bg-muted text-foreground' };\r\n\r\nfunction AngleContent({ data }: AngleContentProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n const sectionDefs: Array<{\r\n key: string;\r\n field: unknown;\r\n icon: JSX.Element;\r\n labelId: string;\r\n renderAs: 'paths' | 'text';\r\n }> = [\r\n { key: 'project_structure', field: data.project_structure, icon: <FolderOpen className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.projectStructure', renderAs: 'text' },\r\n { key: 'relevant_files', field: data.relevant_files, icon: <FileText className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.relevantFiles', renderAs: 'paths' },\r\n { key: 'patterns', field: data.patterns, icon: <Layers className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.patterns', renderAs: 'text' },\r\n { key: 'dependencies', field: data.dependencies, icon: <GitBranch className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.dependencies', renderAs: 'text' },\r\n { key: 'integration_points', field: data.integration_points, icon: <Link className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.integrationPoints', renderAs: 'text' },\r\n { key: 'testing', field: data.testing, icon: <TestTube className=\"w-3.5 h-3.5\" />, labelId: 'sessionDetail.context.explorations.testing', renderAs: 'text' },\r\n ];\r\n\r\n const sections = sectionDefs\r\n .map((def) => ({ ...def, items: toItems(def.field) }))\r\n .filter((s) => s.items.length > 0);\r\n\r\n if (sections.length === 0) {\r\n return <p className=\"text-xs text-muted-foreground italic\">No data available</p>;\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {sections.map((section) => {\r\n const theme = sectionThemes[section.key] || defaultTheme;\r\n return (\r\n <div key={section.key} className={`border-l-2 ${theme.border} ${theme.bg} rounded-r pl-3 py-2 pr-2`}>\r\n <h4 className={`text-xs font-medium uppercase tracking-wide mb-1.5 flex items-center gap-1.5 ${theme.icon}`}>\r\n {section.icon}\r\n {formatMessage({ id: section.labelId })}\r\n <span className={`text-[10px] px-1.5 py-0.5 rounded-full font-normal normal-case tracking-normal ${theme.badge}`}>\r\n {section.items.length}\r\n </span>\r\n </h4>\r\n {section.renderAs === 'paths' ? (\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {section.items.map((item, i) => (\r\n <div\r\n key={i}\r\n className=\"flex items-center gap-1 px-2 py-1 bg-background rounded border text-[11px] font-mono text-foreground\"\r\n title={item.reason}\r\n >\r\n <FileText className={`w-3 h-3 flex-shrink-0 ${theme.icon}`} />\r\n {item.text}\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <ul className=\"space-y-1\">\r\n {section.items.map((item, i) => (\r\n <li key={i} className=\"flex items-start gap-1.5 text-xs text-foreground\">\r\n <span className={`mt-0.5 ${theme.icon}`}>•</span>\r\n <span className=\"flex-1\">\r\n <FormattedTextItem text={item.text} />\r\n </span>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\n/** Render text with inline code/path highlighting */\r\nfunction FormattedTextItem({ text }: { text: string }) {\r\n // Split on backtick-wrapped segments\r\n const parts = text.split(/(`[^`]+`)/g);\r\n if (parts.length === 1) {\r\n // No backtick segments – highlight embedded file paths\r\n const pathParts = text.split(/(\\S+\\/\\S+\\.\\w+)/g);\r\n if (pathParts.length === 1) return <>{text}</>;\r\n return (\r\n <>\r\n {pathParts.map((part, i) =>\r\n /\\S+\\/\\S+\\.\\w+/.test(part) ? (\r\n <code key={i} className=\"px-1 py-0.5 bg-muted rounded text-[10px] font-mono\">{part}</code>\r\n ) : (\r\n <span key={i}>{part}</span>\r\n )\r\n )}\r\n </>\r\n );\r\n }\r\n return (\r\n <>\r\n {parts.map((part, i) =>\r\n part.startsWith('`') && part.endsWith('`') ? (\r\n <code key={i} className=\"px-1 py-0.5 bg-muted rounded text-[10px] font-mono\">\r\n {part.slice(1, -1)}\r\n </code>\r\n ) : (\r\n <span key={i}>{part}</span>\r\n )\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nfunction formatAngleTitle(angle: string): string {\r\n return angle\r\n .replace(/_/g, ' ')\r\n .replace(/([A-Z])/g, ' $1')\r\n .trim()\r\n .toLowerCase()\r\n .replace(/^\\w/, (c) => c.toUpperCase());\r\n}\r\n","// ========================================\r\n// AssetsCard Component\r\n// ========================================\r\n// Displays assets with category tabs and card grid\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { FileText, Code, TestTube } from 'lucide-react';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/Tabs';\r\n\r\nexport interface AssetItem {\r\n path: string;\r\n relevance_score?: number;\r\n scope?: string;\r\n contains?: string[];\r\n}\r\n\r\nexport interface AssetsData {\r\n documentation?: AssetItem[];\r\n source_code?: AssetItem[];\r\n tests?: AssetItem[];\r\n}\r\n\r\nexport interface AssetsCardProps {\r\n data?: AssetsData;\r\n}\r\n\r\n/**\r\n * AssetsCard component - Displays project assets with categorization\r\n */\r\nexport function AssetsCard({ data }: AssetsCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || (!data.documentation?.length && !data.source_code?.length && !data.tests?.length)) {\r\n return null;\r\n }\r\n\r\n const docCount = data.documentation?.length || 0;\r\n const sourceCount = data.source_code?.length || 0;\r\n const testCount = data.tests?.length || 0;\r\n const totalAssets = docCount + sourceCount + testCount;\r\n\r\n return (\r\n <Card>\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2\">\r\n <FileText className=\"w-5 h-5\" />\r\n {formatMessage({ id: 'sessionDetail.context.assets.title' })}\r\n <Badge variant=\"secondary\">{totalAssets}</Badge>\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent>\r\n <Tabs defaultValue={docCount > 0 ? 'documentation' : sourceCount > 0 ? 'source_code' : 'tests'}>\r\n <TabsList className=\"grid w-full grid-cols-3\">\r\n <TabsTrigger value=\"documentation\" disabled={!docCount}>\r\n <FileText className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'sessionDetail.context.categories.documentation' })}\r\n {docCount > 0 && <span className=\"ml-1 text-xs\">({docCount})</span>}\r\n </TabsTrigger>\r\n <TabsTrigger value=\"source_code\" disabled={!sourceCount}>\r\n <Code className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'sessionDetail.context.categories.sourceCode' })}\r\n {sourceCount > 0 && <span className=\"ml-1 text-xs\">({sourceCount})</span>}\r\n </TabsTrigger>\r\n <TabsTrigger value=\"tests\" disabled={!testCount}>\r\n <TestTube className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'sessionDetail.context.categories.tests' })}\r\n {testCount > 0 && <span className=\"ml-1 text-xs\">({testCount})</span>}\r\n </TabsTrigger>\r\n </TabsList>\r\n\r\n <TabsContent value=\"documentation\" className=\"mt-4\">\r\n <AssetGrid items={data.documentation || []} type=\"documentation\" />\r\n </TabsContent>\r\n\r\n <TabsContent value=\"source_code\" className=\"mt-4\">\r\n <AssetGrid items={data.source_code || []} type=\"source_code\" />\r\n </TabsContent>\r\n\r\n <TabsContent value=\"tests\" className=\"mt-4\">\r\n <AssetGrid items={data.tests || []} type=\"tests\" />\r\n </TabsContent>\r\n </Tabs>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface AssetGridProps {\r\n items: AssetItem[];\r\n type: string;\r\n}\r\n\r\nfunction AssetGrid({ items }: AssetGridProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (items.length === 0) {\r\n return (\r\n <div className=\"text-center py-8 text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.assets.noData' })}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"grid gap-3\">\r\n {items.map((item, index) => (\r\n <div\r\n key={index}\r\n className=\"p-3 border rounded-lg hover:bg-muted/50 transition-colors\"\r\n >\r\n <div className=\"flex items-start justify-between gap-2 mb-2\">\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-mono text-foreground truncate\">{item.path}</p>\r\n </div>\r\n {item.relevance_score !== undefined && (\r\n <Badge\r\n variant={item.relevance_score > 0.7 ? 'success' : item.relevance_score > 0.4 ? 'default' : 'secondary'}\r\n className=\"flex-shrink-0\"\r\n >\r\n {Math.round(item.relevance_score * 100)}%\r\n </Badge>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex flex-wrap gap-2 text-xs\">\r\n {item.scope && (\r\n <span className=\"text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.assets.scope' })}: {item.scope}\r\n </span>\r\n )}\r\n {item.contains && item.contains.length > 0 && (\r\n <span className=\"text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.context.assets.contains' })}: {item.contains.join(', ')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// ConflictDetectionCard Component\r\n// ========================================\r\n// Displays conflict detection results with risk levels\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { AlertTriangle, Shield, 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 RiskFactors {\r\n test_gaps?: string[];\r\n existing_implementations?: string[];\r\n}\r\n\r\nexport interface ConflictDetectionData {\r\n risk_level?: 'low' | 'medium' | 'high' | 'critical';\r\n mitigation_strategy?: string;\r\n risk_factors?: RiskFactors;\r\n affected_modules?: string[];\r\n}\r\n\r\nexport interface ConflictDetectionCardProps {\r\n data?: ConflictDetectionData;\r\n}\r\n\r\n/**\r\n * ConflictDetectionCard component - Displays conflict detection results\r\n */\r\nexport function ConflictDetectionCard({ data }: ConflictDetectionCardProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!data || !data.risk_level) {\r\n return null;\r\n }\r\n\r\n const riskConfig = getRiskConfig(data.risk_level);\r\n\r\n return (\r\n <Card className={riskConfig.borderClass}>\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2\">\r\n <AlertTriangle className={`w-5 h-5 ${riskConfig.iconColor}`} />\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.title' })}\r\n <Badge variant={riskConfig.badgeVariant} className={riskConfig.badgeClass}>\r\n {formatMessage({ id: `sessionDetail.context.conflictDetection.riskLevel.${data.risk_level}` })}\r\n </Badge>\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n {/* Mitigation Strategy */}\r\n {data.mitigation_strategy && (\r\n <div className=\"p-3 bg-muted/50 rounded-lg\">\r\n <div className=\"flex items-start gap-2\">\r\n <Shield className=\"w-4 h-4 text-muted-foreground mt-0.5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <h4 className=\"text-sm font-medium text-foreground mb-1\">\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.mitigation' })}\r\n </h4>\r\n <p className=\"text-sm text-muted-foreground\">{data.mitigation_strategy}</p>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Risk Factors */}\r\n {data.risk_factors && (\r\n <RiskFactorsSection factors={data.risk_factors} />\r\n )}\r\n\r\n {/* Affected Modules */}\r\n {data.affected_modules && data.affected_modules.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.conflictDetection.affectedModules' })}\r\n </h4>\r\n <FieldRenderer value={data.affected_modules} type=\"tags\" />\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\ninterface RiskFactorsSectionProps {\r\n factors: RiskFactors;\r\n}\r\n\r\nfunction RiskFactorsSection({ factors }: RiskFactorsSectionProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n const hasTestGaps = factors.test_gaps && factors.test_gaps.length > 0;\r\n const hasExistingImpl = factors.existing_implementations && factors.existing_implementations.length > 0;\r\n\r\n if (!hasTestGaps && !hasExistingImpl) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wide mb-2 flex items-center gap-2\">\r\n <AlertCircle className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.riskFactors' })}\r\n </h4>\r\n <div className=\"space-y-2\">\r\n {hasTestGaps && (\r\n <div className=\"p-2 border-l-2 border-warning bg-warning/5 rounded-r\">\r\n <p className=\"text-xs font-medium text-foreground mb-1\">\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.testGaps' })}\r\n </p>\r\n <FieldRenderer value={factors.test_gaps!} type=\"array\" />\r\n </div>\r\n )}\r\n {hasExistingImpl && (\r\n <div className=\"p-2 border-l-2 border-info bg-info/5 rounded-r\">\r\n <p className=\"text-xs font-medium text-foreground mb-1\">\r\n {formatMessage({ id: 'sessionDetail.context.conflictDetection.existingImplementations' })}\r\n </p>\r\n <FieldRenderer value={factors.existing_implementations!} type=\"array\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction getRiskConfig(level: string) {\r\n switch (level) {\r\n case 'critical':\r\n return {\r\n borderClass: 'border-destructive',\r\n iconColor: 'text-destructive',\r\n badgeVariant: 'destructive' as const,\r\n badgeClass: 'bg-destructive text-destructive-foreground',\r\n };\r\n case 'high':\r\n return {\r\n borderClass: 'border-warning',\r\n iconColor: 'text-warning',\r\n badgeVariant: 'warning' as const,\r\n badgeClass: '',\r\n };\r\n case 'medium':\r\n return {\r\n borderClass: 'border-info',\r\n iconColor: 'text-info',\r\n badgeVariant: 'info' as const,\r\n badgeClass: '',\r\n };\r\n default:\r\n return {\r\n borderClass: '',\r\n iconColor: 'text-success',\r\n badgeVariant: 'success' as const,\r\n badgeClass: '',\r\n };\r\n }\r\n}\r\n","// ========================================\r\n// Flowchart Component\r\n// ========================================\r\n// Interactive flowchart component using @xyflow/react\r\n\r\nimport * as React from 'react';\r\nimport {\r\n ReactFlow,\r\n MiniMap,\r\n Controls,\r\n Background,\r\n Handle,\r\n Position,\r\n useNodesState,\r\n useEdgesState,\r\n type Node,\r\n type Edge,\r\n type Connection,\r\n type NodeTypes,\r\n} from '@xyflow/react';\r\nimport '@xyflow/react/dist/style.css';\r\nimport { CheckCircle, Circle, Loader2 } from 'lucide-react';\r\nimport type { FlowControl } from '@/lib/api';\r\n\r\n// Custom node types\r\ninterface FlowchartNodeData extends Record<string, unknown> {\r\n label: string;\r\n description?: string;\r\n step?: number | string;\r\n output?: string;\r\n type: 'pre-analysis' | 'implementation' | 'section';\r\n dependsOn?: string[];\r\n status?: 'pending' | 'in_progress' | 'completed' | 'blocked' | 'skipped';\r\n showStepStatus?: boolean;\r\n}\r\n\r\n// Status icon component\r\nconst StatusIcon: React.FC<{ status?: string; className?: string }> = ({ status, className = 'h-4 w-4' }) => {\r\n switch (status) {\r\n case 'completed':\r\n return <CheckCircle className={`${className} text-green-500`} />;\r\n case 'in_progress':\r\n return <Loader2 className={`${className} text-amber-500 animate-spin`} />;\r\n case 'blocked':\r\n return <Circle className={`${className} text-red-500`} />;\r\n case 'skipped':\r\n return <Circle className={`${className} text-gray-400`} />;\r\n default:\r\n return <Circle className={`${className} text-gray-300`} />;\r\n }\r\n};\r\n\r\n// Custom node component\r\nconst CustomNode: React.FC<{ data: FlowchartNodeData }> = ({ data }) => {\r\n const isPreAnalysis = data.type === 'pre-analysis';\r\n const isSection = data.type === 'section';\r\n const showStatus = data.showStepStatus !== false;\r\n const isCompleted = showStatus && data.status === 'completed';\r\n const isInProgress = showStatus && data.status === 'in_progress';\r\n\r\n if (isSection) {\r\n return (\r\n <div className=\"px-4 py-2 bg-muted rounded border-2 border-border relative\">\r\n <Handle type=\"target\" position={Position.Top} className=\"!bg-transparent !border-0 !w-0 !h-0\" />\r\n <span className=\"text-sm font-semibold text-foreground\">{data.label}</span>\r\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-transparent !border-0 !w-0 !h-0\" />\r\n </div>\r\n );\r\n }\r\n\r\n // Color scheme based on status\r\n let nodeColor = isPreAnalysis ? '#f59e0b' : '#3b82f6';\r\n let bgClass = isPreAnalysis\r\n ? 'bg-amber-50 border-amber-500 dark:bg-amber-950/30'\r\n : 'bg-blue-50 border-blue-500 dark:bg-blue-950/30';\r\n let stepBgClass = isPreAnalysis ? 'bg-amber-500 text-white' : 'bg-blue-500 text-white';\r\n\r\n // Override for completed status\r\n if (isCompleted) {\r\n nodeColor = '#22c55e'; // green-500\r\n bgClass = 'bg-green-50 border-green-500 dark:bg-green-950/30';\r\n stepBgClass = 'bg-green-500 text-white';\r\n } else if (isInProgress) {\r\n nodeColor = '#f59e0b'; // amber-500\r\n bgClass = 'bg-amber-50 border-amber-500 dark:bg-amber-950/30';\r\n stepBgClass = 'bg-amber-500 text-white';\r\n }\r\n\r\n return (\r\n <div\r\n className={`px-4 py-3 rounded-lg border-2 shadow-sm min-w-[280px] max-w-[400px] relative ${bgClass}`}\r\n >\r\n {/* Top handle for incoming edges */}\r\n <Handle\r\n type=\"target\"\r\n position={Position.Top}\r\n className=\"!w-3 !h-3 !-top-1.5\"\r\n style={{ background: nodeColor, border: `2px solid ${nodeColor}` }}\r\n />\r\n\r\n <div className=\"flex items-start gap-2\">\r\n <span\r\n className={`flex-shrink-0 w-6 h-6 rounded-full flex items-center justify-center text-xs font-bold ${stepBgClass}`}\r\n >\r\n {isCompleted && showStatus ? <CheckCircle className=\"h-4 w-4\" /> : data.step}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className={`text-sm font-semibold ${isCompleted ? 'text-green-700 dark:text-green-400' : 'text-foreground'}`}>\r\n {data.label}\r\n </span>\r\n {showStatus && data.status && data.status !== 'pending' && (\r\n <StatusIcon status={data.status} className=\"h-3.5 w-3.5\" />\r\n )}\r\n </div>\r\n {data.description && (\r\n <div className=\"text-xs text-muted-foreground mt-1 line-clamp-2\">{data.description}</div>\r\n )}\r\n {data.output && (\r\n <div className=\"text-xs text-green-600 dark:text-green-400 mt-1\">\r\n {'->'} {data.output}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Bottom handle for outgoing edges */}\r\n <Handle\r\n type=\"source\"\r\n position={Position.Bottom}\r\n className=\"!w-3 !h-3 !-bottom-1.5\"\r\n style={{ background: nodeColor, border: `2px solid ${nodeColor}` }}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nconst nodeTypes: NodeTypes = {\r\n custom: CustomNode,\r\n};\r\n\r\nexport interface FlowchartProps {\r\n flowControl: FlowControl;\r\n className?: string;\r\n showStepStatus?: boolean;\r\n}\r\n\r\n/**\r\n * Flowchart component for visualizing implementation approach\r\n */\r\nexport function Flowchart({ flowControl, className = '', showStepStatus = true }: FlowchartProps) {\r\n const preAnalysis = flowControl.pre_analysis || [];\r\n const implSteps = flowControl.implementation_approach || [];\r\n\r\n // Build nodes and edges\r\n const initialNodes: Node[] = [];\r\n const initialEdges: Edge[] = [];\r\n\r\n let currentY = 0;\r\n const nodeHeight = 100;\r\n const verticalGap = 80;\r\n const sectionGap = 60;\r\n\r\n // Add Pre-Analysis section\r\n if (preAnalysis.length > 0) {\r\n // Section header node\r\n initialNodes.push({\r\n id: 'pre-section',\r\n type: 'custom',\r\n position: { x: 0, y: currentY },\r\n data: {\r\n label: 'Pre-Analysis Steps',\r\n type: 'section' as const,\r\n },\r\n });\r\n currentY += sectionGap;\r\n\r\n preAnalysis.forEach((step, idx) => {\r\n const nodeId = `pre-${idx}`;\r\n initialNodes.push({\r\n id: nodeId,\r\n type: 'custom',\r\n position: { x: 0, y: currentY },\r\n data: {\r\n label: step.step || step.action || `Pre-step ${idx + 1}`,\r\n description: step.action,\r\n step: `P${idx + 1}`,\r\n output: step.output_to,\r\n type: 'pre-analysis' as const,\r\n showStepStatus,\r\n },\r\n });\r\n\r\n // Edge from previous node\r\n if (idx === 0) {\r\n initialEdges.push({\r\n id: `pre-section-${idx}`,\r\n source: 'pre-section',\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { stroke: '#f59e0b', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#f59e0b' },\r\n });\r\n } else {\r\n initialEdges.push({\r\n id: `pre-${idx - 1}-${idx}`,\r\n source: `pre-${idx - 1}`,\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { stroke: '#f59e0b', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#f59e0b' },\r\n });\r\n }\r\n\r\n currentY += nodeHeight + verticalGap;\r\n });\r\n\r\n currentY += sectionGap;\r\n }\r\n\r\n // Add Implementation section\r\n if (implSteps.length > 0) {\r\n // Section header node\r\n const implSectionId = 'impl-section';\r\n initialNodes.push({\r\n id: implSectionId,\r\n type: 'custom',\r\n position: { x: 0, y: currentY },\r\n data: {\r\n label: 'Implementation Steps',\r\n type: 'section' as const,\r\n },\r\n });\r\n\r\n // Edge from pre-analysis to impl section (if both exist)\r\n if (preAnalysis.length > 0) {\r\n initialEdges.push({\r\n id: `pre-impl-conn`,\r\n source: `pre-${preAnalysis.length - 1}`,\r\n target: implSectionId,\r\n type: 'smoothstep',\r\n animated: true,\r\n style: { stroke: '#3b82f6', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#3b82f6' },\r\n });\r\n }\r\n\r\n currentY += sectionGap;\r\n\r\n implSteps.forEach((step, idx) => {\r\n const nodeId = `impl-${idx}`;\r\n\r\n // Handle both string and ImplementationStep types\r\n const isString = typeof step === 'string';\r\n\r\n // Extract just the number from strings like \"Step 1\", \"step1\", etc.\r\n const rawStep = isString ? (idx + 1) : (step.step || idx + 1);\r\n const stepNumber = typeof rawStep === 'string'\r\n ? (rawStep.match(/\\d+/)?.[0] || idx + 1)\r\n : rawStep;\r\n\r\n // Try multiple fields for label (matching JS version priority)\r\n // Check for content in various possible field names\r\n let label: string;\r\n let description: string | undefined;\r\n\r\n if (isString) {\r\n label = step;\r\n } else {\r\n // Try title first (JS version uses this), then action, description, phase, or any string value\r\n label = step.title || step.action || step.phase || step.description || '';\r\n\r\n // If still empty, try to extract any non-empty string from the step object\r\n if (!label) {\r\n const stepKeys = Object.keys(step).filter(k =>\r\n k !== 'step' && k !== 'depends_on' && k !== 'modification_points' && k !== 'logic_flow'\r\n );\r\n for (const key of stepKeys) {\r\n const val = step[key as keyof typeof step];\r\n if (typeof val === 'string' && val.trim()) {\r\n label = val;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Final fallback\r\n if (!label) {\r\n label = `Step ${stepNumber}`;\r\n }\r\n\r\n // Set description if different from label\r\n description = step.description && step.description !== label ? step.description : undefined;\r\n }\r\n\r\n const dependsOn = isString ? undefined : step.depends_on?.map((d: number | string) => `impl-${Number(d) - 1}`);\r\n\r\n // Extract status from step (may be in 'status' field or other locations)\r\n const stepStatus = isString ? undefined : (step.status as string | undefined);\r\n\r\n initialNodes.push({\r\n id: nodeId,\r\n type: 'custom',\r\n position: { x: 0, y: currentY },\r\n data: {\r\n label,\r\n description,\r\n step: stepNumber,\r\n type: 'implementation' as const,\r\n dependsOn,\r\n status: stepStatus,\r\n showStepStatus,\r\n },\r\n });\r\n\r\n // Edge from section header to first step\r\n if (idx === 0) {\r\n initialEdges.push({\r\n id: `impl-section-${idx}`,\r\n source: implSectionId,\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { stroke: '#3b82f6', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#3b82f6' },\r\n });\r\n } else {\r\n // Sequential edge with styled connection\r\n initialEdges.push({\r\n id: `impl-${idx - 1}-${idx}`,\r\n source: `impl-${idx - 1}`,\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { stroke: '#3b82f6', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#3b82f6' },\r\n });\r\n }\r\n\r\n // Dependency edges\r\n if (!isString && step.depends_on && step.depends_on.length > 0) {\r\n step.depends_on.forEach((depIdx: number | string) => {\r\n const depNodeId = `impl-${Number(depIdx) - 1}`;\r\n initialEdges.push({\r\n id: `dep-${depIdx}-${idx}`,\r\n source: depNodeId,\r\n target: nodeId,\r\n type: 'smoothstep',\r\n animated: false,\r\n style: { strokeDasharray: '5,5', stroke: '#f59e0b', strokeWidth: 2 },\r\n markerEnd: { type: 'arrowclosed' as const, color: '#f59e0b' },\r\n });\r\n });\r\n }\r\n\r\n currentY += nodeHeight + verticalGap;\r\n });\r\n }\r\n\r\n const [nodes, , onNodesChange] = useNodesState(initialNodes);\r\n const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);\r\n\r\n // Handle new connections (disabled for this use case)\r\n const onConnect = React.useCallback(\r\n (connection: Connection) => {\r\n setEdges((eds) => [\r\n ...eds,\r\n {\r\n ...connection,\r\n id: `edge-${Date.now()}`,\r\n type: 'smoothstep',\r\n },\r\n ]);\r\n },\r\n [setEdges]\r\n );\r\n\r\n // If no data, show empty state\r\n if (preAnalysis.length === 0 && implSteps.length === 0) {\r\n return (\r\n <div className={`flex items-center justify-center p-8 text-center ${className}`}>\r\n <div>\r\n <p className=\"text-sm text-muted-foreground\">No flowchart data available</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={className} style={{ height: `${currentY + 100}px` }}>\r\n <ReactFlow\r\n nodes={nodes}\r\n edges={edges}\r\n onNodesChange={onNodesChange}\r\n onEdgesChange={onEdgesChange}\r\n onConnect={onConnect}\r\n nodeTypes={nodeTypes}\r\n fitView\r\n fitViewOptions={{ padding: 0.2 }}\r\n minZoom={0.3}\r\n maxZoom={1.5}\r\n defaultViewport={{ x: 0, y: 0, zoom: 0.8 }}\r\n nodesDraggable={false}\r\n nodesConnectable={false}\r\n elementsSelectable={true}\r\n selectNodesOnDrag={false}\r\n zoomOnScroll={true}\r\n panOnScroll={true}\r\n >\r\n <Background color=\"var(--color-border, #e0e0e0)\" style={{ backgroundColor: 'var(--color-background, white)' }} />\r\n <Controls className=\"bg-card border border-border rounded shadow-sm\" />\r\n <MiniMap\r\n nodeColor={(node) => {\r\n const data = node.data as FlowchartNodeData;\r\n if (data.type === 'section') return '#9ca3af';\r\n // Status-based colors (only when status tracking is enabled)\r\n if (data.showStepStatus !== false) {\r\n if (data.status === 'completed') return '#22c55e'; // green-500\r\n if (data.status === 'in_progress') return '#f59e0b'; // amber-500\r\n if (data.status === 'blocked') return '#ef4444'; // red-500\r\n }\r\n if (data.type === 'pre-analysis') return '#f59e0b';\r\n return '#3b82f6';\r\n }}\r\n className=\"!bg-card !border-border !rounded !shadow-sm\"\r\n />\r\n </ReactFlow>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Flowchart;\r\n","// ========================================\r\n// TaskDrawer Component\r\n// ========================================\r\n// Right-side task detail drawer with Overview/Flowchart/Files tabs\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { X, FileText, GitBranch, Folder, CheckCircle, Circle, Loader2, XCircle } from 'lucide-react';\r\nimport { Flowchart } from './Flowchart';\r\nimport { Badge } from '../ui/Badge';\r\nimport { Button } from '../ui/Button';\r\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '../ui/Tabs';\r\nimport type { NormalizedTask, LiteTask } from '@/lib/api';\r\nimport { buildFlowControl, normalizeTask } from '@/lib/api';\r\nimport type { TaskData } from '@/types/store';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface TaskDrawerProps {\r\n task: NormalizedTask | TaskData | LiteTask | null;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n}\r\n\r\ntype TabValue = 'overview' | 'flowchart' | 'files';\r\n\r\n// Status configuration\r\nconst taskStatusConfig: Record<string, { label: string; variant: 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'info' | null; icon: React.ComponentType<{ className?: string }> }> = {\r\n pending: {\r\n label: 'sessionDetail.taskDrawer.status.pending',\r\n variant: 'secondary',\r\n icon: Circle,\r\n },\r\n in_progress: {\r\n label: 'sessionDetail.taskDrawer.status.inProgress',\r\n variant: 'warning',\r\n icon: Loader2,\r\n },\r\n completed: {\r\n label: 'sessionDetail.taskDrawer.status.completed',\r\n variant: 'success',\r\n icon: CheckCircle,\r\n },\r\n blocked: {\r\n label: 'sessionDetail.taskDrawer.status.blocked',\r\n variant: 'destructive',\r\n icon: XCircle,\r\n },\r\n skipped: {\r\n label: 'sessionDetail.taskDrawer.status.skipped',\r\n variant: 'default',\r\n icon: Circle,\r\n },\r\n failed: {\r\n label: 'sessionDetail.taskDrawer.status.failed',\r\n variant: 'destructive',\r\n icon: XCircle,\r\n },\r\n};\r\n\r\n// ========== Component ==========\r\n\r\nexport function TaskDrawer({ task, isOpen, onClose }: TaskDrawerProps) {\r\n const { formatMessage } = useIntl();\r\n const [activeTab, setActiveTab] = React.useState<TabValue>('overview');\r\n\r\n // Reset to overview when task changes\r\n React.useEffect(() => {\r\n if (task) {\r\n setActiveTab('overview');\r\n }\r\n }, [task]);\r\n\r\n // ESC key to close\r\n React.useEffect(() => {\r\n const handleEsc = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && isOpen) {\r\n onClose();\r\n }\r\n };\r\n window.addEventListener('keydown', handleEsc);\r\n return () => window.removeEventListener('keydown', handleEsc);\r\n }, [isOpen, onClose]);\r\n\r\n // Normalize task to unified flat format (handles old nested, new flat, and raw LiteTask/TaskData)\r\n // MUST be called before early return to satisfy React hooks rules\r\n const nt = React.useMemo(\r\n () => task ? normalizeTask(task as unknown as Record<string, unknown>) : null,\r\n [task],\r\n );\r\n\r\n if (!task || !isOpen || !nt) {\r\n return null;\r\n }\r\n const taskId = nt.task_id || 'N/A';\r\n const taskTitle = nt.title || 'Untitled Task';\r\n const taskDescription = nt.description;\r\n const taskStatus = nt.status;\r\n const flowControl = buildFlowControl(nt);\r\n\r\n // Normalized flat fields\r\n const acceptanceCriteria = nt.convergence?.criteria || [];\r\n const focusPaths = nt.focus_paths || [];\r\n const dependsOn = nt.depends_on || [];\r\n const preAnalysis = nt.pre_analysis || flowControl?.pre_analysis || [];\r\n const implSteps = nt.implementation || flowControl?.implementation_approach || [];\r\n\r\n // Get files from multiple sources: nt.files, flowControl.target_files, or sourceRaw.file\r\n const rawData = nt._raw as Record<string, unknown> | undefined;\r\n const sourceRaw = (rawData?._raw as Record<string, unknown>) || rawData;\r\n const rawFile = sourceRaw?.file as string | undefined;\r\n const taskFiles = nt.files || flowControl?.target_files || (rawFile ? [{ path: rawFile }] : []);\r\n const taskScope = nt.scope;\r\n\r\n // Detect if task supports status tracking (new format has explicit status/status_history)\r\n const hasStatusTracking = sourceRaw\r\n ? (sourceRaw.status !== undefined || sourceRaw.status_history !== undefined)\r\n : false;\r\n\r\n const statusConfig = taskStatusConfig[taskStatus] || taskStatusConfig.pending;\r\n const StatusIcon = statusConfig.icon;\r\n\r\n const hasFlowchart = implSteps.length > 0;\r\n const hasFiles = taskFiles.length > 0;\r\n\r\n return (\r\n <>\r\n {/* Overlay */}\r\n <div\r\n className={`fixed inset-0 bg-black/40 transition-opacity z-40 ${\r\n isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none'\r\n }`}\r\n onClick={onClose}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n {/* Drawer */}\r\n <div\r\n className={`fixed top-0 right-0 h-full w-1/2 bg-background border-l border-border shadow-2xl z-50 flex flex-col transition-transform duration-300 ease-in-out ${\r\n isOpen ? 'translate-x-0' : 'translate-x-full'\r\n }`}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"drawer-title\"\r\n style={{ minWidth: '400px', maxWidth: '800px' }}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between p-6 border-b border-border bg-card\">\r\n <div className=\"flex-1 min-w-0 mr-4\">\r\n <div className=\"flex items-center gap-2 mb-2\">\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\">{taskId}</span>\r\n {hasStatusTracking && (\r\n <Badge variant={statusConfig.variant} className=\"gap-1\">\r\n <StatusIcon className=\"h-3 w-3\" />\r\n {formatMessage({ id: statusConfig.label })}\r\n </Badge>\r\n )}\r\n </div>\r\n <h2 id=\"drawer-title\" className=\"text-lg font-semibold text-foreground\">\r\n {taskTitle}\r\n </h2>\r\n </div>\r\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose} className=\"flex-shrink-0 hover:bg-secondary\">\r\n <X className=\"h-5 w-5\" />\r\n <span className=\"sr-only\">{formatMessage({ id: 'common.actions.close' })}</span>\r\n </Button>\r\n </div>\r\n\r\n {/* Tabs Navigation */}\r\n <div className=\"px-6 pt-4 bg-card\">\r\n <Tabs value={activeTab} onValueChange={(v) => setActiveTab(v as TabValue)} className=\"w-full\">\r\n <TabsList className=\"w-full\">\r\n <TabsTrigger value=\"overview\" className=\"flex-1\">\r\n <FileText className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.tabs.overview' })}\r\n </TabsTrigger>\r\n {hasFlowchart && (\r\n <TabsTrigger value=\"flowchart\" className=\"flex-1\">\r\n <GitBranch className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.tabs.flowchart' })}\r\n </TabsTrigger>\r\n )}\r\n <TabsTrigger value=\"files\" className=\"flex-1\">\r\n <Folder className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.tabs.files' })}\r\n </TabsTrigger>\r\n </TabsList>\r\n\r\n {/* Tab Content (scrollable) */}\r\n <div className=\"overflow-y-auto pr-2\" style={{ height: 'calc(100vh - 200px)' }}>\r\n {/* Overview Tab - Rich display matching JS version */}\r\n <TabsContent value=\"overview\" className=\"mt-4 pb-6 focus-visible:outline-none\">\r\n <div className=\"space-y-4\">\r\n {/* Description Section */}\r\n {taskDescription && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-2 flex items-center gap-2\">\r\n <span>📝</span>\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.overview.description' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground whitespace-pre-wrap\">\r\n {taskDescription}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Scope Section */}\r\n {taskScope && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-2 flex items-center gap-2\">\r\n <span>📁</span>\r\n Scope\r\n </h3>\r\n <div className=\"pl-3 border-l-2 border-primary\">\r\n <code className=\"text-sm text-foreground\">{taskScope}</code>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Acceptance / Convergence Criteria Section */}\r\n {acceptanceCriteria.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>✅</span>\r\n {formatMessage({ id: 'liteTasks.acceptanceCriteria' })}\r\n </h3>\r\n <div className=\"space-y-2\">\r\n {acceptanceCriteria.map((criterion, i) => (\r\n <div key={i} className=\"flex items-start gap-2\">\r\n <span className=\"text-muted-foreground mt-0.5\">○</span>\r\n <span className=\"text-sm text-foreground\">{criterion}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Focus Paths / Reference Section */}\r\n {focusPaths.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>📚</span>\r\n {formatMessage({ id: 'liteTasks.focusPaths' })}\r\n </h3>\r\n <div className=\"space-y-1\">\r\n {focusPaths.map((path, i) => (\r\n <code key={i} className=\"block text-xs bg-muted px-3 py-1.5 rounded text-foreground font-mono\">\r\n {path}\r\n </code>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Dependencies Section */}\r\n {dependsOn.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>🔗</span>\r\n {formatMessage({ id: 'liteTasks.dependsOn' })}\r\n </h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {dependsOn.map((dep, i) => (\r\n <Badge key={i} variant=\"secondary\">{dep}</Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Pre-analysis Steps */}\r\n {preAnalysis.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>🔍</span>\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.overview.preAnalysis' })}\r\n </h3>\r\n <div className=\"space-y-3\">\r\n {preAnalysis.map((step, index) => (\r\n <div key={index} className=\"flex items-start gap-3\">\r\n <span className=\"flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full bg-primary text-primary-foreground text-xs font-medium\">\r\n {index + 1}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium text-foreground\">{step.step || step.action}</p>\r\n {step.action && step.action !== step.step && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">{step.action}</p>\r\n )}\r\n {step.commands && step.commands.length > 0 && (\r\n <div className=\"mt-2 flex flex-wrap gap-1\">\r\n {step.commands.map((cmd, i) => (\r\n <code key={i} className=\"text-xs bg-muted px-2 py-0.5 rounded\">{cmd}</code>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Implementation Steps */}\r\n {flowControl?.implementation_approach && flowControl.implementation_approach.length > 0 && (\r\n <div className=\"p-4 bg-card rounded-lg border border-border\">\r\n <h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\r\n <span>📋</span>\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.overview.implementationSteps' })}\r\n </h3>\r\n <ol className=\"space-y-3\">\r\n {flowControl.implementation_approach.map((step, index) => {\r\n const isString = typeof step === 'string';\r\n // Extract just the number from strings like \"Step 1\", \"step1\", etc.\r\n const rawStep = isString ? (index + 1) : (step.step || index + 1);\r\n const stepNumber = typeof rawStep === 'string'\r\n ? (rawStep.match(/\\d+/)?.[0] || index + 1)\r\n : rawStep;\r\n\r\n // Try multiple fields for title (matching JS version)\r\n let stepTitle: string;\r\n let stepDesc: string | undefined;\r\n\r\n if (isString) {\r\n stepTitle = step;\r\n } else {\r\n // Try title first, then action, phase, description\r\n stepTitle = step.title || step.action || step.phase || '';\r\n\r\n // If empty, try any string value from the object\r\n if (!stepTitle) {\r\n const stepKeys = Object.keys(step).filter(k =>\r\n k !== 'step' && k !== 'depends_on' && k !== 'modification_points' && k !== 'logic_flow'\r\n );\r\n for (const key of stepKeys) {\r\n const val = step[key as keyof typeof step];\r\n if (typeof val === 'string' && val.trim()) {\r\n stepTitle = val;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Final fallback\r\n if (!stepTitle) {\r\n stepTitle = `Step ${stepNumber}`;\r\n }\r\n\r\n // Description if different from title\r\n stepDesc = step.description && step.description !== stepTitle ? step.description : undefined;\r\n }\r\n\r\n return (\r\n <li key={index} className=\"flex items-start gap-3\">\r\n <span className=\"flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full bg-primary text-primary-foreground text-xs font-medium\">\r\n {stepNumber}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium text-foreground\">{stepTitle}</p>\r\n {stepDesc && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">{stepDesc}</p>\r\n )}\r\n </div>\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </div>\r\n )}\r\n\r\n {/* Empty State */}\r\n {!taskDescription &&\r\n !taskScope &&\r\n !acceptanceCriteria.length &&\r\n !focusPaths.length &&\r\n !(flowControl?.pre_analysis?.length) &&\r\n !(flowControl?.implementation_approach?.length) && (\r\n <div className=\"text-center py-12\">\r\n <FileText className=\"h-12 w-12 text-muted-foreground mx-auto mb-4\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.overview.empty' })}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </TabsContent>\r\n\r\n {/* Flowchart Tab */}\r\n {hasFlowchart && (\r\n <TabsContent value=\"flowchart\" className=\"mt-4 pb-6\">\r\n <Flowchart flowControl={flowControl!} className=\"min-h-[400px]\" showStepStatus={hasStatusTracking} />\r\n </TabsContent>\r\n )}\r\n\r\n {/* Files Tab */}\r\n <TabsContent value=\"files\" className=\"mt-4 pb-6\">\r\n {hasFiles ? (\r\n <div className=\"space-y-3\">\r\n {taskFiles.map((file, index) => {\r\n // Support multiple file formats: string, { path: string }, { name: string }, { path, name }\r\n let displayPath: string;\r\n if (typeof file === 'string') {\r\n displayPath = file;\r\n } else if (file && typeof file === 'object') {\r\n displayPath = file.path || file.name || 'Unknown';\r\n } else {\r\n displayPath = 'Unknown';\r\n }\r\n\r\n return (\r\n <div\r\n key={index}\r\n className=\"flex items-center gap-2 p-3 bg-card rounded-md border border-border shadow-sm hover:shadow-md transition-shadow\"\r\n >\r\n <Folder className=\"h-4 w-4 text-primary flex-shrink-0\" />\r\n <span className=\"text-sm font-mono text-foreground\">{displayPath}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12\">\r\n <Folder className=\"h-12 w-12 text-muted-foreground mx-auto mb-4\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'sessionDetail.taskDrawer.files.empty' })}\r\n </p>\r\n </div>\r\n )}\r\n </TabsContent>\r\n </div>\r\n </Tabs>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":["FieldRenderer","value","type","className","jsx","detectType","ArrayRenderer","ObjectRenderer","FilesRenderer","TagsRenderer","StringRenderer","cn","item","index","jsxs","entries","_","v","key","val","formatLabel","file","FileText","tag","Badge","c","ExplorationCollapsible","title","icon","defaultOpen","children","isOpen","setIsOpen","React.useState","Collapsible","CollapsibleTrigger","ChevronDown","CollapsibleContent","ExplorationsSection","data","formatMessage","useIntl","explorationEntries","Card","CardContent","Search","angle","angleData","formatAngleTitle","AngleContent","extractString","obj","extractReason","toItems","sectionThemes","defaultTheme","sections","FolderOpen","Layers","GitBranch","Link","TestTube","def","s","section","theme","i","FormattedTextItem","text","parts","pathParts","part","AssetsCard","_a","_b","_c","docCount","_d","sourceCount","_e","testCount","_f","totalAssets","CardHeader","CardTitle","Tabs","TabsList","TabsTrigger","Code","TabsContent","AssetGrid","items","ConflictDetectionCard","riskConfig","getRiskConfig","AlertTriangle","Shield","RiskFactorsSection","factors","hasTestGaps","hasExistingImpl","AlertCircle","level","StatusIcon","status","CheckCircle","Loader2","Circle","CustomNode","isPreAnalysis","isSection","showStatus","isCompleted","isInProgress","Handle","Position","nodeColor","bgClass","stepBgClass","nodeTypes","Flowchart","flowControl","showStepStatus","preAnalysis","implSteps","initialNodes","initialEdges","currentY","nodeHeight","verticalGap","sectionGap","step","idx","nodeId","implSectionId","isString","rawStep","stepNumber","label","description","stepKeys","k","dependsOn","d","stepStatus","depIdx","depNodeId","nodes","onNodesChange","useNodesState","edges","setEdges","onEdgesChange","useEdgesState","onConnect","React.useCallback","connection","eds","ReactFlow","Background","Controls","MiniMap","node","taskStatusConfig","XCircle","TaskDrawer","task","onClose","activeTab","setActiveTab","React.useEffect","handleEsc","e","nt","React.useMemo","normalizeTask","taskId","taskTitle","taskDescription","taskStatus","buildFlowControl","acceptanceCriteria","focusPaths","rawData","sourceRaw","rawFile","taskFiles","taskScope","hasStatusTracking","statusConfig","hasFlowchart","hasFiles","Fragment","Button","X","Folder","criterion","path","dep","cmd","stepTitle","stepDesc","displayPath"],"mappings":"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"}