claude-code-workflow 7.2.10 → 7.2.12

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 (331) 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/commands/workflow/analyze-with-file.md +108 -54
  9. package/.claude/commands/workflow-tune.md +811 -0
  10. package/.claude/skills/review-code/SKILL.md +2 -0
  11. package/.claude/skills/review-cycle/SKILL.md +4 -0
  12. package/.claude/skills/skill-simplify/phases/02-optimize.md +4 -0
  13. package/.claude/skills/spec-generator/phases/05-epics-stories.md +4 -0
  14. package/.claude/skills/team-arch-opt/specs/team-config.json +5 -5
  15. package/.claude/skills/team-frontend-debug/roles/analyzer/role.md +3 -2
  16. package/.claude/skills/team-perf-opt/roles/coordinator/commands/monitor.md +1 -1
  17. package/.claude/skills/team-perf-opt/specs/team-config.json +5 -5
  18. package/.claude/skills/team-quality-assurance/roles/executor/role.md +2 -1
  19. package/.claude/skills/team-review/roles/reviewer/role.md +2 -1
  20. package/.claude/skills/team-tech-debt/roles/scanner/role.md +2 -1
  21. package/.claude/skills/team-testing/roles/executor/role.md +2 -1
  22. package/.claude/skills/team-testing/roles/generator/role.md +2 -1
  23. package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +2 -1
  24. package/.claude/skills/team-ux-improve/specs/team-config.json +6 -6
  25. package/.claude/skills/workflow-execute/phases/06-review.md +4 -4
  26. package/.claude/skills/workflow-lite-execute/SKILL.md +106 -14
  27. package/.claude/skills/workflow-lite-plan/SKILL.md +34 -72
  28. package/.claude/skills/workflow-lite-test-review/SKILL.md +41 -26
  29. package/.claude/skills/workflow-plan/phases/05-plan-verify.md +4 -0
  30. package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +1 -0
  31. package/.claude/skills/workflow-tdd-plan/phases/05-tdd-task-generation.md +2 -1
  32. package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +1 -0
  33. package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +2 -1
  34. package/.codex/skills/analyze-with-file/SKILL.md +2 -0
  35. package/.codex/skills/debug-with-file/SKILL.md +4 -0
  36. package/.codex/skills/issue-discover/SKILL.md +1 -0
  37. package/.codex/skills/review-cycle/phases/02-parallel-review.md +3 -0
  38. package/.codex/skills/team-designer/agents/validation-reporter.md +186 -0
  39. package/.codex/skills/team-iterdev/agents/gc-controller.md +193 -0
  40. package/.codex/skills/team-iterdev/agents/task-analyzer.md +206 -0
  41. package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +165 -0
  42. package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +163 -0
  43. package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +182 -0
  44. package/.codex/skills/team-uidesign/agents/completion-handler.md +177 -0
  45. package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +162 -0
  46. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +4 -0
  47. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +2 -0
  48. package/ccw/dist/commands/spec.d.ts.map +1 -1
  49. package/ccw/dist/commands/spec.js +9 -4
  50. package/ccw/dist/commands/spec.js.map +1 -1
  51. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  52. package/ccw/dist/core/routes/codexlens-routes.js +3 -1
  53. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  54. package/ccw/dist/tools/spec-index-builder.d.ts +8 -4
  55. package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -1
  56. package/ccw/dist/tools/spec-index-builder.js +8 -4
  57. package/ccw/dist/tools/spec-index-builder.js.map +1 -1
  58. package/ccw/dist/tools/spec-init.d.ts +1 -1
  59. package/ccw/dist/tools/spec-init.d.ts.map +1 -1
  60. package/ccw/dist/tools/spec-init.js +127 -0
  61. package/ccw/dist/tools/spec-init.js.map +1 -1
  62. package/ccw/dist/tools/spec-loader.d.ts.map +1 -1
  63. package/ccw/dist/tools/spec-loader.js +2 -1
  64. package/ccw/dist/tools/spec-loader.js.map +1 -1
  65. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js → AlertDialog-BW9jiZ-p.js} +2 -2
  66. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js.map → AlertDialog-BW9jiZ-p.js.map} +1 -1
  67. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js → AnalysisPage-ds-w_nVO.js} +2 -2
  68. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js.map → AnalysisPage-ds-w_nVO.js.map} +1 -1
  69. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js → ApiSettingsPage-DlCbXxTz.js} +2 -2
  70. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js.map → ApiSettingsPage-DlCbXxTz.js.map} +1 -1
  71. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js → CliModeToggle-Dq3nL4fF.js} +2 -2
  72. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js.map → CliModeToggle-Dq3nL4fF.js.map} +1 -1
  73. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js → CliSessionSharePage-BNDkEE4u.js} +2 -2
  74. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js.map → CliSessionSharePage-BNDkEE4u.js.map} +1 -1
  75. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js → CliViewerPage-ChM-uNx_.js} +2 -2
  76. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js.map → CliViewerPage-ChM-uNx_.js.map} +1 -1
  77. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js +2 -0
  78. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js.map +1 -0
  79. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js → Collapsible-CRNbykXN.js} +2 -2
  80. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js.map → Collapsible-CRNbykXN.js.map} +1 -1
  81. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js → CommandsManagerPage-C2JWcemF.js} +2 -2
  82. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js.map → CommandsManagerPage-C2JWcemF.js.map} +1 -1
  83. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js → DeepWikiPage-CvleOtJy.js} +2 -2
  84. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js.map → DeepWikiPage-CvleOtJy.js.map} +1 -1
  85. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js → EndpointsPage-CMOWQG64.js} +2 -2
  86. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js.map → EndpointsPage-CMOWQG64.js.map} +1 -1
  87. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js → ExplorerPage-DaFPRlNo.js} +2 -2
  88. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js.map → ExplorerPage-DaFPRlNo.js.map} +1 -1
  89. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js → FixSessionPage-CC4p04Az.js} +2 -2
  90. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js.map → FixSessionPage-CC4p04Az.js.map} +1 -1
  91. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js → FloatingFileBrowser-DROn1xZ5.js} +2 -2
  92. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js.map → FloatingFileBrowser-DROn1xZ5.js.map} +1 -1
  93. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js → FloatingPanel-CmL_yhDv.js} +2 -2
  94. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js.map → FloatingPanel-CmL_yhDv.js.map} +1 -1
  95. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js → GraphExplorerPage-DCV5ybKE.js} +2 -2
  96. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js.map → GraphExplorerPage-DCV5ybKE.js.map} +1 -1
  97. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js → HistoryPage-D0fYQZgc.js} +2 -2
  98. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js.map → HistoryPage-D0fYQZgc.js.map} +1 -1
  99. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js → HookManagerPage-D2FuJfsM.js} +2 -2
  100. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js.map → HookManagerPage-D2FuJfsM.js.map} +1 -1
  101. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js → InstallationsPage-tjklillZ.js} +2 -2
  102. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js.map → InstallationsPage-tjklillZ.js.map} +1 -1
  103. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js → IssueHubPage-E4JVrhO1.js} +2 -2
  104. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js.map → IssueHubPage-E4JVrhO1.js.map} +1 -1
  105. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js → LiteTasksPage-aJuRoyLt.js} +2 -2
  106. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js.map → LiteTasksPage-aJuRoyLt.js.map} +1 -1
  107. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js → McpManagerPage-BJeuWJv1.js} +2 -2
  108. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js.map → McpManagerPage-BJeuWJv1.js.map} +1 -1
  109. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js → MemoryPage-BI4FAXhs.js} +2 -2
  110. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js.map → MemoryPage-BI4FAXhs.js.map} +1 -1
  111. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js → NotFoundPage-DD2svchp.js} +2 -2
  112. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js.map → NotFoundPage-DD2svchp.js.map} +1 -1
  113. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js → OrchestratorPage-FC__7yYa.js} +2 -2
  114. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js.map → OrchestratorPage-FC__7yYa.js.map} +1 -1
  115. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js → ProjectOverviewPage-DBB_-FzV.js} +2 -2
  116. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js.map → ProjectOverviewPage-DBB_-FzV.js.map} +1 -1
  117. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js → PromptHistoryPage-BwOAvCH8.js} +2 -2
  118. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js.map → PromptHistoryPage-BwOAvCH8.js.map} +1 -1
  119. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js → ReviewSessionPage-Dd1-g_gp.js} +2 -2
  120. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js.map → ReviewSessionPage-Dd1-g_gp.js.map} +1 -1
  121. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js → RulesManagerPage-B3RGdsKD.js} +2 -2
  122. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js.map → RulesManagerPage-B3RGdsKD.js.map} +1 -1
  123. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js → SessionDetailPage-DM-W5R8K.js} +2 -2
  124. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js.map → SessionDetailPage-DM-W5R8K.js.map} +1 -1
  125. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js → SessionsPage-BVz1KCc7.js} +2 -2
  126. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js.map → SessionsPage-BVz1KCc7.js.map} +1 -1
  127. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js → SettingsPage-ComW7EZS.js} +4 -4
  128. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js.map → SettingsPage-ComW7EZS.js.map} +1 -1
  129. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js → SkillsManagerPage-CKom9XwV.js} +2 -2
  130. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js.map → SkillsManagerPage-CKom9XwV.js.map} +1 -1
  131. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js → SpecsSettingsPage-DQz7WP2s.js} +2 -2
  132. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js.map → SpecsSettingsPage-DQz7WP2s.js.map} +1 -1
  133. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js → Switch-BPMdND9H.js} +2 -2
  134. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js.map → Switch-BPMdND9H.js.map} +1 -1
  135. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js → TabsNavigation-qqt70VYL.js} +2 -2
  136. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js.map → TabsNavigation-qqt70VYL.js.map} +1 -1
  137. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js → TaskDrawer-BqK_qiHX.js} +2 -2
  138. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js.map → TaskDrawer-BqK_qiHX.js.map} +1 -1
  139. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js → TeamPage-u5_i0Rgh.js} +2 -2
  140. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js.map → TeamPage-u5_i0Rgh.js.map} +1 -1
  141. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js → TerminalDashboardPage-rUtC9e40.js} +2 -2
  142. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js.map → TerminalDashboardPage-rUtC9e40.js.map} +1 -1
  143. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js → archive-C3u8YNQF.js} +2 -2
  144. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js.map → archive-C3u8YNQF.js.map} +1 -1
  145. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js → archive-restore-DfQ998g5.js} +2 -2
  146. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js.map → archive-restore-DfQ998g5.js.map} +1 -1
  147. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js → arrow-right-BshJM9Po.js} +2 -2
  148. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js.map → arrow-right-BshJM9Po.js.map} +1 -1
  149. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js → bookmark-plus-D03qJyOZ.js} +2 -2
  150. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js.map → bookmark-plus-D03qJyOZ.js.map} +1 -1
  151. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js → bot-CyzWuwq0.js} +2 -2
  152. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js.map → bot-CyzWuwq0.js.map} +1 -1
  153. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js → braces-BPgtyjsG.js} +2 -2
  154. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js.map → braces-BPgtyjsG.js.map} +1 -1
  155. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js → circle-stop-Dix1AOmw.js} +2 -2
  156. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js.map → circle-stop-Dix1AOmw.js.map} +1 -1
  157. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js → cpu-CCQ4Q0Zh.js} +2 -2
  158. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js.map → cpu-CCQ4Q0Zh.js.map} +1 -1
  159. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js → ellipsis-vertical-BpTysg-Y.js} +2 -2
  160. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js.map → ellipsis-vertical-BpTysg-Y.js.map} +1 -1
  161. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js → eye-DGY1rAZs.js} +2 -2
  162. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js.map → eye-DGY1rAZs.js.map} +1 -1
  163. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js → eye-off-D8t3JfWG.js} +2 -2
  164. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js.map → eye-off-D8t3JfWG.js.map} +1 -1
  165. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js → file-json-BAdJb0n8.js} +2 -2
  166. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js.map → file-json-BAdJb0n8.js.map} +1 -1
  167. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js → file-text-DrJFiOUB.js} +2 -2
  168. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js.map → file-text-DrJFiOUB.js.map} +1 -1
  169. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js → filter-CKqzYbz7.js} +2 -2
  170. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js.map → filter-CKqzYbz7.js.map} +1 -1
  171. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js → folder-CV8511y9.js} +2 -2
  172. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js.map → folder-CV8511y9.js.map} +1 -1
  173. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js → gauge-XKvmu_uU.js} +2 -2
  174. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js.map → gauge-XKvmu_uU.js.map} +1 -1
  175. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js → globe-C56cDUzX.js} +2 -2
  176. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js.map → globe-C56cDUzX.js.map} +1 -1
  177. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js → grid-3x3-Bya-suFW.js} +2 -2
  178. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js.map → grid-3x3-Bya-suFW.js.map} +1 -1
  179. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js → hard-drive-CmuTZpsB.js} +2 -2
  180. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js.map → hard-drive-CmuTZpsB.js.map} +1 -1
  181. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js → hash-CRPT_tJQ.js} +2 -2
  182. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js.map → hash-CRPT_tJQ.js.map} +1 -1
  183. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js → history-C1pJZQCL.js} +2 -2
  184. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js.map → history-C1pJZQCL.js.map} +1 -1
  185. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js → index-B6TpijCe.js} +2 -2
  186. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js.map → index-B6TpijCe.js.map} +1 -1
  187. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js → index-Bcq-7r6F.js} +2 -2
  188. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js.map → index-Bcq-7r6F.js.map} +1 -1
  189. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js → index-CI8-rBff.js} +2 -2
  190. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js.map → index-CI8-rBff.js.map} +1 -1
  191. package/ccw/frontend/dist/assets/{index-CY6Lueph.js → index-Dmt9OiEf.js} +2 -2
  192. package/ccw/frontend/dist/assets/{index-CY6Lueph.js.map → index-Dmt9OiEf.js.map} +1 -1
  193. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js → index-anSMmEF8.js} +2 -2
  194. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js.map → index-anSMmEF8.js.map} +1 -1
  195. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js → index-dWT2M6Ef.js} +4 -4
  196. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js.map → index-dWT2M6Ef.js.map} +1 -1
  197. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js → layout-grid-TSO0BFQE.js} +2 -2
  198. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js.map → layout-grid-TSO0BFQE.js.map} +1 -1
  199. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js → lightbulb-Caj6fIQD.js} +2 -2
  200. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js.map → lightbulb-Caj6fIQD.js.map} +1 -1
  201. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js → link-2-DE9lMxa-.js} +2 -2
  202. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js.map → link-2-DE9lMxa-.js.map} +1 -1
  203. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js → link-BZtPgLW0.js} +2 -2
  204. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js.map → link-BZtPgLW0.js.map} +1 -1
  205. package/ccw/frontend/dist/assets/{list-CDmYFcio.js → list-DubWyY-U.js} +2 -2
  206. package/ccw/frontend/dist/assets/{list-CDmYFcio.js.map → list-DubWyY-U.js.map} +1 -1
  207. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js → map-pin-DwN_48AF.js} +2 -2
  208. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js.map → map-pin-DwN_48AF.js.map} +1 -1
  209. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js → messages-square-bjxvaiM9.js} +2 -2
  210. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js.map → messages-square-bjxvaiM9.js.map} +1 -1
  211. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js → minimize-2-CGfBKD_V.js} +2 -2
  212. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js.map → minimize-2-CGfBKD_V.js.map} +1 -1
  213. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js → package-nzWY6ilt.js} +2 -2
  214. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js.map → package-nzWY6ilt.js.map} +1 -1
  215. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js → plug-CiLce49C.js} +2 -2
  216. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js.map → plug-CiLce49C.js.map} +1 -1
  217. package/ccw/frontend/dist/assets/{power-DmIojFl-.js → power-CFLmB-U9.js} +2 -2
  218. package/ccw/frontend/dist/assets/{power-DmIojFl-.js.map → power-CFLmB-U9.js.map} +1 -1
  219. package/ccw/frontend/dist/assets/{save-BFa03OnG.js → save-DuO6OF0C.js} +2 -2
  220. package/ccw/frontend/dist/assets/{save-BFa03OnG.js.map → save-DuO6OF0C.js.map} +1 -1
  221. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js → send-CZk9p0mM.js} +2 -2
  222. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js.map → send-CZk9p0mM.js.map} +1 -1
  223. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js → square-check-big-BY_1YQQg.js} +2 -2
  224. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js.map → square-check-big-BY_1YQQg.js.map} +1 -1
  225. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js → square-pen-CnZgm6g-.js} +2 -2
  226. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js.map → square-pen-CnZgm6g-.js.map} +1 -1
  227. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js → star-Cn1F0qy7.js} +2 -2
  228. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js.map → star-Cn1F0qy7.js.map} +1 -1
  229. package/ccw/frontend/dist/assets/{style-CJsrp48L.js → style-Dxs1iXCV.js} +2 -2
  230. package/ccw/frontend/dist/assets/{style-CJsrp48L.js.map → style-Dxs1iXCV.js.map} +1 -1
  231. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js → target-Bz1fLRKH.js} +2 -2
  232. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js.map → target-Bz1fLRKH.js.map} +1 -1
  233. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js → test-tube-C6qCYlDr.js} +2 -2
  234. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js.map → test-tube-C6qCYlDr.js.map} +1 -1
  235. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js → upload-C71kd4Qs.js} +2 -2
  236. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js.map → upload-C71kd4Qs.js.map} +1 -1
  237. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js → useApiSettings-CqP2BAJ7.js} +2 -2
  238. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js.map → useApiSettings-CqP2BAJ7.js.map} +1 -1
  239. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js → useCli-PCoPoVeM.js} +2 -2
  240. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js.map → useCli-PCoPoVeM.js.map} +1 -1
  241. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js → useCommands-3OfPQPw4.js} +2 -2
  242. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js.map → useCommands-3OfPQPw4.js.map} +1 -1
  243. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js → useDebounce-bXiFhQx9.js} +2 -2
  244. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js.map → useDebounce-bXiFhQx9.js.map} +1 -1
  245. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js → useFileExplorer-DEyUm46_.js} +2 -2
  246. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js.map → useFileExplorer-DEyUm46_.js.map} +1 -1
  247. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js → useLocale-sXTrdxcJ.js} +2 -2
  248. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js.map → useLocale-sXTrdxcJ.js.map} +1 -1
  249. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js → useSkills-D0W0kXYm.js} +3 -3
  250. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js.map → useSkills-D0W0kXYm.js.map} +1 -1
  251. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js → useSystemSettings-DZ-8lZsG.js} +2 -2
  252. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js.map → useSystemSettings-DZ-8lZsG.js.map} +1 -1
  253. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js → wand-sparkles-83GmAYuw.js} +2 -2
  254. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js.map → wand-sparkles-83GmAYuw.js.map} +1 -1
  255. package/ccw/frontend/dist/index.html +1 -1
  256. package/package.json +1 -1
  257. package/.claude/commands/ddd/auto.md +0 -359
  258. package/.claude/commands/ddd/doc-generate.md +0 -222
  259. package/.claude/commands/ddd/doc-refresh.md +0 -218
  260. package/.claude/commands/ddd/execute.md +0 -416
  261. package/.claude/commands/ddd/index-build.md +0 -212
  262. package/.claude/commands/ddd/plan.md +0 -611
  263. package/.claude/commands/ddd/scan.md +0 -365
  264. package/.claude/commands/ddd/sync.md +0 -353
  265. package/.claude/commands/ddd/update.md +0 -160
  266. package/.claude/commands/idaw/add.md +0 -287
  267. package/.claude/commands/idaw/resume.md +0 -442
  268. package/.claude/commands/idaw/run-coordinate.md +0 -648
  269. package/.claude/commands/idaw/run.md +0 -539
  270. package/.claude/commands/idaw/status.md +0 -182
  271. package/.claude/skills/team-arch-opt/role-specs/analyzer.md +0 -80
  272. package/.claude/skills/team-arch-opt/role-specs/designer.md +0 -118
  273. package/.claude/skills/team-arch-opt/role-specs/refactorer.md +0 -106
  274. package/.claude/skills/team-arch-opt/role-specs/reviewer.md +0 -116
  275. package/.claude/skills/team-arch-opt/role-specs/validator.md +0 -117
  276. package/.claude/skills/team-brainstorm/role-specs/challenger.md +0 -63
  277. package/.claude/skills/team-brainstorm/role-specs/evaluator.md +0 -58
  278. package/.claude/skills/team-brainstorm/role-specs/ideator.md +0 -71
  279. package/.claude/skills/team-brainstorm/role-specs/synthesizer.md +0 -59
  280. package/.claude/skills/team-frontend/role-specs/analyst.md +0 -91
  281. package/.claude/skills/team-frontend/role-specs/architect.md +0 -85
  282. package/.claude/skills/team-frontend/role-specs/developer.md +0 -92
  283. package/.claude/skills/team-frontend/role-specs/qa.md +0 -78
  284. package/.claude/skills/team-issue/role-specs/explorer.md +0 -95
  285. package/.claude/skills/team-issue/role-specs/implementer.md +0 -89
  286. package/.claude/skills/team-issue/role-specs/integrator.md +0 -86
  287. package/.claude/skills/team-issue/role-specs/planner.md +0 -83
  288. package/.claude/skills/team-issue/role-specs/reviewer.md +0 -89
  289. package/.claude/skills/team-iterdev/role-specs/architect.md +0 -64
  290. package/.claude/skills/team-iterdev/role-specs/developer.md +0 -73
  291. package/.claude/skills/team-iterdev/role-specs/reviewer.md +0 -65
  292. package/.claude/skills/team-iterdev/role-specs/tester.md +0 -87
  293. package/.claude/skills/team-perf-opt/role-specs/benchmarker.md +0 -110
  294. package/.claude/skills/team-perf-opt/role-specs/optimizer.md +0 -102
  295. package/.claude/skills/team-perf-opt/role-specs/profiler.md +0 -73
  296. package/.claude/skills/team-perf-opt/role-specs/reviewer.md +0 -91
  297. package/.claude/skills/team-perf-opt/role-specs/strategist.md +0 -114
  298. package/.claude/skills/team-planex/role-specs/executor.md +0 -90
  299. package/.claude/skills/team-planex/role-specs/planner.md +0 -110
  300. package/.claude/skills/team-quality-assurance/role-specs/analyst.md +0 -79
  301. package/.claude/skills/team-quality-assurance/role-specs/executor.md +0 -64
  302. package/.claude/skills/team-quality-assurance/role-specs/generator.md +0 -67
  303. package/.claude/skills/team-quality-assurance/role-specs/scout.md +0 -66
  304. package/.claude/skills/team-quality-assurance/role-specs/strategist.md +0 -70
  305. package/.claude/skills/team-review/role-specs/fixer.md +0 -75
  306. package/.claude/skills/team-review/role-specs/reviewer.md +0 -66
  307. package/.claude/skills/team-review/role-specs/scanner.md +0 -70
  308. package/.claude/skills/team-roadmap-dev/role-specs/executor.md +0 -71
  309. package/.claude/skills/team-roadmap-dev/role-specs/planner.md +0 -77
  310. package/.claude/skills/team-roadmap-dev/role-specs/verifier.md +0 -73
  311. package/.claude/skills/team-tech-debt/role-specs/assessor.md +0 -70
  312. package/.claude/skills/team-tech-debt/role-specs/executor.md +0 -80
  313. package/.claude/skills/team-tech-debt/role-specs/planner.md +0 -71
  314. package/.claude/skills/team-tech-debt/role-specs/scanner.md +0 -85
  315. package/.claude/skills/team-tech-debt/role-specs/validator.md +0 -83
  316. package/.claude/skills/team-testing/role-specs/analyst.md +0 -94
  317. package/.claude/skills/team-testing/role-specs/executor.md +0 -97
  318. package/.claude/skills/team-testing/role-specs/generator.md +0 -96
  319. package/.claude/skills/team-testing/role-specs/strategist.md +0 -82
  320. package/.claude/skills/team-uidesign/role-specs/designer.md +0 -72
  321. package/.claude/skills/team-uidesign/role-specs/implementer.md +0 -74
  322. package/.claude/skills/team-uidesign/role-specs/researcher.md +0 -84
  323. package/.claude/skills/team-uidesign/role-specs/reviewer.md +0 -70
  324. package/.claude/skills/team-ux-improve/role-specs/designer.md +0 -191
  325. package/.claude/skills/team-ux-improve/role-specs/diagnoser.md +0 -110
  326. package/.claude/skills/team-ux-improve/role-specs/explorer.md +0 -109
  327. package/.claude/skills/team-ux-improve/role-specs/implementer.md +0 -164
  328. package/.claude/skills/team-ux-improve/role-specs/scanner.md +0 -117
  329. package/.claude/skills/team-ux-improve/role-specs/tester.md +0 -163
  330. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js +0 -2
  331. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DeepWikiPage-EgHsHvAH.js","sources":["../../src/hooks/useDeepWiki.ts","../../src/components/deepwiki/FileList.tsx","../../../../node_modules/hast-util-sanitize/lib/schema.js","../../../../node_modules/hast-util-sanitize/lib/index.js","../../../../node_modules/rehype-sanitize/lib/index.js","../../src/components/deepwiki/DocumentViewer.tsx","../../src/pages/DeepWikiPage.tsx"],"sourcesContent":["// ========================================\r\n// useDeepWiki Hook\r\n// ========================================\r\n// TanStack Query hooks for DeepWiki documentation system\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\n// Types\r\nexport interface DeepWikiFile {\r\n id?: number;\r\n path: string;\r\n contentHash: string;\r\n lastIndexed: string;\r\n symbolsCount: number;\r\n docsGenerated: boolean;\r\n}\r\n\r\nexport interface DeepWikiSymbol {\r\n id?: number;\r\n name: string;\r\n type: string;\r\n sourceFile: string;\r\n docFile: string;\r\n anchor: string;\r\n lineRange: [number, number];\r\n createdAt?: string;\r\n updatedAt?: string;\r\n}\r\n\r\nexport interface DeepWikiDoc {\r\n id?: number;\r\n path: string;\r\n contentHash: string;\r\n symbols: string[];\r\n generatedAt: string;\r\n llmTool?: string;\r\n}\r\n\r\nexport interface DeepWikiStats {\r\n available: boolean;\r\n files: number;\r\n symbols: number;\r\n docs: number;\r\n filesNeedingDocs?: number;\r\n dbPath?: string;\r\n}\r\n\r\nexport interface DocumentResponse {\r\n doc: DeepWikiDoc | null;\r\n content: string;\r\n symbols: DeepWikiSymbol[];\r\n}\r\n\r\n// Query key factory\r\nexport const deepWikiKeys = {\r\n all: ['deepWiki'] as const,\r\n files: (projectPath: string) => [...deepWikiKeys.all, 'files', projectPath] as const,\r\n doc: (path: string) => [...deepWikiKeys.all, 'doc', path] as const,\r\n stats: (projectPath: string) => [...deepWikiKeys.all, 'stats', projectPath] as const,\r\n search: (query: string) => [...deepWikiKeys.all, 'search', query] as const,\r\n};\r\n\r\n// Default stale time: 5 minutes (increased to reduce API calls)\r\nconst STALE_TIME = 5 * 60 * 1000;\r\n\r\n// Default garbage collection time: 10 minutes\r\nconst GC_TIME = 10 * 60 * 1000;\r\n\r\n// Request timeout: 10 seconds\r\nconst REQUEST_TIMEOUT = 10 * 1000;\r\n\r\n/**\r\n * Fetch with timeout wrapper\r\n */\r\nasync function fetchWithTimeout(url: string, timeout: number = REQUEST_TIMEOUT): Promise<Response> {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(url, { signal: controller.signal });\r\n return response;\r\n } finally {\r\n clearTimeout(timeoutId);\r\n }\r\n}\r\n\r\n/**\r\n * Fetch list of documented files\r\n */\r\nasync function fetchDeepWikiFiles(): Promise<DeepWikiFile[]> {\r\n const response = await fetchWithTimeout('/api/deepwiki/files');\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch files: ${response.statusText}`);\r\n }\r\n return response.json();\r\n}\r\n\r\n/**\r\n * Fetch document by source file path\r\n */\r\nasync function fetchDeepWikiDoc(filePath: string): Promise<DocumentResponse> {\r\n const response = await fetchWithTimeout(`/api/deepwiki/doc?path=${encodeURIComponent(filePath)}`);\r\n if (!response.ok) {\r\n if (response.status === 404) {\r\n return { doc: null, content: '', symbols: [] };\r\n }\r\n throw new Error(`Failed to fetch document: ${response.statusText}`);\r\n }\r\n return response.json();\r\n}\r\n\r\n/**\r\n * Fetch DeepWiki statistics\r\n */\r\nasync function fetchDeepWikiStats(): Promise<DeepWikiStats> {\r\n const response = await fetchWithTimeout('/api/deepwiki/stats');\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch stats: ${response.statusText}`);\r\n }\r\n return response.json();\r\n}\r\n\r\n/**\r\n * Search symbols by query\r\n */\r\nasync function searchDeepWikiSymbols(query: string, limit = 50): Promise<DeepWikiSymbol[]> {\r\n const response = await fetchWithTimeout(`/api/deepwiki/search?q=${encodeURIComponent(query)}&limit=${limit}`);\r\n if (!response.ok) {\r\n throw new Error(`Failed to search symbols: ${response.statusText}`);\r\n }\r\n return response.json();\r\n}\r\n\r\n// ========== Hooks ==========\r\n\r\nexport interface UseDeepWikiFilesOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseDeepWikiFilesReturn {\r\n files: DeepWikiFile[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching list of documented files\r\n */\r\nexport function useDeepWikiFiles(options: UseDeepWikiFilesOptions = {}): UseDeepWikiFilesReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery({\r\n queryKey: deepWikiKeys.files(projectPath ?? ''),\r\n queryFn: fetchDeepWikiFiles,\r\n staleTime,\r\n gcTime: GC_TIME,\r\n enabled: enabled && !!projectPath,\r\n retry: 2,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n refetchOnWindowFocus: false,\r\n });\r\n\r\n return {\r\n files: query.data ?? [],\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch: async () => {\r\n await query.refetch();\r\n },\r\n };\r\n}\r\n\r\nexport interface UseDeepWikiDocOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseDeepWikiDocReturn {\r\n doc: DeepWikiDoc | null;\r\n content: string;\r\n symbols: DeepWikiSymbol[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching a document by source file path\r\n */\r\nexport function useDeepWikiDoc(filePath: string | null, options: UseDeepWikiDocOptions = {}): UseDeepWikiDocReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n\r\n const query = useQuery({\r\n queryKey: deepWikiKeys.doc(filePath ?? ''),\r\n queryFn: () => fetchDeepWikiDoc(filePath!),\r\n staleTime,\r\n gcTime: GC_TIME,\r\n enabled: enabled && !!filePath,\r\n retry: 2,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n refetchOnWindowFocus: false,\r\n });\r\n\r\n return {\r\n doc: query.data?.doc ?? null,\r\n content: query.data?.content ?? '',\r\n symbols: query.data?.symbols ?? [],\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch: async () => {\r\n await query.refetch();\r\n },\r\n };\r\n}\r\n\r\nexport interface UseDeepWikiStatsOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseDeepWikiStatsReturn {\r\n stats: DeepWikiStats | null;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching DeepWiki statistics\r\n */\r\nexport function useDeepWikiStats(options: UseDeepWikiStatsOptions = {}): UseDeepWikiStatsReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery({\r\n queryKey: deepWikiKeys.stats(projectPath ?? ''),\r\n queryFn: fetchDeepWikiStats,\r\n staleTime,\r\n gcTime: GC_TIME,\r\n enabled: enabled && !!projectPath,\r\n retry: 2,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n refetchOnWindowFocus: false,\r\n });\r\n\r\n return {\r\n stats: query.data ?? null,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch: async () => {\r\n await query.refetch();\r\n },\r\n };\r\n}\r\n\r\nexport interface UseDeepWikiSearchOptions {\r\n limit?: number;\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseDeepWikiSearchReturn {\r\n symbols: DeepWikiSymbol[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for searching symbols\r\n */\r\nexport function useDeepWikiSearch(query: string, options: UseDeepWikiSearchOptions = {}): UseDeepWikiSearchReturn {\r\n const { limit = 50, staleTime = STALE_TIME, enabled = true } = options;\r\n\r\n const queryResult = useQuery({\r\n queryKey: deepWikiKeys.search(query),\r\n queryFn: () => searchDeepWikiSymbols(query, limit),\r\n staleTime,\r\n gcTime: GC_TIME,\r\n enabled: enabled && query.length > 0,\r\n retry: 2,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n refetchOnWindowFocus: false,\r\n });\r\n\r\n return {\r\n symbols: queryResult.data ?? [],\r\n isLoading: queryResult.isLoading,\r\n isFetching: queryResult.isFetching,\r\n error: queryResult.error,\r\n refetch: async () => {\r\n await queryResult.refetch();\r\n },\r\n };\r\n}\r\n","// ========================================\r\n// FileList Component\r\n// ========================================\r\n// List of documented files for DeepWiki\r\n\r\nimport { useState, useMemo, useEffect } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { FileText, Search, CheckCircle, Clock, RefreshCw, Loader2 } from 'lucide-react';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { cn } from '@/lib/utils';\r\nimport type { DeepWikiFile } from '@/hooks/useDeepWiki';\r\nimport { useDebounce } from '@/hooks/useDebounce';\r\n\r\nexport interface FileListProps {\r\n files: DeepWikiFile[];\r\n selectedPath: string | null;\r\n onSelectFile: (filePath: string) => void;\r\n isLoading?: boolean;\r\n isFetching?: boolean;\r\n onRefresh?: () => void;\r\n}\r\n\r\n/**\r\n * Get relative file path from full path\r\n */\r\nfunction getRelativePath(fullPath: string): string {\r\n // Try to extract a more readable path\r\n const parts = fullPath.replace(/\\\\/g, '/').split('/');\r\n const srcIndex = parts.findIndex(p => p === 'src');\r\n if (srcIndex >= 0) {\r\n return parts.slice(srcIndex).join('/');\r\n }\r\n // Return last 3 segments if path is long\r\n if (parts.length > 3) {\r\n return '.../' + parts.slice(-3).join('/');\r\n }\r\n return parts.join('/');\r\n}\r\n\r\n/**\r\n * Get file extension for icon coloring\r\n */\r\nfunction getFileExtension(path: string): string {\r\n const parts = path.split('.');\r\n return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : '';\r\n}\r\n\r\n/**\r\n * Get color class by file extension\r\n */\r\nfunction getExtensionColor(ext: string): string {\r\n const colors: Record<string, string> = {\r\n ts: 'text-blue-500',\r\n tsx: 'text-blue-500',\r\n js: 'text-yellow-500',\r\n jsx: 'text-yellow-500',\r\n py: 'text-green-500',\r\n go: 'text-cyan-500',\r\n rs: 'text-orange-500',\r\n java: 'text-red-500',\r\n swift: 'text-orange-500',\r\n };\r\n return colors[ext] || 'text-gray-500';\r\n}\r\n\r\nexport function FileList({\r\n files,\r\n selectedPath,\r\n onSelectFile,\r\n isLoading = false,\r\n isFetching = false,\r\n onRefresh,\r\n}: FileListProps) {\r\n const { formatMessage } = useIntl();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const debouncedSearchQuery = useDebounce(searchQuery, 300);\r\n const [isSearching, setIsSearching] = useState(false);\r\n\r\n // Filter files by search query\r\n const filteredFiles = useMemo(() => {\r\n if (!debouncedSearchQuery.trim()) return files;\r\n const query = debouncedSearchQuery.toLowerCase();\r\n return files.filter(f => f.path.toLowerCase().includes(query));\r\n }, [files, debouncedSearchQuery]);\r\n\r\n useEffect(() => {\r\n if (searchQuery !== debouncedSearchQuery) {\r\n setIsSearching(true);\r\n } else {\r\n setIsSearching(false);\r\n }\r\n }, [searchQuery, debouncedSearchQuery]);\r\n\r\n // Group files by directory\r\n const groupedFiles = useMemo(() => {\r\n const groups: Record<string, DeepWikiFile[]> = {};\r\n for (const file of filteredFiles) {\r\n const parts = file.path.replace(/\\\\/g, '/').split('/');\r\n const dir = parts.length > 1 ? parts.slice(0, -1).join('/') : 'root';\r\n if (!groups[dir]) {\r\n groups[dir] = [];\r\n }\r\n groups[dir].push(file);\r\n }\r\n return groups;\r\n }, [filteredFiles]);\r\n\r\n if (isLoading) {\r\n return (\r\n <Card className=\"p-4\">\r\n <div className=\"space-y-3\">\r\n {[1, 2, 3, 4, 5].map(i => (\r\n <div key={i} className=\"h-12 bg-muted animate-pulse rounded\" />\r\n ))}\r\n </div>\r\n </Card>\r\n );\r\n }\r\n\r\n return (\r\n <Card className=\"flex flex-col h-full\">\r\n {/* Header */}\r\n <div className=\"p-4 border-b border-border\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <h3 className=\"text-sm font-medium text-foreground flex items-center gap-2\">\r\n <FileText className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'deepwiki.files.title', defaultMessage: 'Documented Files' })}\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n {files.length}\r\n </Badge>\r\n </h3>\r\n {onRefresh && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-7 w-7 p-0\"\r\n onClick={() => onRefresh()}\r\n disabled={isFetching}\r\n >\r\n <RefreshCw className={cn('w-4 h-4', isFetching && 'animate-spin')} />\r\n </Button>\r\n )}\r\n </div>\r\n\r\n {/* Search */}\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={formatMessage({ id: 'deepwiki.files.search', defaultMessage: 'Search files...' })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9 h-8 text-sm\"\r\n />\r\n {isSearching && (\r\n <Loader2 className=\"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 animate-spin text-muted-foreground\" />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* File List */}\r\n <div className=\"flex-1 overflow-y-auto p-2\">\r\n {filteredFiles.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\r\n <FileText className=\"w-10 h-10 text-muted-foreground/40 mb-3\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {searchQuery\r\n ? formatMessage({ id: 'deepwiki.files.noResults', defaultMessage: 'No files match your search' })\r\n : formatMessage({ id: 'deepwiki.files.empty', defaultMessage: 'No documented files yet' })}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-1\">\r\n {Object.entries(groupedFiles).map(([dir, dirFiles]) => (\r\n <div key={dir}>\r\n {/* Directory header (collapsed for brevity) */}\r\n <div className=\"space-y-0.5\">\r\n {dirFiles.map(file => {\r\n const ext = getFileExtension(file.path);\r\n const extColor = getExtensionColor(ext);\r\n const isSelected = selectedPath === file.path;\r\n\r\n return (\r\n <button\r\n key={file.path}\r\n onClick={() => onSelectFile(file.path)}\r\n className={cn(\r\n 'w-full flex items-center gap-2 px-3 py-2 rounded-md text-left transition-colors',\r\n 'hover:bg-muted/70',\r\n isSelected && 'bg-primary/10 border border-primary/30'\r\n )}\r\n >\r\n <FileText className={cn('w-4 h-4 flex-shrink-0', extColor)} />\r\n <span className=\"flex-1 text-sm truncate font-mono\" title={file.path}>\r\n {getRelativePath(file.path)}\r\n </span>\r\n <div className=\"flex items-center gap-1.5 flex-shrink-0\">\r\n {file.docsGenerated ? (\r\n <CheckCircle className=\"w-3.5 h-3.5 text-green-500\" />\r\n ) : (\r\n <Clock className=\"w-3.5 h-3.5 text-yellow-500\" />\r\n )}\r\n {file.symbolsCount > 0 && (\r\n <Badge variant=\"outline\" className=\"text-xs px-1.5 py-0\">\r\n {file.symbolsCount}\r\n </Badge>\r\n )}\r\n </div>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\nexport default FileList;\r\n","/**\n * @import {Schema} from 'hast-util-sanitize'\n */\n\n// Couple of ARIA attributes allowed in several, but not all, places.\nconst aria = ['ariaDescribedBy', 'ariaLabel', 'ariaLabelledBy']\n\n/**\n * Default schema.\n *\n * Follows GitHub style sanitation.\n *\n * @type {Schema}\n */\nexport const defaultSchema = {\n ancestors: {\n tbody: ['table'],\n td: ['table'],\n th: ['table'],\n thead: ['table'],\n tfoot: ['table'],\n tr: ['table']\n },\n attributes: {\n a: [\n ...aria,\n // Note: these 3 are used by GFM footnotes, they do work on all links.\n 'dataFootnoteBackref',\n 'dataFootnoteRef',\n ['className', 'data-footnote-backref'],\n 'href'\n ],\n blockquote: ['cite'],\n // Note: this class is not normally allowed by GH, when manually writing\n // `code` as HTML in markdown, they adds it some other way.\n // We can’t do that, so we have to allow it.\n code: [['className', /^language-./]],\n del: ['cite'],\n div: ['itemScope', 'itemType'],\n dl: [...aria],\n // Note: this is used by GFM footnotes.\n h2: [['className', 'sr-only']],\n img: [...aria, 'longDesc', 'src'],\n // Note: `input` is not normally allowed by GH, when manually writing\n // it in markdown, they add it from tasklists some other way.\n // We can’t do that, so we have to allow it.\n input: [\n ['disabled', true],\n ['type', 'checkbox']\n ],\n ins: ['cite'],\n // Note: this class is not normally allowed by GH, when manually writing\n // `li` as HTML in markdown, they adds it some other way.\n // We can’t do that, so we have to allow it.\n li: [['className', 'task-list-item']],\n // Note: this class is not normally allowed by GH, when manually writing\n // `ol` as HTML in markdown, they adds it some other way.\n // We can’t do that, so we have to allow it.\n ol: [...aria, ['className', 'contains-task-list']],\n q: ['cite'],\n section: ['dataFootnotes', ['className', 'footnotes']],\n source: ['srcSet'],\n summary: [...aria],\n table: [...aria],\n // Note: this class is not normally allowed by GH, when manually writing\n // `ol` as HTML in markdown, they adds it some other way.\n // We can’t do that, so we have to allow it.\n ul: [...aria, ['className', 'contains-task-list']],\n '*': [\n 'abbr',\n 'accept',\n 'acceptCharset',\n 'accessKey',\n 'action',\n 'align',\n 'alt',\n 'axis',\n 'border',\n 'cellPadding',\n 'cellSpacing',\n 'char',\n 'charOff',\n 'charSet',\n 'checked',\n 'clear',\n 'colSpan',\n 'color',\n 'cols',\n 'compact',\n 'coords',\n 'dateTime',\n 'dir',\n // Note: `disabled` is technically allowed on all elements by GH.\n // But it is useless on everything except `input`.\n // Because `input`s are normally not allowed, but we allow them for\n // checkboxes due to tasklists, we allow `disabled` only there.\n 'encType',\n 'frame',\n 'hSpace',\n 'headers',\n 'height',\n 'hrefLang',\n 'htmlFor',\n 'id',\n 'isMap',\n 'itemProp',\n 'label',\n 'lang',\n 'maxLength',\n 'media',\n 'method',\n 'multiple',\n 'name',\n 'noHref',\n 'noShade',\n 'noWrap',\n 'open',\n 'prompt',\n 'readOnly',\n 'rev',\n 'rowSpan',\n 'rows',\n 'rules',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'span',\n 'start',\n 'summary',\n 'tabIndex',\n 'title',\n 'useMap',\n 'vAlign',\n 'value',\n 'width'\n ]\n },\n clobber: ['ariaDescribedBy', 'ariaLabelledBy', 'id', 'name'],\n clobberPrefix: 'user-content-',\n protocols: {\n cite: ['http', 'https'],\n href: ['http', 'https', 'irc', 'ircs', 'mailto', 'xmpp'],\n longDesc: ['http', 'https'],\n src: ['http', 'https']\n },\n required: {\n input: {disabled: true, type: 'checkbox'}\n },\n strip: ['script'],\n tagNames: [\n 'a',\n 'b',\n 'blockquote',\n 'br',\n 'code',\n 'dd',\n 'del',\n 'details',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n // Note: `input` is not normally allowed by GH, when manually writing\n // it in markdown, they add it from tasklists some other way.\n // We can’t do that, so we have to allow it.\n 'input',\n 'ins',\n 'kbd',\n 'li',\n 'ol',\n 'p',\n 'picture',\n 'pre',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'source',\n 'span',\n 'strike',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'tr',\n 'tt',\n 'ul',\n 'var'\n ]\n}\n","/**\n * @import {\n * Comment,\n * Doctype,\n * ElementContent,\n * Element,\n * Nodes,\n * Properties,\n * RootContent,\n * Root,\n * Text\n * } from 'hast'\n */\n\n/**\n * @typedef {[string, ...Array<Exclude<Properties[keyof Properties], Array<any>> | RegExp>] | string} PropertyDefinition\n * Definition for a property.\n *\n * @typedef Schema\n * Schema that defines what nodes and properties are allowed.\n *\n * The default schema is `defaultSchema`, which follows how GitHub cleans.\n * If any top-level key is missing in the given schema, the corresponding\n * value of the default schema is used.\n *\n * To extend the standard schema with a few changes, clone `defaultSchema`\n * like so:\n *\n * ```js\n * import deepmerge from 'deepmerge'\n * import {h} from 'hastscript'\n * import {defaultSchema, sanitize} from 'hast-util-sanitize'\n *\n * // This allows `className` on all elements.\n * const schema = deepmerge(defaultSchema, {attributes: {'*': ['className']}})\n *\n * const tree = sanitize(h('div', {className: ['foo']}), schema)\n *\n * // `tree` still has `className`.\n * console.log(tree)\n * // {\n * // type: 'element',\n * // tagName: 'div',\n * // properties: {className: ['foo']},\n * // children: []\n * // }\n * ```\n * @property {boolean | null | undefined} [allowComments=false]\n * Whether to allow comment nodes (default: `false`).\n *\n * For example:\n *\n * ```js\n * allowComments: true\n * ```\n * @property {boolean | null | undefined} [allowDoctypes=false]\n * Whether to allow doctype nodes (default: `false`).\n *\n * For example:\n *\n * ```js\n * allowDoctypes: true\n * ```\n * @property {Record<string, Array<string>> | null | undefined} [ancestors]\n * Map of tag names to a list of tag names which are required ancestors\n * (default: `defaultSchema.ancestors`).\n *\n * Elements with these tag names will be ignored if they occur outside of one\n * of their allowed parents.\n *\n * For example:\n *\n * ```js\n * ancestors: {\n * tbody: ['table'],\n * // …\n * tr: ['table']\n * }\n * ```\n * @property {Record<string, Array<PropertyDefinition>> | null | undefined} [attributes]\n * Map of tag names to allowed property names (default:\n * `defaultSchema.attributes`).\n *\n * The special key `'*'` as a tag name defines property names allowed on all\n * elements.\n *\n * The special value `'data*'` as a property name can be used to allow all\n * `data` properties.\n *\n * For example:\n *\n * ```js\n * attributes: {\n * 'ariaDescribedBy', 'ariaLabel', 'ariaLabelledBy', …, 'href'\n * // …\n * '*': [\n * 'abbr',\n * 'accept',\n * 'acceptCharset',\n * // …\n * 'vAlign',\n * 'value',\n * 'width'\n * ]\n * }\n * ```\n *\n * Instead of a single string in the array, which allows any property value\n * for the field, you can use an array to allow several values.\n * For example, `input: ['type']` allows `type` set to any value on `input`s.\n * But `input: [['type', 'checkbox', 'radio']]` allows `type` when set to\n * `'checkbox'` or `'radio'`.\n *\n * You can use regexes, so for example `span: [['className', /^hljs-/]]`\n * allows any class that starts with `hljs-` on `span`s.\n *\n * When comma- or space-separated values are used (such as `className`), each\n * value in is checked individually.\n * For example, to allow certain classes on `span`s for syntax highlighting,\n * use `span: [['className', 'number', 'operator', 'token']]`.\n * This will allow `'number'`, `'operator'`, and `'token'` classes, but drop\n * others.\n * @property {Array<string> | null | undefined} [clobber]\n * List of property names that clobber (default: `defaultSchema.clobber`).\n *\n * For example:\n *\n * ```js\n * clobber: ['ariaDescribedBy', 'ariaLabelledBy', 'id', 'name']\n * ```\n * @property {string | null | undefined} [clobberPrefix]\n * Prefix to use before clobbering properties (default:\n * `defaultSchema.clobberPrefix`).\n *\n * For example:\n *\n * ```js\n * clobberPrefix: 'user-content-'\n * ```\n * @property {Record<string, Array<string> | null | undefined> | null | undefined} [protocols]\n * Map of *property names* to allowed protocols (default:\n * `defaultSchema.protocols`).\n *\n * This defines URLs that are always allowed to have local URLs (relative to\n * the current website, such as `this`, `#this`, `/this`, or `?this`), and\n * only allowed to have remote URLs (such as `https://example.com`) if they\n * use a known protocol.\n *\n * For example:\n *\n * ```js\n * protocols: {\n * cite: ['http', 'https'],\n * // …\n * src: ['http', 'https']\n * }\n * ```\n * @property {Record<string, Record<string, Properties[keyof Properties]>> | null | undefined} [required]\n * Map of tag names to required property names with a default value\n * (default: `defaultSchema.required`).\n *\n * This defines properties that must be set.\n * If a field does not exist (after the element was made safe), these will be\n * added with the given value.\n *\n * For example:\n *\n * ```js\n * required: {\n * input: {disabled: true, type: 'checkbox'}\n * }\n * ```\n *\n * > 👉 **Note**: properties are first checked based on `schema.attributes`,\n * > then on `schema.required`.\n * > That means properties could be removed by `attributes` and then added\n * > again with `required`.\n * @property {Array<string> | null | undefined} [strip]\n * List of tag names to strip from the tree (default: `defaultSchema.strip`).\n *\n * By default, unsafe elements (those not in `schema.tagNames`) are replaced\n * by what they contain.\n * This option can drop their contents.\n *\n * For example:\n *\n * ```js\n * strip: ['script']\n * ```\n * @property {Array<string> | null | undefined} [tagNames]\n * List of allowed tag names (default: `defaultSchema.tagNames`).\n *\n * For example:\n *\n * ```js\n * tagNames: [\n * 'a',\n * 'b',\n * // …\n * 'ul',\n * 'var'\n * ]\n * ```\n *\n * @typedef State\n * Info passed around.\n * @property {Readonly<Schema>} schema\n * Schema.\n * @property {Array<string>} stack\n * Tag names of ancestors.\n */\n\nimport structuredClone from '@ungap/structured-clone'\nimport {position} from 'unist-util-position'\nimport {defaultSchema} from './schema.js'\n\nconst own = {}.hasOwnProperty\n\n/**\n * Sanitize a tree.\n *\n * @param {Readonly<Nodes>} node\n * Unsafe tree.\n * @param {Readonly<Schema> | null | undefined} [options]\n * Configuration (default: `defaultSchema`).\n * @returns {Nodes}\n * New, safe tree.\n */\nexport function sanitize(node, options) {\n /** @type {Nodes} */\n let result = {type: 'root', children: []}\n\n /** @type {State} */\n const state = {\n schema: options ? {...defaultSchema, ...options} : defaultSchema,\n stack: []\n }\n const replace = transform(state, node)\n\n if (replace) {\n if (Array.isArray(replace)) {\n if (replace.length === 1) {\n result = replace[0]\n } else {\n result.children = replace\n }\n } else {\n result = replace\n }\n }\n\n return result\n}\n\n/**\n * Sanitize `node`.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<unknown>} node\n * Unsafe node.\n * @returns {Array<ElementContent> | Nodes | undefined}\n * Safe result.\n */\nfunction transform(state, node) {\n if (node && typeof node === 'object') {\n const unsafe = /** @type {Record<string, Readonly<unknown>>} */ (node)\n const type = typeof unsafe.type === 'string' ? unsafe.type : ''\n\n switch (type) {\n case 'comment': {\n return comment(state, unsafe)\n }\n\n case 'doctype': {\n return doctype(state, unsafe)\n }\n\n case 'element': {\n return element(state, unsafe)\n }\n\n case 'root': {\n return root(state, unsafe)\n }\n\n case 'text': {\n return text(state, unsafe)\n }\n\n default:\n }\n }\n}\n\n/**\n * Make a safe comment.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe comment-like value.\n * @returns {Comment | undefined}\n * Safe comment (if with `allowComments`).\n */\nfunction comment(state, unsafe) {\n if (state.schema.allowComments) {\n // See <https://html.spec.whatwg.org/multipage/parsing.html#serialising-html-fragments>\n const result = typeof unsafe.value === 'string' ? unsafe.value : ''\n const index = result.indexOf('-->')\n const value = index < 0 ? result : result.slice(0, index)\n\n /** @type {Comment} */\n const node = {type: 'comment', value}\n\n patch(node, unsafe)\n\n return node\n }\n}\n\n/**\n * Make a safe doctype.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe doctype-like value.\n * @returns {Doctype | undefined}\n * Safe doctype (if with `allowDoctypes`).\n */\nfunction doctype(state, unsafe) {\n if (state.schema.allowDoctypes) {\n /** @type {Doctype} */\n const node = {type: 'doctype'}\n\n patch(node, unsafe)\n\n return node\n }\n}\n\n/**\n * Make a safe element.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe element-like value.\n * @returns {Array<ElementContent> | Element | undefined}\n * Safe element.\n */\nfunction element(state, unsafe) {\n const name = typeof unsafe.tagName === 'string' ? unsafe.tagName : ''\n\n state.stack.push(name)\n\n const content = /** @type {Array<ElementContent>} */ (\n children(state, unsafe.children)\n )\n const properties_ = properties(state, unsafe.properties)\n\n state.stack.pop()\n\n let safeElement = false\n\n if (\n name &&\n name !== '*' &&\n (!state.schema.tagNames || state.schema.tagNames.includes(name))\n ) {\n safeElement = true\n\n // Some nodes can break out of their context if they don’t have a certain\n // ancestor.\n if (state.schema.ancestors && own.call(state.schema.ancestors, name)) {\n const ancestors = state.schema.ancestors[name]\n let index = -1\n\n safeElement = false\n\n while (++index < ancestors.length) {\n if (state.stack.includes(ancestors[index])) {\n safeElement = true\n }\n }\n }\n }\n\n if (!safeElement) {\n return state.schema.strip && !state.schema.strip.includes(name)\n ? content\n : undefined\n }\n\n /** @type {Element} */\n const node = {\n type: 'element',\n tagName: name,\n properties: properties_,\n children: content\n }\n\n patch(node, unsafe)\n\n return node\n}\n\n/**\n * Make a safe root.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe root-like value.\n * @returns {Root}\n * Safe root.\n */\nfunction root(state, unsafe) {\n const content = /** @type {Array<RootContent>} */ (\n children(state, unsafe.children)\n )\n\n /** @type {Root} */\n const node = {type: 'root', children: content}\n\n patch(node, unsafe)\n\n return node\n}\n\n/**\n * Make a safe text.\n *\n * @param {State} _\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe text-like value.\n * @returns {Text}\n * Safe text.\n */\nfunction text(_, unsafe) {\n const value = typeof unsafe.value === 'string' ? unsafe.value : ''\n /** @type {Text} */\n const node = {type: 'text', value}\n\n patch(node, unsafe)\n\n return node\n}\n\n/**\n * Make children safe.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<unknown>} children\n * Unsafe value.\n * @returns {Array<Nodes>}\n * Safe children.\n */\nfunction children(state, children) {\n /** @type {Array<Nodes>} */\n const results = []\n\n if (Array.isArray(children)) {\n const childrenUnknown = /** @type {Array<Readonly<unknown>>} */ (children)\n let index = -1\n\n while (++index < childrenUnknown.length) {\n const value = transform(state, childrenUnknown[index])\n\n if (value) {\n if (Array.isArray(value)) {\n results.push(...value)\n } else {\n results.push(value)\n }\n }\n }\n }\n\n return results\n}\n\n/**\n * Make element properties safe.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<unknown>} properties\n * Unsafe value.\n * @returns {Properties}\n * Safe value.\n */\nfunction properties(state, properties) {\n const tagName = state.stack[state.stack.length - 1]\n const attributes = state.schema.attributes\n const required = state.schema.required\n const specific =\n attributes && own.call(attributes, tagName)\n ? attributes[tagName]\n : undefined\n const defaults =\n attributes && own.call(attributes, '*') ? attributes['*'] : undefined\n const properties_ =\n /** @type {Readonly<Record<string, Readonly<unknown>>>} */ (\n properties && typeof properties === 'object' ? properties : {}\n )\n /** @type {Properties} */\n const result = {}\n /** @type {string} */\n let key\n\n for (key in properties_) {\n if (own.call(properties_, key)) {\n const unsafe = properties_[key]\n let safe = propertyValue(\n state,\n findDefinition(specific, key),\n key,\n unsafe\n )\n\n if (safe === null || safe === undefined) {\n safe = propertyValue(state, findDefinition(defaults, key), key, unsafe)\n }\n\n if (safe !== null && safe !== undefined) {\n result[key] = safe\n }\n }\n }\n\n if (required && own.call(required, tagName)) {\n const properties = required[tagName]\n\n for (key in properties) {\n if (own.call(properties, key) && !own.call(result, key)) {\n result[key] = properties[key]\n }\n }\n }\n\n return result\n}\n\n/**\n * Sanitize a property value.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<PropertyDefinition> | undefined} definition\n * Definition.\n * @param {string} key\n * Field name.\n * @param {Readonly<unknown>} value\n * Unsafe value (but an array).\n * @returns {Array<number | string> | boolean | number | string | undefined}\n * Safe value.\n */\nfunction propertyValue(state, definition, key, value) {\n return definition\n ? Array.isArray(value)\n ? propertyValueMany(state, definition, key, value)\n : propertyValuePrimitive(state, definition, key, value)\n : undefined\n}\n\n/**\n * Sanitize a property value which is a list.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<PropertyDefinition>} definition\n * Definition.\n * @param {string} key\n * Field name.\n * @param {Readonly<Array<Readonly<unknown>>>} values\n * Unsafe value (but an array).\n * @returns {Array<number | string>}\n * Safe value.\n */\nfunction propertyValueMany(state, definition, key, values) {\n let index = -1\n /** @type {Array<number | string>} */\n const result = []\n\n while (++index < values.length) {\n const value = propertyValuePrimitive(state, definition, key, values[index])\n\n if (typeof value === 'number' || typeof value === 'string') {\n result.push(value)\n }\n }\n\n return result\n}\n\n/**\n * Sanitize a property value which is a primitive.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<PropertyDefinition>} definition\n * Definition.\n * @param {string} key\n * Field name.\n * @param {Readonly<unknown>} value\n * Unsafe value (but not an array).\n * @returns {boolean | number | string | undefined}\n * Safe value.\n */\nfunction propertyValuePrimitive(state, definition, key, value) {\n if (\n typeof value !== 'boolean' &&\n typeof value !== 'number' &&\n typeof value !== 'string'\n ) {\n return\n }\n\n if (!safeProtocol(state, key, value)) {\n return\n }\n\n // Just a string, or only one item in an array, means all values are OK.\n // More than one item means an allow list.\n if (typeof definition === 'object' && definition.length > 1) {\n let ok = false\n let index = 0 // Ignore `key`, which is the first item.\n\n while (++index < definition.length) {\n const allowed = definition[index]\n\n // Expression.\n if (allowed && typeof allowed === 'object' && 'flags' in allowed) {\n if (allowed.test(String(value))) {\n ok = true\n break\n }\n }\n // Primitive.\n else if (allowed === value) {\n ok = true\n break\n }\n }\n\n if (!ok) return\n }\n\n return state.schema.clobber &&\n state.schema.clobberPrefix &&\n state.schema.clobber.includes(key)\n ? state.schema.clobberPrefix + value\n : value\n}\n\n/**\n * Check whether `value` is a safe URL.\n *\n * @param {State} state\n * Info passed around.\n * @param {string} key\n * Field name.\n * @param {Readonly<unknown>} value\n * Unsafe value.\n * @returns {boolean}\n * Whether it’s a safe value.\n */\nfunction safeProtocol(state, key, value) {\n const protocols =\n state.schema.protocols && own.call(state.schema.protocols, key)\n ? state.schema.protocols[key]\n : undefined\n\n // No protocols defined? Then everything is fine.\n if (!protocols || protocols.length === 0) {\n return true\n }\n\n const url = String(value)\n const colon = url.indexOf(':')\n const questionMark = url.indexOf('?')\n const numberSign = url.indexOf('#')\n const slash = url.indexOf('/')\n\n if (\n colon < 0 ||\n // If the first colon is after a `?`, `#`, or `/`, it’s not a protocol.\n (slash > -1 && colon > slash) ||\n (questionMark > -1 && colon > questionMark) ||\n (numberSign > -1 && colon > numberSign)\n ) {\n return true\n }\n\n let index = -1\n\n while (++index < protocols.length) {\n const protocol = protocols[index]\n\n if (\n colon === protocol.length &&\n url.slice(0, protocol.length) === protocol\n ) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Add data and position.\n *\n * @param {Nodes} node\n * Node to patch safe data and position on.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe node-like value.\n * @returns {undefined}\n * Nothing.\n */\nfunction patch(node, unsafe) {\n const cleanPosition = position(\n // @ts-expect-error: looks like a node.\n unsafe\n )\n\n if (unsafe.data) {\n node.data = structuredClone(unsafe.data)\n }\n\n if (cleanPosition) node.position = cleanPosition\n}\n\n/**\n *\n * @param {Readonly<Array<PropertyDefinition>> | undefined} definitions\n * @param {string} key\n * @returns {Readonly<PropertyDefinition> | undefined}\n */\nfunction findDefinition(definitions, key) {\n /** @type {PropertyDefinition | undefined} */\n let dataDefault\n let index = -1\n\n if (definitions) {\n while (++index < definitions.length) {\n const entry = definitions[index]\n const name = typeof entry === 'string' ? entry : entry[0]\n\n if (name === key) {\n return entry\n }\n\n if (name === 'data*') dataDefault = entry\n }\n }\n\n if (key.length > 4 && key.slice(0, 4).toLowerCase() === 'data') {\n return dataDefault\n }\n}\n","/**\n * @typedef {import('hast').Root} Root\n * @typedef {import('hast-util-sanitize').Schema} Schema\n */\n\nimport {sanitize} from 'hast-util-sanitize'\n\n/**\n * Sanitize HTML.\n *\n * @param {Schema | null | undefined} [options]\n * Configuration (optional).\n * @returns\n * Transform.\n */\nexport default function rehypeSanitize(options) {\n /**\n * @param {Root} tree\n * Tree.\n * @returns {Root}\n * New tree.\n */\n return function (tree) {\n // Assume root in -> root out.\n const result = /** @type {Root} */ (sanitize(tree, options))\n return result\n }\n}\n","// ========================================\r\n// DocumentViewer Component\r\n// ========================================\r\n// Displays DeepWiki documentation content with table of contents\r\n\r\nimport { useMemo, useState, useCallback } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { FileText, Hash, Clock, Sparkles, AlertCircle, Link2, Check } from 'lucide-react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport remarkGfm from 'remark-gfm';\r\nimport rehypeSanitize from 'rehype-sanitize';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { cn } from '@/lib/utils';\r\nimport type { DeepWikiSymbol, DeepWikiDoc } from '@/hooks/useDeepWiki';\r\n\r\nexport interface DocumentViewerProps {\r\n doc: DeepWikiDoc | null;\r\n content: string;\r\n symbols: DeepWikiSymbol[];\r\n isLoading?: boolean;\r\n error?: Error | null;\r\n /** Current file path for generating deep links */\r\n filePath?: string;\r\n}\r\n\r\n/**\r\n * Get symbol type icon\r\n */\r\nfunction getSymbolTypeIcon(type: string): { symbol: string; label: string } {\r\n const icons: Record<string, { symbol: string; label: string }> = {\r\n function: { symbol: 'λ', label: 'Function' },\r\n async_function: { symbol: 'λ', label: 'Async Function' },\r\n class: { symbol: '◇', label: 'Class' },\r\n method: { symbol: '◈', label: 'Method' },\r\n interface: { symbol: '△', label: 'Interface' },\r\n variable: { symbol: '•', label: 'Variable' },\r\n constant: { symbol: '⬡', label: 'Constant' },\r\n };\r\n return icons[type] || { symbol: '•', label: 'Symbol' };\r\n}\r\n\r\n/**\r\n * Get symbol type color\r\n */\r\nfunction getSymbolTypeColor(type: string): string {\r\n const colors: Record<string, string> = {\r\n function: 'text-blue-500',\r\n async_function: 'text-blue-400',\r\n class: 'text-purple-500',\r\n method: 'text-purple-400',\r\n interface: 'text-teal-500',\r\n variable: 'text-gray-500',\r\n constant: 'text-amber-500',\r\n };\r\n return colors[type] || 'text-gray-500';\r\n}\r\n\r\n/**\r\n * Markdown components with custom styling\r\n */\r\nconst markdownComponents = {\r\n h1: ({ children }: { children?: React.ReactNode }) => (\r\n <h1 className=\"text-xl font-bold mt-6 mb-3 text-foreground\">{children}</h1>\r\n ),\r\n h2: ({ children }: { children?: React.ReactNode }) => (\r\n <h2 className=\"text-lg font-semibold mt-5 mb-2 text-foreground\">{children}</h2>\r\n ),\r\n h3: ({ children }: { children?: React.ReactNode }) => (\r\n <h3 className=\"text-base font-semibold mt-4 mb-2 text-foreground\">{children}</h3>\r\n ),\r\n p: ({ children }: { children?: React.ReactNode }) => (\r\n <p className=\"mb-3 leading-relaxed text-foreground/90\">{children}</p>\r\n ),\r\n a: ({ href, children }: { href?: string; children?: React.ReactNode }) => (\r\n <a\r\n href={href}\r\n className=\"text-primary hover:underline\"\r\n target={href?.startsWith('http') ? '_blank' : undefined}\r\n rel={href?.startsWith('http') ? 'noopener noreferrer' : undefined}\r\n >\r\n {children}\r\n </a>\r\n ),\r\n code: ({ className, children }: { className?: string; children?: React.ReactNode }) => {\r\n const isInline = !className;\r\n if (isInline) {\r\n return (\r\n <code className=\"bg-muted px-1.5 py-0.5 rounded text-sm font-mono\">\r\n {children}\r\n </code>\r\n );\r\n }\r\n return (\r\n <code className={cn('block bg-muted p-3 rounded-md text-sm font-mono overflow-x-auto', className)}>\r\n {children}\r\n </code>\r\n );\r\n },\r\n pre: ({ children }: { children?: React.ReactNode }) => (\r\n <pre className=\"bg-muted p-4 rounded-lg my-4 overflow-x-auto\">\r\n {children}\r\n </pre>\r\n ),\r\n ul: ({ children }: { children?: React.ReactNode }) => (\r\n <ul className=\"list-disc list-inside mb-3 space-y-1\">{children}</ul>\r\n ),\r\n ol: ({ children }: { children?: React.ReactNode }) => (\r\n <ol className=\"list-decimal list-inside mb-3 space-y-1\">{children}</ol>\r\n ),\r\n blockquote: ({ children }: { children?: React.ReactNode }) => (\r\n <blockquote className=\"border-l-4 border-primary/50 pl-4 my-4 italic text-muted-foreground\">\r\n {children}\r\n </blockquote>\r\n ),\r\n table: ({ children }: { children?: React.ReactNode }) => (\r\n <div className=\"overflow-x-auto my-4\">\r\n <table className=\"min-w-full border border-border\">{children}</table>\r\n </div>\r\n ),\r\n thead: ({ children }: { children?: React.ReactNode }) => (\r\n <thead className=\"bg-muted\">{children}</thead>\r\n ),\r\n th: ({ children }: { children?: React.ReactNode }) => (\r\n <th className=\"border border-border px-3 py-2 text-left font-medium\">{children}</th>\r\n ),\r\n td: ({ children }: { children?: React.ReactNode }) => (\r\n <td className=\"border border-border px-3 py-2\">{children}</td>\r\n ),\r\n};\r\n\r\nexport function DocumentViewer({\r\n doc,\r\n content,\r\n symbols,\r\n isLoading = false,\r\n error = null,\r\n filePath,\r\n}: DocumentViewerProps) {\r\n const { formatMessage } = useIntl();\r\n const [copiedSymbol, setCopiedSymbol] = useState<string | null>(null);\r\n\r\n // Copy deep link to clipboard\r\n const copyDeepLink = useCallback((symbolName: string, anchor: string) => {\r\n const url = new URL(window.location.href);\r\n if (filePath) {\r\n url.searchParams.set('file', filePath);\r\n }\r\n url.hash = anchor.replace('#', '');\r\n\r\n navigator.clipboard.writeText(url.toString()).then(() => {\r\n setCopiedSymbol(symbolName);\r\n setTimeout(() => setCopiedSymbol(null), 2000);\r\n });\r\n }, [filePath]);\r\n\r\n // Parse HTML comments for symbol metadata\r\n const symbolSections = useMemo(() => {\r\n if (!content) return [];\r\n\r\n // Extract sections marked with deepwiki-symbol-start/end comments\r\n const regex = /<!-- deepwiki-symbol-start name=\"([^\"]+)\" type=\"([^\"]+)\" -->([\\s\\S]*?)<!-- deepwiki-symbol-end -->/g;\r\n const sections: Array<{ name: string; type: string; content: string }> = [];\r\n\r\n let match;\r\n while ((match = regex.exec(content)) !== null) {\r\n sections.push({\r\n name: match[1],\r\n type: match[2],\r\n content: match[3].trim(),\r\n });\r\n }\r\n\r\n // If no sections found, treat entire content as one section\r\n if (sections.length === 0 && content.trim()) {\r\n sections.push({\r\n name: 'Documentation',\r\n type: 'document',\r\n content: content.trim(),\r\n });\r\n }\r\n\r\n return sections;\r\n }, [content]);\r\n\r\n // Loading state\r\n if (isLoading) {\r\n return (\r\n <Card className=\"flex-1 p-6\">\r\n <div className=\"space-y-4 animate-pulse\">\r\n <div className=\"h-8 bg-muted rounded w-1/3\" />\r\n <div className=\"h-4 bg-muted rounded w-2/3\" />\r\n <div className=\"h-4 bg-muted rounded w-1/2\" />\r\n <div className=\"h-32 bg-muted rounded mt-6\" />\r\n <div className=\"h-4 bg-muted rounded w-3/4\" />\r\n <div className=\"h-4 bg-muted rounded w-2/3\" />\r\n </div>\r\n </Card>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <Card className=\"flex-1 p-6 flex flex-col items-center justify-center text-center\">\r\n <AlertCircle className=\"w-12 h-12 text-destructive/50 mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'deepwiki.viewer.error.title', defaultMessage: 'Error Loading Document' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">{error.message}</p>\r\n </Card>\r\n );\r\n }\r\n\r\n // Empty state\r\n if (!doc && !content) {\r\n return (\r\n <Card className=\"flex-1 p-6 flex flex-col items-center justify-center text-center\">\r\n <FileText className=\"w-12 h-12 text-muted-foreground/30 mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'deepwiki.viewer.empty.title', defaultMessage: 'Select a File' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'deepwiki.viewer.empty.message', defaultMessage: 'Choose a file from the list to view its documentation' })}\r\n </p>\r\n </Card>\r\n );\r\n }\r\n\r\n return (\r\n <Card className=\"flex-1 flex flex-col overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"p-4 border-b border-border\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div>\r\n <h2 className=\"text-lg font-semibold text-foreground flex items-center gap-2\">\r\n <FileText className=\"w-5 h-5 text-primary\" />\r\n <span className=\"font-mono text-sm\" title={doc?.path}>\r\n {doc?.path?.split('/').pop() || 'Documentation'}\r\n </span>\r\n </h2>\r\n {doc && (\r\n <div className=\"flex items-center gap-3 mt-1.5 text-xs text-muted-foreground\">\r\n {doc.generatedAt && (\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {new Date(doc.generatedAt).toLocaleString()}\r\n </span>\r\n )}\r\n {doc.llmTool && (\r\n <span className=\"flex items-center gap-1\">\r\n <Sparkles className=\"w-3 h-3\" />\r\n {doc.llmTool}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Main content area with TOC sidebar */}\r\n <div className=\"flex-1 flex overflow-hidden\">\r\n {/* Document content */}\r\n <div className=\"flex-1 overflow-y-auto p-6\">\r\n {/* Symbols list */}\r\n {symbols.length > 0 && (\r\n <div className=\"mb-6 flex flex-wrap gap-2\">\r\n {symbols.map(symbol => {\r\n const iconInfo = getSymbolTypeIcon(symbol.type);\r\n return (\r\n <a\r\n key={symbol.name}\r\n href={`#${symbol.anchor.replace('#', '')}`}\r\n className={cn(\r\n 'inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium',\r\n 'bg-muted/50 hover:bg-muted transition-colors',\r\n getSymbolTypeColor(symbol.type)\r\n )}\r\n aria-label={`${iconInfo.label}: ${symbol.name}`}\r\n >\r\n <span aria-hidden=\"true\">{iconInfo.symbol}</span>\r\n <span>{symbol.name}</span>\r\n <Badge variant=\"outline\" className=\"text-[10px] px-1\">\r\n {symbol.type}\r\n </Badge>\r\n </a>\r\n );\r\n })}\r\n </div>\r\n )}\r\n\r\n {/* Document sections with safe markdown rendering */}\r\n <div className=\"space-y-6\">\r\n {symbolSections.map((section, idx) => (\r\n <section\r\n key={`${section.name}-${idx}`}\r\n id={section.name.toLowerCase().replace(/\\s+/g, '-')}\r\n className=\"scroll-mt-4\"\r\n >\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeSanitize]}\r\n components={markdownComponents}\r\n >\r\n {section.content}\r\n </ReactMarkdown>\r\n </section>\r\n ))}\r\n\r\n {symbolSections.length === 0 && content && (\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeSanitize]}\r\n components={markdownComponents}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Table of contents sidebar (if symbols exist) */}\r\n {symbols.length > 0 && (\r\n <div className=\"w-48 border-l border-border p-4 overflow-y-auto hidden lg:block\">\r\n <h4 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-3 flex items-center gap-2\">\r\n <Hash className=\"w-3 h-3\" />\r\n {formatMessage({ id: 'deepwiki.viewer.toc', defaultMessage: 'Symbols' })}\r\n </h4>\r\n <nav className=\"space-y-1\" role=\"list\" aria-label=\"Document symbols\">\r\n {symbols.map(symbol => {\r\n const iconInfo = getSymbolTypeIcon(symbol.type);\r\n return (\r\n <div\r\n key={symbol.name}\r\n className=\"group flex items-center gap-1\"\r\n >\r\n <a\r\n href={`#${symbol.anchor.replace('#', '')}`}\r\n className={cn(\r\n 'flex-1 text-xs py-1.5 px-2 rounded transition-colors',\r\n 'text-muted-foreground hover:text-foreground hover:bg-muted/50',\r\n 'font-mono'\r\n )}\r\n role=\"listitem\"\r\n aria-label={`${iconInfo.label}: ${symbol.name}`}\r\n >\r\n <span className={cn('mr-1', getSymbolTypeColor(symbol.type))} aria-hidden=\"true\">\r\n {iconInfo.symbol}\r\n </span>\r\n {symbol.name}\r\n </a>\r\n <button\r\n onClick={() => copyDeepLink(symbol.name, symbol.anchor)}\r\n className={cn(\r\n 'opacity-0 group-hover:opacity-100 p-1 rounded transition-all',\r\n 'hover:bg-muted/50',\r\n copiedSymbol === symbol.name\r\n ? 'text-green-500'\r\n : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n aria-label={\r\n copiedSymbol === symbol.name\r\n ? formatMessage({ id: 'deepwiki.viewer.linkCopied', defaultMessage: 'Link copied' })\r\n : formatMessage({ id: 'deepwiki.viewer.copyLink', defaultMessage: 'Copy deep link to {name}' }, { name: symbol.name })\r\n }\r\n >\r\n {copiedSymbol === symbol.name ? (\r\n <Check className=\"w-3 h-3\" aria-hidden=\"true\" />\r\n ) : (\r\n <Link2 className=\"w-3 h-3\" aria-hidden=\"true\" />\r\n )}\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n )}\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\nexport default DocumentViewer;\r\n","// ========================================\r\n// DeepWiki Page\r\n// ========================================\r\n// Documentation deep-linking page with file browser and document viewer\r\n\r\nimport { useState, useEffect, useRef, useCallback } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport { BookOpen, RefreshCw, FileText, Hash, BarChart3 } from 'lucide-react';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\r\nimport { FileList } from '@/components/deepwiki/FileList';\r\nimport { DocumentViewer } from '@/components/deepwiki/DocumentViewer';\r\nimport {\r\n useDeepWikiFiles,\r\n useDeepWikiDoc,\r\n useDeepWikiStats,\r\n useDeepWikiSearch,\r\n} from '@/hooks/useDeepWiki';\r\nimport { cn } from '@/lib/utils';\r\n\r\ntype ActiveTab = 'documents' | 'index' | 'stats';\r\n\r\n/**\r\n * Stats card component\r\n */\r\nfunction StatsCard({\r\n label,\r\n value,\r\n icon: Icon,\r\n color,\r\n}: {\r\n label: string;\r\n value: number;\r\n icon: React.ComponentType<{ className?: string }>;\r\n color: string;\r\n}) {\r\n return (\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={cn('p-2 rounded-lg', color)}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div>\r\n <p className=\"text-2xl font-bold text-foreground\">{value}</p>\r\n <p className=\"text-xs text-muted-foreground\">{label}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\nexport function DeepWikiPage() {\r\n const { formatMessage } = useIntl();\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const [activeTab, setActiveTab] = useState<ActiveTab>('documents');\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const scrollAttemptedRef = useRef(false);\r\n\r\n // Get file from URL query parameter\r\n const fileParam = searchParams.get('file');\r\n const hashParam = window.location.hash.slice(1); // Remove leading #\r\n\r\n const [selectedFile, setSelectedFile] = useState<string | null>(fileParam);\r\n\r\n // Data hooks\r\n const {\r\n files,\r\n isLoading: filesLoading,\r\n isFetching: filesFetching,\r\n refetch: refetchFiles,\r\n } = useDeepWikiFiles();\r\n\r\n const {\r\n stats,\r\n isLoading: statsLoading,\r\n refetch: refetchStats,\r\n } = useDeepWikiStats();\r\n\r\n const {\r\n doc,\r\n content,\r\n symbols,\r\n isLoading: docLoading,\r\n error: docError,\r\n } = useDeepWikiDoc(selectedFile);\r\n\r\n const {\r\n symbols: searchResults,\r\n isLoading: searchLoading,\r\n } = useDeepWikiSearch(searchQuery, { enabled: activeTab === 'index' });\r\n\r\n // Handle file selection with URL sync\r\n const handleSelectFile = useCallback((filePath: string) => {\r\n setSelectedFile(filePath);\r\n setSearchParams({ file: filePath });\r\n scrollAttemptedRef.current = false; // Reset scroll flag for new file\r\n }, [setSearchParams]);\r\n\r\n // Scroll to symbol anchor when content loads\r\n useEffect(() => {\r\n if (hashParam && content && !docLoading && !scrollAttemptedRef.current) {\r\n scrollAttemptedRef.current = true;\r\n // Small delay to ensure DOM is rendered\r\n setTimeout(() => {\r\n const element = document.getElementById(hashParam);\r\n if (element) {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n }, 100);\r\n }\r\n }, [hashParam, content, docLoading]);\r\n\r\n // Refresh all data\r\n const handleRefresh = () => {\r\n refetchFiles();\r\n refetchStats();\r\n };\r\n\r\n return (\r\n <div className=\"h-full flex flex-col space-y-4\">\r\n {/* Page Header */}\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\r\n <BookOpen className=\"w-6 h-6 text-primary\" />\r\n {formatMessage({ id: 'deepwiki.title', defaultMessage: 'DeepWiki' })}\r\n </h1>\r\n <p className=\"text-muted-foreground mt-1\">\r\n {formatMessage({ id: 'deepwiki.description', defaultMessage: 'Code documentation with deep-linking to source symbols' })}\r\n </p>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleRefresh}\r\n disabled={filesFetching}\r\n >\r\n <RefreshCw className={cn('w-4 h-4 mr-2', filesFetching && 'animate-spin')} />\r\n {formatMessage({ id: 'common.actions.refresh', defaultMessage: 'Refresh' })}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Tabbed Interface */}\r\n <TabsNavigation\r\n value={activeTab}\r\n onValueChange={(value) => setActiveTab(value as ActiveTab)}\r\n tabs={[\r\n { value: 'documents', label: formatMessage({ id: 'deepwiki.tabs.documents', defaultMessage: 'Documents' }) },\r\n { value: 'index', label: formatMessage({ id: 'deepwiki.tabs.index', defaultMessage: 'Symbol Index' }) },\r\n { value: 'stats', label: formatMessage({ id: 'deepwiki.tabs.stats', defaultMessage: 'Statistics' }) },\r\n ]}\r\n />\r\n\r\n {/* Tab Content: Documents */}\r\n {activeTab === 'documents' && (\r\n <div className=\"flex-1 flex gap-4 min-h-0\">\r\n {/* File List Sidebar */}\r\n <div className=\"w-80 flex-shrink-0\">\r\n <FileList\r\n files={files}\r\n selectedPath={selectedFile}\r\n onSelectFile={handleSelectFile}\r\n isLoading={filesLoading}\r\n isFetching={filesFetching}\r\n onRefresh={() => refetchFiles()}\r\n />\r\n </div>\r\n\r\n {/* Document Viewer */}\r\n <DocumentViewer\r\n doc={doc}\r\n content={content}\r\n symbols={symbols}\r\n isLoading={docLoading}\r\n error={docError}\r\n filePath={selectedFile ?? undefined}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Tab Content: Symbol Index */}\r\n {activeTab === 'index' && (\r\n <div className=\"flex-1 overflow-y-auto\">\r\n <Card className=\"p-4 h-full flex flex-col\">\r\n {/* Search input */}\r\n <div className=\"mb-4\">\r\n <input\r\n type=\"text\"\r\n placeholder={formatMessage({ id: 'deepwiki.index.search', defaultMessage: 'Search symbols...' })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"w-full px-4 py-2 rounded-md border border-input bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-primary\"\r\n />\r\n </div>\r\n\r\n {/* Search results */}\r\n {searchLoading ? (\r\n <div className=\"flex-1 flex items-center justify-center\">\r\n <RefreshCw className=\"w-6 h-6 animate-spin text-muted-foreground\" />\r\n </div>\r\n ) : searchResults.length > 0 ? (\r\n <div className=\"flex-1 overflow-y-auto space-y-2\">\r\n {searchResults.map(symbol => (\r\n <button\r\n key={`${symbol.name}-${symbol.sourceFile}`}\r\n onClick={() => {\r\n setSelectedFile(symbol.sourceFile);\r\n setActiveTab('documents');\r\n }}\r\n className=\"w-full p-3 rounded-md border border-border hover:bg-muted/50 transition-colors text-left\"\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <Hash className=\"w-4 h-4 text-primary\" />\r\n <span className=\"font-medium text-foreground\">{symbol.name}</span>\r\n <Badge variant=\"outline\" className=\"text-xs\">{symbol.type}</Badge>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground mt-1 font-mono truncate\">\r\n {symbol.sourceFile}:{symbol.lineRange[0]}-{symbol.lineRange[1]}\r\n </p>\r\n </button>\r\n ))}\r\n </div>\r\n ) : searchQuery ? (\r\n <div className=\"flex-1 flex flex-col items-center justify-center text-center\">\r\n <Hash className=\"w-10 h-10 text-muted-foreground/30 mb-3\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'deepwiki.index.noResults', defaultMessage: 'No symbols found' })}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"flex-1 flex flex-col items-center justify-center text-center\">\r\n <Hash className=\"w-10 h-10 text-muted-foreground/30 mb-3\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'deepwiki.index.placeholder', defaultMessage: 'Enter a search query to find symbols' })}\r\n </p>\r\n </div>\r\n )}\r\n </Card>\r\n </div>\r\n )}\r\n\r\n {/* Tab Content: Statistics */}\r\n {activeTab === 'stats' && (\r\n <div className=\"flex-1 overflow-y-auto space-y-4\">\r\n {statsLoading ? (\r\n <Card className=\"p-6\">\r\n <div className=\"space-y-4 animate-pulse\">\r\n <div className=\"h-20 bg-muted rounded\" />\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div className=\"h-24 bg-muted rounded\" />\r\n <div className=\"h-24 bg-muted rounded\" />\r\n <div className=\"h-24 bg-muted rounded\" />\r\n <div className=\"h-24 bg-muted rounded\" />\r\n </div>\r\n </div>\r\n </Card>\r\n ) : (\r\n <>\r\n {/* Status card */}\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div\r\n className={cn(\r\n 'w-3 h-3 rounded-full',\r\n stats?.available ? 'bg-green-500' : 'bg-red-500'\r\n )}\r\n />\r\n <span className=\"text-sm font-medium text-foreground\">\r\n {stats?.available\r\n ? formatMessage({ id: 'deepwiki.stats.available', defaultMessage: 'Database Connected' })\r\n : formatMessage({ id: 'deepwiki.stats.unavailable', defaultMessage: 'Database Not Available' })}\r\n </span>\r\n </div>\r\n {stats?.dbPath && (\r\n <code className=\"text-xs text-muted-foreground bg-muted px-2 py-1 rounded\">\r\n {stats.dbPath}\r\n </code>\r\n )}\r\n </div>\r\n </Card>\r\n\r\n {/* Stats grid */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <StatsCard\r\n label={formatMessage({ id: 'deepwiki.stats.files', defaultMessage: 'Files' })}\r\n value={stats?.files ?? 0}\r\n icon={FileText}\r\n color=\"bg-blue-500/10 text-blue-500\"\r\n />\r\n <StatsCard\r\n label={formatMessage({ id: 'deepwiki.stats.symbols', defaultMessage: 'Symbols' })}\r\n value={stats?.symbols ?? 0}\r\n icon={Hash}\r\n color=\"bg-purple-500/10 text-purple-500\"\r\n />\r\n <StatsCard\r\n label={formatMessage({ id: 'deepwiki.stats.docs', defaultMessage: 'Documents' })}\r\n value={stats?.docs ?? 0}\r\n icon={BookOpen}\r\n color=\"bg-green-500/10 text-green-500\"\r\n />\r\n <StatsCard\r\n label={formatMessage({ id: 'deepwiki.stats.needingDocs', defaultMessage: 'Need Docs' })}\r\n value={stats?.filesNeedingDocs ?? 0}\r\n icon={BarChart3}\r\n color=\"bg-amber-500/10 text-amber-500\"\r\n />\r\n </div>\r\n\r\n {/* Help text */}\r\n <Card className=\"p-4\">\r\n <h3 className=\"text-sm font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'deepwiki.stats.howTo.title', defaultMessage: 'Documentation Index' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'deepwiki.stats.howTo.description', defaultMessage: 'DeepWiki automatically indexes symbols and documentation from code. Currently in read-only mode.' })}\r\n </p>\r\n </Card>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default DeepWikiPage;\r\n"],"names":["deepWikiKeys","projectPath","path","query","STALE_TIME","GC_TIME","REQUEST_TIMEOUT","fetchWithTimeout","url","timeout","controller","timeoutId","fetchDeepWikiFiles","response","fetchDeepWikiDoc","filePath","fetchDeepWikiStats","searchDeepWikiSymbols","limit","useDeepWikiFiles","options","staleTime","enabled","useWorkflowStore","selectProjectPath","useQuery","useDeepWikiDoc","_a","_b","_c","useDeepWikiStats","useDeepWikiSearch","queryResult","getRelativePath","fullPath","parts","srcIndex","p","getFileExtension","getExtensionColor","ext","FileList","files","selectedPath","onSelectFile","isLoading","isFetching","onRefresh","formatMessage","useIntl","searchQuery","setSearchQuery","useState","debouncedSearchQuery","useDebounce","isSearching","setIsSearching","filteredFiles","useMemo","f","useEffect","groupedFiles","groups","file","dir","jsx","Card","i","jsxs","FileText","Badge","Button","RefreshCw","cn","Search","Input","e","Loader2","dirFiles","extColor","isSelected","CheckCircle","Clock","aria","defaultSchema","own","sanitize","node","result","state","replace","transform","unsafe","comment","doctype","element","root","text","index","patch","name","content","children","properties_","properties","safeElement","ancestors","_","results","childrenUnknown","value","tagName","attributes","required","specific","defaults","key","safe","propertyValue","findDefinition","definition","propertyValueMany","propertyValuePrimitive","values","safeProtocol","ok","allowed","protocols","colon","questionMark","numberSign","slash","protocol","cleanPosition","position","structuredClone","definitions","dataDefault","entry","rehypeSanitize","tree","getSymbolTypeIcon","type","getSymbolTypeColor","markdownComponents","href","className","DocumentViewer","doc","symbols","error","copiedSymbol","setCopiedSymbol","copyDeepLink","useCallback","symbolName","anchor","symbolSections","regex","sections","match","AlertCircle","Sparkles","symbol","iconInfo","section","idx","ReactMarkdown","remarkGfm","Hash","Check","Link2","StatsCard","label","Icon","color","DeepWikiPage","searchParams","setSearchParams","useSearchParams","activeTab","setActiveTab","scrollAttemptedRef","useRef","fileParam","hashParam","selectedFile","setSelectedFile","filesLoading","filesFetching","refetchFiles","stats","statsLoading","refetchStats","docLoading","docError","searchResults","searchLoading","handleSelectFile","handleRefresh","BookOpen","TabsNavigation","Fragment","BarChart3"],"mappings":"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EAIZ,GAAI,CAAC,CAAC,YAAa,gBAAgB,CAAC,EAIpC,GAAI,CAAC,GAAGA,EAAM,CAAC,YAAa,oBAAoB,CAAC,EACjD,EAAG,CAAC,MAAM,EACV,QAAS,CAAC,gBAAiB,CAAC,YAAa,WAAW,CAAC,EACrD,OAAQ,CAAC,QAAQ,EACjB,QAAS,CAAC,GAAGA,CAAI,EACjB,MAAO,CAAC,GAAGA,CAAI,EAIf,GAAI,CAAC,GAAGA,EAAM,CAAC,YAAa,oBAAoB,CAAC,EACjD,IAAK,CACH,OACA,SACA,gBACA,YACA,SACA,QACA,MACA,OACA,SACA,cACA,cACA,OACA,UACA,UACA,UACA,QACA,UACA,QACA,OACA,UACA,SACA,WACA,MAKA,UACA,QACA,SACA,UACA,SACA,WACA,UACA,KACA,QACA,WACA,QACA,OACA,YACA,QACA,SACA,WACA,OACA,SACA,UACA,SACA,OACA,SACA,WACA,MACA,UACA,OACA,QACA,QACA,WACA,QACA,OACA,OACA,QACA,UACA,WACA,QACA,SACA,SACA,QACA,OACN,CACA,EACE,QAAS,CAAC,kBAAmB,iBAAkB,KAAM,MAAM,EAC3D,cAAe,gBACf,UAAW,CACT,KAAM,CAAC,OAAQ,OAAO,EACtB,KAAM,CAAC,OAAQ,QAAS,MAAO,OAAQ,SAAU,MAAM,EACvD,SAAU,CAAC,OAAQ,OAAO,EAC1B,IAAK,CAAC,OAAQ,OAAO,CACzB,EACE,SAAU,CACR,MAAO,CAAC,SAAU,GAAM,KAAM,UAAU,CAC5C,EACE,MAAO,CAAC,QAAQ,EAChB,SAAU,CACR,IACA,IACA,aACA,KACA,OACA,KACA,MACA,UACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,MAIA,QACA,MACA,MACA,KACA,KACA,IACA,UACA,MACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,OACA,SACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,QACA,KACA,QACA,KACA,KACA,KACA,KACJ,CACA,ECQME,EAAM,CAAA,EAAG,eAYR,SAASC,GAASC,EAAMnE,EAAS,CAEtC,IAAIoE,EAAS,CAAC,KAAM,OAAQ,SAAU,CAAA,CAAE,EAGxC,MAAMC,EAAQ,CACZ,OAAQrE,EAAU,CAAC,GAAGgE,EAAe,GAAGhE,CAAO,EAAIgE,EACnD,MAAO,CAAA,CACX,EACQM,EAAUC,GAAUF,EAAOF,CAAI,EAErC,OAAIG,IACE,MAAM,QAAQA,CAAO,EACnBA,EAAQ,SAAW,EACrBF,EAASE,EAAQ,CAAC,EAElBF,EAAO,SAAWE,EAGpBF,EAASE,GAINF,CACT,CAYA,SAASG,GAAUF,EAAOF,EAAM,CAC9B,GAAIA,GAAQ,OAAOA,GAAS,SAAU,CACpC,MAAMK,EAA2DL,EAGjE,OAFa,OAAOK,EAAO,MAAS,SAAWA,EAAO,KAAO,GAEjD,CACV,IAAK,UACH,OAAOC,GAAQJ,EAAOG,CAAM,EAG9B,IAAK,UACH,OAAOE,GAAQL,EAAOG,CAAM,EAG9B,IAAK,UACH,OAAOG,GAAQN,EAAOG,CAAM,EAG9B,IAAK,OACH,OAAOI,GAAKP,EAAOG,CAAM,EAG3B,IAAK,OACH,OAAOK,GAAKR,EAAOG,CAAM,CAIjC,CACE,CACF,CAYA,SAASC,GAAQJ,EAAOG,EAAQ,CAC9B,GAAIH,EAAM,OAAO,cAAe,CAE9B,MAAMD,EAAS,OAAOI,EAAO,OAAU,SAAWA,EAAO,MAAQ,GAC3DM,EAAQV,EAAO,QAAQ,KAAK,EAI5BD,EAAO,CAAC,KAAM,UAAW,MAHjBW,EAAQ,EAAIV,EAASA,EAAO,MAAM,EAAGU,CAAK,CAGpB,EAEpC,OAAAC,EAAMZ,EAAMK,CAAM,EAEXL,CACT,CACF,CAYA,SAASO,GAAQL,EAAOG,EAAQ,CAC9B,GAAIH,EAAM,OAAO,cAAe,CAE9B,MAAMF,EAAO,CAAC,KAAM,SAAS,EAE7B,OAAAY,EAAMZ,EAAMK,CAAM,EAEXL,CACT,CACF,CAYA,SAASQ,GAAQN,EAAOG,EAAQ,CAC9B,MAAMQ,EAAO,OAAOR,EAAO,SAAY,SAAWA,EAAO,QAAU,GAEnEH,EAAM,MAAM,KAAKW,CAAI,EAErB,MAAMC,EACJC,GAASb,EAAOG,EAAO,QAAQ,EAE3BW,EAAcC,GAAWf,EAAOG,EAAO,UAAU,EAEvDH,EAAM,MAAM,IAAG,EAEf,IAAIgB,EAAc,GAElB,GACEL,GACAA,IAAS,MACR,CAACX,EAAM,OAAO,UAAYA,EAAM,OAAO,SAAS,SAASW,CAAI,KAE9DK,EAAc,GAIVhB,EAAM,OAAO,WAAaJ,EAAI,KAAKI,EAAM,OAAO,UAAWW,CAAI,GAAG,CACpE,MAAMM,EAAYjB,EAAM,OAAO,UAAUW,CAAI,EAC7C,IAAIF,EAAQ,GAIZ,IAFAO,EAAc,GAEP,EAAEP,EAAQQ,EAAU,QACrBjB,EAAM,MAAM,SAASiB,EAAUR,CAAK,CAAC,IACvCO,EAAc,GAGpB,CAGF,GAAI,CAACA,EACH,OAAOhB,EAAM,OAAO,OAAS,CAACA,EAAM,OAAO,MAAM,SAASW,CAAI,EAC1DC,EACA,OAIN,MAAMd,EAAO,CACX,KAAM,UACN,QAASa,EACT,WAAYG,EACZ,SAAUF,CACd,EAEE,OAAAF,EAAMZ,EAAMK,CAAM,EAEXL,CACT,CAYA,SAASS,GAAKP,EAAOG,EAAQ,CAM3B,MAAML,EAAO,CAAC,KAAM,OAAQ,SAJ1Be,GAASb,EAAOG,EAAO,QAAQ,CAIY,EAE7C,OAAAO,EAAMZ,EAAMK,CAAM,EAEXL,CACT,CAYA,SAASU,GAAKU,EAAGf,EAAQ,CAGvB,MAAML,EAAO,CAAC,KAAM,OAAQ,MAFd,OAAOK,EAAO,OAAU,SAAWA,EAAO,MAAQ,EAE/B,EAEjC,OAAAO,EAAMZ,EAAMK,CAAM,EAEXL,CACT,CAYA,SAASe,GAASb,EAAOa,EAAU,CAEjC,MAAMM,EAAU,CAAA,EAEhB,GAAI,MAAM,QAAQN,CAAQ,EAAG,CAC3B,MAAMO,EAA2DP,EACjE,IAAIJ,EAAQ,GAEZ,KAAO,EAAEA,EAAQW,EAAgB,QAAQ,CACvC,MAAMC,EAAQnB,GAAUF,EAAOoB,EAAgBX,CAAK,CAAC,EAEjDY,IACE,MAAM,QAAQA,CAAK,EACrBF,EAAQ,KAAK,GAAGE,CAAK,EAErBF,EAAQ,KAAKE,CAAK,EAGxB,CACF,CAEA,OAAOF,CACT,CAYA,SAASJ,GAAWf,EAAOe,EAAY,CACrC,MAAMO,EAAUtB,EAAM,MAAMA,EAAM,MAAM,OAAS,CAAC,EAC5CuB,EAAavB,EAAM,OAAO,WAC1BwB,EAAWxB,EAAM,OAAO,SACxByB,EACJF,GAAc3B,EAAI,KAAK2B,EAAYD,CAAO,EACtCC,EAAWD,CAAO,EAClB,OACAI,EACJH,GAAc3B,EAAI,KAAK2B,EAAY,GAAG,EAAIA,EAAW,GAAG,EAAI,OACxDT,EAEFC,GAAc,OAAOA,GAAe,SAAWA,EAAa,CAAA,EAG1DhB,EAAS,CAAA,EAEf,IAAI4B,EAEJ,IAAKA,KAAOb,EACV,GAAIlB,EAAI,KAAKkB,EAAaa,CAAG,EAAG,CAC9B,MAAMxB,EAASW,EAAYa,CAAG,EAC9B,IAAIC,EAAOC,EACT7B,EACA8B,EAAeL,EAAUE,CAAG,EAC5BA,EACAxB,CACR,EAEUyB,GAAS,OACXA,EAAOC,EAAc7B,EAAO8B,EAAeJ,EAAUC,CAAG,EAAGA,EAAKxB,CAAM,GAGpEyB,GAAS,OACX7B,EAAO4B,CAAG,EAAIC,EAElB,CAGF,GAAIJ,GAAY5B,EAAI,KAAK4B,EAAUF,CAAO,EAAG,CAC3C,MAAMP,EAAaS,EAASF,CAAO,EAEnC,IAAKK,KAAOZ,EACNnB,EAAI,KAAKmB,EAAYY,CAAG,GAAK,CAAC/B,EAAI,KAAKG,EAAQ4B,CAAG,IACpD5B,EAAO4B,CAAG,EAAIZ,EAAWY,CAAG,EAGlC,CAEA,OAAO5B,CACT,CAgBA,SAAS8B,EAAc7B,EAAO+B,EAAYJ,EAAKN,EAAO,CACpD,OAAOU,EACH,MAAM,QAAQV,CAAK,EACjBW,GAAkBhC,EAAO+B,EAAYJ,EAAKN,CAAK,EAC/CY,GAAuBjC,EAAO+B,EAAYJ,EAAKN,CAAK,EACtD,MACN,CAgBA,SAASW,GAAkBhC,EAAO+B,EAAYJ,EAAKO,EAAQ,CACzD,IAAIzB,EAAQ,GAEZ,MAAMV,EAAS,CAAA,EAEf,KAAO,EAAEU,EAAQyB,EAAO,QAAQ,CAC9B,MAAMb,EAAQY,GAAuBjC,EAAO+B,EAAYJ,EAAKO,EAAOzB,CAAK,CAAC,GAEtE,OAAOY,GAAU,UAAY,OAAOA,GAAU,WAChDtB,EAAO,KAAKsB,CAAK,CAErB,CAEA,OAAOtB,CACT,CAgBA,SAASkC,GAAuBjC,EAAO+B,EAAYJ,EAAKN,EAAO,CAC7D,GACE,SAAOA,GAAU,WACjB,OAAOA,GAAU,UACjB,OAAOA,GAAU,WAKdc,GAAanC,EAAO2B,EAAKN,CAAK,EAMnC,IAAI,OAAOU,GAAe,UAAYA,EAAW,OAAS,EAAG,CAC3D,IAAIK,EAAK,GACL3B,EAAQ,EAEZ,KAAO,EAAEA,EAAQsB,EAAW,QAAQ,CAClC,MAAMM,EAAUN,EAAWtB,CAAK,EAGhC,GAAI4B,GAAW,OAAOA,GAAY,UAAY,UAAWA,GACvD,GAAIA,EAAQ,KAAK,OAAOhB,CAAK,CAAC,EAAG,CAC/Be,EAAK,GACL,KACF,UAGOC,IAAYhB,EAAO,CAC1Be,EAAK,GACL,KACF,CACF,CAEA,GAAI,CAACA,EAAI,MACX,CAEA,OAAOpC,EAAM,OAAO,SAClBA,EAAM,OAAO,eACbA,EAAM,OAAO,QAAQ,SAAS2B,CAAG,EAC/B3B,EAAM,OAAO,cAAgBqB,EAC7BA,EACN,CAcA,SAASc,GAAanC,EAAO2B,EAAKN,EAAO,CACvC,MAAMiB,EACJtC,EAAM,OAAO,WAAaJ,EAAI,KAAKI,EAAM,OAAO,UAAW2B,CAAG,EAC1D3B,EAAM,OAAO,UAAU2B,CAAG,EAC1B,OAGN,GAAI,CAACW,GAAaA,EAAU,SAAW,EACrC,MAAO,GAGT,MAAMvH,EAAM,OAAOsG,CAAK,EAClBkB,EAAQxH,EAAI,QAAQ,GAAG,EACvByH,EAAezH,EAAI,QAAQ,GAAG,EAC9B0H,EAAa1H,EAAI,QAAQ,GAAG,EAC5B2H,EAAQ3H,EAAI,QAAQ,GAAG,EAE7B,GACEwH,EAAQ,GAEPG,EAAQ,IAAMH,EAAQG,GACtBF,EAAe,IAAMD,EAAQC,GAC7BC,EAAa,IAAMF,EAAQE,EAE5B,MAAO,GAGT,IAAIhC,EAAQ,GAEZ,KAAO,EAAEA,EAAQ6B,EAAU,QAAQ,CACjC,MAAMK,EAAWL,EAAU7B,CAAK,EAEhC,GACE8B,IAAUI,EAAS,QACnB5H,EAAI,MAAM,EAAG4H,EAAS,MAAM,IAAMA,EAElC,MAAO,EAEX,CAEA,MAAO,EACT,CAYA,SAASjC,EAAMZ,EAAMK,EAAQ,CAC3B,MAAMyC,EAAgBC,GAEpB1C,CACJ,EAEMA,EAAO,OACTL,EAAK,KAAOgD,GAAgB3C,EAAO,IAAI,GAGrCyC,IAAe9C,EAAK,SAAW8C,EACrC,CAQA,SAASd,EAAeiB,EAAapB,EAAK,CAExC,IAAIqB,EACAvC,EAAQ,GAEZ,GAAIsC,EACF,KAAO,EAAEtC,EAAQsC,EAAY,QAAQ,CACnC,MAAME,EAAQF,EAAYtC,CAAK,EACzBE,EAAO,OAAOsC,GAAU,SAAWA,EAAQA,EAAM,CAAC,EAExD,GAAItC,IAASgB,EACX,OAAOsB,EAGLtC,IAAS,UAASqC,EAAcC,EACtC,CAGF,GAAItB,EAAI,OAAS,GAAKA,EAAI,MAAM,EAAG,CAAC,EAAE,YAAW,IAAO,OACtD,OAAOqB,CAEX,CC7uBe,SAASE,EAAevH,EAAS,CAO9C,OAAO,SAAUwH,EAAM,CAGrB,OADoCtD,GAASsD,EAAMxH,CAAO,CAE5D,CACF,CCEA,SAASyH,EAAkBC,EAAiD,CAU1E,MATiE,CAC/D,SAAU,CAAE,OAAQ,IAAK,MAAO,UAAA,EAChC,eAAgB,CAAE,OAAQ,IAAK,MAAO,gBAAA,EACtC,MAAO,CAAE,OAAQ,IAAK,MAAO,OAAA,EAC7B,OAAQ,CAAE,OAAQ,IAAK,MAAO,QAAA,EAC9B,UAAW,CAAE,OAAQ,IAAK,MAAO,WAAA,EACjC,SAAU,CAAE,OAAQ,IAAK,MAAO,UAAA,EAChC,SAAU,CAAE,OAAQ,IAAK,MAAO,UAAA,CAAW,EAEhCA,CAAI,GAAK,CAAE,OAAQ,IAAK,MAAO,QAAA,CAC9C,CAKA,SAASC,EAAmBD,EAAsB,CAUhD,MATuC,CACrC,SAAU,gBACV,eAAgB,gBAChB,MAAO,kBACP,OAAQ,kBACR,UAAW,gBACX,SAAU,gBACV,SAAU,gBAAA,EAEEA,CAAI,GAAK,eACzB,CAKA,MAAME,EAAqB,CACzB,GAAI,CAAC,CAAE,SAAA1C,CAAA,IACLrC,EAAAA,IAAC,KAAA,CAAG,UAAU,8CAA+C,SAAAqC,EAAS,EAExE,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLrC,EAAAA,IAAC,KAAA,CAAG,UAAU,kDAAmD,SAAAqC,EAAS,EAE5E,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLrC,EAAAA,IAAC,KAAA,CAAG,UAAU,oDAAqD,SAAAqC,EAAS,EAE9E,EAAG,CAAC,CAAE,SAAAA,CAAA,IACJrC,EAAAA,IAAC,IAAA,CAAE,UAAU,0CAA2C,SAAAqC,EAAS,EAEnE,EAAG,CAAC,CAAE,KAAA2C,EAAM,SAAA3C,KACVrC,EAAAA,IAAC,IAAA,CACC,KAAAgF,EACA,UAAU,+BACV,OAAQA,GAAA,MAAAA,EAAM,WAAW,QAAU,SAAW,OAC9C,IAAKA,GAAA,MAAAA,EAAM,WAAW,QAAU,sBAAwB,OAEvD,SAAA3C,CAAA,CAAA,EAGL,KAAM,CAAC,CAAE,UAAA4C,EAAW,SAAA5C,KACA4C,QASf,OAAA,CAAK,UAAWzE,EAAG,kEAAmEyE,CAAS,EAC7F,SAAA5C,EACH,EARErC,EAAAA,IAAC,OAAA,CAAK,UAAU,mDACb,SAAAqC,CAAA,CACH,EASN,IAAK,CAAC,CAAE,SAAAA,CAAA,IACNrC,EAAAA,IAAC,MAAA,CAAI,UAAU,+CACZ,SAAAqC,EACH,EAEF,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLrC,EAAAA,IAAC,KAAA,CAAG,UAAU,uCAAwC,SAAAqC,EAAS,EAEjE,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLrC,EAAAA,IAAC,KAAA,CAAG,UAAU,0CAA2C,SAAAqC,EAAS,EAEpE,WAAY,CAAC,CAAE,SAAAA,CAAA,IACbrC,EAAAA,IAAC,aAAA,CAAW,UAAU,sEACnB,SAAAqC,EACH,EAEF,MAAO,CAAC,CAAE,SAAAA,CAAA,IACRrC,EAAAA,IAAC,MAAA,CAAI,UAAU,uBACb,SAAAA,EAAAA,IAAC,QAAA,CAAM,UAAU,kCAAmC,SAAAqC,EAAS,EAC/D,EAEF,MAAO,CAAC,CAAE,SAAAA,CAAA,IACRrC,EAAAA,IAAC,QAAA,CAAM,UAAU,WAAY,SAAAqC,EAAS,EAExC,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLrC,EAAAA,IAAC,KAAA,CAAG,UAAU,uDAAwD,SAAAqC,EAAS,EAEjF,GAAI,CAAC,CAAE,SAAAA,KACLrC,EAAAA,IAAC,KAAA,CAAG,UAAU,iCAAkC,SAAAqC,CAAA,CAAS,CAE7D,EAEO,SAAS6C,GAAe,CAC7B,IAAAC,EACA,QAAA/C,EACA,QAAAgD,EACA,UAAAxG,EAAY,GACZ,MAAAyG,EAAQ,KACR,SAAAvI,CACF,EAAwB,OACtB,KAAM,CAAE,cAAAiC,CAAA,EAAkBC,EAAA,EACpB,CAACsG,EAAcC,CAAe,EAAIpG,EAAAA,SAAwB,IAAI,EAG9DqG,EAAeC,EAAAA,YAAY,CAACC,EAAoBC,IAAmB,CACvE,MAAMpJ,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACpCO,GACFP,EAAI,aAAa,IAAI,OAAQO,CAAQ,EAEvCP,EAAI,KAAOoJ,EAAO,QAAQ,IAAK,EAAE,EAEjC,UAAU,UAAU,UAAUpJ,EAAI,UAAU,EAAE,KAAK,IAAM,CACvDgJ,EAAgBG,CAAU,EAC1B,WAAW,IAAMH,EAAgB,IAAI,EAAG,GAAI,CAC9C,CAAC,CACH,EAAG,CAACzI,CAAQ,CAAC,EAGP8I,EAAiBnG,EAAAA,QAAQ,IAAM,CACnC,GAAI,CAAC2C,EAAS,MAAO,CAAA,EAGrB,MAAMyD,EAAQ,sGACRC,EAAmE,CAAA,EAEzE,IAAIC,EACJ,MAAQA,EAAQF,EAAM,KAAKzD,CAAO,KAAO,MACvC0D,EAAS,KAAK,CACZ,KAAMC,EAAM,CAAC,EACb,KAAMA,EAAM,CAAC,EACb,QAASA,EAAM,CAAC,EAAE,KAAA,CAAK,CACxB,EAIH,OAAID,EAAS,SAAW,GAAK1D,EAAQ,QACnC0D,EAAS,KAAK,CACZ,KAAM,gBACN,KAAM,WACN,QAAS1D,EAAQ,KAAA,CAAK,CACvB,EAGI0D,CACT,EAAG,CAAC1D,CAAO,CAAC,EAGZ,OAAIxD,QAECqB,EAAA,CAAK,UAAU,aACd,SAAAE,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAH,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAAA,CAA6B,EAC5CA,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAAA,CAA6B,EAC5CA,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAAA,CAA6B,EAC5CA,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAAA,CAA6B,EAC5CA,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAAA,CAA6B,EAC5CA,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAAA,CAA6B,CAAA,CAAA,CAC9C,CAAA,CACF,EAKAqF,EAEAlF,EAAAA,KAACF,EAAA,CAAK,UAAU,mEACd,SAAA,CAAAD,EAAAA,IAACgG,GAAA,CAAY,UAAU,oCAAA,CAAqC,EAC5DhG,EAAAA,IAAC,KAAA,CAAG,UAAU,2CACX,SAAAjB,EAAc,CAAE,GAAI,8BAA+B,eAAgB,wBAAA,CAA0B,CAAA,CAChG,EACAiB,EAAAA,IAAC,IAAA,CAAE,UAAU,gCAAiC,WAAM,OAAA,CAAQ,CAAA,EAC9D,EAKA,CAACmF,GAAO,CAAC/C,EAETjC,EAAAA,KAACF,EAAA,CAAK,UAAU,mEACd,SAAA,CAAAD,EAAAA,IAACI,EAAA,CAAS,UAAU,yCAAA,CAA0C,EAC9DJ,EAAAA,IAAC,KAAA,CAAG,UAAU,2CACX,SAAAjB,EAAc,CAAE,GAAI,8BAA+B,eAAgB,eAAA,CAAiB,CAAA,CACvF,EACAiB,EAAAA,IAAC,IAAA,CAAE,UAAU,gCACV,SAAAjB,EAAc,CAAE,GAAI,gCAAiC,eAAgB,uDAAA,CAAyD,CAAA,CACjI,CAAA,EACF,EAKFoB,EAAAA,KAACF,EAAA,CAAK,UAAU,uCAEd,SAAA,CAAAD,EAAAA,IAAC,MAAA,CAAI,UAAU,6BACb,SAAAA,EAAAA,IAAC,OAAI,UAAU,yCACb,gBAAC,MAAA,CACC,SAAA,CAAAG,EAAAA,KAAC,KAAA,CAAG,UAAU,gEACZ,SAAA,CAAAH,EAAAA,IAACI,EAAA,CAAS,UAAU,sBAAA,CAAuB,EAC3CJ,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAoB,MAAOmF,GAAA,YAAAA,EAAK,KAC7C,WAAAzH,EAAAyH,GAAA,YAAAA,EAAK,OAAL,YAAAzH,EAAW,MAAM,KAAK,QAAS,eAAA,CAClC,CAAA,EACF,EACCyH,GACChF,EAAAA,KAAC,MAAA,CAAI,UAAU,+DACZ,SAAA,CAAAgF,EAAI,aACHhF,OAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAH,EAAAA,IAACiB,GAAA,CAAM,UAAU,SAAA,CAAU,EAC1B,IAAI,KAAKkE,EAAI,WAAW,EAAE,eAAA,CAAe,EAC5C,EAEDA,EAAI,SACHhF,OAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAH,EAAAA,IAACiG,GAAA,CAAS,UAAU,SAAA,CAAU,EAC7Bd,EAAI,OAAA,CAAA,CACP,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,EACF,EACF,EAGAhF,EAAAA,KAAC,MAAA,CAAI,UAAU,8BAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,6BAEZ,SAAA,CAAAiF,EAAQ,OAAS,GAChBpF,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACZ,SAAAoF,EAAQ,IAAIc,GAAU,CACrB,MAAMC,EAAWvB,EAAkBsB,EAAO,IAAI,EAC9C,OACE/F,EAAAA,KAAC,IAAA,CAEC,KAAM,IAAI+F,EAAO,OAAO,QAAQ,IAAK,EAAE,CAAC,GACxC,UAAW1F,EACT,4EACA,+CACAsE,EAAmBoB,EAAO,IAAI,CAAA,EAEhC,aAAY,GAAGC,EAAS,KAAK,KAAKD,EAAO,IAAI,GAE7C,SAAA,CAAAlG,EAAAA,IAAC,OAAA,CAAK,cAAY,OAAQ,SAAAmG,EAAS,OAAO,EAC1CnG,EAAAA,IAAC,OAAA,CAAM,SAAAkG,EAAO,IAAA,CAAK,QAClB7F,EAAA,CAAM,QAAQ,UAAU,UAAU,mBAChC,WAAO,IAAA,CACV,CAAA,CAAA,EAbK6F,EAAO,IAAA,CAgBlB,CAAC,CAAA,CACH,EAIF/F,EAAAA,KAAC,MAAA,CAAI,UAAU,YACZ,SAAA,CAAAyF,EAAe,IAAI,CAACQ,EAASC,IAC5BrG,EAAAA,IAAC,UAAA,CAEC,GAAIoG,EAAQ,KAAK,cAAc,QAAQ,OAAQ,GAAG,EAClD,UAAU,cAEV,SAAApG,EAAAA,IAACsG,EAAA,CACC,cAAe,CAACC,CAAS,EACzB,cAAe,CAAC7B,CAAc,EAC9B,WAAYK,EAEX,SAAAqB,EAAQ,OAAA,CAAA,CACX,EAVK,GAAGA,EAAQ,IAAI,IAAIC,CAAG,EAAA,CAY9B,EAEAT,EAAe,SAAW,GAAKxD,GAC9BpC,EAAAA,IAACsG,EAAA,CACC,cAAe,CAACC,CAAS,EACzB,cAAe,CAAC7B,CAAc,EAC9B,WAAYK,EAEX,SAAA3C,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,EACF,EAGCgD,EAAQ,OAAS,GAChBjF,EAAAA,KAAC,MAAA,CAAI,UAAU,kEACb,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,oGACZ,SAAA,CAAAH,EAAAA,IAACwG,EAAA,CAAK,UAAU,SAAA,CAAU,EACzBzH,EAAc,CAAE,GAAI,sBAAuB,eAAgB,UAAW,CAAA,EACzE,EACAiB,EAAAA,IAAC,MAAA,CAAI,UAAU,YAAY,KAAK,OAAO,aAAW,mBAC/C,SAAAoF,EAAQ,IAAIc,GAAU,CACrB,MAAMC,EAAWvB,EAAkBsB,EAAO,IAAI,EAC9C,OACE/F,EAAAA,KAAC,MAAA,CAEC,UAAU,gCAEV,SAAA,CAAAA,EAAAA,KAAC,IAAA,CACC,KAAM,IAAI+F,EAAO,OAAO,QAAQ,IAAK,EAAE,CAAC,GACxC,UAAW1F,EACT,uDACA,gEACA,WAAA,EAEF,KAAK,WACL,aAAY,GAAG2F,EAAS,KAAK,KAAKD,EAAO,IAAI,GAE7C,SAAA,CAAAlG,EAAAA,IAAC,OAAA,CAAK,UAAWQ,EAAG,OAAQsE,EAAmBoB,EAAO,IAAI,CAAC,EAAG,cAAY,OACvE,SAAAC,EAAS,OACZ,EACCD,EAAO,IAAA,CAAA,CAAA,EAEVlG,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMwF,EAAaU,EAAO,KAAMA,EAAO,MAAM,EACtD,UAAW1F,EACT,+DACA,oBACA8E,IAAiBY,EAAO,KACpB,iBACA,6CAAA,EAEN,aACEZ,IAAiBY,EAAO,KACpBnH,EAAc,CAAE,GAAI,6BAA8B,eAAgB,aAAA,CAAe,EACjFA,EAAc,CAAE,GAAI,2BAA4B,eAAgB,0BAAA,EAA8B,CAAE,KAAMmH,EAAO,KAAM,EAGxH,SAAAZ,IAAiBY,EAAO,KACvBlG,EAAAA,IAACyG,IAAM,UAAU,UAAU,cAAY,MAAA,CAAO,EAE9CzG,EAAAA,IAAC0G,GAAA,CAAM,UAAU,UAAU,cAAY,MAAA,CAAO,CAAA,CAAA,CAElD,CAAA,EAtCKR,EAAO,IAAA,CAyClB,CAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,CClWA,SAASS,EAAU,CACjB,MAAAC,EACA,MAAA/D,EACA,KAAMgE,EACN,MAAAC,CACF,EAKG,CACD,aACG7G,EAAA,CAAK,UAAU,MACd,SAAAE,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAH,EAAAA,IAAC,MAAA,CAAI,UAAWQ,EAAG,iBAAkBsG,CAAK,EACxC,SAAA9G,EAAAA,IAAC6G,EAAA,CAAK,UAAU,SAAA,CAAU,CAAA,CAC5B,SACC,MAAA,CACC,SAAA,CAAA7G,EAAAA,IAAC,IAAA,CAAE,UAAU,qCAAsC,SAAA6C,EAAM,EACzD7C,EAAAA,IAAC,IAAA,CAAE,UAAU,gCAAiC,SAAA4G,CAAA,CAAM,CAAA,CAAA,CACtD,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAEO,SAASG,IAAe,CAC7B,KAAM,CAAE,cAAAhI,CAAA,EAAkBC,EAAA,EACpB,CAACgI,EAAcC,CAAe,EAAIC,GAAA,EAClC,CAACC,EAAWC,CAAY,EAAIjI,EAAAA,SAAoB,WAAW,EAC3D,CAACF,EAAaC,CAAc,EAAIC,EAAAA,SAAS,EAAE,EAC3CkI,EAAqBC,EAAAA,OAAO,EAAK,EAGjCC,EAAYP,EAAa,IAAI,MAAM,EACnCQ,EAAY,OAAO,SAAS,KAAK,MAAM,CAAC,EAExC,CAACC,EAAcC,CAAe,EAAIvI,EAAAA,SAAwBoI,CAAS,EAGnE,CACJ,MAAA9I,EACA,UAAWkJ,EACX,WAAYC,EACZ,QAASC,CAAA,EACP3K,GAAA,EAEE,CACJ,MAAA4K,EACA,UAAWC,EACX,QAASC,CAAA,EACPnK,GAAA,EAEE,CACJ,IAAAsH,EACA,QAAA/C,EACA,QAAAgD,GACA,UAAW6C,EACX,MAAOC,EAAA,EACLzK,GAAegK,CAAY,EAEzB,CACJ,QAASU,EACT,UAAWC,EAAA,EACTtK,GAAkBmB,EAAa,CAAE,QAASkI,IAAc,QAAS,EAG/DkB,GAAmB5C,cAAa3I,GAAqB,CACzD4K,EAAgB5K,CAAQ,EACxBmK,EAAgB,CAAE,KAAMnK,EAAU,EAClCuK,EAAmB,QAAU,EAC/B,EAAG,CAACJ,CAAe,CAAC,EAGpBtH,EAAAA,UAAU,IAAM,CACV6H,GAAapF,GAAW,CAAC6F,GAAc,CAACZ,EAAmB,UAC7DA,EAAmB,QAAU,GAE7B,WAAW,IAAM,CACf,MAAMvF,EAAU,SAAS,eAAe0F,CAAS,EAC7C1F,GACFA,EAAQ,eAAe,CAAE,SAAU,SAAU,MAAO,QAAS,CAEjE,EAAG,GAAG,EAEV,EAAG,CAAC0F,EAAWpF,EAAS6F,CAAU,CAAC,EAGnC,MAAMK,GAAgB,IAAM,CAC1BT,EAAA,EACAG,EAAA,CACF,EAEA,OACE7H,EAAAA,KAAC,MAAA,CAAI,UAAU,iCAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,qEACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,6DACZ,SAAA,CAAAH,EAAAA,IAACuI,EAAA,CAAS,UAAU,sBAAA,CAAuB,EAC1CxJ,EAAc,CAAE,GAAI,iBAAkB,eAAgB,WAAY,CAAA,EACrE,EACAiB,EAAAA,IAAC,IAAA,CAAE,UAAU,6BACV,SAAAjB,EAAc,CAAE,GAAI,uBAAwB,eAAgB,wDAAA,CAA0D,CAAA,CACzH,CAAA,EACF,EACAiB,EAAAA,IAAC,MAAA,CAAI,UAAU,aACb,SAAAG,EAAAA,KAACG,GAAA,CACC,QAAQ,UACR,QAASgI,GACT,SAAUV,EAEV,SAAA,CAAA5H,MAACO,GAAU,UAAWC,EAAG,eAAgBoH,GAAiB,cAAc,EAAG,EAC1E7I,EAAc,CAAE,GAAI,yBAA0B,eAAgB,UAAW,CAAA,CAAA,CAAA,CAC5E,CACF,CAAA,EACF,EAGAiB,EAAAA,IAACwI,GAAA,CACC,MAAOrB,EACP,cAAgBtE,GAAUuE,EAAavE,CAAkB,EACzD,KAAM,CACJ,CAAE,MAAO,YAAa,MAAO9D,EAAc,CAAE,GAAI,0BAA2B,eAAgB,WAAA,CAAa,CAAA,EACzG,CAAE,MAAO,QAAS,MAAOA,EAAc,CAAE,GAAI,sBAAuB,eAAgB,cAAA,CAAgB,CAAA,EACpG,CAAE,MAAO,QAAS,MAAOA,EAAc,CAAE,GAAI,sBAAuB,eAAgB,aAAc,CAAA,CAAE,CACtG,CAAA,EAIDoI,IAAc,aACbhH,OAAC,MAAA,CAAI,UAAU,4BAEb,SAAA,CAAAH,EAAAA,IAAC,MAAA,CAAI,UAAU,qBACb,SAAAA,EAAAA,IAACxB,GAAA,CACC,MAAAC,EACA,aAAcgJ,EACd,aAAcY,GACd,UAAWV,EACX,WAAYC,EACZ,UAAW,IAAMC,EAAA,CAAa,CAAA,EAElC,EAGA7H,EAAAA,IAACkF,GAAA,CACC,IAAAC,EACA,QAAA/C,EACA,QAAAgD,GACA,UAAW6C,EACX,MAAOC,GACP,SAAUT,GAAgB,MAAA,CAAA,CAC5B,EACF,EAIDN,IAAc,SACbnH,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACb,SAAAG,EAAAA,KAACF,EAAA,CAAK,UAAU,2BAEd,SAAA,CAAAD,EAAAA,IAAC,MAAA,CAAI,UAAU,OACb,SAAAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,YAAajB,EAAc,CAAE,GAAI,wBAAyB,eAAgB,oBAAqB,EAC/F,MAAOE,EACP,SAAW0B,GAAMzB,EAAeyB,EAAE,OAAO,KAAK,EAC9C,UAAU,kIAAA,CAAA,EAEd,EAGCyH,SACE,MAAA,CAAI,UAAU,0CACb,SAAApI,EAAAA,IAACO,EAAA,CAAU,UAAU,4CAAA,CAA6C,CAAA,CACpE,EACE4H,EAAc,OAAS,EACzBnI,EAAAA,IAAC,MAAA,CAAI,UAAU,mCACZ,SAAAmI,EAAc,IAAIjC,GACjB/F,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAM,CACbuH,EAAgBxB,EAAO,UAAU,EACjCkB,EAAa,WAAW,CAC1B,EACA,UAAU,2FAEV,SAAA,CAAAjH,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAH,EAAAA,IAACwG,EAAA,CAAK,UAAU,sBAAA,CAAuB,EACvCxG,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAA+B,WAAO,KAAK,QAC1DK,EAAA,CAAM,QAAQ,UAAU,UAAU,UAAW,WAAO,IAAA,CAAK,CAAA,EAC5D,EACAF,EAAAA,KAAC,IAAA,CAAE,UAAU,wDACV,SAAA,CAAA+F,EAAO,WAAW,IAAEA,EAAO,UAAU,CAAC,EAAE,IAAEA,EAAO,UAAU,CAAC,CAAA,CAAA,CAC/D,CAAA,CAAA,EAdK,GAAGA,EAAO,IAAI,IAAIA,EAAO,UAAU,EAAA,CAgB3C,CAAA,CACH,EACEjH,EACFkB,EAAAA,KAAC,MAAA,CAAI,UAAU,+DACb,SAAA,CAAAH,EAAAA,IAACwG,EAAA,CAAK,UAAU,yCAAA,CAA0C,EAC1DxG,EAAAA,IAAC,IAAA,CAAE,UAAU,gCACV,SAAAjB,EAAc,CAAE,GAAI,2BAA4B,eAAgB,kBAAA,CAAoB,CAAA,CACvF,CAAA,CAAA,CACF,EAEAoB,EAAAA,KAAC,MAAA,CAAI,UAAU,+DACb,SAAA,CAAAH,EAAAA,IAACwG,EAAA,CAAK,UAAU,yCAAA,CAA0C,EAC1DxG,EAAAA,IAAC,IAAA,CAAE,UAAU,gCACV,SAAAjB,EAAc,CAAE,GAAI,6BAA8B,eAAgB,sCAAA,CAAwC,CAAA,CAC7G,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CACF,EAIDoI,IAAc,SACbnH,EAAAA,IAAC,MAAA,CAAI,UAAU,mCACZ,SAAA+H,EACC/H,EAAAA,IAACC,EAAA,CAAK,UAAU,MACd,SAAAE,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAH,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAA,CAAwB,EACvCG,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAH,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAA,CAAwB,EACvCA,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAA,CAAwB,EACvCA,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAA,CAAwB,EACvCA,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAA,CAAwB,CAAA,CAAA,CACzC,CAAA,CAAA,CACF,CAAA,CACF,EAEAG,EAAAA,KAAAsI,EAAAA,SAAA,CAEE,SAAA,CAAAzI,EAAAA,IAACC,GAAK,UAAU,MACd,SAAAE,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAH,EAAAA,IAAC,MAAA,CACC,UAAWQ,EACT,uBACAsH,GAAA,MAAAA,EAAO,UAAY,eAAiB,YAAA,CACtC,CAAA,EAEF9H,MAAC,QAAK,UAAU,sCACb,oBAAO,UACJjB,EAAc,CAAE,GAAI,2BAA4B,eAAgB,qBAAsB,EACtFA,EAAc,CAAE,GAAI,6BAA8B,eAAgB,wBAAA,CAA0B,CAAA,CAClG,CAAA,EACF,GACC+I,GAAA,YAAAA,EAAO,SACN9H,EAAAA,IAAC,QAAK,UAAU,2DACb,WAAM,MAAA,CACT,CAAA,CAAA,CAEJ,CAAA,CACF,EAGAG,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAH,EAAAA,IAAC2G,EAAA,CACC,MAAO5H,EAAc,CAAE,GAAI,uBAAwB,eAAgB,QAAS,EAC5E,OAAO+I,GAAA,YAAAA,EAAO,QAAS,EACvB,KAAM1H,EACN,MAAM,8BAAA,CAAA,EAERJ,EAAAA,IAAC2G,EAAA,CACC,MAAO5H,EAAc,CAAE,GAAI,yBAA0B,eAAgB,UAAW,EAChF,OAAO+I,GAAA,YAAAA,EAAO,UAAW,EACzB,KAAMtB,EACN,MAAM,kCAAA,CAAA,EAERxG,EAAAA,IAAC2G,EAAA,CACC,MAAO5H,EAAc,CAAE,GAAI,sBAAuB,eAAgB,YAAa,EAC/E,OAAO+I,GAAA,YAAAA,EAAO,OAAQ,EACtB,KAAMS,EACN,MAAM,gCAAA,CAAA,EAERvI,EAAAA,IAAC2G,EAAA,CACC,MAAO5H,EAAc,CAAE,GAAI,6BAA8B,eAAgB,YAAa,EACtF,OAAO+I,GAAA,YAAAA,EAAO,mBAAoB,EAClC,KAAMY,GACN,MAAM,gCAAA,CAAA,CACR,EACF,EAGAvI,EAAAA,KAACF,EAAA,CAAK,UAAU,MACd,SAAA,CAAAD,EAAAA,IAAC,KAAA,CAAG,UAAU,2CACX,SAAAjB,EAAc,CAAE,GAAI,6BAA8B,eAAgB,qBAAA,CAAuB,CAAA,CAC5F,EACAiB,EAAAA,IAAC,IAAA,CAAE,UAAU,gCACV,SAAAjB,EAAc,CAAE,GAAI,mCAAoC,eAAgB,kGAAA,CAAoG,CAAA,CAC/K,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,EAEJ,CAEJ","x_google_ignoreList":[2,3,4]}
1
+ {"version":3,"file":"DeepWikiPage-CvleOtJy.js","sources":["../../src/hooks/useDeepWiki.ts","../../src/components/deepwiki/FileList.tsx","../../../../node_modules/hast-util-sanitize/lib/schema.js","../../../../node_modules/hast-util-sanitize/lib/index.js","../../../../node_modules/rehype-sanitize/lib/index.js","../../src/components/deepwiki/DocumentViewer.tsx","../../src/pages/DeepWikiPage.tsx"],"sourcesContent":["// ========================================\r\n// useDeepWiki Hook\r\n// ========================================\r\n// TanStack Query hooks for DeepWiki documentation system\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\n// Types\r\nexport interface DeepWikiFile {\r\n id?: number;\r\n path: string;\r\n contentHash: string;\r\n lastIndexed: string;\r\n symbolsCount: number;\r\n docsGenerated: boolean;\r\n}\r\n\r\nexport interface DeepWikiSymbol {\r\n id?: number;\r\n name: string;\r\n type: string;\r\n sourceFile: string;\r\n docFile: string;\r\n anchor: string;\r\n lineRange: [number, number];\r\n createdAt?: string;\r\n updatedAt?: string;\r\n}\r\n\r\nexport interface DeepWikiDoc {\r\n id?: number;\r\n path: string;\r\n contentHash: string;\r\n symbols: string[];\r\n generatedAt: string;\r\n llmTool?: string;\r\n}\r\n\r\nexport interface DeepWikiStats {\r\n available: boolean;\r\n files: number;\r\n symbols: number;\r\n docs: number;\r\n filesNeedingDocs?: number;\r\n dbPath?: string;\r\n}\r\n\r\nexport interface DocumentResponse {\r\n doc: DeepWikiDoc | null;\r\n content: string;\r\n symbols: DeepWikiSymbol[];\r\n}\r\n\r\n// Query key factory\r\nexport const deepWikiKeys = {\r\n all: ['deepWiki'] as const,\r\n files: (projectPath: string) => [...deepWikiKeys.all, 'files', projectPath] as const,\r\n doc: (path: string) => [...deepWikiKeys.all, 'doc', path] as const,\r\n stats: (projectPath: string) => [...deepWikiKeys.all, 'stats', projectPath] as const,\r\n search: (query: string) => [...deepWikiKeys.all, 'search', query] as const,\r\n};\r\n\r\n// Default stale time: 5 minutes (increased to reduce API calls)\r\nconst STALE_TIME = 5 * 60 * 1000;\r\n\r\n// Default garbage collection time: 10 minutes\r\nconst GC_TIME = 10 * 60 * 1000;\r\n\r\n// Request timeout: 10 seconds\r\nconst REQUEST_TIMEOUT = 10 * 1000;\r\n\r\n/**\r\n * Fetch with timeout wrapper\r\n */\r\nasync function fetchWithTimeout(url: string, timeout: number = REQUEST_TIMEOUT): Promise<Response> {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(url, { signal: controller.signal });\r\n return response;\r\n } finally {\r\n clearTimeout(timeoutId);\r\n }\r\n}\r\n\r\n/**\r\n * Fetch list of documented files\r\n */\r\nasync function fetchDeepWikiFiles(): Promise<DeepWikiFile[]> {\r\n const response = await fetchWithTimeout('/api/deepwiki/files');\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch files: ${response.statusText}`);\r\n }\r\n return response.json();\r\n}\r\n\r\n/**\r\n * Fetch document by source file path\r\n */\r\nasync function fetchDeepWikiDoc(filePath: string): Promise<DocumentResponse> {\r\n const response = await fetchWithTimeout(`/api/deepwiki/doc?path=${encodeURIComponent(filePath)}`);\r\n if (!response.ok) {\r\n if (response.status === 404) {\r\n return { doc: null, content: '', symbols: [] };\r\n }\r\n throw new Error(`Failed to fetch document: ${response.statusText}`);\r\n }\r\n return response.json();\r\n}\r\n\r\n/**\r\n * Fetch DeepWiki statistics\r\n */\r\nasync function fetchDeepWikiStats(): Promise<DeepWikiStats> {\r\n const response = await fetchWithTimeout('/api/deepwiki/stats');\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch stats: ${response.statusText}`);\r\n }\r\n return response.json();\r\n}\r\n\r\n/**\r\n * Search symbols by query\r\n */\r\nasync function searchDeepWikiSymbols(query: string, limit = 50): Promise<DeepWikiSymbol[]> {\r\n const response = await fetchWithTimeout(`/api/deepwiki/search?q=${encodeURIComponent(query)}&limit=${limit}`);\r\n if (!response.ok) {\r\n throw new Error(`Failed to search symbols: ${response.statusText}`);\r\n }\r\n return response.json();\r\n}\r\n\r\n// ========== Hooks ==========\r\n\r\nexport interface UseDeepWikiFilesOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseDeepWikiFilesReturn {\r\n files: DeepWikiFile[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching list of documented files\r\n */\r\nexport function useDeepWikiFiles(options: UseDeepWikiFilesOptions = {}): UseDeepWikiFilesReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery({\r\n queryKey: deepWikiKeys.files(projectPath ?? ''),\r\n queryFn: fetchDeepWikiFiles,\r\n staleTime,\r\n gcTime: GC_TIME,\r\n enabled: enabled && !!projectPath,\r\n retry: 2,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n refetchOnWindowFocus: false,\r\n });\r\n\r\n return {\r\n files: query.data ?? [],\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch: async () => {\r\n await query.refetch();\r\n },\r\n };\r\n}\r\n\r\nexport interface UseDeepWikiDocOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseDeepWikiDocReturn {\r\n doc: DeepWikiDoc | null;\r\n content: string;\r\n symbols: DeepWikiSymbol[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching a document by source file path\r\n */\r\nexport function useDeepWikiDoc(filePath: string | null, options: UseDeepWikiDocOptions = {}): UseDeepWikiDocReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n\r\n const query = useQuery({\r\n queryKey: deepWikiKeys.doc(filePath ?? ''),\r\n queryFn: () => fetchDeepWikiDoc(filePath!),\r\n staleTime,\r\n gcTime: GC_TIME,\r\n enabled: enabled && !!filePath,\r\n retry: 2,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n refetchOnWindowFocus: false,\r\n });\r\n\r\n return {\r\n doc: query.data?.doc ?? null,\r\n content: query.data?.content ?? '',\r\n symbols: query.data?.symbols ?? [],\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch: async () => {\r\n await query.refetch();\r\n },\r\n };\r\n}\r\n\r\nexport interface UseDeepWikiStatsOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseDeepWikiStatsReturn {\r\n stats: DeepWikiStats | null;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching DeepWiki statistics\r\n */\r\nexport function useDeepWikiStats(options: UseDeepWikiStatsOptions = {}): UseDeepWikiStatsReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery({\r\n queryKey: deepWikiKeys.stats(projectPath ?? ''),\r\n queryFn: fetchDeepWikiStats,\r\n staleTime,\r\n gcTime: GC_TIME,\r\n enabled: enabled && !!projectPath,\r\n retry: 2,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n refetchOnWindowFocus: false,\r\n });\r\n\r\n return {\r\n stats: query.data ?? null,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch: async () => {\r\n await query.refetch();\r\n },\r\n };\r\n}\r\n\r\nexport interface UseDeepWikiSearchOptions {\r\n limit?: number;\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseDeepWikiSearchReturn {\r\n symbols: DeepWikiSymbol[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for searching symbols\r\n */\r\nexport function useDeepWikiSearch(query: string, options: UseDeepWikiSearchOptions = {}): UseDeepWikiSearchReturn {\r\n const { limit = 50, staleTime = STALE_TIME, enabled = true } = options;\r\n\r\n const queryResult = useQuery({\r\n queryKey: deepWikiKeys.search(query),\r\n queryFn: () => searchDeepWikiSymbols(query, limit),\r\n staleTime,\r\n gcTime: GC_TIME,\r\n enabled: enabled && query.length > 0,\r\n retry: 2,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n refetchOnWindowFocus: false,\r\n });\r\n\r\n return {\r\n symbols: queryResult.data ?? [],\r\n isLoading: queryResult.isLoading,\r\n isFetching: queryResult.isFetching,\r\n error: queryResult.error,\r\n refetch: async () => {\r\n await queryResult.refetch();\r\n },\r\n };\r\n}\r\n","// ========================================\r\n// FileList Component\r\n// ========================================\r\n// List of documented files for DeepWiki\r\n\r\nimport { useState, useMemo, useEffect } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { FileText, Search, CheckCircle, Clock, RefreshCw, Loader2 } from 'lucide-react';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { cn } from '@/lib/utils';\r\nimport type { DeepWikiFile } from '@/hooks/useDeepWiki';\r\nimport { useDebounce } from '@/hooks/useDebounce';\r\n\r\nexport interface FileListProps {\r\n files: DeepWikiFile[];\r\n selectedPath: string | null;\r\n onSelectFile: (filePath: string) => void;\r\n isLoading?: boolean;\r\n isFetching?: boolean;\r\n onRefresh?: () => void;\r\n}\r\n\r\n/**\r\n * Get relative file path from full path\r\n */\r\nfunction getRelativePath(fullPath: string): string {\r\n // Try to extract a more readable path\r\n const parts = fullPath.replace(/\\\\/g, '/').split('/');\r\n const srcIndex = parts.findIndex(p => p === 'src');\r\n if (srcIndex >= 0) {\r\n return parts.slice(srcIndex).join('/');\r\n }\r\n // Return last 3 segments if path is long\r\n if (parts.length > 3) {\r\n return '.../' + parts.slice(-3).join('/');\r\n }\r\n return parts.join('/');\r\n}\r\n\r\n/**\r\n * Get file extension for icon coloring\r\n */\r\nfunction getFileExtension(path: string): string {\r\n const parts = path.split('.');\r\n return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : '';\r\n}\r\n\r\n/**\r\n * Get color class by file extension\r\n */\r\nfunction getExtensionColor(ext: string): string {\r\n const colors: Record<string, string> = {\r\n ts: 'text-blue-500',\r\n tsx: 'text-blue-500',\r\n js: 'text-yellow-500',\r\n jsx: 'text-yellow-500',\r\n py: 'text-green-500',\r\n go: 'text-cyan-500',\r\n rs: 'text-orange-500',\r\n java: 'text-red-500',\r\n swift: 'text-orange-500',\r\n };\r\n return colors[ext] || 'text-gray-500';\r\n}\r\n\r\nexport function FileList({\r\n files,\r\n selectedPath,\r\n onSelectFile,\r\n isLoading = false,\r\n isFetching = false,\r\n onRefresh,\r\n}: FileListProps) {\r\n const { formatMessage } = useIntl();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const debouncedSearchQuery = useDebounce(searchQuery, 300);\r\n const [isSearching, setIsSearching] = useState(false);\r\n\r\n // Filter files by search query\r\n const filteredFiles = useMemo(() => {\r\n if (!debouncedSearchQuery.trim()) return files;\r\n const query = debouncedSearchQuery.toLowerCase();\r\n return files.filter(f => f.path.toLowerCase().includes(query));\r\n }, [files, debouncedSearchQuery]);\r\n\r\n useEffect(() => {\r\n if (searchQuery !== debouncedSearchQuery) {\r\n setIsSearching(true);\r\n } else {\r\n setIsSearching(false);\r\n }\r\n }, [searchQuery, debouncedSearchQuery]);\r\n\r\n // Group files by directory\r\n const groupedFiles = useMemo(() => {\r\n const groups: Record<string, DeepWikiFile[]> = {};\r\n for (const file of filteredFiles) {\r\n const parts = file.path.replace(/\\\\/g, '/').split('/');\r\n const dir = parts.length > 1 ? parts.slice(0, -1).join('/') : 'root';\r\n if (!groups[dir]) {\r\n groups[dir] = [];\r\n }\r\n groups[dir].push(file);\r\n }\r\n return groups;\r\n }, [filteredFiles]);\r\n\r\n if (isLoading) {\r\n return (\r\n <Card className=\"p-4\">\r\n <div className=\"space-y-3\">\r\n {[1, 2, 3, 4, 5].map(i => (\r\n <div key={i} className=\"h-12 bg-muted animate-pulse rounded\" />\r\n ))}\r\n </div>\r\n </Card>\r\n );\r\n }\r\n\r\n return (\r\n <Card className=\"flex flex-col h-full\">\r\n {/* Header */}\r\n <div className=\"p-4 border-b border-border\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <h3 className=\"text-sm font-medium text-foreground flex items-center gap-2\">\r\n <FileText className=\"w-4 h-4\" />\r\n {formatMessage({ id: 'deepwiki.files.title', defaultMessage: 'Documented Files' })}\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n {files.length}\r\n </Badge>\r\n </h3>\r\n {onRefresh && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-7 w-7 p-0\"\r\n onClick={() => onRefresh()}\r\n disabled={isFetching}\r\n >\r\n <RefreshCw className={cn('w-4 h-4', isFetching && 'animate-spin')} />\r\n </Button>\r\n )}\r\n </div>\r\n\r\n {/* Search */}\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={formatMessage({ id: 'deepwiki.files.search', defaultMessage: 'Search files...' })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9 h-8 text-sm\"\r\n />\r\n {isSearching && (\r\n <Loader2 className=\"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 animate-spin text-muted-foreground\" />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* File List */}\r\n <div className=\"flex-1 overflow-y-auto p-2\">\r\n {filteredFiles.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\r\n <FileText className=\"w-10 h-10 text-muted-foreground/40 mb-3\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {searchQuery\r\n ? formatMessage({ id: 'deepwiki.files.noResults', defaultMessage: 'No files match your search' })\r\n : formatMessage({ id: 'deepwiki.files.empty', defaultMessage: 'No documented files yet' })}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-1\">\r\n {Object.entries(groupedFiles).map(([dir, dirFiles]) => (\r\n <div key={dir}>\r\n {/* Directory header (collapsed for brevity) */}\r\n <div className=\"space-y-0.5\">\r\n {dirFiles.map(file => {\r\n const ext = getFileExtension(file.path);\r\n const extColor = getExtensionColor(ext);\r\n const isSelected = selectedPath === file.path;\r\n\r\n return (\r\n <button\r\n key={file.path}\r\n onClick={() => onSelectFile(file.path)}\r\n className={cn(\r\n 'w-full flex items-center gap-2 px-3 py-2 rounded-md text-left transition-colors',\r\n 'hover:bg-muted/70',\r\n isSelected && 'bg-primary/10 border border-primary/30'\r\n )}\r\n >\r\n <FileText className={cn('w-4 h-4 flex-shrink-0', extColor)} />\r\n <span className=\"flex-1 text-sm truncate font-mono\" title={file.path}>\r\n {getRelativePath(file.path)}\r\n </span>\r\n <div className=\"flex items-center gap-1.5 flex-shrink-0\">\r\n {file.docsGenerated ? (\r\n <CheckCircle className=\"w-3.5 h-3.5 text-green-500\" />\r\n ) : (\r\n <Clock className=\"w-3.5 h-3.5 text-yellow-500\" />\r\n )}\r\n {file.symbolsCount > 0 && (\r\n <Badge variant=\"outline\" className=\"text-xs px-1.5 py-0\">\r\n {file.symbolsCount}\r\n </Badge>\r\n )}\r\n </div>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\nexport default FileList;\r\n","/**\n * @import {Schema} from 'hast-util-sanitize'\n */\n\n// Couple of ARIA attributes allowed in several, but not all, places.\nconst aria = ['ariaDescribedBy', 'ariaLabel', 'ariaLabelledBy']\n\n/**\n * Default schema.\n *\n * Follows GitHub style sanitation.\n *\n * @type {Schema}\n */\nexport const defaultSchema = {\n ancestors: {\n tbody: ['table'],\n td: ['table'],\n th: ['table'],\n thead: ['table'],\n tfoot: ['table'],\n tr: ['table']\n },\n attributes: {\n a: [\n ...aria,\n // Note: these 3 are used by GFM footnotes, they do work on all links.\n 'dataFootnoteBackref',\n 'dataFootnoteRef',\n ['className', 'data-footnote-backref'],\n 'href'\n ],\n blockquote: ['cite'],\n // Note: this class is not normally allowed by GH, when manually writing\n // `code` as HTML in markdown, they adds it some other way.\n // We can’t do that, so we have to allow it.\n code: [['className', /^language-./]],\n del: ['cite'],\n div: ['itemScope', 'itemType'],\n dl: [...aria],\n // Note: this is used by GFM footnotes.\n h2: [['className', 'sr-only']],\n img: [...aria, 'longDesc', 'src'],\n // Note: `input` is not normally allowed by GH, when manually writing\n // it in markdown, they add it from tasklists some other way.\n // We can’t do that, so we have to allow it.\n input: [\n ['disabled', true],\n ['type', 'checkbox']\n ],\n ins: ['cite'],\n // Note: this class is not normally allowed by GH, when manually writing\n // `li` as HTML in markdown, they adds it some other way.\n // We can’t do that, so we have to allow it.\n li: [['className', 'task-list-item']],\n // Note: this class is not normally allowed by GH, when manually writing\n // `ol` as HTML in markdown, they adds it some other way.\n // We can’t do that, so we have to allow it.\n ol: [...aria, ['className', 'contains-task-list']],\n q: ['cite'],\n section: ['dataFootnotes', ['className', 'footnotes']],\n source: ['srcSet'],\n summary: [...aria],\n table: [...aria],\n // Note: this class is not normally allowed by GH, when manually writing\n // `ol` as HTML in markdown, they adds it some other way.\n // We can’t do that, so we have to allow it.\n ul: [...aria, ['className', 'contains-task-list']],\n '*': [\n 'abbr',\n 'accept',\n 'acceptCharset',\n 'accessKey',\n 'action',\n 'align',\n 'alt',\n 'axis',\n 'border',\n 'cellPadding',\n 'cellSpacing',\n 'char',\n 'charOff',\n 'charSet',\n 'checked',\n 'clear',\n 'colSpan',\n 'color',\n 'cols',\n 'compact',\n 'coords',\n 'dateTime',\n 'dir',\n // Note: `disabled` is technically allowed on all elements by GH.\n // But it is useless on everything except `input`.\n // Because `input`s are normally not allowed, but we allow them for\n // checkboxes due to tasklists, we allow `disabled` only there.\n 'encType',\n 'frame',\n 'hSpace',\n 'headers',\n 'height',\n 'hrefLang',\n 'htmlFor',\n 'id',\n 'isMap',\n 'itemProp',\n 'label',\n 'lang',\n 'maxLength',\n 'media',\n 'method',\n 'multiple',\n 'name',\n 'noHref',\n 'noShade',\n 'noWrap',\n 'open',\n 'prompt',\n 'readOnly',\n 'rev',\n 'rowSpan',\n 'rows',\n 'rules',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'span',\n 'start',\n 'summary',\n 'tabIndex',\n 'title',\n 'useMap',\n 'vAlign',\n 'value',\n 'width'\n ]\n },\n clobber: ['ariaDescribedBy', 'ariaLabelledBy', 'id', 'name'],\n clobberPrefix: 'user-content-',\n protocols: {\n cite: ['http', 'https'],\n href: ['http', 'https', 'irc', 'ircs', 'mailto', 'xmpp'],\n longDesc: ['http', 'https'],\n src: ['http', 'https']\n },\n required: {\n input: {disabled: true, type: 'checkbox'}\n },\n strip: ['script'],\n tagNames: [\n 'a',\n 'b',\n 'blockquote',\n 'br',\n 'code',\n 'dd',\n 'del',\n 'details',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n // Note: `input` is not normally allowed by GH, when manually writing\n // it in markdown, they add it from tasklists some other way.\n // We can’t do that, so we have to allow it.\n 'input',\n 'ins',\n 'kbd',\n 'li',\n 'ol',\n 'p',\n 'picture',\n 'pre',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'source',\n 'span',\n 'strike',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'tr',\n 'tt',\n 'ul',\n 'var'\n ]\n}\n","/**\n * @import {\n * Comment,\n * Doctype,\n * ElementContent,\n * Element,\n * Nodes,\n * Properties,\n * RootContent,\n * Root,\n * Text\n * } from 'hast'\n */\n\n/**\n * @typedef {[string, ...Array<Exclude<Properties[keyof Properties], Array<any>> | RegExp>] | string} PropertyDefinition\n * Definition for a property.\n *\n * @typedef Schema\n * Schema that defines what nodes and properties are allowed.\n *\n * The default schema is `defaultSchema`, which follows how GitHub cleans.\n * If any top-level key is missing in the given schema, the corresponding\n * value of the default schema is used.\n *\n * To extend the standard schema with a few changes, clone `defaultSchema`\n * like so:\n *\n * ```js\n * import deepmerge from 'deepmerge'\n * import {h} from 'hastscript'\n * import {defaultSchema, sanitize} from 'hast-util-sanitize'\n *\n * // This allows `className` on all elements.\n * const schema = deepmerge(defaultSchema, {attributes: {'*': ['className']}})\n *\n * const tree = sanitize(h('div', {className: ['foo']}), schema)\n *\n * // `tree` still has `className`.\n * console.log(tree)\n * // {\n * // type: 'element',\n * // tagName: 'div',\n * // properties: {className: ['foo']},\n * // children: []\n * // }\n * ```\n * @property {boolean | null | undefined} [allowComments=false]\n * Whether to allow comment nodes (default: `false`).\n *\n * For example:\n *\n * ```js\n * allowComments: true\n * ```\n * @property {boolean | null | undefined} [allowDoctypes=false]\n * Whether to allow doctype nodes (default: `false`).\n *\n * For example:\n *\n * ```js\n * allowDoctypes: true\n * ```\n * @property {Record<string, Array<string>> | null | undefined} [ancestors]\n * Map of tag names to a list of tag names which are required ancestors\n * (default: `defaultSchema.ancestors`).\n *\n * Elements with these tag names will be ignored if they occur outside of one\n * of their allowed parents.\n *\n * For example:\n *\n * ```js\n * ancestors: {\n * tbody: ['table'],\n * // …\n * tr: ['table']\n * }\n * ```\n * @property {Record<string, Array<PropertyDefinition>> | null | undefined} [attributes]\n * Map of tag names to allowed property names (default:\n * `defaultSchema.attributes`).\n *\n * The special key `'*'` as a tag name defines property names allowed on all\n * elements.\n *\n * The special value `'data*'` as a property name can be used to allow all\n * `data` properties.\n *\n * For example:\n *\n * ```js\n * attributes: {\n * 'ariaDescribedBy', 'ariaLabel', 'ariaLabelledBy', …, 'href'\n * // …\n * '*': [\n * 'abbr',\n * 'accept',\n * 'acceptCharset',\n * // …\n * 'vAlign',\n * 'value',\n * 'width'\n * ]\n * }\n * ```\n *\n * Instead of a single string in the array, which allows any property value\n * for the field, you can use an array to allow several values.\n * For example, `input: ['type']` allows `type` set to any value on `input`s.\n * But `input: [['type', 'checkbox', 'radio']]` allows `type` when set to\n * `'checkbox'` or `'radio'`.\n *\n * You can use regexes, so for example `span: [['className', /^hljs-/]]`\n * allows any class that starts with `hljs-` on `span`s.\n *\n * When comma- or space-separated values are used (such as `className`), each\n * value in is checked individually.\n * For example, to allow certain classes on `span`s for syntax highlighting,\n * use `span: [['className', 'number', 'operator', 'token']]`.\n * This will allow `'number'`, `'operator'`, and `'token'` classes, but drop\n * others.\n * @property {Array<string> | null | undefined} [clobber]\n * List of property names that clobber (default: `defaultSchema.clobber`).\n *\n * For example:\n *\n * ```js\n * clobber: ['ariaDescribedBy', 'ariaLabelledBy', 'id', 'name']\n * ```\n * @property {string | null | undefined} [clobberPrefix]\n * Prefix to use before clobbering properties (default:\n * `defaultSchema.clobberPrefix`).\n *\n * For example:\n *\n * ```js\n * clobberPrefix: 'user-content-'\n * ```\n * @property {Record<string, Array<string> | null | undefined> | null | undefined} [protocols]\n * Map of *property names* to allowed protocols (default:\n * `defaultSchema.protocols`).\n *\n * This defines URLs that are always allowed to have local URLs (relative to\n * the current website, such as `this`, `#this`, `/this`, or `?this`), and\n * only allowed to have remote URLs (such as `https://example.com`) if they\n * use a known protocol.\n *\n * For example:\n *\n * ```js\n * protocols: {\n * cite: ['http', 'https'],\n * // …\n * src: ['http', 'https']\n * }\n * ```\n * @property {Record<string, Record<string, Properties[keyof Properties]>> | null | undefined} [required]\n * Map of tag names to required property names with a default value\n * (default: `defaultSchema.required`).\n *\n * This defines properties that must be set.\n * If a field does not exist (after the element was made safe), these will be\n * added with the given value.\n *\n * For example:\n *\n * ```js\n * required: {\n * input: {disabled: true, type: 'checkbox'}\n * }\n * ```\n *\n * > 👉 **Note**: properties are first checked based on `schema.attributes`,\n * > then on `schema.required`.\n * > That means properties could be removed by `attributes` and then added\n * > again with `required`.\n * @property {Array<string> | null | undefined} [strip]\n * List of tag names to strip from the tree (default: `defaultSchema.strip`).\n *\n * By default, unsafe elements (those not in `schema.tagNames`) are replaced\n * by what they contain.\n * This option can drop their contents.\n *\n * For example:\n *\n * ```js\n * strip: ['script']\n * ```\n * @property {Array<string> | null | undefined} [tagNames]\n * List of allowed tag names (default: `defaultSchema.tagNames`).\n *\n * For example:\n *\n * ```js\n * tagNames: [\n * 'a',\n * 'b',\n * // …\n * 'ul',\n * 'var'\n * ]\n * ```\n *\n * @typedef State\n * Info passed around.\n * @property {Readonly<Schema>} schema\n * Schema.\n * @property {Array<string>} stack\n * Tag names of ancestors.\n */\n\nimport structuredClone from '@ungap/structured-clone'\nimport {position} from 'unist-util-position'\nimport {defaultSchema} from './schema.js'\n\nconst own = {}.hasOwnProperty\n\n/**\n * Sanitize a tree.\n *\n * @param {Readonly<Nodes>} node\n * Unsafe tree.\n * @param {Readonly<Schema> | null | undefined} [options]\n * Configuration (default: `defaultSchema`).\n * @returns {Nodes}\n * New, safe tree.\n */\nexport function sanitize(node, options) {\n /** @type {Nodes} */\n let result = {type: 'root', children: []}\n\n /** @type {State} */\n const state = {\n schema: options ? {...defaultSchema, ...options} : defaultSchema,\n stack: []\n }\n const replace = transform(state, node)\n\n if (replace) {\n if (Array.isArray(replace)) {\n if (replace.length === 1) {\n result = replace[0]\n } else {\n result.children = replace\n }\n } else {\n result = replace\n }\n }\n\n return result\n}\n\n/**\n * Sanitize `node`.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<unknown>} node\n * Unsafe node.\n * @returns {Array<ElementContent> | Nodes | undefined}\n * Safe result.\n */\nfunction transform(state, node) {\n if (node && typeof node === 'object') {\n const unsafe = /** @type {Record<string, Readonly<unknown>>} */ (node)\n const type = typeof unsafe.type === 'string' ? unsafe.type : ''\n\n switch (type) {\n case 'comment': {\n return comment(state, unsafe)\n }\n\n case 'doctype': {\n return doctype(state, unsafe)\n }\n\n case 'element': {\n return element(state, unsafe)\n }\n\n case 'root': {\n return root(state, unsafe)\n }\n\n case 'text': {\n return text(state, unsafe)\n }\n\n default:\n }\n }\n}\n\n/**\n * Make a safe comment.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe comment-like value.\n * @returns {Comment | undefined}\n * Safe comment (if with `allowComments`).\n */\nfunction comment(state, unsafe) {\n if (state.schema.allowComments) {\n // See <https://html.spec.whatwg.org/multipage/parsing.html#serialising-html-fragments>\n const result = typeof unsafe.value === 'string' ? unsafe.value : ''\n const index = result.indexOf('-->')\n const value = index < 0 ? result : result.slice(0, index)\n\n /** @type {Comment} */\n const node = {type: 'comment', value}\n\n patch(node, unsafe)\n\n return node\n }\n}\n\n/**\n * Make a safe doctype.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe doctype-like value.\n * @returns {Doctype | undefined}\n * Safe doctype (if with `allowDoctypes`).\n */\nfunction doctype(state, unsafe) {\n if (state.schema.allowDoctypes) {\n /** @type {Doctype} */\n const node = {type: 'doctype'}\n\n patch(node, unsafe)\n\n return node\n }\n}\n\n/**\n * Make a safe element.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe element-like value.\n * @returns {Array<ElementContent> | Element | undefined}\n * Safe element.\n */\nfunction element(state, unsafe) {\n const name = typeof unsafe.tagName === 'string' ? unsafe.tagName : ''\n\n state.stack.push(name)\n\n const content = /** @type {Array<ElementContent>} */ (\n children(state, unsafe.children)\n )\n const properties_ = properties(state, unsafe.properties)\n\n state.stack.pop()\n\n let safeElement = false\n\n if (\n name &&\n name !== '*' &&\n (!state.schema.tagNames || state.schema.tagNames.includes(name))\n ) {\n safeElement = true\n\n // Some nodes can break out of their context if they don’t have a certain\n // ancestor.\n if (state.schema.ancestors && own.call(state.schema.ancestors, name)) {\n const ancestors = state.schema.ancestors[name]\n let index = -1\n\n safeElement = false\n\n while (++index < ancestors.length) {\n if (state.stack.includes(ancestors[index])) {\n safeElement = true\n }\n }\n }\n }\n\n if (!safeElement) {\n return state.schema.strip && !state.schema.strip.includes(name)\n ? content\n : undefined\n }\n\n /** @type {Element} */\n const node = {\n type: 'element',\n tagName: name,\n properties: properties_,\n children: content\n }\n\n patch(node, unsafe)\n\n return node\n}\n\n/**\n * Make a safe root.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe root-like value.\n * @returns {Root}\n * Safe root.\n */\nfunction root(state, unsafe) {\n const content = /** @type {Array<RootContent>} */ (\n children(state, unsafe.children)\n )\n\n /** @type {Root} */\n const node = {type: 'root', children: content}\n\n patch(node, unsafe)\n\n return node\n}\n\n/**\n * Make a safe text.\n *\n * @param {State} _\n * Info passed around.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe text-like value.\n * @returns {Text}\n * Safe text.\n */\nfunction text(_, unsafe) {\n const value = typeof unsafe.value === 'string' ? unsafe.value : ''\n /** @type {Text} */\n const node = {type: 'text', value}\n\n patch(node, unsafe)\n\n return node\n}\n\n/**\n * Make children safe.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<unknown>} children\n * Unsafe value.\n * @returns {Array<Nodes>}\n * Safe children.\n */\nfunction children(state, children) {\n /** @type {Array<Nodes>} */\n const results = []\n\n if (Array.isArray(children)) {\n const childrenUnknown = /** @type {Array<Readonly<unknown>>} */ (children)\n let index = -1\n\n while (++index < childrenUnknown.length) {\n const value = transform(state, childrenUnknown[index])\n\n if (value) {\n if (Array.isArray(value)) {\n results.push(...value)\n } else {\n results.push(value)\n }\n }\n }\n }\n\n return results\n}\n\n/**\n * Make element properties safe.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<unknown>} properties\n * Unsafe value.\n * @returns {Properties}\n * Safe value.\n */\nfunction properties(state, properties) {\n const tagName = state.stack[state.stack.length - 1]\n const attributes = state.schema.attributes\n const required = state.schema.required\n const specific =\n attributes && own.call(attributes, tagName)\n ? attributes[tagName]\n : undefined\n const defaults =\n attributes && own.call(attributes, '*') ? attributes['*'] : undefined\n const properties_ =\n /** @type {Readonly<Record<string, Readonly<unknown>>>} */ (\n properties && typeof properties === 'object' ? properties : {}\n )\n /** @type {Properties} */\n const result = {}\n /** @type {string} */\n let key\n\n for (key in properties_) {\n if (own.call(properties_, key)) {\n const unsafe = properties_[key]\n let safe = propertyValue(\n state,\n findDefinition(specific, key),\n key,\n unsafe\n )\n\n if (safe === null || safe === undefined) {\n safe = propertyValue(state, findDefinition(defaults, key), key, unsafe)\n }\n\n if (safe !== null && safe !== undefined) {\n result[key] = safe\n }\n }\n }\n\n if (required && own.call(required, tagName)) {\n const properties = required[tagName]\n\n for (key in properties) {\n if (own.call(properties, key) && !own.call(result, key)) {\n result[key] = properties[key]\n }\n }\n }\n\n return result\n}\n\n/**\n * Sanitize a property value.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<PropertyDefinition> | undefined} definition\n * Definition.\n * @param {string} key\n * Field name.\n * @param {Readonly<unknown>} value\n * Unsafe value (but an array).\n * @returns {Array<number | string> | boolean | number | string | undefined}\n * Safe value.\n */\nfunction propertyValue(state, definition, key, value) {\n return definition\n ? Array.isArray(value)\n ? propertyValueMany(state, definition, key, value)\n : propertyValuePrimitive(state, definition, key, value)\n : undefined\n}\n\n/**\n * Sanitize a property value which is a list.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<PropertyDefinition>} definition\n * Definition.\n * @param {string} key\n * Field name.\n * @param {Readonly<Array<Readonly<unknown>>>} values\n * Unsafe value (but an array).\n * @returns {Array<number | string>}\n * Safe value.\n */\nfunction propertyValueMany(state, definition, key, values) {\n let index = -1\n /** @type {Array<number | string>} */\n const result = []\n\n while (++index < values.length) {\n const value = propertyValuePrimitive(state, definition, key, values[index])\n\n if (typeof value === 'number' || typeof value === 'string') {\n result.push(value)\n }\n }\n\n return result\n}\n\n/**\n * Sanitize a property value which is a primitive.\n *\n * @param {State} state\n * Info passed around.\n * @param {Readonly<PropertyDefinition>} definition\n * Definition.\n * @param {string} key\n * Field name.\n * @param {Readonly<unknown>} value\n * Unsafe value (but not an array).\n * @returns {boolean | number | string | undefined}\n * Safe value.\n */\nfunction propertyValuePrimitive(state, definition, key, value) {\n if (\n typeof value !== 'boolean' &&\n typeof value !== 'number' &&\n typeof value !== 'string'\n ) {\n return\n }\n\n if (!safeProtocol(state, key, value)) {\n return\n }\n\n // Just a string, or only one item in an array, means all values are OK.\n // More than one item means an allow list.\n if (typeof definition === 'object' && definition.length > 1) {\n let ok = false\n let index = 0 // Ignore `key`, which is the first item.\n\n while (++index < definition.length) {\n const allowed = definition[index]\n\n // Expression.\n if (allowed && typeof allowed === 'object' && 'flags' in allowed) {\n if (allowed.test(String(value))) {\n ok = true\n break\n }\n }\n // Primitive.\n else if (allowed === value) {\n ok = true\n break\n }\n }\n\n if (!ok) return\n }\n\n return state.schema.clobber &&\n state.schema.clobberPrefix &&\n state.schema.clobber.includes(key)\n ? state.schema.clobberPrefix + value\n : value\n}\n\n/**\n * Check whether `value` is a safe URL.\n *\n * @param {State} state\n * Info passed around.\n * @param {string} key\n * Field name.\n * @param {Readonly<unknown>} value\n * Unsafe value.\n * @returns {boolean}\n * Whether it’s a safe value.\n */\nfunction safeProtocol(state, key, value) {\n const protocols =\n state.schema.protocols && own.call(state.schema.protocols, key)\n ? state.schema.protocols[key]\n : undefined\n\n // No protocols defined? Then everything is fine.\n if (!protocols || protocols.length === 0) {\n return true\n }\n\n const url = String(value)\n const colon = url.indexOf(':')\n const questionMark = url.indexOf('?')\n const numberSign = url.indexOf('#')\n const slash = url.indexOf('/')\n\n if (\n colon < 0 ||\n // If the first colon is after a `?`, `#`, or `/`, it’s not a protocol.\n (slash > -1 && colon > slash) ||\n (questionMark > -1 && colon > questionMark) ||\n (numberSign > -1 && colon > numberSign)\n ) {\n return true\n }\n\n let index = -1\n\n while (++index < protocols.length) {\n const protocol = protocols[index]\n\n if (\n colon === protocol.length &&\n url.slice(0, protocol.length) === protocol\n ) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Add data and position.\n *\n * @param {Nodes} node\n * Node to patch safe data and position on.\n * @param {Readonly<Record<string, Readonly<unknown>>>} unsafe\n * Unsafe node-like value.\n * @returns {undefined}\n * Nothing.\n */\nfunction patch(node, unsafe) {\n const cleanPosition = position(\n // @ts-expect-error: looks like a node.\n unsafe\n )\n\n if (unsafe.data) {\n node.data = structuredClone(unsafe.data)\n }\n\n if (cleanPosition) node.position = cleanPosition\n}\n\n/**\n *\n * @param {Readonly<Array<PropertyDefinition>> | undefined} definitions\n * @param {string} key\n * @returns {Readonly<PropertyDefinition> | undefined}\n */\nfunction findDefinition(definitions, key) {\n /** @type {PropertyDefinition | undefined} */\n let dataDefault\n let index = -1\n\n if (definitions) {\n while (++index < definitions.length) {\n const entry = definitions[index]\n const name = typeof entry === 'string' ? entry : entry[0]\n\n if (name === key) {\n return entry\n }\n\n if (name === 'data*') dataDefault = entry\n }\n }\n\n if (key.length > 4 && key.slice(0, 4).toLowerCase() === 'data') {\n return dataDefault\n }\n}\n","/**\n * @typedef {import('hast').Root} Root\n * @typedef {import('hast-util-sanitize').Schema} Schema\n */\n\nimport {sanitize} from 'hast-util-sanitize'\n\n/**\n * Sanitize HTML.\n *\n * @param {Schema | null | undefined} [options]\n * Configuration (optional).\n * @returns\n * Transform.\n */\nexport default function rehypeSanitize(options) {\n /**\n * @param {Root} tree\n * Tree.\n * @returns {Root}\n * New tree.\n */\n return function (tree) {\n // Assume root in -> root out.\n const result = /** @type {Root} */ (sanitize(tree, options))\n return result\n }\n}\n","// ========================================\r\n// DocumentViewer Component\r\n// ========================================\r\n// Displays DeepWiki documentation content with table of contents\r\n\r\nimport { useMemo, useState, useCallback } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { FileText, Hash, Clock, Sparkles, AlertCircle, Link2, Check } from 'lucide-react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport remarkGfm from 'remark-gfm';\r\nimport rehypeSanitize from 'rehype-sanitize';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { cn } from '@/lib/utils';\r\nimport type { DeepWikiSymbol, DeepWikiDoc } from '@/hooks/useDeepWiki';\r\n\r\nexport interface DocumentViewerProps {\r\n doc: DeepWikiDoc | null;\r\n content: string;\r\n symbols: DeepWikiSymbol[];\r\n isLoading?: boolean;\r\n error?: Error | null;\r\n /** Current file path for generating deep links */\r\n filePath?: string;\r\n}\r\n\r\n/**\r\n * Get symbol type icon\r\n */\r\nfunction getSymbolTypeIcon(type: string): { symbol: string; label: string } {\r\n const icons: Record<string, { symbol: string; label: string }> = {\r\n function: { symbol: 'λ', label: 'Function' },\r\n async_function: { symbol: 'λ', label: 'Async Function' },\r\n class: { symbol: '◇', label: 'Class' },\r\n method: { symbol: '◈', label: 'Method' },\r\n interface: { symbol: '△', label: 'Interface' },\r\n variable: { symbol: '•', label: 'Variable' },\r\n constant: { symbol: '⬡', label: 'Constant' },\r\n };\r\n return icons[type] || { symbol: '•', label: 'Symbol' };\r\n}\r\n\r\n/**\r\n * Get symbol type color\r\n */\r\nfunction getSymbolTypeColor(type: string): string {\r\n const colors: Record<string, string> = {\r\n function: 'text-blue-500',\r\n async_function: 'text-blue-400',\r\n class: 'text-purple-500',\r\n method: 'text-purple-400',\r\n interface: 'text-teal-500',\r\n variable: 'text-gray-500',\r\n constant: 'text-amber-500',\r\n };\r\n return colors[type] || 'text-gray-500';\r\n}\r\n\r\n/**\r\n * Markdown components with custom styling\r\n */\r\nconst markdownComponents = {\r\n h1: ({ children }: { children?: React.ReactNode }) => (\r\n <h1 className=\"text-xl font-bold mt-6 mb-3 text-foreground\">{children}</h1>\r\n ),\r\n h2: ({ children }: { children?: React.ReactNode }) => (\r\n <h2 className=\"text-lg font-semibold mt-5 mb-2 text-foreground\">{children}</h2>\r\n ),\r\n h3: ({ children }: { children?: React.ReactNode }) => (\r\n <h3 className=\"text-base font-semibold mt-4 mb-2 text-foreground\">{children}</h3>\r\n ),\r\n p: ({ children }: { children?: React.ReactNode }) => (\r\n <p className=\"mb-3 leading-relaxed text-foreground/90\">{children}</p>\r\n ),\r\n a: ({ href, children }: { href?: string; children?: React.ReactNode }) => (\r\n <a\r\n href={href}\r\n className=\"text-primary hover:underline\"\r\n target={href?.startsWith('http') ? '_blank' : undefined}\r\n rel={href?.startsWith('http') ? 'noopener noreferrer' : undefined}\r\n >\r\n {children}\r\n </a>\r\n ),\r\n code: ({ className, children }: { className?: string; children?: React.ReactNode }) => {\r\n const isInline = !className;\r\n if (isInline) {\r\n return (\r\n <code className=\"bg-muted px-1.5 py-0.5 rounded text-sm font-mono\">\r\n {children}\r\n </code>\r\n );\r\n }\r\n return (\r\n <code className={cn('block bg-muted p-3 rounded-md text-sm font-mono overflow-x-auto', className)}>\r\n {children}\r\n </code>\r\n );\r\n },\r\n pre: ({ children }: { children?: React.ReactNode }) => (\r\n <pre className=\"bg-muted p-4 rounded-lg my-4 overflow-x-auto\">\r\n {children}\r\n </pre>\r\n ),\r\n ul: ({ children }: { children?: React.ReactNode }) => (\r\n <ul className=\"list-disc list-inside mb-3 space-y-1\">{children}</ul>\r\n ),\r\n ol: ({ children }: { children?: React.ReactNode }) => (\r\n <ol className=\"list-decimal list-inside mb-3 space-y-1\">{children}</ol>\r\n ),\r\n blockquote: ({ children }: { children?: React.ReactNode }) => (\r\n <blockquote className=\"border-l-4 border-primary/50 pl-4 my-4 italic text-muted-foreground\">\r\n {children}\r\n </blockquote>\r\n ),\r\n table: ({ children }: { children?: React.ReactNode }) => (\r\n <div className=\"overflow-x-auto my-4\">\r\n <table className=\"min-w-full border border-border\">{children}</table>\r\n </div>\r\n ),\r\n thead: ({ children }: { children?: React.ReactNode }) => (\r\n <thead className=\"bg-muted\">{children}</thead>\r\n ),\r\n th: ({ children }: { children?: React.ReactNode }) => (\r\n <th className=\"border border-border px-3 py-2 text-left font-medium\">{children}</th>\r\n ),\r\n td: ({ children }: { children?: React.ReactNode }) => (\r\n <td className=\"border border-border px-3 py-2\">{children}</td>\r\n ),\r\n};\r\n\r\nexport function DocumentViewer({\r\n doc,\r\n content,\r\n symbols,\r\n isLoading = false,\r\n error = null,\r\n filePath,\r\n}: DocumentViewerProps) {\r\n const { formatMessage } = useIntl();\r\n const [copiedSymbol, setCopiedSymbol] = useState<string | null>(null);\r\n\r\n // Copy deep link to clipboard\r\n const copyDeepLink = useCallback((symbolName: string, anchor: string) => {\r\n const url = new URL(window.location.href);\r\n if (filePath) {\r\n url.searchParams.set('file', filePath);\r\n }\r\n url.hash = anchor.replace('#', '');\r\n\r\n navigator.clipboard.writeText(url.toString()).then(() => {\r\n setCopiedSymbol(symbolName);\r\n setTimeout(() => setCopiedSymbol(null), 2000);\r\n });\r\n }, [filePath]);\r\n\r\n // Parse HTML comments for symbol metadata\r\n const symbolSections = useMemo(() => {\r\n if (!content) return [];\r\n\r\n // Extract sections marked with deepwiki-symbol-start/end comments\r\n const regex = /<!-- deepwiki-symbol-start name=\"([^\"]+)\" type=\"([^\"]+)\" -->([\\s\\S]*?)<!-- deepwiki-symbol-end -->/g;\r\n const sections: Array<{ name: string; type: string; content: string }> = [];\r\n\r\n let match;\r\n while ((match = regex.exec(content)) !== null) {\r\n sections.push({\r\n name: match[1],\r\n type: match[2],\r\n content: match[3].trim(),\r\n });\r\n }\r\n\r\n // If no sections found, treat entire content as one section\r\n if (sections.length === 0 && content.trim()) {\r\n sections.push({\r\n name: 'Documentation',\r\n type: 'document',\r\n content: content.trim(),\r\n });\r\n }\r\n\r\n return sections;\r\n }, [content]);\r\n\r\n // Loading state\r\n if (isLoading) {\r\n return (\r\n <Card className=\"flex-1 p-6\">\r\n <div className=\"space-y-4 animate-pulse\">\r\n <div className=\"h-8 bg-muted rounded w-1/3\" />\r\n <div className=\"h-4 bg-muted rounded w-2/3\" />\r\n <div className=\"h-4 bg-muted rounded w-1/2\" />\r\n <div className=\"h-32 bg-muted rounded mt-6\" />\r\n <div className=\"h-4 bg-muted rounded w-3/4\" />\r\n <div className=\"h-4 bg-muted rounded w-2/3\" />\r\n </div>\r\n </Card>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <Card className=\"flex-1 p-6 flex flex-col items-center justify-center text-center\">\r\n <AlertCircle className=\"w-12 h-12 text-destructive/50 mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'deepwiki.viewer.error.title', defaultMessage: 'Error Loading Document' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">{error.message}</p>\r\n </Card>\r\n );\r\n }\r\n\r\n // Empty state\r\n if (!doc && !content) {\r\n return (\r\n <Card className=\"flex-1 p-6 flex flex-col items-center justify-center text-center\">\r\n <FileText className=\"w-12 h-12 text-muted-foreground/30 mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'deepwiki.viewer.empty.title', defaultMessage: 'Select a File' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'deepwiki.viewer.empty.message', defaultMessage: 'Choose a file from the list to view its documentation' })}\r\n </p>\r\n </Card>\r\n );\r\n }\r\n\r\n return (\r\n <Card className=\"flex-1 flex flex-col overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"p-4 border-b border-border\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div>\r\n <h2 className=\"text-lg font-semibold text-foreground flex items-center gap-2\">\r\n <FileText className=\"w-5 h-5 text-primary\" />\r\n <span className=\"font-mono text-sm\" title={doc?.path}>\r\n {doc?.path?.split('/').pop() || 'Documentation'}\r\n </span>\r\n </h2>\r\n {doc && (\r\n <div className=\"flex items-center gap-3 mt-1.5 text-xs text-muted-foreground\">\r\n {doc.generatedAt && (\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {new Date(doc.generatedAt).toLocaleString()}\r\n </span>\r\n )}\r\n {doc.llmTool && (\r\n <span className=\"flex items-center gap-1\">\r\n <Sparkles className=\"w-3 h-3\" />\r\n {doc.llmTool}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Main content area with TOC sidebar */}\r\n <div className=\"flex-1 flex overflow-hidden\">\r\n {/* Document content */}\r\n <div className=\"flex-1 overflow-y-auto p-6\">\r\n {/* Symbols list */}\r\n {symbols.length > 0 && (\r\n <div className=\"mb-6 flex flex-wrap gap-2\">\r\n {symbols.map(symbol => {\r\n const iconInfo = getSymbolTypeIcon(symbol.type);\r\n return (\r\n <a\r\n key={symbol.name}\r\n href={`#${symbol.anchor.replace('#', '')}`}\r\n className={cn(\r\n 'inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium',\r\n 'bg-muted/50 hover:bg-muted transition-colors',\r\n getSymbolTypeColor(symbol.type)\r\n )}\r\n aria-label={`${iconInfo.label}: ${symbol.name}`}\r\n >\r\n <span aria-hidden=\"true\">{iconInfo.symbol}</span>\r\n <span>{symbol.name}</span>\r\n <Badge variant=\"outline\" className=\"text-[10px] px-1\">\r\n {symbol.type}\r\n </Badge>\r\n </a>\r\n );\r\n })}\r\n </div>\r\n )}\r\n\r\n {/* Document sections with safe markdown rendering */}\r\n <div className=\"space-y-6\">\r\n {symbolSections.map((section, idx) => (\r\n <section\r\n key={`${section.name}-${idx}`}\r\n id={section.name.toLowerCase().replace(/\\s+/g, '-')}\r\n className=\"scroll-mt-4\"\r\n >\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeSanitize]}\r\n components={markdownComponents}\r\n >\r\n {section.content}\r\n </ReactMarkdown>\r\n </section>\r\n ))}\r\n\r\n {symbolSections.length === 0 && content && (\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeSanitize]}\r\n components={markdownComponents}\r\n >\r\n {content}\r\n </ReactMarkdown>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Table of contents sidebar (if symbols exist) */}\r\n {symbols.length > 0 && (\r\n <div className=\"w-48 border-l border-border p-4 overflow-y-auto hidden lg:block\">\r\n <h4 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-3 flex items-center gap-2\">\r\n <Hash className=\"w-3 h-3\" />\r\n {formatMessage({ id: 'deepwiki.viewer.toc', defaultMessage: 'Symbols' })}\r\n </h4>\r\n <nav className=\"space-y-1\" role=\"list\" aria-label=\"Document symbols\">\r\n {symbols.map(symbol => {\r\n const iconInfo = getSymbolTypeIcon(symbol.type);\r\n return (\r\n <div\r\n key={symbol.name}\r\n className=\"group flex items-center gap-1\"\r\n >\r\n <a\r\n href={`#${symbol.anchor.replace('#', '')}`}\r\n className={cn(\r\n 'flex-1 text-xs py-1.5 px-2 rounded transition-colors',\r\n 'text-muted-foreground hover:text-foreground hover:bg-muted/50',\r\n 'font-mono'\r\n )}\r\n role=\"listitem\"\r\n aria-label={`${iconInfo.label}: ${symbol.name}`}\r\n >\r\n <span className={cn('mr-1', getSymbolTypeColor(symbol.type))} aria-hidden=\"true\">\r\n {iconInfo.symbol}\r\n </span>\r\n {symbol.name}\r\n </a>\r\n <button\r\n onClick={() => copyDeepLink(symbol.name, symbol.anchor)}\r\n className={cn(\r\n 'opacity-0 group-hover:opacity-100 p-1 rounded transition-all',\r\n 'hover:bg-muted/50',\r\n copiedSymbol === symbol.name\r\n ? 'text-green-500'\r\n : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n aria-label={\r\n copiedSymbol === symbol.name\r\n ? formatMessage({ id: 'deepwiki.viewer.linkCopied', defaultMessage: 'Link copied' })\r\n : formatMessage({ id: 'deepwiki.viewer.copyLink', defaultMessage: 'Copy deep link to {name}' }, { name: symbol.name })\r\n }\r\n >\r\n {copiedSymbol === symbol.name ? (\r\n <Check className=\"w-3 h-3\" aria-hidden=\"true\" />\r\n ) : (\r\n <Link2 className=\"w-3 h-3\" aria-hidden=\"true\" />\r\n )}\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n )}\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\nexport default DocumentViewer;\r\n","// ========================================\r\n// DeepWiki Page\r\n// ========================================\r\n// Documentation deep-linking page with file browser and document viewer\r\n\r\nimport { useState, useEffect, useRef, useCallback } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport { BookOpen, RefreshCw, FileText, Hash, BarChart3 } from 'lucide-react';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\r\nimport { FileList } from '@/components/deepwiki/FileList';\r\nimport { DocumentViewer } from '@/components/deepwiki/DocumentViewer';\r\nimport {\r\n useDeepWikiFiles,\r\n useDeepWikiDoc,\r\n useDeepWikiStats,\r\n useDeepWikiSearch,\r\n} from '@/hooks/useDeepWiki';\r\nimport { cn } from '@/lib/utils';\r\n\r\ntype ActiveTab = 'documents' | 'index' | 'stats';\r\n\r\n/**\r\n * Stats card component\r\n */\r\nfunction StatsCard({\r\n label,\r\n value,\r\n icon: Icon,\r\n color,\r\n}: {\r\n label: string;\r\n value: number;\r\n icon: React.ComponentType<{ className?: string }>;\r\n color: string;\r\n}) {\r\n return (\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={cn('p-2 rounded-lg', color)}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div>\r\n <p className=\"text-2xl font-bold text-foreground\">{value}</p>\r\n <p className=\"text-xs text-muted-foreground\">{label}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\nexport function DeepWikiPage() {\r\n const { formatMessage } = useIntl();\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const [activeTab, setActiveTab] = useState<ActiveTab>('documents');\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const scrollAttemptedRef = useRef(false);\r\n\r\n // Get file from URL query parameter\r\n const fileParam = searchParams.get('file');\r\n const hashParam = window.location.hash.slice(1); // Remove leading #\r\n\r\n const [selectedFile, setSelectedFile] = useState<string | null>(fileParam);\r\n\r\n // Data hooks\r\n const {\r\n files,\r\n isLoading: filesLoading,\r\n isFetching: filesFetching,\r\n refetch: refetchFiles,\r\n } = useDeepWikiFiles();\r\n\r\n const {\r\n stats,\r\n isLoading: statsLoading,\r\n refetch: refetchStats,\r\n } = useDeepWikiStats();\r\n\r\n const {\r\n doc,\r\n content,\r\n symbols,\r\n isLoading: docLoading,\r\n error: docError,\r\n } = useDeepWikiDoc(selectedFile);\r\n\r\n const {\r\n symbols: searchResults,\r\n isLoading: searchLoading,\r\n } = useDeepWikiSearch(searchQuery, { enabled: activeTab === 'index' });\r\n\r\n // Handle file selection with URL sync\r\n const handleSelectFile = useCallback((filePath: string) => {\r\n setSelectedFile(filePath);\r\n setSearchParams({ file: filePath });\r\n scrollAttemptedRef.current = false; // Reset scroll flag for new file\r\n }, [setSearchParams]);\r\n\r\n // Scroll to symbol anchor when content loads\r\n useEffect(() => {\r\n if (hashParam && content && !docLoading && !scrollAttemptedRef.current) {\r\n scrollAttemptedRef.current = true;\r\n // Small delay to ensure DOM is rendered\r\n setTimeout(() => {\r\n const element = document.getElementById(hashParam);\r\n if (element) {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n }, 100);\r\n }\r\n }, [hashParam, content, docLoading]);\r\n\r\n // Refresh all data\r\n const handleRefresh = () => {\r\n refetchFiles();\r\n refetchStats();\r\n };\r\n\r\n return (\r\n <div className=\"h-full flex flex-col space-y-4\">\r\n {/* Page Header */}\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\r\n <BookOpen className=\"w-6 h-6 text-primary\" />\r\n {formatMessage({ id: 'deepwiki.title', defaultMessage: 'DeepWiki' })}\r\n </h1>\r\n <p className=\"text-muted-foreground mt-1\">\r\n {formatMessage({ id: 'deepwiki.description', defaultMessage: 'Code documentation with deep-linking to source symbols' })}\r\n </p>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleRefresh}\r\n disabled={filesFetching}\r\n >\r\n <RefreshCw className={cn('w-4 h-4 mr-2', filesFetching && 'animate-spin')} />\r\n {formatMessage({ id: 'common.actions.refresh', defaultMessage: 'Refresh' })}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Tabbed Interface */}\r\n <TabsNavigation\r\n value={activeTab}\r\n onValueChange={(value) => setActiveTab(value as ActiveTab)}\r\n tabs={[\r\n { value: 'documents', label: formatMessage({ id: 'deepwiki.tabs.documents', defaultMessage: 'Documents' }) },\r\n { value: 'index', label: formatMessage({ id: 'deepwiki.tabs.index', defaultMessage: 'Symbol Index' }) },\r\n { value: 'stats', label: formatMessage({ id: 'deepwiki.tabs.stats', defaultMessage: 'Statistics' }) },\r\n ]}\r\n />\r\n\r\n {/* Tab Content: Documents */}\r\n {activeTab === 'documents' && (\r\n <div className=\"flex-1 flex gap-4 min-h-0\">\r\n {/* File List Sidebar */}\r\n <div className=\"w-80 flex-shrink-0\">\r\n <FileList\r\n files={files}\r\n selectedPath={selectedFile}\r\n onSelectFile={handleSelectFile}\r\n isLoading={filesLoading}\r\n isFetching={filesFetching}\r\n onRefresh={() => refetchFiles()}\r\n />\r\n </div>\r\n\r\n {/* Document Viewer */}\r\n <DocumentViewer\r\n doc={doc}\r\n content={content}\r\n symbols={symbols}\r\n isLoading={docLoading}\r\n error={docError}\r\n filePath={selectedFile ?? undefined}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Tab Content: Symbol Index */}\r\n {activeTab === 'index' && (\r\n <div className=\"flex-1 overflow-y-auto\">\r\n <Card className=\"p-4 h-full flex flex-col\">\r\n {/* Search input */}\r\n <div className=\"mb-4\">\r\n <input\r\n type=\"text\"\r\n placeholder={formatMessage({ id: 'deepwiki.index.search', defaultMessage: 'Search symbols...' })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"w-full px-4 py-2 rounded-md border border-input bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-primary\"\r\n />\r\n </div>\r\n\r\n {/* Search results */}\r\n {searchLoading ? (\r\n <div className=\"flex-1 flex items-center justify-center\">\r\n <RefreshCw className=\"w-6 h-6 animate-spin text-muted-foreground\" />\r\n </div>\r\n ) : searchResults.length > 0 ? (\r\n <div className=\"flex-1 overflow-y-auto space-y-2\">\r\n {searchResults.map(symbol => (\r\n <button\r\n key={`${symbol.name}-${symbol.sourceFile}`}\r\n onClick={() => {\r\n setSelectedFile(symbol.sourceFile);\r\n setActiveTab('documents');\r\n }}\r\n className=\"w-full p-3 rounded-md border border-border hover:bg-muted/50 transition-colors text-left\"\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <Hash className=\"w-4 h-4 text-primary\" />\r\n <span className=\"font-medium text-foreground\">{symbol.name}</span>\r\n <Badge variant=\"outline\" className=\"text-xs\">{symbol.type}</Badge>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground mt-1 font-mono truncate\">\r\n {symbol.sourceFile}:{symbol.lineRange[0]}-{symbol.lineRange[1]}\r\n </p>\r\n </button>\r\n ))}\r\n </div>\r\n ) : searchQuery ? (\r\n <div className=\"flex-1 flex flex-col items-center justify-center text-center\">\r\n <Hash className=\"w-10 h-10 text-muted-foreground/30 mb-3\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'deepwiki.index.noResults', defaultMessage: 'No symbols found' })}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"flex-1 flex flex-col items-center justify-center text-center\">\r\n <Hash className=\"w-10 h-10 text-muted-foreground/30 mb-3\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'deepwiki.index.placeholder', defaultMessage: 'Enter a search query to find symbols' })}\r\n </p>\r\n </div>\r\n )}\r\n </Card>\r\n </div>\r\n )}\r\n\r\n {/* Tab Content: Statistics */}\r\n {activeTab === 'stats' && (\r\n <div className=\"flex-1 overflow-y-auto space-y-4\">\r\n {statsLoading ? (\r\n <Card className=\"p-6\">\r\n <div className=\"space-y-4 animate-pulse\">\r\n <div className=\"h-20 bg-muted rounded\" />\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div className=\"h-24 bg-muted rounded\" />\r\n <div className=\"h-24 bg-muted rounded\" />\r\n <div className=\"h-24 bg-muted rounded\" />\r\n <div className=\"h-24 bg-muted rounded\" />\r\n </div>\r\n </div>\r\n </Card>\r\n ) : (\r\n <>\r\n {/* Status card */}\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div\r\n className={cn(\r\n 'w-3 h-3 rounded-full',\r\n stats?.available ? 'bg-green-500' : 'bg-red-500'\r\n )}\r\n />\r\n <span className=\"text-sm font-medium text-foreground\">\r\n {stats?.available\r\n ? formatMessage({ id: 'deepwiki.stats.available', defaultMessage: 'Database Connected' })\r\n : formatMessage({ id: 'deepwiki.stats.unavailable', defaultMessage: 'Database Not Available' })}\r\n </span>\r\n </div>\r\n {stats?.dbPath && (\r\n <code className=\"text-xs text-muted-foreground bg-muted px-2 py-1 rounded\">\r\n {stats.dbPath}\r\n </code>\r\n )}\r\n </div>\r\n </Card>\r\n\r\n {/* Stats grid */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <StatsCard\r\n label={formatMessage({ id: 'deepwiki.stats.files', defaultMessage: 'Files' })}\r\n value={stats?.files ?? 0}\r\n icon={FileText}\r\n color=\"bg-blue-500/10 text-blue-500\"\r\n />\r\n <StatsCard\r\n label={formatMessage({ id: 'deepwiki.stats.symbols', defaultMessage: 'Symbols' })}\r\n value={stats?.symbols ?? 0}\r\n icon={Hash}\r\n color=\"bg-purple-500/10 text-purple-500\"\r\n />\r\n <StatsCard\r\n label={formatMessage({ id: 'deepwiki.stats.docs', defaultMessage: 'Documents' })}\r\n value={stats?.docs ?? 0}\r\n icon={BookOpen}\r\n color=\"bg-green-500/10 text-green-500\"\r\n />\r\n <StatsCard\r\n label={formatMessage({ id: 'deepwiki.stats.needingDocs', defaultMessage: 'Need Docs' })}\r\n value={stats?.filesNeedingDocs ?? 0}\r\n icon={BarChart3}\r\n color=\"bg-amber-500/10 text-amber-500\"\r\n />\r\n </div>\r\n\r\n {/* Help text */}\r\n <Card className=\"p-4\">\r\n <h3 className=\"text-sm font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'deepwiki.stats.howTo.title', defaultMessage: 'Documentation Index' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'deepwiki.stats.howTo.description', defaultMessage: 'DeepWiki automatically indexes symbols and documentation from code. Currently in read-only mode.' })}\r\n </p>\r\n </Card>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default DeepWikiPage;\r\n"],"names":["deepWikiKeys","projectPath","path","query","STALE_TIME","GC_TIME","REQUEST_TIMEOUT","fetchWithTimeout","url","timeout","controller","timeoutId","fetchDeepWikiFiles","response","fetchDeepWikiDoc","filePath","fetchDeepWikiStats","searchDeepWikiSymbols","limit","useDeepWikiFiles","options","staleTime","enabled","useWorkflowStore","selectProjectPath","useQuery","useDeepWikiDoc","_a","_b","_c","useDeepWikiStats","useDeepWikiSearch","queryResult","getRelativePath","fullPath","parts","srcIndex","p","getFileExtension","getExtensionColor","ext","FileList","files","selectedPath","onSelectFile","isLoading","isFetching","onRefresh","formatMessage","useIntl","searchQuery","setSearchQuery","useState","debouncedSearchQuery","useDebounce","isSearching","setIsSearching","filteredFiles","useMemo","f","useEffect","groupedFiles","groups","file","dir","jsx","Card","i","jsxs","FileText","Badge","Button","RefreshCw","cn","Search","Input","e","Loader2","dirFiles","extColor","isSelected","CheckCircle","Clock","aria","defaultSchema","own","sanitize","node","result","state","replace","transform","unsafe","comment","doctype","element","root","text","index","patch","name","content","children","properties_","properties","safeElement","ancestors","_","results","childrenUnknown","value","tagName","attributes","required","specific","defaults","key","safe","propertyValue","findDefinition","definition","propertyValueMany","propertyValuePrimitive","values","safeProtocol","ok","allowed","protocols","colon","questionMark","numberSign","slash","protocol","cleanPosition","position","structuredClone","definitions","dataDefault","entry","rehypeSanitize","tree","getSymbolTypeIcon","type","getSymbolTypeColor","markdownComponents","href","className","DocumentViewer","doc","symbols","error","copiedSymbol","setCopiedSymbol","copyDeepLink","useCallback","symbolName","anchor","symbolSections","regex","sections","match","AlertCircle","Sparkles","symbol","iconInfo","section","idx","ReactMarkdown","remarkGfm","Hash","Check","Link2","StatsCard","label","Icon","color","DeepWikiPage","searchParams","setSearchParams","useSearchParams","activeTab","setActiveTab","scrollAttemptedRef","useRef","fileParam","hashParam","selectedFile","setSelectedFile","filesLoading","filesFetching","refetchFiles","stats","statsLoading","refetchStats","docLoading","docError","searchResults","searchLoading","handleSelectFile","handleRefresh","BookOpen","TabsNavigation","Fragment","BarChart3"],"mappings":"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EAIZ,GAAI,CAAC,CAAC,YAAa,gBAAgB,CAAC,EAIpC,GAAI,CAAC,GAAGA,EAAM,CAAC,YAAa,oBAAoB,CAAC,EACjD,EAAG,CAAC,MAAM,EACV,QAAS,CAAC,gBAAiB,CAAC,YAAa,WAAW,CAAC,EACrD,OAAQ,CAAC,QAAQ,EACjB,QAAS,CAAC,GAAGA,CAAI,EACjB,MAAO,CAAC,GAAGA,CAAI,EAIf,GAAI,CAAC,GAAGA,EAAM,CAAC,YAAa,oBAAoB,CAAC,EACjD,IAAK,CACH,OACA,SACA,gBACA,YACA,SACA,QACA,MACA,OACA,SACA,cACA,cACA,OACA,UACA,UACA,UACA,QACA,UACA,QACA,OACA,UACA,SACA,WACA,MAKA,UACA,QACA,SACA,UACA,SACA,WACA,UACA,KACA,QACA,WACA,QACA,OACA,YACA,QACA,SACA,WACA,OACA,SACA,UACA,SACA,OACA,SACA,WACA,MACA,UACA,OACA,QACA,QACA,WACA,QACA,OACA,OACA,QACA,UACA,WACA,QACA,SACA,SACA,QACA,OACN,CACA,EACE,QAAS,CAAC,kBAAmB,iBAAkB,KAAM,MAAM,EAC3D,cAAe,gBACf,UAAW,CACT,KAAM,CAAC,OAAQ,OAAO,EACtB,KAAM,CAAC,OAAQ,QAAS,MAAO,OAAQ,SAAU,MAAM,EACvD,SAAU,CAAC,OAAQ,OAAO,EAC1B,IAAK,CAAC,OAAQ,OAAO,CACzB,EACE,SAAU,CACR,MAAO,CAAC,SAAU,GAAM,KAAM,UAAU,CAC5C,EACE,MAAO,CAAC,QAAQ,EAChB,SAAU,CACR,IACA,IACA,aACA,KACA,OACA,KACA,MACA,UACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,MAIA,QACA,MACA,MACA,KACA,KACA,IACA,UACA,MACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,OACA,SACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,QACA,KACA,QACA,KACA,KACA,KACA,KACJ,CACA,ECQME,EAAM,CAAA,EAAG,eAYR,SAASC,GAASC,EAAMnE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","x_google_ignoreList":[2,3,4]}