claude-code-workflow 7.2.19 → 7.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.claude/commands/workflow/analyze-with-file.md +33 -8
  2. package/.codex/skills/analyze-with-file/SKILL.md +55 -8
  3. package/ccw/frontend/dist/assets/{AlertDialog-zDuLRyN3.js → AlertDialog-Cukb0xv2.js} +2 -2
  4. package/ccw/frontend/dist/assets/{AlertDialog-zDuLRyN3.js.map → AlertDialog-Cukb0xv2.js.map} +1 -1
  5. package/ccw/frontend/dist/assets/{AnalysisPage-DGCGwIZY.js → AnalysisPage-Ddmv0J4x.js} +2 -2
  6. package/ccw/frontend/dist/assets/{AnalysisPage-DGCGwIZY.js.map → AnalysisPage-Ddmv0J4x.js.map} +1 -1
  7. package/ccw/frontend/dist/assets/{ApiSettingsPage-CgclCqmv.js → ApiSettingsPage-DMkrTZDX.js} +2 -2
  8. package/ccw/frontend/dist/assets/{ApiSettingsPage-CgclCqmv.js.map → ApiSettingsPage-DMkrTZDX.js.map} +1 -1
  9. package/ccw/frontend/dist/assets/{CliModeToggle-CbGH7qO4.js → CliModeToggle-DXenjpbe.js} +2 -2
  10. package/ccw/frontend/dist/assets/{CliModeToggle-CbGH7qO4.js.map → CliModeToggle-DXenjpbe.js.map} +1 -1
  11. package/ccw/frontend/dist/assets/{CliSessionSharePage-CJGlwyDw.js → CliSessionSharePage-B-ZIMqmX.js} +2 -2
  12. package/ccw/frontend/dist/assets/{CliSessionSharePage-CJGlwyDw.js.map → CliSessionSharePage-B-ZIMqmX.js.map} +1 -1
  13. package/ccw/frontend/dist/assets/{CliViewerPage-D-MHYyDt.js → CliViewerPage-9YxGyLxh.js} +2 -2
  14. package/ccw/frontend/dist/assets/{CliViewerPage-D-MHYyDt.js.map → CliViewerPage-9YxGyLxh.js.map} +1 -1
  15. package/ccw/frontend/dist/assets/{CodexLensPage-z6miX68P.js → CodexLensPage-B_uv5wdn.js} +2 -2
  16. package/ccw/frontend/dist/assets/{CodexLensPage-z6miX68P.js.map → CodexLensPage-B_uv5wdn.js.map} +1 -1
  17. package/ccw/frontend/dist/assets/{Collapsible-D5zS2wef.js → Collapsible-C2qk3yV0.js} +2 -2
  18. package/ccw/frontend/dist/assets/{Collapsible-D5zS2wef.js.map → Collapsible-C2qk3yV0.js.map} +1 -1
  19. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChcTwmAn.js → CommandsManagerPage-DBtaWxLB.js} +2 -2
  20. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChcTwmAn.js.map → CommandsManagerPage-DBtaWxLB.js.map} +1 -1
  21. package/ccw/frontend/dist/assets/{DeepWikiPage-Cv5LifSi.js → DeepWikiPage-d9K4_TgG.js} +2 -2
  22. package/ccw/frontend/dist/assets/{DeepWikiPage-Cv5LifSi.js.map → DeepWikiPage-d9K4_TgG.js.map} +1 -1
  23. package/ccw/frontend/dist/assets/{EndpointsPage-BcyNmqIa.js → EndpointsPage-DhW6hYrI.js} +2 -2
  24. package/ccw/frontend/dist/assets/{EndpointsPage-BcyNmqIa.js.map → EndpointsPage-DhW6hYrI.js.map} +1 -1
  25. package/ccw/frontend/dist/assets/{ExplorerPage-DfHtqeQM.js → ExplorerPage-DYYpCvtB.js} +2 -2
  26. package/ccw/frontend/dist/assets/{ExplorerPage-DfHtqeQM.js.map → ExplorerPage-DYYpCvtB.js.map} +1 -1
  27. package/ccw/frontend/dist/assets/{FixSessionPage-CbvZApeF.js → FixSessionPage-CSmiT5SE.js} +2 -2
  28. package/ccw/frontend/dist/assets/{FixSessionPage-CbvZApeF.js.map → FixSessionPage-CSmiT5SE.js.map} +1 -1
  29. package/ccw/frontend/dist/assets/{FloatingFileBrowser-DLz85cw9.js → FloatingFileBrowser-DvMsXLdP.js} +2 -2
  30. package/ccw/frontend/dist/assets/{FloatingFileBrowser-DLz85cw9.js.map → FloatingFileBrowser-DvMsXLdP.js.map} +1 -1
  31. package/ccw/frontend/dist/assets/{FloatingPanel-DrUTmgtV.js → FloatingPanel-sqezhSI8.js} +2 -2
  32. package/ccw/frontend/dist/assets/{FloatingPanel-DrUTmgtV.js.map → FloatingPanel-sqezhSI8.js.map} +1 -1
  33. package/ccw/frontend/dist/assets/{GraphExplorerPage-C439yLvH.js → GraphExplorerPage-DS8ghMFM.js} +2 -2
  34. package/ccw/frontend/dist/assets/{GraphExplorerPage-C439yLvH.js.map → GraphExplorerPage-DS8ghMFM.js.map} +1 -1
  35. package/ccw/frontend/dist/assets/{HistoryPage-BClJJMEy.js → HistoryPage-B-x1RyHu.js} +2 -2
  36. package/ccw/frontend/dist/assets/{HistoryPage-BClJJMEy.js.map → HistoryPage-B-x1RyHu.js.map} +1 -1
  37. package/ccw/frontend/dist/assets/{HookManagerPage-DI-2QDLJ.js → HookManagerPage-BbxpDb68.js} +2 -2
  38. package/ccw/frontend/dist/assets/{HookManagerPage-DI-2QDLJ.js.map → HookManagerPage-BbxpDb68.js.map} +1 -1
  39. package/ccw/frontend/dist/assets/{InstallationsPage-DKlz1ypL.js → InstallationsPage-3bShz_Ai.js} +2 -2
  40. package/ccw/frontend/dist/assets/{InstallationsPage-DKlz1ypL.js.map → InstallationsPage-3bShz_Ai.js.map} +1 -1
  41. package/ccw/frontend/dist/assets/{IssueHubPage--6DduN4j.js → IssueHubPage-BQY_Hh3e.js} +2 -2
  42. package/ccw/frontend/dist/assets/{IssueHubPage--6DduN4j.js.map → IssueHubPage-BQY_Hh3e.js.map} +1 -1
  43. package/ccw/frontend/dist/assets/{LiteTasksPage-39j6xEeL.js → LiteTasksPage-vD_8fQcR.js} +2 -2
  44. package/ccw/frontend/dist/assets/{LiteTasksPage-39j6xEeL.js.map → LiteTasksPage-vD_8fQcR.js.map} +1 -1
  45. package/ccw/frontend/dist/assets/{McpManagerPage-D00C9RVN.js → McpManagerPage-CI5ZzB8A.js} +2 -2
  46. package/ccw/frontend/dist/assets/{McpManagerPage-D00C9RVN.js.map → McpManagerPage-CI5ZzB8A.js.map} +1 -1
  47. package/ccw/frontend/dist/assets/{MemoryPage-BXWKdTyM.js → MemoryPage-CNuj2eNg.js} +2 -2
  48. package/ccw/frontend/dist/assets/{MemoryPage-BXWKdTyM.js.map → MemoryPage-CNuj2eNg.js.map} +1 -1
  49. package/ccw/frontend/dist/assets/{NotFoundPage-h5o3I7cF.js → NotFoundPage-BrnAXkb1.js} +2 -2
  50. package/ccw/frontend/dist/assets/{NotFoundPage-h5o3I7cF.js.map → NotFoundPage-BrnAXkb1.js.map} +1 -1
  51. package/ccw/frontend/dist/assets/{OrchestratorPage-jkyjmiI1.js → OrchestratorPage-CH81PGt4.js} +2 -2
  52. package/ccw/frontend/dist/assets/{OrchestratorPage-jkyjmiI1.js.map → OrchestratorPage-CH81PGt4.js.map} +1 -1
  53. package/ccw/frontend/dist/assets/{ProjectOverviewPage-C2bE5eb2.js → ProjectOverviewPage-dwiEXl2O.js} +2 -2
  54. package/ccw/frontend/dist/assets/{ProjectOverviewPage-C2bE5eb2.js.map → ProjectOverviewPage-dwiEXl2O.js.map} +1 -1
  55. package/ccw/frontend/dist/assets/{PromptHistoryPage-DzmPK4GZ.js → PromptHistoryPage-CabgLjJU.js} +2 -2
  56. package/ccw/frontend/dist/assets/{PromptHistoryPage-DzmPK4GZ.js.map → PromptHistoryPage-CabgLjJU.js.map} +1 -1
  57. package/ccw/frontend/dist/assets/{ReviewSessionPage-CVMH1K6G.js → ReviewSessionPage-DAMrNFn8.js} +2 -2
  58. package/ccw/frontend/dist/assets/{ReviewSessionPage-CVMH1K6G.js.map → ReviewSessionPage-DAMrNFn8.js.map} +1 -1
  59. package/ccw/frontend/dist/assets/{RulesManagerPage-BDZco-r2.js → RulesManagerPage-4jzmxPn0.js} +2 -2
  60. package/ccw/frontend/dist/assets/{RulesManagerPage-BDZco-r2.js.map → RulesManagerPage-4jzmxPn0.js.map} +1 -1
  61. package/ccw/frontend/dist/assets/{SessionDetailPage-D5cM-8Kk.js → SessionDetailPage-C5Btktmp.js} +2 -2
  62. package/ccw/frontend/dist/assets/{SessionDetailPage-D5cM-8Kk.js.map → SessionDetailPage-C5Btktmp.js.map} +1 -1
  63. package/ccw/frontend/dist/assets/{SessionsPage-BFy74ye3.js → SessionsPage-CQIB4E8m.js} +2 -2
  64. package/ccw/frontend/dist/assets/{SessionsPage-BFy74ye3.js.map → SessionsPage-CQIB4E8m.js.map} +1 -1
  65. package/ccw/frontend/dist/assets/SettingsPage-Yi9UAfm7.js +150 -0
  66. package/ccw/frontend/dist/assets/SettingsPage-Yi9UAfm7.js.map +1 -0
  67. package/ccw/frontend/dist/assets/{SkillsManagerPage-8Dsq4AUD.js → SkillsManagerPage-BqfvYSkT.js} +2 -2
  68. package/ccw/frontend/dist/assets/{SkillsManagerPage-8Dsq4AUD.js.map → SkillsManagerPage-BqfvYSkT.js.map} +1 -1
  69. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CG77iAYQ.js → SpecsSettingsPage-BdVPM5R6.js} +2 -2
  70. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CG77iAYQ.js.map → SpecsSettingsPage-BdVPM5R6.js.map} +1 -1
  71. package/ccw/frontend/dist/assets/{Switch-BbuvVsX-.js → Switch-BG929kV0.js} +2 -2
  72. package/ccw/frontend/dist/assets/{Switch-BbuvVsX-.js.map → Switch-BG929kV0.js.map} +1 -1
  73. package/ccw/frontend/dist/assets/{TabsNavigation-SGJhC8-P.js → TabsNavigation-Bol1y09b.js} +2 -2
  74. package/ccw/frontend/dist/assets/{TabsNavigation-SGJhC8-P.js.map → TabsNavigation-Bol1y09b.js.map} +1 -1
  75. package/ccw/frontend/dist/assets/{TaskDrawer-p51jeScU.js → TaskDrawer-Dwutrn8_.js} +2 -2
  76. package/ccw/frontend/dist/assets/{TaskDrawer-p51jeScU.js.map → TaskDrawer-Dwutrn8_.js.map} +1 -1
  77. package/ccw/frontend/dist/assets/{TeamPage-CvZBThbr.js → TeamPage-CpCSwpxD.js} +2 -2
  78. package/ccw/frontend/dist/assets/{TeamPage-CvZBThbr.js.map → TeamPage-CpCSwpxD.js.map} +1 -1
  79. package/ccw/frontend/dist/assets/{TerminalDashboardPage-uhM7kGKI.js → TerminalDashboardPage-DODKjOeK.js} +2 -2
  80. package/ccw/frontend/dist/assets/{TerminalDashboardPage-uhM7kGKI.js.map → TerminalDashboardPage-DODKjOeK.js.map} +1 -1
  81. package/ccw/frontend/dist/assets/{archive-D6ySrtHC.js → archive-CQw634kD.js} +2 -2
  82. package/ccw/frontend/dist/assets/{archive-D6ySrtHC.js.map → archive-CQw634kD.js.map} +1 -1
  83. package/ccw/frontend/dist/assets/{archive-restore-C1uI-5TY.js → archive-restore-B-_EG6wE.js} +2 -2
  84. package/ccw/frontend/dist/assets/{archive-restore-C1uI-5TY.js.map → archive-restore-B-_EG6wE.js.map} +1 -1
  85. package/ccw/frontend/dist/assets/{arrow-right-qE5-FMG8.js → arrow-right-CcQtxBrU.js} +2 -2
  86. package/ccw/frontend/dist/assets/{arrow-right-qE5-FMG8.js.map → arrow-right-CcQtxBrU.js.map} +1 -1
  87. package/ccw/frontend/dist/assets/{bookmark-plus-DL4iL38T.js → bookmark-plus-Cl-BbcpR.js} +2 -2
  88. package/ccw/frontend/dist/assets/{bookmark-plus-DL4iL38T.js.map → bookmark-plus-Cl-BbcpR.js.map} +1 -1
  89. package/ccw/frontend/dist/assets/{bot-CZzIeEkg.js → bot-CLSNSkW_.js} +2 -2
  90. package/ccw/frontend/dist/assets/{bot-CZzIeEkg.js.map → bot-CLSNSkW_.js.map} +1 -1
  91. package/ccw/frontend/dist/assets/{braces-MEPRT2LN.js → braces-DWwkaDS6.js} +2 -2
  92. package/ccw/frontend/dist/assets/{braces-MEPRT2LN.js.map → braces-DWwkaDS6.js.map} +1 -1
  93. package/ccw/frontend/dist/assets/{circle-stop-GQcecSUg.js → circle-stop-DiS7e6ma.js} +2 -2
  94. package/ccw/frontend/dist/assets/{circle-stop-GQcecSUg.js.map → circle-stop-DiS7e6ma.js.map} +1 -1
  95. package/ccw/frontend/dist/assets/{cpu-CzxYMs1Y.js → cpu-CuvHUVXO.js} +2 -2
  96. package/ccw/frontend/dist/assets/{cpu-CzxYMs1Y.js.map → cpu-CuvHUVXO.js.map} +1 -1
  97. package/ccw/frontend/dist/assets/{ellipsis-vertical-DZMfiFKo.js → ellipsis-vertical-BoVlINSw.js} +2 -2
  98. package/ccw/frontend/dist/assets/{ellipsis-vertical-DZMfiFKo.js.map → ellipsis-vertical-BoVlINSw.js.map} +1 -1
  99. package/ccw/frontend/dist/assets/{eye-BXfPoClW.js → eye-BEMOdcAN.js} +2 -2
  100. package/ccw/frontend/dist/assets/{eye-BXfPoClW.js.map → eye-BEMOdcAN.js.map} +1 -1
  101. package/ccw/frontend/dist/assets/{eye-off-CyaKXmAk.js → eye-off-C5HS4Ytm.js} +2 -2
  102. package/ccw/frontend/dist/assets/{eye-off-CyaKXmAk.js.map → eye-off-C5HS4Ytm.js.map} +1 -1
  103. package/ccw/frontend/dist/assets/{file-json-B4LbFfTU.js → file-json-DQ9XLq0B.js} +2 -2
  104. package/ccw/frontend/dist/assets/{file-json-B4LbFfTU.js.map → file-json-DQ9XLq0B.js.map} +1 -1
  105. package/ccw/frontend/dist/assets/{file-text-CIWG7Xgj.js → file-text-TGs_qCbw.js} +2 -2
  106. package/ccw/frontend/dist/assets/{file-text-CIWG7Xgj.js.map → file-text-TGs_qCbw.js.map} +1 -1
  107. package/ccw/frontend/dist/assets/{filter-CNBjjvBX.js → filter-CIuCqnDB.js} +2 -2
  108. package/ccw/frontend/dist/assets/{filter-CNBjjvBX.js.map → filter-CIuCqnDB.js.map} +1 -1
  109. package/ccw/frontend/dist/assets/{folder-DT_XOYw9.js → folder-BkivHBwn.js} +2 -2
  110. package/ccw/frontend/dist/assets/{folder-DT_XOYw9.js.map → folder-BkivHBwn.js.map} +1 -1
  111. package/ccw/frontend/dist/assets/{gauge-mvQWOG3S.js → gauge-CtM68fVY.js} +2 -2
  112. package/ccw/frontend/dist/assets/{gauge-mvQWOG3S.js.map → gauge-CtM68fVY.js.map} +1 -1
  113. package/ccw/frontend/dist/assets/{globe-B25jraBz.js → globe-DpnrINqP.js} +2 -2
  114. package/ccw/frontend/dist/assets/{globe-B25jraBz.js.map → globe-DpnrINqP.js.map} +1 -1
  115. package/ccw/frontend/dist/assets/{grid-3x3-CptugI_Z.js → grid-3x3-SjX0a5JH.js} +2 -2
  116. package/ccw/frontend/dist/assets/{grid-3x3-CptugI_Z.js.map → grid-3x3-SjX0a5JH.js.map} +1 -1
  117. package/ccw/frontend/dist/assets/{hard-drive-BUK9Wcoz.js → hard-drive-ByAmnoEg.js} +2 -2
  118. package/ccw/frontend/dist/assets/{hard-drive-BUK9Wcoz.js.map → hard-drive-ByAmnoEg.js.map} +1 -1
  119. package/ccw/frontend/dist/assets/{hash-dddMDYK7.js → hash-DbLc3VOZ.js} +2 -2
  120. package/ccw/frontend/dist/assets/{hash-dddMDYK7.js.map → hash-DbLc3VOZ.js.map} +1 -1
  121. package/ccw/frontend/dist/assets/{history-BdDj8MtC.js → history-Botz5Z5d.js} +2 -2
  122. package/ccw/frontend/dist/assets/{history-BdDj8MtC.js.map → history-Botz5Z5d.js.map} +1 -1
  123. package/ccw/frontend/dist/assets/{index-CcxBnbbQ.js → index-BGvyf4-9.js} +2 -2
  124. package/ccw/frontend/dist/assets/{index-CcxBnbbQ.js.map → index-BGvyf4-9.js.map} +1 -1
  125. package/ccw/frontend/dist/assets/index-BoqylFO4.css +39 -0
  126. package/ccw/frontend/dist/assets/{index-DZGHdspr.js → index-DP_mTJI8.js} +3 -3
  127. package/ccw/frontend/dist/assets/{index-DZGHdspr.js.map → index-DP_mTJI8.js.map} +1 -1
  128. package/ccw/frontend/dist/assets/{index-B6UfIzhR.js → index-MkgdhX7a.js} +2 -2
  129. package/ccw/frontend/dist/assets/{index-B6UfIzhR.js.map → index-MkgdhX7a.js.map} +1 -1
  130. package/ccw/frontend/dist/assets/{index-EFcT7h67.js → index-ni-tG9rm.js} +2 -2
  131. package/ccw/frontend/dist/assets/{index-EFcT7h67.js.map → index-ni-tG9rm.js.map} +1 -1
  132. package/ccw/frontend/dist/assets/{layout-grid-BVlT1oI7.js → layout-grid-11E4bGJz.js} +2 -2
  133. package/ccw/frontend/dist/assets/{layout-grid-BVlT1oI7.js.map → layout-grid-11E4bGJz.js.map} +1 -1
  134. package/ccw/frontend/dist/assets/{lightbulb-Mt3Tlwh4.js → lightbulb-8KrKY82b.js} +2 -2
  135. package/ccw/frontend/dist/assets/{lightbulb-Mt3Tlwh4.js.map → lightbulb-8KrKY82b.js.map} +1 -1
  136. package/ccw/frontend/dist/assets/{link-2-DXqT64qo.js → link-2-BUn6RILb.js} +2 -2
  137. package/ccw/frontend/dist/assets/{link-2-DXqT64qo.js.map → link-2-BUn6RILb.js.map} +1 -1
  138. package/ccw/frontend/dist/assets/{link-CBMtrpcI.js → link-CmP254Ai.js} +2 -2
  139. package/ccw/frontend/dist/assets/{link-CBMtrpcI.js.map → link-CmP254Ai.js.map} +1 -1
  140. package/ccw/frontend/dist/assets/{list-DDyEM4AO.js → list-BAwzl4a2.js} +2 -2
  141. package/ccw/frontend/dist/assets/{list-DDyEM4AO.js.map → list-BAwzl4a2.js.map} +1 -1
  142. package/ccw/frontend/dist/assets/{map-pin-B2FxBKfk.js → map-pin-gi342rqk.js} +2 -2
  143. package/ccw/frontend/dist/assets/{map-pin-B2FxBKfk.js.map → map-pin-gi342rqk.js.map} +1 -1
  144. package/ccw/frontend/dist/assets/{messages-square-zJfTY9pq.js → messages-square-C1Lh8q8b.js} +2 -2
  145. package/ccw/frontend/dist/assets/{messages-square-zJfTY9pq.js.map → messages-square-C1Lh8q8b.js.map} +1 -1
  146. package/ccw/frontend/dist/assets/{minimize-2-DnhGZj79.js → minimize-2-OgWNLKdq.js} +2 -2
  147. package/ccw/frontend/dist/assets/{minimize-2-DnhGZj79.js.map → minimize-2-OgWNLKdq.js.map} +1 -1
  148. package/ccw/frontend/dist/assets/{package-DYzAybhU.js → package-Djsvs5qp.js} +2 -2
  149. package/ccw/frontend/dist/assets/{package-DYzAybhU.js.map → package-Djsvs5qp.js.map} +1 -1
  150. package/ccw/frontend/dist/assets/{plug-B3kKHsu1.js → plug-DvSZP2cp.js} +2 -2
  151. package/ccw/frontend/dist/assets/{plug-B3kKHsu1.js.map → plug-DvSZP2cp.js.map} +1 -1
  152. package/ccw/frontend/dist/assets/{power-BPNNZgLy.js → power-BY7vTLmU.js} +2 -2
  153. package/ccw/frontend/dist/assets/{power-BPNNZgLy.js.map → power-BY7vTLmU.js.map} +1 -1
  154. package/ccw/frontend/dist/assets/{save-Cwry93p-.js → save-DXfqv84T.js} +2 -2
  155. package/ccw/frontend/dist/assets/{save-Cwry93p-.js.map → save-DXfqv84T.js.map} +1 -1
  156. package/ccw/frontend/dist/assets/{send-DuWWy2J8.js → send-E2o2LZSX.js} +2 -2
  157. package/ccw/frontend/dist/assets/{send-DuWWy2J8.js.map → send-E2o2LZSX.js.map} +1 -1
  158. package/ccw/frontend/dist/assets/{settings-2-C3U1eSK6.js → settings-2-ChD1LFHH.js} +2 -2
  159. package/ccw/frontend/dist/assets/{settings-2-C3U1eSK6.js.map → settings-2-ChD1LFHH.js.map} +1 -1
  160. package/ccw/frontend/dist/assets/{square-check-big-CrG1ejFB.js → square-check-big-CBymuqmD.js} +2 -2
  161. package/ccw/frontend/dist/assets/{square-check-big-CrG1ejFB.js.map → square-check-big-CBymuqmD.js.map} +1 -1
  162. package/ccw/frontend/dist/assets/{square-pen-eLWlCgZ5.js → square-pen-BfaiJgOX.js} +2 -2
  163. package/ccw/frontend/dist/assets/{square-pen-eLWlCgZ5.js.map → square-pen-BfaiJgOX.js.map} +1 -1
  164. package/ccw/frontend/dist/assets/{star-sveo4KRn.js → star-DHMWqZ09.js} +2 -2
  165. package/ccw/frontend/dist/assets/{star-sveo4KRn.js.map → star-DHMWqZ09.js.map} +1 -1
  166. package/ccw/frontend/dist/assets/{style-CRdAX7Cu.js → style-wvcOEAiM.js} +2 -2
  167. package/ccw/frontend/dist/assets/{style-CRdAX7Cu.js.map → style-wvcOEAiM.js.map} +1 -1
  168. package/ccw/frontend/dist/assets/{target-Oz1-z8Zu.js → target-B8AMmf_N.js} +2 -2
  169. package/ccw/frontend/dist/assets/{target-Oz1-z8Zu.js.map → target-B8AMmf_N.js.map} +1 -1
  170. package/ccw/frontend/dist/assets/{test-tube-BozkZKD6.js → test-tube-BpDeTJi1.js} +2 -2
  171. package/ccw/frontend/dist/assets/{test-tube-BozkZKD6.js.map → test-tube-BpDeTJi1.js.map} +1 -1
  172. package/ccw/frontend/dist/assets/{upload-CTlUsxyh.js → upload-pflkdIDG.js} +2 -2
  173. package/ccw/frontend/dist/assets/{upload-CTlUsxyh.js.map → upload-pflkdIDG.js.map} +1 -1
  174. package/ccw/frontend/dist/assets/{useApiSettings-D6WfgFYj.js → useApiSettings-BPx4DyKT.js} +2 -2
  175. package/ccw/frontend/dist/assets/{useApiSettings-D6WfgFYj.js.map → useApiSettings-BPx4DyKT.js.map} +1 -1
  176. package/ccw/frontend/dist/assets/{useCli-CgGVNN5I.js → useCli-D1jfH3XA.js} +2 -2
  177. package/ccw/frontend/dist/assets/{useCli-CgGVNN5I.js.map → useCli-D1jfH3XA.js.map} +1 -1
  178. package/ccw/frontend/dist/assets/{useCommands-o5CKv-10.js → useCommands-DhR71vpa.js} +2 -2
  179. package/ccw/frontend/dist/assets/{useCommands-o5CKv-10.js.map → useCommands-DhR71vpa.js.map} +1 -1
  180. package/ccw/frontend/dist/assets/{useDebounce-rKo_bCBK.js → useDebounce-a6Yyer3m.js} +2 -2
  181. package/ccw/frontend/dist/assets/{useDebounce-rKo_bCBK.js.map → useDebounce-a6Yyer3m.js.map} +1 -1
  182. package/ccw/frontend/dist/assets/{useFileExplorer-WeE4t9Hg.js → useFileExplorer-B8W2JTj2.js} +2 -2
  183. package/ccw/frontend/dist/assets/{useFileExplorer-WeE4t9Hg.js.map → useFileExplorer-B8W2JTj2.js.map} +1 -1
  184. package/ccw/frontend/dist/assets/{useLocale-BS0tTC-_.js → useLocale-aMHdQIL_.js} +2 -2
  185. package/ccw/frontend/dist/assets/{useLocale-BS0tTC-_.js.map → useLocale-aMHdQIL_.js.map} +1 -1
  186. package/ccw/frontend/dist/assets/{useSkills-BUgAhw6r.js → useSkills-BHpc2LtN.js} +3 -3
  187. package/ccw/frontend/dist/assets/{useSkills-BUgAhw6r.js.map → useSkills-BHpc2LtN.js.map} +1 -1
  188. package/ccw/frontend/dist/assets/{useSystemSettings-CLhmINg1.js → useSystemSettings-BFD0SvEF.js} +2 -2
  189. package/ccw/frontend/dist/assets/{useSystemSettings-CLhmINg1.js.map → useSystemSettings-BFD0SvEF.js.map} +1 -1
  190. package/ccw/frontend/dist/assets/{wand-sparkles-BUHKJH1X.js → wand-sparkles-dYtI2IKM.js} +2 -2
  191. package/ccw/frontend/dist/assets/{wand-sparkles-BUHKJH1X.js.map → wand-sparkles-dYtI2IKM.js.map} +1 -1
  192. package/ccw/frontend/dist/index.html +2 -2
  193. package/package.json +1 -1
  194. package/ccw/frontend/dist/assets/SettingsPage-Qj0fFDjX.js +0 -150
  195. package/ccw/frontend/dist/assets/SettingsPage-Qj0fFDjX.js.map +0 -1
  196. package/ccw/frontend/dist/assets/index-nU0QYi1y.css +0 -39
@@ -1,2 +1,2 @@
1
- import{ab as I,aF as M,aH as A,gd as _,u as v,r as j,a9 as q,aa as z,j as e,B as P,C as y,ai as D,aj as L,e as h,bq as Q,am as V,R as Y,a as S,N as b,an as X,dl as $,dk as Z,T as G,I as K,a7 as ee,cN as se,b as ne}from"./index-DZGHdspr.js";import{T as te}from"./TabsNavigation-SGJhC8-P.js";import{S as ae}from"./save-Cwry93p-.js";import{E as le}from"./eye-off-CyaKXmAk.js";import{E as ie}from"./eye-BXfPoClW.js";const p={all:["codexLens"],models:()=>[...p.all,"models"],indexStatus:s=>[...p.all,"indexStatus",s],env:()=>[...p.all,"env"],mcpConfig:()=>[...p.all,"mcpConfig"]};function de(){return I({queryKey:p.models(),queryFn:()=>_("/api/codexlens/models").then(s=>s.models),staleTime:3e4})}function ce(){const s=M(),n=A({mutationFn:t=>_("/api/codexlens/models/download",{method:"POST",body:JSON.stringify({name:t})}),onSuccess:()=>{s.invalidateQueries({queryKey:p.models()})}});return{downloadModel:n.mutateAsync,isDownloading:n.isPending,error:n.error}}function oe(){const s=M(),n=A({mutationFn:t=>_("/api/codexlens/models/delete",{method:"POST",body:JSON.stringify({name:t})}),onSuccess:()=>{s.invalidateQueries({queryKey:p.models()})}});return{deleteModel:n.mutateAsync,isDeleting:n.isPending,error:n.error}}function re(s){return I({queryKey:p.indexStatus(s),queryFn:()=>_(`/api/codexlens/index/status?projectPath=${encodeURIComponent(s)}`).then(n=>n.status),enabled:!!s,staleTime:1e4})}function me(){const s=A({mutationFn:n=>_("/api/codexlens/index/sync",{method:"POST",body:JSON.stringify({projectPath:n})})});return{syncIndex:s.mutateAsync,isSyncing:s.isPending,error:s.error}}function xe(){const s=A({mutationFn:n=>_("/api/codexlens/index/rebuild",{method:"POST",body:JSON.stringify({projectPath:n})})});return{rebuildIndex:s.mutateAsync,isRebuilding:s.isPending,error:s.error}}function R(){return I({queryKey:p.env(),queryFn:()=>_("/api/codexlens/env").then(s=>({values:s.env??{},defaults:s.defaults??{}})),staleTime:6e4})}function ue(){const s=M(),n=A({mutationFn:t=>_("/api/codexlens/env",{method:"POST",body:JSON.stringify({env:t})}),onSuccess:()=>{s.invalidateQueries({queryKey:p.env()}),s.invalidateQueries({queryKey:p.mcpConfig()})}});return{saveEnv:n.mutateAsync,isSaving:n.isPending,error:n.error}}function Ee(){return I({queryKey:p.mcpConfig(),queryFn:()=>_("/api/codexlens/mcp-config").then(s=>s.config),staleTime:3e4})}function Ne(){var l,i;const{data:s}=R(),n=((l=s==null?void 0:s.values)==null?void 0:l.CODEXLENS_AUTO_WATCH)==="true",t=((i=s==null?void 0:s.values)==null?void 0:i.CODEXLENS_WATCHER_DEBOUNCE_MS)||"1000";return{autoWatch:n,debounceMs:t}}function he(){const{formatMessage:s}=v(),{data:n,isLoading:t,isError:l,refetch:i}=Ee(),{data:d}=R(),[u,E]=j.useState(!1),[o,N]=j.useState(!1),[a,m]=j.useState(null),x=q(z),O=async g=>{N(!0),m(null);try{const C=n==null?void 0:n.mcpServers,w=C&&typeof C=="object"?C.codexlens:void 0;if(!w||typeof w!="object")throw new Error(s({id:"codexlens.mcp.noConfig"}));const F=w;if(g==="project"){if(!x)throw new Error(s({id:"codexlens.mcp.installError"}));await $("codexlens",F,x)}else await Z("codexlens",F);m({ok:!0,msg:s({id:"codexlens.mcp.installSuccess"})})}catch(C){m({ok:!1,msg:C.message})}finally{N(!1)}},k=!!(d!=null&&d.values.CODEXLENS_EMBED_API_URL),T=k?"API":"Local fastembed",r=n?JSON.stringify(n,null,2):"",f=()=>{navigator.clipboard.writeText(r).then(()=>{E(!0),setTimeout(()=>E(!1),2e3)})},c=()=>{i()};return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:[s({id:"codexlens.mcp.embedMode"}),":"]}),e.jsx(P,{variant:k?"success":"secondary",children:T})]}),e.jsxs(y,{children:[e.jsx(D,{className:"pb-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(L,{className:"text-base",children:s({id:"codexlens.mcp.configTitle"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(h,{variant:"outline",size:"sm",onClick:f,disabled:!r||t,children:[u?e.jsx(Q,{className:"w-4 h-4 mr-1"}):e.jsx(V,{className:"w-4 h-4 mr-1"}),s(u?{id:"codexlens.mcp.copied"}:{id:"codexlens.mcp.copy"})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:c,disabled:t,children:[e.jsx(Y,{className:`w-4 h-4 mr-1 ${t?"animate-spin":""}`}),s({id:"codexlens.mcp.regenerate"})]})]})]})}),e.jsxs(S,{children:[t&&e.jsx("p",{className:"text-sm text-muted-foreground",children:s({id:"codexlens.mcp.loading"})}),l&&e.jsx("p",{className:"text-sm text-destructive",children:s({id:"codexlens.mcp.error"})}),!t&&!l&&e.jsx("pre",{className:"bg-muted rounded-md p-4 text-xs overflow-auto max-h-96 font-mono",children:r||s({id:"codexlens.mcp.noConfig"})})]})]}),e.jsxs(y,{children:[e.jsxs(D,{className:"pb-3",children:[e.jsx(L,{className:"text-base",children:s({id:"codexlens.mcp.quickInstallTitle"})}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:s({id:"codexlens.mcp.quickInstallDesc"})})]}),e.jsxs(S,{className:"space-y-3",children:[e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>O("project"),disabled:o||!x,children:[o?e.jsx(b,{className:"w-4 h-4 mr-1 animate-spin"}):e.jsx(X,{className:"w-4 h-4 mr-1"}),s(o?{id:"codexlens.mcp.installing"}:{id:"codexlens.mcp.installProject"})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>O("global"),disabled:o,children:[o?e.jsx(b,{className:"w-4 h-4 mr-1 animate-spin"}):e.jsx(X,{className:"w-4 h-4 mr-1"}),s(o?{id:"codexlens.mcp.installing"}:{id:"codexlens.mcp.installGlobal"})]})]}),a&&e.jsx("p",{className:`text-sm ${a.ok?"text-success":"text-destructive"}`,children:a.msg})]})]}),e.jsxs(y,{children:[e.jsx(D,{className:"pb-3",children:e.jsx(L,{className:"text-base",children:s({id:"codexlens.mcp.installTitle"})})}),e.jsx(S,{children:e.jsxs("ol",{className:"list-decimal list-inside space-y-2 text-sm text-muted-foreground",children:[e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step1"})}),e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step2"})}),e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step3"})}),e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step4"})}),e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step5"})})]})})]})]})}function pe(){const{formatMessage:s}=v(),{data:n,isLoading:t,isError:l}=de(),{data:i}=R(),{downloadModel:d,isDownloading:u}=ce(),{deleteModel:E,isDeleting:o}=oe(),N=!!(i!=null&&i.values.CODEXLENS_EMBED_API_URL),a=N?"API":"Local fastembed",m=n??[];return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2 p-3 rounded-md bg-muted text-sm",children:[e.jsxs("span",{className:"text-muted-foreground",children:[s({id:"codexlens.models.embedMode"}),":"]}),e.jsx(P,{variant:N?"success":"secondary",children:a})]}),t&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground p-4",children:[e.jsx(b,{className:"w-4 h-4 animate-spin"}),s({id:"codexlens.models.loading"})]}),l&&e.jsx("p",{className:"text-sm text-destructive p-4",children:s({id:"codexlens.models.error"})}),!t&&!l&&m.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground p-4",children:s({id:"codexlens.models.noModels"})}),!t&&!l&&m.length>0&&e.jsx(y,{children:e.jsx(S,{className:"p-0",children:e.jsx("div",{className:"divide-y divide-border",children:m.map(x=>e.jsxs("div",{className:"flex items-center justify-between px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-sm font-medium",children:x.name}),e.jsx(P,{variant:x.installed?"success":"secondary",children:x.installed?s({id:"codexlens.models.installed"}):s({id:"codexlens.models.notInstalled"})})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>d(x.name),disabled:u,children:[u?e.jsx(b,{className:"w-4 h-4 animate-spin"}):e.jsx(X,{className:"w-4 h-4"}),e.jsx("span",{className:"ml-1",children:s({id:"codexlens.models.download"})})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>E(x.name),disabled:!x.installed||o,children:[o?e.jsx(b,{className:"w-4 h-4 animate-spin"}):e.jsx(G,{className:"w-4 h-4"}),e.jsx("span",{className:"ml-1",children:s({id:"codexlens.models.delete"})})]})]})]},x.name))})})})]})}function fe({projectPath:s}){const{formatMessage:n}=v(),t=M(),{data:l,isLoading:i,isError:d}=re(s),{syncIndex:u,isSyncing:E}=me(),{rebuildIndex:o,isRebuilding:N}=xe(),a=l,m=()=>{t.invalidateQueries({queryKey:p.indexStatus(s)})};return e.jsxs(y,{children:[e.jsx(D,{className:"pb-3",children:e.jsx(L,{className:"text-sm font-medium truncate",children:s})}),e.jsxs(S,{className:"space-y-4",children:[i&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[e.jsx(b,{className:"w-4 h-4 animate-spin"}),n({id:"codexlens.index.loading"})]}),d&&e.jsx("p",{className:"text-sm text-destructive",children:n({id:"codexlens.index.error"})}),!i&&!d&&a&&e.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg font-semibold",children:a.files_tracked??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n({id:"codexlens.index.filesTracked"})})]}),e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg font-semibold",children:a.total_chunks??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n({id:"codexlens.index.totalChunks"})})]}),e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg font-semibold",children:a.deleted_chunks??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n({id:"codexlens.index.deletedChunks"})})]})]}),e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>u(s),disabled:E,children:[E?e.jsx(b,{className:"w-4 h-4 animate-spin mr-1"}):null,n({id:"codexlens.index.sync"})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>o(s),disabled:N,children:[N?e.jsx(b,{className:"w-4 h-4 animate-spin mr-1"}):null,n({id:"codexlens.index.rebuild"})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:m,children:[e.jsx(Y,{className:"w-4 h-4 mr-1"}),n({id:"codexlens.index.refresh"})]})]})]})]})}function je(){const{formatMessage:s}=v(),n=q(z),[t,l]=j.useState([]),[i,d]=j.useState("");j.useEffect(()=>{n&&l(a=>a.includes(n)?a:[n,...a])},[n]);const u=()=>{const a=i.trim();a&&!t.includes(a)&&l(m=>[...m,a]),d("")},E=a=>{l(m=>m.filter(x=>x!==a))},o=a=>{a.key==="Enter"&&u()},{autoWatch:N}=Ne();return e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${N?"bg-green-100 text-green-700":"bg-gray-100 text-gray-500"}`,children:N?"Auto-watch ON":"Auto-watch OFF"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(K,{placeholder:s({id:"codexlens.index.pathPlaceholder"}),value:i,onChange:a=>d(a.target.value),onKeyDown:o,className:"flex-1"}),e.jsxs(h,{onClick:u,disabled:!i.trim(),children:[e.jsx(ee,{className:"w-4 h-4 mr-1"}),s({id:"codexlens.index.add"})]})]}),t.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:s({id:"codexlens.index.empty"})}),t.map(a=>e.jsxs("div",{className:"relative",children:[e.jsx(h,{variant:"ghost",size:"sm",className:"absolute top-2 right-2 z-10 h-7 w-7 p-0",onClick:()=>E(a),title:s({id:"codexlens.index.removeProject"}),children:e.jsx(G,{className:"w-4 h-4 text-muted-foreground"})}),e.jsx(fe,{projectPath:a})]},a))]})}const J=[{title:"embed",fields:[{key:"CODEXLENS_EMBED_API_URL",label:"Embed API URL"},{key:"CODEXLENS_EMBED_API_KEY",label:"Embed API Key",sensitive:!0},{key:"CODEXLENS_EMBED_API_MODEL",label:"Embed API Model"},{key:"CODEXLENS_EMBED_DIM",label:"Embed Dimension"},{key:"CODEXLENS_EMBED_API_ENDPOINTS",label:"Embed API Endpoints",sensitive:!0},{key:"CODEXLENS_EMBED_BATCH_SIZE",label:"Embed Batch Size"},{key:"CODEXLENS_EMBED_API_CONCURRENCY",label:"Embed API Concurrency"}]},{title:"reranker",fields:[{key:"CODEXLENS_RERANKER_API_URL",label:"Reranker API URL"},{key:"CODEXLENS_RERANKER_API_KEY",label:"Reranker API Key",sensitive:!0},{key:"CODEXLENS_RERANKER_API_MODEL",label:"Reranker API Model"}]},{title:"performance",fields:[{key:"CODEXLENS_BINARY_TOP_K",label:"Binary Top K"},{key:"CODEXLENS_ANN_TOP_K",label:"ANN Top K"},{key:"CODEXLENS_FTS_TOP_K",label:"FTS Top K"},{key:"CODEXLENS_FUSION_K",label:"Fusion K"},{key:"CODEXLENS_RERANKER_TOP_K",label:"Reranker Top K"},{key:"CODEXLENS_RERANKER_BATCH_SIZE",label:"Reranker Batch Size"}]},{title:"index",fields:[{key:"CODEXLENS_DB_PATH",label:"DB Path"},{key:"CODEXLENS_INDEX_WORKERS",label:"Index Workers"},{key:"CODEXLENS_CODE_AWARE_CHUNKING",label:"Code Aware Chunking"},{key:"CODEXLENS_AST_CHUNKING",label:"AST Chunking"},{key:"CODEXLENS_MAX_FILE_SIZE",label:"Max File Size"},{key:"CODEXLENS_HNSW_EF",label:"HNSW EF"},{key:"CODEXLENS_HNSW_M",label:"HNSW M"}]},{title:"watcher",fields:[{key:"CODEXLENS_AUTO_WATCH",label:"Auto Watch"},{key:"CODEXLENS_WATCHER_DEBOUNCE_MS",label:"Watch Debounce (ms)"}]}],ge=new Set(["CODEXLENS_EMBED_API_URL","CODEXLENS_EMBED_API_KEY","CODEXLENS_EMBED_API_ENDPOINTS","CODEXLENS_EMBED_API_CONCURRENCY"]),U={CODEXLENS_EMBED_API_MODEL:"text-embedding-3-small",CODEXLENS_EMBED_DIM:"1536",CODEXLENS_EMBED_BATCH_SIZE:"64",CODEXLENS_EMBED_API_CONCURRENCY:"4",CODEXLENS_BINARY_TOP_K:"200",CODEXLENS_ANN_TOP_K:"50",CODEXLENS_FTS_TOP_K:"50",CODEXLENS_FUSION_K:"60",CODEXLENS_RERANKER_TOP_K:"20",CODEXLENS_RERANKER_BATCH_SIZE:"32",CODEXLENS_INDEX_WORKERS:"2",CODEXLENS_CODE_AWARE_CHUNKING:"true",CODEXLENS_AST_CHUNKING:"true",CODEXLENS_AUTO_WATCH:"false",CODEXLENS_WATCHER_DEBOUNCE_MS:"1000",CODEXLENS_MAX_FILE_SIZE:"1000000",CODEXLENS_HNSW_EF:"150",CODEXLENS_HNSW_M:"32"},B=J.flatMap(s=>s.fields.map(n=>n.key));function W(){return Object.fromEntries(B.map(s=>[s,""]))}function H(s,n){return Object.fromEntries(B.map(t=>[t,s[t]??n[t]??""]))}function _e({value:s,onChange:n,id:t}){const[l,i]=j.useState(!1);return e.jsxs("div",{className:"relative",children:[e.jsx(K,{id:t,type:l?"text":"password",value:s,onChange:d=>n(d.target.value),className:"pr-10"}),e.jsx("button",{type:"button",className:"absolute inset-y-0 right-2 flex items-center text-muted-foreground hover:text-foreground",onClick:()=>i(d=>!d),tabIndex:-1,children:l?e.jsx(le,{className:"w-4 h-4"}):e.jsx(ie,{className:"w-4 h-4"})})]})}function be(){const{formatMessage:s}=v(),{data:n,isLoading:t}=R(),{saveEnv:l,isSaving:i}=ue(),[d,u]=j.useState("local"),[E,o]=j.useState(W),N=(n==null?void 0:n.values)??{},a={...U,...(n==null?void 0:n.defaults)??{}},m=H(N,a);j.useEffect(()=>{if(n){const r={...U,...n.defaults??{}},f=n.values??{};o(H(f,r)),f.CODEXLENS_EMBED_API_URL&&u("api")}},[n]);const x=B.some(r=>E[r]!==(m[r]??"")),O=(r,f)=>{o(c=>({...c,[r]:f}))},k=async()=>{const r=Object.fromEntries(Object.entries(E).flatMap(([f,c])=>{const g=c.trim(),C=a[f]??"";return!g||g===C?[]:[[f,g]]}));await l(r)},T=()=>{o(W())};return t?e.jsx("p",{className:"text-sm text-muted-foreground p-4",children:s({id:"codexlens.env.loading"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-sm font-medium",children:[s({id:"codexlens.env.mode"}),":"]}),e.jsxs("div",{className:"flex rounded-md border border-border overflow-hidden",children:[e.jsx("button",{type:"button",onClick:()=>u("local"),className:`px-3 py-1.5 text-sm transition-colors ${d==="local"?"bg-primary text-primary-foreground":"bg-background text-muted-foreground hover:bg-muted"}`,children:s({id:"codexlens.env.localMode"})}),e.jsx("button",{type:"button",onClick:()=>u("api"),className:`px-3 py-1.5 text-sm transition-colors ${d==="api"?"bg-primary text-primary-foreground":"bg-background text-muted-foreground hover:bg-muted"}`,children:s({id:"codexlens.env.apiMode"})})]}),e.jsx("span",{className:"text-xs text-muted-foreground",children:s(d==="local"?{id:"codexlens.env.localModeDesc"}:{id:"codexlens.env.apiModeDesc"})})]}),J.map(r=>{const f=d==="local"?r.fields.filter(c=>!ge.has(c.key)):r.fields;return f.length===0?null:e.jsxs(y,{children:[e.jsx(D,{className:"pb-3",children:e.jsx(L,{className:"text-base",children:s({id:`codexlens.env.sections.${r.title}`})})}),e.jsx(S,{className:"space-y-3",children:f.map(c=>e.jsxs("div",{className:"grid grid-cols-3 gap-3 items-center",children:[e.jsx("label",{htmlFor:c.key,className:"text-sm text-muted-foreground col-span-1",children:c.label}),e.jsx("div",{className:"col-span-2",children:c.sensitive?e.jsx(_e,{id:c.key,value:E[c.key]??"",onChange:g=>O(c.key,g)}):e.jsx(K,{id:c.key,value:E[c.key]??"",placeholder:a[c.key]??"",onChange:g=>O(c.key,g.target.value)})})]},c.key))})]},r.title)}),e.jsxs("div",{className:"flex justify-between pt-2",children:[e.jsxs(h,{variant:"outline",onClick:T,children:[e.jsx(se,{className:"w-4 h-4 mr-2"}),s({id:"codexlens.env.clearForm"})]}),e.jsxs(h,{onClick:k,disabled:!x||i,children:[e.jsx(ae,{className:"w-4 h-4 mr-2"}),s(i?{id:"codexlens.env.saving"}:{id:"codexlens.env.save"})]})]})]})}function De(){const{formatMessage:s}=v(),[n,t]=j.useState("mcp");return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold text-foreground flex items-center gap-2",children:[e.jsx(ne,{className:"w-6 h-6 text-primary"}),s({id:"codexlens.page.title"})]}),e.jsx("p",{className:"text-muted-foreground mt-1",children:s({id:"codexlens.page.description"})})]}),e.jsx(te,{value:n,onValueChange:l=>t(l),tabs:[{value:"mcp",label:s({id:"codexlens.tabs.mcp"})},{value:"models",label:s({id:"codexlens.tabs.models"})},{value:"index",label:s({id:"codexlens.tabs.index"})},{value:"env",label:s({id:"codexlens.tabs.env"})}]}),e.jsxs("div",{className:"mt-4",children:[n==="mcp"&&e.jsx(he,{}),n==="models"&&e.jsx(pe,{}),n==="index"&&e.jsx(je,{}),n==="env"&&e.jsx(be,{})]})]})}export{De as CodexLensPage,De as default};
2
- //# sourceMappingURL=CodexLensPage-z6miX68P.js.map
1
+ import{ab as I,aF as M,aH as A,gd as _,u as v,r as j,a9 as q,aa as z,j as e,B as P,C as y,ai as D,aj as L,e as h,bq as Q,am as V,R as Y,a as S,N as b,an as X,dl as $,dk as Z,T as G,I as K,a7 as ee,cN as se,b as ne}from"./index-DP_mTJI8.js";import{T as te}from"./TabsNavigation-Bol1y09b.js";import{S as ae}from"./save-DXfqv84T.js";import{E as le}from"./eye-off-C5HS4Ytm.js";import{E as ie}from"./eye-BEMOdcAN.js";const p={all:["codexLens"],models:()=>[...p.all,"models"],indexStatus:s=>[...p.all,"indexStatus",s],env:()=>[...p.all,"env"],mcpConfig:()=>[...p.all,"mcpConfig"]};function de(){return I({queryKey:p.models(),queryFn:()=>_("/api/codexlens/models").then(s=>s.models),staleTime:3e4})}function ce(){const s=M(),n=A({mutationFn:t=>_("/api/codexlens/models/download",{method:"POST",body:JSON.stringify({name:t})}),onSuccess:()=>{s.invalidateQueries({queryKey:p.models()})}});return{downloadModel:n.mutateAsync,isDownloading:n.isPending,error:n.error}}function oe(){const s=M(),n=A({mutationFn:t=>_("/api/codexlens/models/delete",{method:"POST",body:JSON.stringify({name:t})}),onSuccess:()=>{s.invalidateQueries({queryKey:p.models()})}});return{deleteModel:n.mutateAsync,isDeleting:n.isPending,error:n.error}}function re(s){return I({queryKey:p.indexStatus(s),queryFn:()=>_(`/api/codexlens/index/status?projectPath=${encodeURIComponent(s)}`).then(n=>n.status),enabled:!!s,staleTime:1e4})}function me(){const s=A({mutationFn:n=>_("/api/codexlens/index/sync",{method:"POST",body:JSON.stringify({projectPath:n})})});return{syncIndex:s.mutateAsync,isSyncing:s.isPending,error:s.error}}function xe(){const s=A({mutationFn:n=>_("/api/codexlens/index/rebuild",{method:"POST",body:JSON.stringify({projectPath:n})})});return{rebuildIndex:s.mutateAsync,isRebuilding:s.isPending,error:s.error}}function R(){return I({queryKey:p.env(),queryFn:()=>_("/api/codexlens/env").then(s=>({values:s.env??{},defaults:s.defaults??{}})),staleTime:6e4})}function ue(){const s=M(),n=A({mutationFn:t=>_("/api/codexlens/env",{method:"POST",body:JSON.stringify({env:t})}),onSuccess:()=>{s.invalidateQueries({queryKey:p.env()}),s.invalidateQueries({queryKey:p.mcpConfig()})}});return{saveEnv:n.mutateAsync,isSaving:n.isPending,error:n.error}}function Ee(){return I({queryKey:p.mcpConfig(),queryFn:()=>_("/api/codexlens/mcp-config").then(s=>s.config),staleTime:3e4})}function Ne(){var l,i;const{data:s}=R(),n=((l=s==null?void 0:s.values)==null?void 0:l.CODEXLENS_AUTO_WATCH)==="true",t=((i=s==null?void 0:s.values)==null?void 0:i.CODEXLENS_WATCHER_DEBOUNCE_MS)||"1000";return{autoWatch:n,debounceMs:t}}function he(){const{formatMessage:s}=v(),{data:n,isLoading:t,isError:l,refetch:i}=Ee(),{data:d}=R(),[u,E]=j.useState(!1),[o,N]=j.useState(!1),[a,m]=j.useState(null),x=q(z),O=async g=>{N(!0),m(null);try{const C=n==null?void 0:n.mcpServers,w=C&&typeof C=="object"?C.codexlens:void 0;if(!w||typeof w!="object")throw new Error(s({id:"codexlens.mcp.noConfig"}));const F=w;if(g==="project"){if(!x)throw new Error(s({id:"codexlens.mcp.installError"}));await $("codexlens",F,x)}else await Z("codexlens",F);m({ok:!0,msg:s({id:"codexlens.mcp.installSuccess"})})}catch(C){m({ok:!1,msg:C.message})}finally{N(!1)}},k=!!(d!=null&&d.values.CODEXLENS_EMBED_API_URL),T=k?"API":"Local fastembed",r=n?JSON.stringify(n,null,2):"",f=()=>{navigator.clipboard.writeText(r).then(()=>{E(!0),setTimeout(()=>E(!1),2e3)})},c=()=>{i()};return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:[s({id:"codexlens.mcp.embedMode"}),":"]}),e.jsx(P,{variant:k?"success":"secondary",children:T})]}),e.jsxs(y,{children:[e.jsx(D,{className:"pb-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(L,{className:"text-base",children:s({id:"codexlens.mcp.configTitle"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(h,{variant:"outline",size:"sm",onClick:f,disabled:!r||t,children:[u?e.jsx(Q,{className:"w-4 h-4 mr-1"}):e.jsx(V,{className:"w-4 h-4 mr-1"}),s(u?{id:"codexlens.mcp.copied"}:{id:"codexlens.mcp.copy"})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:c,disabled:t,children:[e.jsx(Y,{className:`w-4 h-4 mr-1 ${t?"animate-spin":""}`}),s({id:"codexlens.mcp.regenerate"})]})]})]})}),e.jsxs(S,{children:[t&&e.jsx("p",{className:"text-sm text-muted-foreground",children:s({id:"codexlens.mcp.loading"})}),l&&e.jsx("p",{className:"text-sm text-destructive",children:s({id:"codexlens.mcp.error"})}),!t&&!l&&e.jsx("pre",{className:"bg-muted rounded-md p-4 text-xs overflow-auto max-h-96 font-mono",children:r||s({id:"codexlens.mcp.noConfig"})})]})]}),e.jsxs(y,{children:[e.jsxs(D,{className:"pb-3",children:[e.jsx(L,{className:"text-base",children:s({id:"codexlens.mcp.quickInstallTitle"})}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:s({id:"codexlens.mcp.quickInstallDesc"})})]}),e.jsxs(S,{className:"space-y-3",children:[e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>O("project"),disabled:o||!x,children:[o?e.jsx(b,{className:"w-4 h-4 mr-1 animate-spin"}):e.jsx(X,{className:"w-4 h-4 mr-1"}),s(o?{id:"codexlens.mcp.installing"}:{id:"codexlens.mcp.installProject"})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>O("global"),disabled:o,children:[o?e.jsx(b,{className:"w-4 h-4 mr-1 animate-spin"}):e.jsx(X,{className:"w-4 h-4 mr-1"}),s(o?{id:"codexlens.mcp.installing"}:{id:"codexlens.mcp.installGlobal"})]})]}),a&&e.jsx("p",{className:`text-sm ${a.ok?"text-success":"text-destructive"}`,children:a.msg})]})]}),e.jsxs(y,{children:[e.jsx(D,{className:"pb-3",children:e.jsx(L,{className:"text-base",children:s({id:"codexlens.mcp.installTitle"})})}),e.jsx(S,{children:e.jsxs("ol",{className:"list-decimal list-inside space-y-2 text-sm text-muted-foreground",children:[e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step1"})}),e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step2"})}),e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step3"})}),e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step4"})}),e.jsx("li",{children:s({id:"codexlens.mcp.installSteps.step5"})})]})})]})]})}function pe(){const{formatMessage:s}=v(),{data:n,isLoading:t,isError:l}=de(),{data:i}=R(),{downloadModel:d,isDownloading:u}=ce(),{deleteModel:E,isDeleting:o}=oe(),N=!!(i!=null&&i.values.CODEXLENS_EMBED_API_URL),a=N?"API":"Local fastembed",m=n??[];return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2 p-3 rounded-md bg-muted text-sm",children:[e.jsxs("span",{className:"text-muted-foreground",children:[s({id:"codexlens.models.embedMode"}),":"]}),e.jsx(P,{variant:N?"success":"secondary",children:a})]}),t&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground p-4",children:[e.jsx(b,{className:"w-4 h-4 animate-spin"}),s({id:"codexlens.models.loading"})]}),l&&e.jsx("p",{className:"text-sm text-destructive p-4",children:s({id:"codexlens.models.error"})}),!t&&!l&&m.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground p-4",children:s({id:"codexlens.models.noModels"})}),!t&&!l&&m.length>0&&e.jsx(y,{children:e.jsx(S,{className:"p-0",children:e.jsx("div",{className:"divide-y divide-border",children:m.map(x=>e.jsxs("div",{className:"flex items-center justify-between px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-sm font-medium",children:x.name}),e.jsx(P,{variant:x.installed?"success":"secondary",children:x.installed?s({id:"codexlens.models.installed"}):s({id:"codexlens.models.notInstalled"})})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>d(x.name),disabled:u,children:[u?e.jsx(b,{className:"w-4 h-4 animate-spin"}):e.jsx(X,{className:"w-4 h-4"}),e.jsx("span",{className:"ml-1",children:s({id:"codexlens.models.download"})})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>E(x.name),disabled:!x.installed||o,children:[o?e.jsx(b,{className:"w-4 h-4 animate-spin"}):e.jsx(G,{className:"w-4 h-4"}),e.jsx("span",{className:"ml-1",children:s({id:"codexlens.models.delete"})})]})]})]},x.name))})})})]})}function fe({projectPath:s}){const{formatMessage:n}=v(),t=M(),{data:l,isLoading:i,isError:d}=re(s),{syncIndex:u,isSyncing:E}=me(),{rebuildIndex:o,isRebuilding:N}=xe(),a=l,m=()=>{t.invalidateQueries({queryKey:p.indexStatus(s)})};return e.jsxs(y,{children:[e.jsx(D,{className:"pb-3",children:e.jsx(L,{className:"text-sm font-medium truncate",children:s})}),e.jsxs(S,{className:"space-y-4",children:[i&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[e.jsx(b,{className:"w-4 h-4 animate-spin"}),n({id:"codexlens.index.loading"})]}),d&&e.jsx("p",{className:"text-sm text-destructive",children:n({id:"codexlens.index.error"})}),!i&&!d&&a&&e.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg font-semibold",children:a.files_tracked??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n({id:"codexlens.index.filesTracked"})})]}),e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg font-semibold",children:a.total_chunks??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n({id:"codexlens.index.totalChunks"})})]}),e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg font-semibold",children:a.deleted_chunks??0}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n({id:"codexlens.index.deletedChunks"})})]})]}),e.jsxs("div",{className:"flex gap-2 flex-wrap",children:[e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>u(s),disabled:E,children:[E?e.jsx(b,{className:"w-4 h-4 animate-spin mr-1"}):null,n({id:"codexlens.index.sync"})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>o(s),disabled:N,children:[N?e.jsx(b,{className:"w-4 h-4 animate-spin mr-1"}):null,n({id:"codexlens.index.rebuild"})]}),e.jsxs(h,{variant:"outline",size:"sm",onClick:m,children:[e.jsx(Y,{className:"w-4 h-4 mr-1"}),n({id:"codexlens.index.refresh"})]})]})]})]})}function je(){const{formatMessage:s}=v(),n=q(z),[t,l]=j.useState([]),[i,d]=j.useState("");j.useEffect(()=>{n&&l(a=>a.includes(n)?a:[n,...a])},[n]);const u=()=>{const a=i.trim();a&&!t.includes(a)&&l(m=>[...m,a]),d("")},E=a=>{l(m=>m.filter(x=>x!==a))},o=a=>{a.key==="Enter"&&u()},{autoWatch:N}=Ne();return e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${N?"bg-green-100 text-green-700":"bg-gray-100 text-gray-500"}`,children:N?"Auto-watch ON":"Auto-watch OFF"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(K,{placeholder:s({id:"codexlens.index.pathPlaceholder"}),value:i,onChange:a=>d(a.target.value),onKeyDown:o,className:"flex-1"}),e.jsxs(h,{onClick:u,disabled:!i.trim(),children:[e.jsx(ee,{className:"w-4 h-4 mr-1"}),s({id:"codexlens.index.add"})]})]}),t.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:s({id:"codexlens.index.empty"})}),t.map(a=>e.jsxs("div",{className:"relative",children:[e.jsx(h,{variant:"ghost",size:"sm",className:"absolute top-2 right-2 z-10 h-7 w-7 p-0",onClick:()=>E(a),title:s({id:"codexlens.index.removeProject"}),children:e.jsx(G,{className:"w-4 h-4 text-muted-foreground"})}),e.jsx(fe,{projectPath:a})]},a))]})}const J=[{title:"embed",fields:[{key:"CODEXLENS_EMBED_API_URL",label:"Embed API URL"},{key:"CODEXLENS_EMBED_API_KEY",label:"Embed API Key",sensitive:!0},{key:"CODEXLENS_EMBED_API_MODEL",label:"Embed API Model"},{key:"CODEXLENS_EMBED_DIM",label:"Embed Dimension"},{key:"CODEXLENS_EMBED_API_ENDPOINTS",label:"Embed API Endpoints",sensitive:!0},{key:"CODEXLENS_EMBED_BATCH_SIZE",label:"Embed Batch Size"},{key:"CODEXLENS_EMBED_API_CONCURRENCY",label:"Embed API Concurrency"}]},{title:"reranker",fields:[{key:"CODEXLENS_RERANKER_API_URL",label:"Reranker API URL"},{key:"CODEXLENS_RERANKER_API_KEY",label:"Reranker API Key",sensitive:!0},{key:"CODEXLENS_RERANKER_API_MODEL",label:"Reranker API Model"}]},{title:"performance",fields:[{key:"CODEXLENS_BINARY_TOP_K",label:"Binary Top K"},{key:"CODEXLENS_ANN_TOP_K",label:"ANN Top K"},{key:"CODEXLENS_FTS_TOP_K",label:"FTS Top K"},{key:"CODEXLENS_FUSION_K",label:"Fusion K"},{key:"CODEXLENS_RERANKER_TOP_K",label:"Reranker Top K"},{key:"CODEXLENS_RERANKER_BATCH_SIZE",label:"Reranker Batch Size"}]},{title:"index",fields:[{key:"CODEXLENS_DB_PATH",label:"DB Path"},{key:"CODEXLENS_INDEX_WORKERS",label:"Index Workers"},{key:"CODEXLENS_CODE_AWARE_CHUNKING",label:"Code Aware Chunking"},{key:"CODEXLENS_AST_CHUNKING",label:"AST Chunking"},{key:"CODEXLENS_MAX_FILE_SIZE",label:"Max File Size"},{key:"CODEXLENS_HNSW_EF",label:"HNSW EF"},{key:"CODEXLENS_HNSW_M",label:"HNSW M"}]},{title:"watcher",fields:[{key:"CODEXLENS_AUTO_WATCH",label:"Auto Watch"},{key:"CODEXLENS_WATCHER_DEBOUNCE_MS",label:"Watch Debounce (ms)"}]}],ge=new Set(["CODEXLENS_EMBED_API_URL","CODEXLENS_EMBED_API_KEY","CODEXLENS_EMBED_API_ENDPOINTS","CODEXLENS_EMBED_API_CONCURRENCY"]),U={CODEXLENS_EMBED_API_MODEL:"text-embedding-3-small",CODEXLENS_EMBED_DIM:"1536",CODEXLENS_EMBED_BATCH_SIZE:"64",CODEXLENS_EMBED_API_CONCURRENCY:"4",CODEXLENS_BINARY_TOP_K:"200",CODEXLENS_ANN_TOP_K:"50",CODEXLENS_FTS_TOP_K:"50",CODEXLENS_FUSION_K:"60",CODEXLENS_RERANKER_TOP_K:"20",CODEXLENS_RERANKER_BATCH_SIZE:"32",CODEXLENS_INDEX_WORKERS:"2",CODEXLENS_CODE_AWARE_CHUNKING:"true",CODEXLENS_AST_CHUNKING:"true",CODEXLENS_AUTO_WATCH:"false",CODEXLENS_WATCHER_DEBOUNCE_MS:"1000",CODEXLENS_MAX_FILE_SIZE:"1000000",CODEXLENS_HNSW_EF:"150",CODEXLENS_HNSW_M:"32"},B=J.flatMap(s=>s.fields.map(n=>n.key));function W(){return Object.fromEntries(B.map(s=>[s,""]))}function H(s,n){return Object.fromEntries(B.map(t=>[t,s[t]??n[t]??""]))}function _e({value:s,onChange:n,id:t}){const[l,i]=j.useState(!1);return e.jsxs("div",{className:"relative",children:[e.jsx(K,{id:t,type:l?"text":"password",value:s,onChange:d=>n(d.target.value),className:"pr-10"}),e.jsx("button",{type:"button",className:"absolute inset-y-0 right-2 flex items-center text-muted-foreground hover:text-foreground",onClick:()=>i(d=>!d),tabIndex:-1,children:l?e.jsx(le,{className:"w-4 h-4"}):e.jsx(ie,{className:"w-4 h-4"})})]})}function be(){const{formatMessage:s}=v(),{data:n,isLoading:t}=R(),{saveEnv:l,isSaving:i}=ue(),[d,u]=j.useState("local"),[E,o]=j.useState(W),N=(n==null?void 0:n.values)??{},a={...U,...(n==null?void 0:n.defaults)??{}},m=H(N,a);j.useEffect(()=>{if(n){const r={...U,...n.defaults??{}},f=n.values??{};o(H(f,r)),f.CODEXLENS_EMBED_API_URL&&u("api")}},[n]);const x=B.some(r=>E[r]!==(m[r]??"")),O=(r,f)=>{o(c=>({...c,[r]:f}))},k=async()=>{const r=Object.fromEntries(Object.entries(E).flatMap(([f,c])=>{const g=c.trim(),C=a[f]??"";return!g||g===C?[]:[[f,g]]}));await l(r)},T=()=>{o(W())};return t?e.jsx("p",{className:"text-sm text-muted-foreground p-4",children:s({id:"codexlens.env.loading"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-sm font-medium",children:[s({id:"codexlens.env.mode"}),":"]}),e.jsxs("div",{className:"flex rounded-md border border-border overflow-hidden",children:[e.jsx("button",{type:"button",onClick:()=>u("local"),className:`px-3 py-1.5 text-sm transition-colors ${d==="local"?"bg-primary text-primary-foreground":"bg-background text-muted-foreground hover:bg-muted"}`,children:s({id:"codexlens.env.localMode"})}),e.jsx("button",{type:"button",onClick:()=>u("api"),className:`px-3 py-1.5 text-sm transition-colors ${d==="api"?"bg-primary text-primary-foreground":"bg-background text-muted-foreground hover:bg-muted"}`,children:s({id:"codexlens.env.apiMode"})})]}),e.jsx("span",{className:"text-xs text-muted-foreground",children:s(d==="local"?{id:"codexlens.env.localModeDesc"}:{id:"codexlens.env.apiModeDesc"})})]}),J.map(r=>{const f=d==="local"?r.fields.filter(c=>!ge.has(c.key)):r.fields;return f.length===0?null:e.jsxs(y,{children:[e.jsx(D,{className:"pb-3",children:e.jsx(L,{className:"text-base",children:s({id:`codexlens.env.sections.${r.title}`})})}),e.jsx(S,{className:"space-y-3",children:f.map(c=>e.jsxs("div",{className:"grid grid-cols-3 gap-3 items-center",children:[e.jsx("label",{htmlFor:c.key,className:"text-sm text-muted-foreground col-span-1",children:c.label}),e.jsx("div",{className:"col-span-2",children:c.sensitive?e.jsx(_e,{id:c.key,value:E[c.key]??"",onChange:g=>O(c.key,g)}):e.jsx(K,{id:c.key,value:E[c.key]??"",placeholder:a[c.key]??"",onChange:g=>O(c.key,g.target.value)})})]},c.key))})]},r.title)}),e.jsxs("div",{className:"flex justify-between pt-2",children:[e.jsxs(h,{variant:"outline",onClick:T,children:[e.jsx(se,{className:"w-4 h-4 mr-2"}),s({id:"codexlens.env.clearForm"})]}),e.jsxs(h,{onClick:k,disabled:!x||i,children:[e.jsx(ae,{className:"w-4 h-4 mr-2"}),s(i?{id:"codexlens.env.saving"}:{id:"codexlens.env.save"})]})]})]})}function De(){const{formatMessage:s}=v(),[n,t]=j.useState("mcp");return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold text-foreground flex items-center gap-2",children:[e.jsx(ne,{className:"w-6 h-6 text-primary"}),s({id:"codexlens.page.title"})]}),e.jsx("p",{className:"text-muted-foreground mt-1",children:s({id:"codexlens.page.description"})})]}),e.jsx(te,{value:n,onValueChange:l=>t(l),tabs:[{value:"mcp",label:s({id:"codexlens.tabs.mcp"})},{value:"models",label:s({id:"codexlens.tabs.models"})},{value:"index",label:s({id:"codexlens.tabs.index"})},{value:"env",label:s({id:"codexlens.tabs.env"})}]}),e.jsxs("div",{className:"mt-4",children:[n==="mcp"&&e.jsx(he,{}),n==="models"&&e.jsx(pe,{}),n==="index"&&e.jsx(je,{}),n==="env"&&e.jsx(be,{})]})]})}export{De as CodexLensPage,De as default};
2
+ //# sourceMappingURL=CodexLensPage-B_uv5wdn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodexLensPage-z6miX68P.js","sources":["../../src/hooks/useCodexLens.ts","../../src/components/codexlens/McpConfigTab.tsx","../../src/components/codexlens/ModelManagerTab.tsx","../../src/components/codexlens/IndexManagerTab.tsx","../../src/components/codexlens/EnvSettingsTab.tsx","../../src/pages/CodexLensPage.tsx"],"sourcesContent":["// ========================================\n// useCodexLens Hook\n// ========================================\n// TanStack Query hooks for CodexLens v2 API management\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { fetchApi } from '@/lib/api';\n\n// ========================================\n// Domain types (exported for component use)\n// ========================================\n\nexport interface ModelEntry {\n name: string;\n installed: boolean;\n type?: string;\n cache_path?: string;\n}\n\nexport interface IndexStatusData {\n status?: string;\n files_tracked?: number;\n total_chunks?: number;\n deleted_chunks?: number;\n db_path?: string;\n}\n\nexport type McpConfigData = Record<string, unknown>;\nexport interface CodexLensEnvData {\n values: Record<string, string>;\n defaults: Record<string, string>;\n}\n\n// Internal API response wrappers\ninterface ModelsResponse { success: boolean; models: ModelEntry[] }\ninterface IndexStatusResponse { success: boolean; status: IndexStatusData }\ninterface EnvResponse {\n success: boolean;\n env: Record<string, string>;\n defaults?: Record<string, string>;\n}\ninterface McpConfigResponse { success: boolean; config: McpConfigData }\n\n// ========================================\n// Query Key Factory\n// ========================================\n\nexport const codexLensKeys = {\n all: ['codexLens'] as const,\n models: () => [...codexLensKeys.all, 'models'] as const,\n indexStatus: (path: string) => [...codexLensKeys.all, 'indexStatus', path] as const,\n env: () => [...codexLensKeys.all, 'env'] as const,\n mcpConfig: () => [...codexLensKeys.all, 'mcpConfig'] as const,\n};\n\n// ========================================\n// Models Hooks\n// ========================================\n\nexport function useCodexLensModels() {\n return useQuery({\n queryKey: codexLensKeys.models(),\n queryFn: () => fetchApi<ModelsResponse>('/api/codexlens/models').then(r => r.models),\n staleTime: 30_000,\n });\n}\n\nexport function useDownloadModel() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (modelName: string) =>\n fetchApi<{ success: boolean }>('/api/codexlens/models/download', {\n method: 'POST',\n body: JSON.stringify({ name: modelName }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: codexLensKeys.models() });\n },\n });\n\n return {\n downloadModel: mutation.mutateAsync,\n isDownloading: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteModel() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (modelName: string) =>\n fetchApi<{ success: boolean }>('/api/codexlens/models/delete', {\n method: 'POST',\n body: JSON.stringify({ name: modelName }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: codexLensKeys.models() });\n },\n });\n\n return {\n deleteModel: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Index Hooks\n// ========================================\n\nexport function useIndexStatus(projectPath: string) {\n return useQuery({\n queryKey: codexLensKeys.indexStatus(projectPath),\n queryFn: () =>\n fetchApi<IndexStatusResponse>(\n `/api/codexlens/index/status?projectPath=${encodeURIComponent(projectPath)}`\n ).then(r => r.status),\n enabled: !!projectPath,\n staleTime: 10_000,\n });\n}\n\nexport function useSyncIndex() {\n const mutation = useMutation({\n mutationFn: (projectPath: string) =>\n fetchApi<{ success: boolean }>('/api/codexlens/index/sync', {\n method: 'POST',\n body: JSON.stringify({ projectPath }),\n }),\n });\n\n return {\n syncIndex: mutation.mutateAsync,\n isSyncing: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useRebuildIndex() {\n const mutation = useMutation({\n mutationFn: (projectPath: string) =>\n fetchApi<{ success: boolean }>('/api/codexlens/index/rebuild', {\n method: 'POST',\n body: JSON.stringify({ projectPath }),\n }),\n });\n\n return {\n rebuildIndex: mutation.mutateAsync,\n isRebuilding: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Env Hooks\n// ========================================\n\nexport function useCodexLensEnv() {\n return useQuery({\n queryKey: codexLensKeys.env(),\n queryFn: () =>\n fetchApi<EnvResponse>('/api/codexlens/env').then((r): CodexLensEnvData => ({\n values: r.env ?? {},\n defaults: r.defaults ?? {},\n })),\n staleTime: 60_000,\n });\n}\n\nexport function useSaveCodexLensEnv() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (env: Record<string, string>) =>\n fetchApi<{ success: boolean }>('/api/codexlens/env', {\n method: 'POST',\n body: JSON.stringify({ env }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: codexLensKeys.env() });\n queryClient.invalidateQueries({ queryKey: codexLensKeys.mcpConfig() });\n },\n });\n\n return {\n saveEnv: mutation.mutateAsync,\n isSaving: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// MCP Config Hooks\n// ========================================\n\nexport function useCodexLensMcpConfig() {\n return useQuery({\n queryKey: codexLensKeys.mcpConfig(),\n queryFn: () => fetchApi<McpConfigResponse>('/api/codexlens/mcp-config').then(r => r.config),\n staleTime: 30_000,\n });\n}\n\n// ========================================\n// Watcher Status Hook\n// ========================================\n\nexport function useWatcherStatus() {\n const { data: envData } = useCodexLensEnv();\n const autoWatch = envData?.values?.CODEXLENS_AUTO_WATCH === 'true';\n const debounceMs = envData?.values?.CODEXLENS_WATCHER_DEBOUNCE_MS || '1000';\n\n return {\n autoWatch,\n debounceMs,\n };\n}\n","// ========================================\r\n// McpConfigTab Component\r\n// ========================================\r\n// Read-only MCP config JSON display with copy-to-clipboard and regenerate\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { Copy, RefreshCw, Check, Download, Loader2 } from 'lucide-react';\nimport { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Badge } from '@/components/ui/Badge';\nimport { useCodexLensMcpConfig, useCodexLensEnv } from '@/hooks/useCodexLens';\nimport { addGlobalMcpServer, copyMcpServerToProject } from '@/lib/api';\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\n\r\nexport function McpConfigTab() {\r\n const { formatMessage } = useIntl();\r\n const { data: mcpConfig, isLoading, isError, refetch } = useCodexLensMcpConfig();\r\n const { data: envData } = useCodexLensEnv();\r\n const [copied, setCopied] = useState(false);\r\n const [installing, setInstalling] = useState(false);\r\n const [installResult, setInstallResult] = useState<{ ok: boolean; msg: string } | null>(null);\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const handleInstall = async (scope: 'global' | 'project') => {\n setInstalling(true);\n setInstallResult(null);\n try {\n const mcpServers = mcpConfig?.['mcpServers'];\n const serverConfig = mcpServers && typeof mcpServers === 'object'\n ? (mcpServers as Record<string, unknown>).codexlens\n : undefined;\n\n if (!serverConfig || typeof serverConfig !== 'object') {\n throw new Error(formatMessage({ id: 'codexlens.mcp.noConfig' }));\n }\n\n const typedConfig = serverConfig as {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n type?: string;\n };\n\n if (scope === 'project') {\n if (!projectPath) {\n throw new Error(formatMessage({ id: 'codexlens.mcp.installError' }));\n }\n await copyMcpServerToProject('codexlens', typedConfig, projectPath);\n } else {\n await addGlobalMcpServer('codexlens', typedConfig);\n }\n\n setInstallResult({\n ok: true,\n msg: formatMessage({ id: 'codexlens.mcp.installSuccess' }),\n });\n } catch (err) {\n setInstallResult({ ok: false, msg: (err as Error).message });\n } finally {\n setInstalling(false);\n }\n };\n\n const hasApiUrl = !!(envData?.values.CODEXLENS_EMBED_API_URL);\n const embedMode = hasApiUrl ? 'API' : 'Local fastembed';\r\n\r\n const configJson = mcpConfig ? JSON.stringify(mcpConfig, null, 2) : '';\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(configJson).then(() => {\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n });\r\n };\r\n\r\n const handleRegenerate = () => {\r\n refetch();\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Embed mode badge */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'codexlens.mcp.embedMode' })}:</span>\r\n <Badge variant={hasApiUrl ? 'success' : 'secondary'}>\r\n {embedMode}\r\n </Badge>\r\n </div>\r\n\r\n {/* Config JSON block */}\r\n <Card>\r\n <CardHeader className=\"pb-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <CardTitle className=\"text-base\">{formatMessage({ id: 'codexlens.mcp.configTitle' })}</CardTitle>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={handleCopy}\r\n disabled={!configJson || isLoading}\r\n >\r\n {copied ? <Check className=\"w-4 h-4 mr-1\" /> : <Copy className=\"w-4 h-4 mr-1\" />}\r\n {copied ? formatMessage({ id: 'codexlens.mcp.copied' }) : formatMessage({ id: 'codexlens.mcp.copy' })}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={handleRegenerate}\r\n disabled={isLoading}\r\n >\r\n <RefreshCw className={`w-4 h-4 mr-1 ${isLoading ? 'animate-spin' : ''}`} />\r\n {formatMessage({ id: 'codexlens.mcp.regenerate' })}\r\n </Button>\r\n </div>\r\n </div>\r\n </CardHeader>\r\n <CardContent>\r\n {isLoading && (\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'codexlens.mcp.loading' })}</p>\r\n )}\r\n {isError && (\r\n <p className=\"text-sm text-destructive\">{formatMessage({ id: 'codexlens.mcp.error' })}</p>\r\n )}\r\n {!isLoading && !isError && (\r\n <pre className=\"bg-muted rounded-md p-4 text-xs overflow-auto max-h-96 font-mono\">\r\n {configJson || formatMessage({ id: 'codexlens.mcp.noConfig' })}\r\n </pre>\r\n )}\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Quick Install */}\r\n <Card>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-base\">{formatMessage({ id: 'codexlens.mcp.quickInstallTitle' })}</CardTitle>\r\n <p className=\"text-xs text-muted-foreground mt-1\">{formatMessage({ id: 'codexlens.mcp.quickInstallDesc' })}</p>\r\n </CardHeader>\r\n <CardContent className=\"space-y-3\">\r\n <div className=\"flex gap-2 flex-wrap\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => handleInstall('project')}\r\n disabled={installing || !projectPath}\r\n >\r\n {installing ? <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" /> : <Download className=\"w-4 h-4 mr-1\" />}\r\n {installing ? formatMessage({ id: 'codexlens.mcp.installing' }) : formatMessage({ id: 'codexlens.mcp.installProject' })}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => handleInstall('global')}\r\n disabled={installing}\r\n >\r\n {installing ? <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" /> : <Download className=\"w-4 h-4 mr-1\" />}\r\n {installing ? formatMessage({ id: 'codexlens.mcp.installing' }) : formatMessage({ id: 'codexlens.mcp.installGlobal' })}\r\n </Button>\r\n </div>\r\n {installResult && (\r\n <p className={`text-sm ${installResult.ok ? 'text-success' : 'text-destructive'}`}>\r\n {installResult.msg}\r\n </p>\r\n )}\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Installation instructions */}\r\n <Card>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-base\">{formatMessage({ id: 'codexlens.mcp.installTitle' })}</CardTitle>\r\n </CardHeader>\r\n <CardContent>\r\n <ol className=\"list-decimal list-inside space-y-2 text-sm text-muted-foreground\">\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step1' })}</li>\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step2' })}</li>\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step3' })}</li>\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step4' })}</li>\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step5' })}</li>\r\n </ol>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// ModelManagerTab Component\r\n// ========================================\r\n// Model list with download/delete actions and embed mode banner\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { Download, Trash2, Loader2 } from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport {\r\n useCodexLensModels,\r\n useDownloadModel,\r\n useDeleteModel,\r\n useCodexLensEnv,\r\n type ModelEntry,\r\n} from '@/hooks/useCodexLens';\r\n\r\nexport function ModelManagerTab() {\r\n const { formatMessage } = useIntl();\r\n const { data: modelsData, isLoading, isError } = useCodexLensModels();\r\n const { data: envData } = useCodexLensEnv();\r\n const { downloadModel, isDownloading } = useDownloadModel();\r\n const { deleteModel, isDeleting } = useDeleteModel();\r\n\r\n const hasApiUrl = !!(envData?.values.CODEXLENS_EMBED_API_URL);\n const embedMode = hasApiUrl ? 'API' : 'Local fastembed';\r\n\r\n const models: ModelEntry[] = modelsData ?? [];\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Embed mode banner */}\r\n <div className=\"flex items-center gap-2 p-3 rounded-md bg-muted text-sm\">\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'codexlens.models.embedMode' })}:</span>\r\n <Badge variant={hasApiUrl ? 'success' : 'secondary'}>{embedMode}</Badge>\r\n </div>\r\n\r\n {/* Loading / Error states */}\r\n {isLoading && (\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground p-4\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {formatMessage({ id: 'codexlens.models.loading' })}\r\n </div>\r\n )}\r\n\r\n {isError && (\r\n <p className=\"text-sm text-destructive p-4\">{formatMessage({ id: 'codexlens.models.error' })}</p>\r\n )}\r\n\r\n {/* Model list */}\r\n {!isLoading && !isError && models.length === 0 && (\r\n <p className=\"text-sm text-muted-foreground p-4\">{formatMessage({ id: 'codexlens.models.noModels' })}</p>\r\n )}\r\n\r\n {!isLoading && !isError && models.length > 0 && (\r\n <Card>\r\n <CardContent className=\"p-0\">\r\n <div className=\"divide-y divide-border\">\r\n {models.map((model) => (\r\n <div\r\n key={model.name}\r\n className=\"flex items-center justify-between px-4 py-3\"\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"text-sm font-medium\">{model.name}</span>\r\n <Badge variant={model.installed ? 'success' : 'secondary'}>\r\n {model.installed\r\n ? formatMessage({ id: 'codexlens.models.installed' })\r\n : formatMessage({ id: 'codexlens.models.notInstalled' })}\r\n </Badge>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => downloadModel(model.name)}\r\n disabled={isDownloading}\r\n >\r\n {isDownloading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Download className=\"w-4 h-4\" />\r\n )}\r\n <span className=\"ml-1\">{formatMessage({ id: 'codexlens.models.download' })}</span>\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => deleteModel(model.name)}\r\n disabled={!model.installed || isDeleting}\r\n >\r\n {isDeleting ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n <span className=\"ml-1\">{formatMessage({ id: 'codexlens.models.delete' })}</span>\r\n </Button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// IndexManagerTab Component\r\n// ========================================\r\n// Project path input, index status display, and sync/rebuild actions\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { Plus, Trash2, RefreshCw, Loader2 } from 'lucide-react';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { useIndexStatus, useSyncIndex, useRebuildIndex, useWatcherStatus, codexLensKeys, type IndexStatusData } from '@/hooks/useCodexLens';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\ninterface ProjectStatusCardProps {\r\n projectPath: string;\r\n}\r\n\r\nfunction ProjectStatusCard({ projectPath }: ProjectStatusCardProps) {\r\n const { formatMessage } = useIntl();\r\n const queryClient = useQueryClient();\r\n const { data: statusData, isLoading, isError } = useIndexStatus(projectPath);\r\n const { syncIndex, isSyncing } = useSyncIndex();\r\n const { rebuildIndex, isRebuilding } = useRebuildIndex();\r\n\r\n const status: IndexStatusData | undefined = statusData;\r\n\r\n const handleRefresh = () => {\r\n queryClient.invalidateQueries({ queryKey: codexLensKeys.indexStatus(projectPath) });\r\n };\r\n\r\n return (\r\n <Card>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-sm font-medium truncate\">{projectPath}</CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n {/* Status stats */}\r\n {isLoading && (\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {formatMessage({ id: 'codexlens.index.loading' })}\r\n </div>\r\n )}\r\n {isError && (\r\n <p className=\"text-sm text-destructive\">{formatMessage({ id: 'codexlens.index.error' })}</p>\r\n )}\r\n {!isLoading && !isError && status && (\r\n <div className=\"grid grid-cols-3 gap-3\">\r\n <div className=\"text-center\">\r\n <p className=\"text-lg font-semibold\">{status.files_tracked ?? 0}</p>\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'codexlens.index.filesTracked' })}</p>\r\n </div>\r\n <div className=\"text-center\">\r\n <p className=\"text-lg font-semibold\">{status.total_chunks ?? 0}</p>\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'codexlens.index.totalChunks' })}</p>\r\n </div>\r\n <div className=\"text-center\">\r\n <p className=\"text-lg font-semibold\">{status.deleted_chunks ?? 0}</p>\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'codexlens.index.deletedChunks' })}</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Action buttons */}\r\n <div className=\"flex gap-2 flex-wrap\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => syncIndex(projectPath)}\r\n disabled={isSyncing}\r\n >\r\n {isSyncing ? <Loader2 className=\"w-4 h-4 animate-spin mr-1\" /> : null}\r\n {formatMessage({ id: 'codexlens.index.sync' })}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => rebuildIndex(projectPath)}\r\n disabled={isRebuilding}\r\n >\r\n {isRebuilding ? <Loader2 className=\"w-4 h-4 animate-spin mr-1\" /> : null}\r\n {formatMessage({ id: 'codexlens.index.rebuild' })}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={handleRefresh}\r\n >\r\n <RefreshCw className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'codexlens.index.refresh' })}\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\nexport function IndexManagerTab() {\r\n const { formatMessage } = useIntl();\r\n const currentWorkspacePath = useWorkflowStore(selectProjectPath);\r\n const [paths, setPaths] = useState<string[]>([]);\r\n const [inputValue, setInputValue] = useState('');\r\n\r\n // Auto-add current workspace path on mount and when workspace changes\r\n useEffect(() => {\r\n if (currentWorkspacePath) {\r\n setPaths((prev) => {\r\n if (prev.includes(currentWorkspacePath)) return prev;\r\n return [currentWorkspacePath, ...prev];\r\n });\r\n }\r\n }, [currentWorkspacePath]);\r\n\r\n const handleAdd = () => {\r\n const trimmed = inputValue.trim();\r\n if (trimmed && !paths.includes(trimmed)) {\r\n setPaths((prev) => [...prev, trimmed]);\r\n }\r\n setInputValue('');\r\n };\r\n\r\n const handleRemove = (path: string) => {\r\n setPaths((prev) => prev.filter((p) => p !== path));\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n handleAdd();\r\n }\r\n };\r\n\r\n const { autoWatch } = useWatcherStatus();\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Global watcher status */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className={`text-xs px-2 py-0.5 rounded-full ${autoWatch ? 'bg-green-100 text-green-700' : 'bg-gray-100 text-gray-500'}`}>\r\n {autoWatch ? 'Auto-watch ON' : 'Auto-watch OFF'}\r\n </span>\r\n </div>\r\n\r\n {/* Add project path */}\r\n <div className=\"flex gap-2\">\r\n <Input\r\n placeholder={formatMessage({ id: 'codexlens.index.pathPlaceholder' })}\r\n value={inputValue}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n className=\"flex-1\"\r\n />\r\n <Button onClick={handleAdd} disabled={!inputValue.trim()}>\r\n <Plus className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'codexlens.index.add' })}\r\n </Button>\r\n </div>\r\n\r\n {paths.length === 0 && (\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'codexlens.index.empty' })}\r\n </p>\r\n )}\r\n\r\n {/* Project status cards */}\r\n {paths.map((path) => (\r\n <div key={path} className=\"relative\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"absolute top-2 right-2 z-10 h-7 w-7 p-0\"\r\n onClick={() => handleRemove(path)}\r\n title={formatMessage({ id: 'codexlens.index.removeProject' })}\r\n >\r\n <Trash2 className=\"w-4 h-4 text-muted-foreground\" />\r\n </Button>\r\n <ProjectStatusCard projectPath={path} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// EnvSettingsTab Component\r\n// ========================================\r\n// Grouped env var form with save/reset actions\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { Eye, EyeOff, Save, RotateCcw } from 'lucide-react';\r\nimport { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { useCodexLensEnv, useSaveCodexLensEnv } from '@/hooks/useCodexLens';\r\n\r\ntype EmbedMode = 'local' | 'api';\r\n\r\n// ========================================\r\n// ENV group definitions\r\n// ========================================\r\n\r\ninterface EnvField {\r\n key: string;\r\n label: string;\r\n sensitive?: boolean;\r\n}\r\n\r\ninterface EnvGroup {\r\n title: string;\r\n fields: EnvField[];\r\n}\r\n\r\nconst ENV_GROUPS: EnvGroup[] = [\r\n {\r\n title: 'embed',\r\n fields: [\r\n { key: 'CODEXLENS_EMBED_API_URL', label: 'Embed API URL' },\r\n { key: 'CODEXLENS_EMBED_API_KEY', label: 'Embed API Key', sensitive: true },\r\n { key: 'CODEXLENS_EMBED_API_MODEL', label: 'Embed API Model' },\r\n { key: 'CODEXLENS_EMBED_DIM', label: 'Embed Dimension' },\r\n { key: 'CODEXLENS_EMBED_API_ENDPOINTS', label: 'Embed API Endpoints', sensitive: true },\r\n { key: 'CODEXLENS_EMBED_BATCH_SIZE', label: 'Embed Batch Size' },\r\n { key: 'CODEXLENS_EMBED_API_CONCURRENCY', label: 'Embed API Concurrency' },\r\n ],\r\n },\r\n {\r\n title: 'reranker',\r\n fields: [\r\n { key: 'CODEXLENS_RERANKER_API_URL', label: 'Reranker API URL' },\r\n { key: 'CODEXLENS_RERANKER_API_KEY', label: 'Reranker API Key', sensitive: true },\r\n { key: 'CODEXLENS_RERANKER_API_MODEL', label: 'Reranker API Model' },\r\n ],\r\n },\r\n {\r\n title: 'performance',\r\n fields: [\r\n { key: 'CODEXLENS_BINARY_TOP_K', label: 'Binary Top K' },\r\n { key: 'CODEXLENS_ANN_TOP_K', label: 'ANN Top K' },\r\n { key: 'CODEXLENS_FTS_TOP_K', label: 'FTS Top K' },\r\n { key: 'CODEXLENS_FUSION_K', label: 'Fusion K' },\r\n { key: 'CODEXLENS_RERANKER_TOP_K', label: 'Reranker Top K' },\r\n { key: 'CODEXLENS_RERANKER_BATCH_SIZE', label: 'Reranker Batch Size' },\r\n ],\r\n },\r\n {\r\n title: 'index',\r\n fields: [\r\n { key: 'CODEXLENS_DB_PATH', label: 'DB Path' },\r\n { key: 'CODEXLENS_INDEX_WORKERS', label: 'Index Workers' },\r\n { key: 'CODEXLENS_CODE_AWARE_CHUNKING', label: 'Code Aware Chunking' },\r\n { key: 'CODEXLENS_AST_CHUNKING', label: 'AST Chunking' },\r\n { key: 'CODEXLENS_MAX_FILE_SIZE', label: 'Max File Size' },\r\n { key: 'CODEXLENS_HNSW_EF', label: 'HNSW EF' },\r\n { key: 'CODEXLENS_HNSW_M', label: 'HNSW M' },\r\n ],\r\n },\r\n {\r\n title: 'watcher',\r\n fields: [\r\n { key: 'CODEXLENS_AUTO_WATCH', label: 'Auto Watch' },\r\n { key: 'CODEXLENS_WATCHER_DEBOUNCE_MS', label: 'Watch Debounce (ms)' },\r\n ],\r\n },\r\n];\r\n\r\n// Fields that are only relevant in API mode\r\nconst API_ONLY_KEYS = new Set([\r\n 'CODEXLENS_EMBED_API_URL',\r\n 'CODEXLENS_EMBED_API_KEY',\r\n 'CODEXLENS_EMBED_API_ENDPOINTS',\r\n 'CODEXLENS_EMBED_API_CONCURRENCY',\r\n]);\r\n\r\n// Default placeholder values\r\nconst FIELD_DEFAULTS: Record<string, string> = {\r\n CODEXLENS_EMBED_API_MODEL: 'text-embedding-3-small',\r\n CODEXLENS_EMBED_DIM: '1536',\r\n CODEXLENS_EMBED_BATCH_SIZE: '64',\r\n CODEXLENS_EMBED_API_CONCURRENCY: '4',\r\n CODEXLENS_BINARY_TOP_K: '200',\r\n CODEXLENS_ANN_TOP_K: '50',\r\n CODEXLENS_FTS_TOP_K: '50',\r\n CODEXLENS_FUSION_K: '60',\r\n CODEXLENS_RERANKER_TOP_K: '20',\r\n CODEXLENS_RERANKER_BATCH_SIZE: '32',\r\n CODEXLENS_INDEX_WORKERS: '2',\r\n CODEXLENS_CODE_AWARE_CHUNKING: 'true',\r\n CODEXLENS_AST_CHUNKING: 'true',\r\n CODEXLENS_AUTO_WATCH: 'false',\r\n CODEXLENS_WATCHER_DEBOUNCE_MS: '1000',\r\n CODEXLENS_MAX_FILE_SIZE: '1000000',\r\n CODEXLENS_HNSW_EF: '150',\r\n CODEXLENS_HNSW_M: '32',\r\n};\r\n\r\n// Collect all keys\r\nconst ALL_KEYS = ENV_GROUPS.flatMap((g) => g.fields.map((f) => f.key));\r\n\r\nfunction buildEmptyEnv(): Record<string, string> {\r\n return Object.fromEntries(ALL_KEYS.map((k) => [k, '']));\r\n}\r\n\r\nfunction buildEffectiveEnv(\r\n values: Record<string, string>,\r\n defaults: Record<string, string>,\r\n): Record<string, string> {\r\n return Object.fromEntries(\r\n ALL_KEYS.map((key) => [key, values[key] ?? defaults[key] ?? '']),\r\n );\r\n}\r\n\r\n// ========================================\r\n// Sensitive field with show/hide toggle\r\n// ========================================\r\n\r\ninterface SensitiveInputProps {\r\n value: string;\r\n onChange: (v: string) => void;\r\n id: string;\r\n}\r\n\r\nfunction SensitiveInput({ value, onChange, id }: SensitiveInputProps) {\r\n const [show, setShow] = useState(false);\r\n return (\r\n <div className=\"relative\">\r\n <Input\r\n id={id}\r\n type={show ? 'text' : 'password'}\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n className=\"pr-10\"\r\n />\r\n <button\r\n type=\"button\"\r\n className=\"absolute inset-y-0 right-2 flex items-center text-muted-foreground hover:text-foreground\"\r\n onClick={() => setShow((s) => !s)}\r\n tabIndex={-1}\r\n >\r\n {show ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\n// ========================================\r\n// Main component\r\n// ========================================\r\n\r\nexport function EnvSettingsTab() {\r\n const { formatMessage } = useIntl();\r\n const { data: envData, isLoading } = useCodexLensEnv();\r\n const { saveEnv, isSaving } = useSaveCodexLensEnv();\r\n\r\n const [embedMode, setEmbedMode] = useState<EmbedMode>('local');\r\n const [localEnv, setLocalEnv] = useState<Record<string, string>>(buildEmptyEnv);\r\n\r\n const serverValues = envData?.values ?? {};\r\n const serverDefaults = { ...FIELD_DEFAULTS, ...(envData?.defaults ?? {}) };\r\n const serverRecord = buildEffectiveEnv(serverValues, serverDefaults);\r\n\r\n // Sync server state into local when loaded and detect embed mode\r\n useEffect(() => {\r\n if (envData) {\r\n const nextDefaults = { ...FIELD_DEFAULTS, ...(envData.defaults ?? {}) };\r\n const nextValues = envData.values ?? {};\r\n setLocalEnv(buildEffectiveEnv(nextValues, nextDefaults));\r\n // Auto-detect mode from saved env\r\n if (nextValues.CODEXLENS_EMBED_API_URL) {\r\n setEmbedMode('api');\r\n }\r\n }\r\n }, [envData]);\r\n\r\n const isDirty = ALL_KEYS.some((k) => localEnv[k] !== (serverRecord[k] ?? ''));\r\n\r\n const handleChange = (key: string, value: string) => {\r\n setLocalEnv((prev) => ({ ...prev, [key]: value }));\r\n };\r\n\r\n const handleSave = async () => {\r\n const payload = Object.fromEntries(\r\n Object.entries(localEnv).flatMap(([key, value]) => {\r\n const trimmed = value.trim();\r\n const defaultValue = serverDefaults[key] ?? '';\r\n if (!trimmed || trimmed === defaultValue) {\r\n return [];\r\n }\r\n return [[key, trimmed]];\r\n }),\r\n );\r\n await saveEnv(payload);\r\n };\r\n\r\n const handleReset = () => {\r\n setLocalEnv(buildEmptyEnv());\r\n };\r\n\r\n if (isLoading) {\r\n return <p className=\"text-sm text-muted-foreground p-4\">{formatMessage({ id: 'codexlens.env.loading' })}</p>;\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Mode toggle */}\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"text-sm font-medium\">{formatMessage({ id: 'codexlens.env.mode' })}:</span>\r\n <div className=\"flex rounded-md border border-border overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setEmbedMode('local')}\r\n className={`px-3 py-1.5 text-sm transition-colors ${\r\n embedMode === 'local'\r\n ? 'bg-primary text-primary-foreground'\r\n : 'bg-background text-muted-foreground hover:bg-muted'\r\n }`}\r\n >\r\n {formatMessage({ id: 'codexlens.env.localMode' })}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setEmbedMode('api')}\r\n className={`px-3 py-1.5 text-sm transition-colors ${\r\n embedMode === 'api'\r\n ? 'bg-primary text-primary-foreground'\r\n : 'bg-background text-muted-foreground hover:bg-muted'\r\n }`}\r\n >\r\n {formatMessage({ id: 'codexlens.env.apiMode' })}\r\n </button>\r\n </div>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {embedMode === 'local'\r\n ? formatMessage({ id: 'codexlens.env.localModeDesc' })\r\n : formatMessage({ id: 'codexlens.env.apiModeDesc' })}\r\n </span>\r\n </div>\r\n\r\n {ENV_GROUPS.map((group) => {\r\n // In local mode, filter out API-only fields from embed group\r\n const visibleFields = embedMode === 'local'\r\n ? group.fields.filter((f) => !API_ONLY_KEYS.has(f.key))\r\n : group.fields;\r\n if (visibleFields.length === 0) return null;\r\n return (\r\n <Card key={group.title}>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-base\">{formatMessage({ id: `codexlens.env.sections.${group.title}` })}</CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-3\">\r\n {visibleFields.map((field) => (\r\n <div key={field.key} className=\"grid grid-cols-3 gap-3 items-center\">\r\n <label\r\n htmlFor={field.key}\r\n className=\"text-sm text-muted-foreground col-span-1\"\r\n >\r\n {field.label}\r\n </label>\r\n <div className=\"col-span-2\">\r\n {field.sensitive ? (\r\n <SensitiveInput\r\n id={field.key}\r\n value={localEnv[field.key] ?? ''}\r\n onChange={(v) => handleChange(field.key, v)}\r\n />\r\n ) : (\r\n <Input\r\n id={field.key}\r\n value={localEnv[field.key] ?? ''}\r\n placeholder={serverDefaults[field.key] ?? ''}\r\n onChange={(e) => handleChange(field.key, e.target.value)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </CardContent>\r\n </Card>\r\n );\r\n })}\r\n\r\n {/* Action buttons */}\r\n <div className=\"flex justify-between pt-2\">\r\n <Button variant=\"outline\" onClick={handleReset}>\r\n <RotateCcw className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'codexlens.env.clearForm' })}\r\n </Button>\r\n <Button onClick={handleSave} disabled={!isDirty || isSaving}>\r\n <Save className=\"w-4 h-4 mr-2\" />\r\n {isSaving ? formatMessage({ id: 'codexlens.env.saving' }) : formatMessage({ id: 'codexlens.env.save' })}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// CodexLens Page\r\n// ========================================\r\n// Main page for CodexLens v2 management: MCP config, models, index, env\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { Search } from 'lucide-react';\r\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\r\nimport { McpConfigTab } from '@/components/codexlens/McpConfigTab';\r\nimport { ModelManagerTab } from '@/components/codexlens/ModelManagerTab';\r\nimport { IndexManagerTab } from '@/components/codexlens/IndexManagerTab';\r\nimport { EnvSettingsTab } from '@/components/codexlens/EnvSettingsTab';\r\n\r\ntype TabType = 'mcp' | 'models' | 'index' | 'env';\r\n\r\nexport function CodexLensPage() {\r\n const { formatMessage } = useIntl();\r\n const [activeTab, setActiveTab] = useState<TabType>('mcp');\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Page Header */}\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\r\n <Search className=\"w-6 h-6 text-primary\" />\r\n {formatMessage({ id: 'codexlens.page.title' })}\r\n </h1>\r\n <p className=\"text-muted-foreground mt-1\">\r\n {formatMessage({ id: 'codexlens.page.description' })}\r\n </p>\r\n </div>\r\n\r\n {/* Tab Navigation */}\r\n <TabsNavigation\r\n value={activeTab}\r\n onValueChange={(v) => setActiveTab(v as TabType)}\r\n tabs={[\r\n { value: 'mcp', label: formatMessage({ id: 'codexlens.tabs.mcp' }) },\r\n { value: 'models', label: formatMessage({ id: 'codexlens.tabs.models' }) },\r\n { value: 'index', label: formatMessage({ id: 'codexlens.tabs.index' }) },\r\n { value: 'env', label: formatMessage({ id: 'codexlens.tabs.env' }) },\r\n ]}\r\n />\r\n\r\n {/* Tab Content */}\r\n <div className=\"mt-4\">\r\n {activeTab === 'mcp' && <McpConfigTab />}\r\n {activeTab === 'models' && <ModelManagerTab />}\r\n {activeTab === 'index' && <IndexManagerTab />}\r\n {activeTab === 'env' && <EnvSettingsTab />}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default CodexLensPage;\r\n"],"names":["codexLensKeys","path","useCodexLensModels","useQuery","fetchApi","r","useDownloadModel","queryClient","useQueryClient","mutation","useMutation","modelName","useDeleteModel","useIndexStatus","projectPath","useSyncIndex","useRebuildIndex","useCodexLensEnv","useSaveCodexLensEnv","env","useCodexLensMcpConfig","useWatcherStatus","envData","autoWatch","_a","debounceMs","_b","McpConfigTab","formatMessage","useIntl","mcpConfig","isLoading","isError","refetch","copied","setCopied","useState","installing","setInstalling","installResult","setInstallResult","useWorkflowStore","selectProjectPath","handleInstall","scope","mcpServers","serverConfig","typedConfig","copyMcpServerToProject","addGlobalMcpServer","err","hasApiUrl","embedMode","configJson","handleCopy","handleRegenerate","jsxs","Badge","Card","jsx","CardHeader","CardTitle","Button","Check","Copy","RefreshCw","CardContent","Loader2","Download","ModelManagerTab","modelsData","downloadModel","isDownloading","deleteModel","isDeleting","models","model","Trash2","ProjectStatusCard","statusData","syncIndex","isSyncing","rebuildIndex","isRebuilding","status","handleRefresh","IndexManagerTab","currentWorkspacePath","paths","setPaths","inputValue","setInputValue","useEffect","prev","handleAdd","trimmed","handleRemove","p","handleKeyDown","e","Input","Plus","ENV_GROUPS","API_ONLY_KEYS","FIELD_DEFAULTS","ALL_KEYS","g","f","buildEmptyEnv","k","buildEffectiveEnv","values","defaults","key","SensitiveInput","value","onChange","id","show","setShow","s","EyeOff","Eye","EnvSettingsTab","saveEnv","isSaving","setEmbedMode","localEnv","setLocalEnv","serverValues","serverDefaults","serverRecord","nextDefaults","nextValues","isDirty","handleChange","handleSave","payload","defaultValue","handleReset","group","visibleFields","field","v","RotateCcw","Save","CodexLensPage","activeTab","setActiveTab","Search","TabsNavigation"],"mappings":"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"}
1
+ {"version":3,"file":"CodexLensPage-B_uv5wdn.js","sources":["../../src/hooks/useCodexLens.ts","../../src/components/codexlens/McpConfigTab.tsx","../../src/components/codexlens/ModelManagerTab.tsx","../../src/components/codexlens/IndexManagerTab.tsx","../../src/components/codexlens/EnvSettingsTab.tsx","../../src/pages/CodexLensPage.tsx"],"sourcesContent":["// ========================================\n// useCodexLens Hook\n// ========================================\n// TanStack Query hooks for CodexLens v2 API management\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { fetchApi } from '@/lib/api';\n\n// ========================================\n// Domain types (exported for component use)\n// ========================================\n\nexport interface ModelEntry {\n name: string;\n installed: boolean;\n type?: string;\n cache_path?: string;\n}\n\nexport interface IndexStatusData {\n status?: string;\n files_tracked?: number;\n total_chunks?: number;\n deleted_chunks?: number;\n db_path?: string;\n}\n\nexport type McpConfigData = Record<string, unknown>;\nexport interface CodexLensEnvData {\n values: Record<string, string>;\n defaults: Record<string, string>;\n}\n\n// Internal API response wrappers\ninterface ModelsResponse { success: boolean; models: ModelEntry[] }\ninterface IndexStatusResponse { success: boolean; status: IndexStatusData }\ninterface EnvResponse {\n success: boolean;\n env: Record<string, string>;\n defaults?: Record<string, string>;\n}\ninterface McpConfigResponse { success: boolean; config: McpConfigData }\n\n// ========================================\n// Query Key Factory\n// ========================================\n\nexport const codexLensKeys = {\n all: ['codexLens'] as const,\n models: () => [...codexLensKeys.all, 'models'] as const,\n indexStatus: (path: string) => [...codexLensKeys.all, 'indexStatus', path] as const,\n env: () => [...codexLensKeys.all, 'env'] as const,\n mcpConfig: () => [...codexLensKeys.all, 'mcpConfig'] as const,\n};\n\n// ========================================\n// Models Hooks\n// ========================================\n\nexport function useCodexLensModels() {\n return useQuery({\n queryKey: codexLensKeys.models(),\n queryFn: () => fetchApi<ModelsResponse>('/api/codexlens/models').then(r => r.models),\n staleTime: 30_000,\n });\n}\n\nexport function useDownloadModel() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (modelName: string) =>\n fetchApi<{ success: boolean }>('/api/codexlens/models/download', {\n method: 'POST',\n body: JSON.stringify({ name: modelName }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: codexLensKeys.models() });\n },\n });\n\n return {\n downloadModel: mutation.mutateAsync,\n isDownloading: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteModel() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (modelName: string) =>\n fetchApi<{ success: boolean }>('/api/codexlens/models/delete', {\n method: 'POST',\n body: JSON.stringify({ name: modelName }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: codexLensKeys.models() });\n },\n });\n\n return {\n deleteModel: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Index Hooks\n// ========================================\n\nexport function useIndexStatus(projectPath: string) {\n return useQuery({\n queryKey: codexLensKeys.indexStatus(projectPath),\n queryFn: () =>\n fetchApi<IndexStatusResponse>(\n `/api/codexlens/index/status?projectPath=${encodeURIComponent(projectPath)}`\n ).then(r => r.status),\n enabled: !!projectPath,\n staleTime: 10_000,\n });\n}\n\nexport function useSyncIndex() {\n const mutation = useMutation({\n mutationFn: (projectPath: string) =>\n fetchApi<{ success: boolean }>('/api/codexlens/index/sync', {\n method: 'POST',\n body: JSON.stringify({ projectPath }),\n }),\n });\n\n return {\n syncIndex: mutation.mutateAsync,\n isSyncing: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useRebuildIndex() {\n const mutation = useMutation({\n mutationFn: (projectPath: string) =>\n fetchApi<{ success: boolean }>('/api/codexlens/index/rebuild', {\n method: 'POST',\n body: JSON.stringify({ projectPath }),\n }),\n });\n\n return {\n rebuildIndex: mutation.mutateAsync,\n isRebuilding: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Env Hooks\n// ========================================\n\nexport function useCodexLensEnv() {\n return useQuery({\n queryKey: codexLensKeys.env(),\n queryFn: () =>\n fetchApi<EnvResponse>('/api/codexlens/env').then((r): CodexLensEnvData => ({\n values: r.env ?? {},\n defaults: r.defaults ?? {},\n })),\n staleTime: 60_000,\n });\n}\n\nexport function useSaveCodexLensEnv() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (env: Record<string, string>) =>\n fetchApi<{ success: boolean }>('/api/codexlens/env', {\n method: 'POST',\n body: JSON.stringify({ env }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: codexLensKeys.env() });\n queryClient.invalidateQueries({ queryKey: codexLensKeys.mcpConfig() });\n },\n });\n\n return {\n saveEnv: mutation.mutateAsync,\n isSaving: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// MCP Config Hooks\n// ========================================\n\nexport function useCodexLensMcpConfig() {\n return useQuery({\n queryKey: codexLensKeys.mcpConfig(),\n queryFn: () => fetchApi<McpConfigResponse>('/api/codexlens/mcp-config').then(r => r.config),\n staleTime: 30_000,\n });\n}\n\n// ========================================\n// Watcher Status Hook\n// ========================================\n\nexport function useWatcherStatus() {\n const { data: envData } = useCodexLensEnv();\n const autoWatch = envData?.values?.CODEXLENS_AUTO_WATCH === 'true';\n const debounceMs = envData?.values?.CODEXLENS_WATCHER_DEBOUNCE_MS || '1000';\n\n return {\n autoWatch,\n debounceMs,\n };\n}\n","// ========================================\r\n// McpConfigTab Component\r\n// ========================================\r\n// Read-only MCP config JSON display with copy-to-clipboard and regenerate\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { Copy, RefreshCw, Check, Download, Loader2 } from 'lucide-react';\nimport { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Badge } from '@/components/ui/Badge';\nimport { useCodexLensMcpConfig, useCodexLensEnv } from '@/hooks/useCodexLens';\nimport { addGlobalMcpServer, copyMcpServerToProject } from '@/lib/api';\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\n\r\nexport function McpConfigTab() {\r\n const { formatMessage } = useIntl();\r\n const { data: mcpConfig, isLoading, isError, refetch } = useCodexLensMcpConfig();\r\n const { data: envData } = useCodexLensEnv();\r\n const [copied, setCopied] = useState(false);\r\n const [installing, setInstalling] = useState(false);\r\n const [installResult, setInstallResult] = useState<{ ok: boolean; msg: string } | null>(null);\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const handleInstall = async (scope: 'global' | 'project') => {\n setInstalling(true);\n setInstallResult(null);\n try {\n const mcpServers = mcpConfig?.['mcpServers'];\n const serverConfig = mcpServers && typeof mcpServers === 'object'\n ? (mcpServers as Record<string, unknown>).codexlens\n : undefined;\n\n if (!serverConfig || typeof serverConfig !== 'object') {\n throw new Error(formatMessage({ id: 'codexlens.mcp.noConfig' }));\n }\n\n const typedConfig = serverConfig as {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n type?: string;\n };\n\n if (scope === 'project') {\n if (!projectPath) {\n throw new Error(formatMessage({ id: 'codexlens.mcp.installError' }));\n }\n await copyMcpServerToProject('codexlens', typedConfig, projectPath);\n } else {\n await addGlobalMcpServer('codexlens', typedConfig);\n }\n\n setInstallResult({\n ok: true,\n msg: formatMessage({ id: 'codexlens.mcp.installSuccess' }),\n });\n } catch (err) {\n setInstallResult({ ok: false, msg: (err as Error).message });\n } finally {\n setInstalling(false);\n }\n };\n\n const hasApiUrl = !!(envData?.values.CODEXLENS_EMBED_API_URL);\n const embedMode = hasApiUrl ? 'API' : 'Local fastembed';\r\n\r\n const configJson = mcpConfig ? JSON.stringify(mcpConfig, null, 2) : '';\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(configJson).then(() => {\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n });\r\n };\r\n\r\n const handleRegenerate = () => {\r\n refetch();\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Embed mode badge */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'codexlens.mcp.embedMode' })}:</span>\r\n <Badge variant={hasApiUrl ? 'success' : 'secondary'}>\r\n {embedMode}\r\n </Badge>\r\n </div>\r\n\r\n {/* Config JSON block */}\r\n <Card>\r\n <CardHeader className=\"pb-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <CardTitle className=\"text-base\">{formatMessage({ id: 'codexlens.mcp.configTitle' })}</CardTitle>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={handleCopy}\r\n disabled={!configJson || isLoading}\r\n >\r\n {copied ? <Check className=\"w-4 h-4 mr-1\" /> : <Copy className=\"w-4 h-4 mr-1\" />}\r\n {copied ? formatMessage({ id: 'codexlens.mcp.copied' }) : formatMessage({ id: 'codexlens.mcp.copy' })}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={handleRegenerate}\r\n disabled={isLoading}\r\n >\r\n <RefreshCw className={`w-4 h-4 mr-1 ${isLoading ? 'animate-spin' : ''}`} />\r\n {formatMessage({ id: 'codexlens.mcp.regenerate' })}\r\n </Button>\r\n </div>\r\n </div>\r\n </CardHeader>\r\n <CardContent>\r\n {isLoading && (\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'codexlens.mcp.loading' })}</p>\r\n )}\r\n {isError && (\r\n <p className=\"text-sm text-destructive\">{formatMessage({ id: 'codexlens.mcp.error' })}</p>\r\n )}\r\n {!isLoading && !isError && (\r\n <pre className=\"bg-muted rounded-md p-4 text-xs overflow-auto max-h-96 font-mono\">\r\n {configJson || formatMessage({ id: 'codexlens.mcp.noConfig' })}\r\n </pre>\r\n )}\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Quick Install */}\r\n <Card>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-base\">{formatMessage({ id: 'codexlens.mcp.quickInstallTitle' })}</CardTitle>\r\n <p className=\"text-xs text-muted-foreground mt-1\">{formatMessage({ id: 'codexlens.mcp.quickInstallDesc' })}</p>\r\n </CardHeader>\r\n <CardContent className=\"space-y-3\">\r\n <div className=\"flex gap-2 flex-wrap\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => handleInstall('project')}\r\n disabled={installing || !projectPath}\r\n >\r\n {installing ? <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" /> : <Download className=\"w-4 h-4 mr-1\" />}\r\n {installing ? formatMessage({ id: 'codexlens.mcp.installing' }) : formatMessage({ id: 'codexlens.mcp.installProject' })}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => handleInstall('global')}\r\n disabled={installing}\r\n >\r\n {installing ? <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" /> : <Download className=\"w-4 h-4 mr-1\" />}\r\n {installing ? formatMessage({ id: 'codexlens.mcp.installing' }) : formatMessage({ id: 'codexlens.mcp.installGlobal' })}\r\n </Button>\r\n </div>\r\n {installResult && (\r\n <p className={`text-sm ${installResult.ok ? 'text-success' : 'text-destructive'}`}>\r\n {installResult.msg}\r\n </p>\r\n )}\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Installation instructions */}\r\n <Card>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-base\">{formatMessage({ id: 'codexlens.mcp.installTitle' })}</CardTitle>\r\n </CardHeader>\r\n <CardContent>\r\n <ol className=\"list-decimal list-inside space-y-2 text-sm text-muted-foreground\">\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step1' })}</li>\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step2' })}</li>\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step3' })}</li>\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step4' })}</li>\r\n <li>{formatMessage({ id: 'codexlens.mcp.installSteps.step5' })}</li>\r\n </ol>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// ModelManagerTab Component\r\n// ========================================\r\n// Model list with download/delete actions and embed mode banner\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { Download, Trash2, Loader2 } from 'lucide-react';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport {\r\n useCodexLensModels,\r\n useDownloadModel,\r\n useDeleteModel,\r\n useCodexLensEnv,\r\n type ModelEntry,\r\n} from '@/hooks/useCodexLens';\r\n\r\nexport function ModelManagerTab() {\r\n const { formatMessage } = useIntl();\r\n const { data: modelsData, isLoading, isError } = useCodexLensModels();\r\n const { data: envData } = useCodexLensEnv();\r\n const { downloadModel, isDownloading } = useDownloadModel();\r\n const { deleteModel, isDeleting } = useDeleteModel();\r\n\r\n const hasApiUrl = !!(envData?.values.CODEXLENS_EMBED_API_URL);\n const embedMode = hasApiUrl ? 'API' : 'Local fastembed';\r\n\r\n const models: ModelEntry[] = modelsData ?? [];\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Embed mode banner */}\r\n <div className=\"flex items-center gap-2 p-3 rounded-md bg-muted text-sm\">\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'codexlens.models.embedMode' })}:</span>\r\n <Badge variant={hasApiUrl ? 'success' : 'secondary'}>{embedMode}</Badge>\r\n </div>\r\n\r\n {/* Loading / Error states */}\r\n {isLoading && (\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground p-4\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {formatMessage({ id: 'codexlens.models.loading' })}\r\n </div>\r\n )}\r\n\r\n {isError && (\r\n <p className=\"text-sm text-destructive p-4\">{formatMessage({ id: 'codexlens.models.error' })}</p>\r\n )}\r\n\r\n {/* Model list */}\r\n {!isLoading && !isError && models.length === 0 && (\r\n <p className=\"text-sm text-muted-foreground p-4\">{formatMessage({ id: 'codexlens.models.noModels' })}</p>\r\n )}\r\n\r\n {!isLoading && !isError && models.length > 0 && (\r\n <Card>\r\n <CardContent className=\"p-0\">\r\n <div className=\"divide-y divide-border\">\r\n {models.map((model) => (\r\n <div\r\n key={model.name}\r\n className=\"flex items-center justify-between px-4 py-3\"\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"text-sm font-medium\">{model.name}</span>\r\n <Badge variant={model.installed ? 'success' : 'secondary'}>\r\n {model.installed\r\n ? formatMessage({ id: 'codexlens.models.installed' })\r\n : formatMessage({ id: 'codexlens.models.notInstalled' })}\r\n </Badge>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => downloadModel(model.name)}\r\n disabled={isDownloading}\r\n >\r\n {isDownloading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Download className=\"w-4 h-4\" />\r\n )}\r\n <span className=\"ml-1\">{formatMessage({ id: 'codexlens.models.download' })}</span>\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => deleteModel(model.name)}\r\n disabled={!model.installed || isDeleting}\r\n >\r\n {isDeleting ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n <span className=\"ml-1\">{formatMessage({ id: 'codexlens.models.delete' })}</span>\r\n </Button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// IndexManagerTab Component\r\n// ========================================\r\n// Project path input, index status display, and sync/rebuild actions\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { Plus, Trash2, RefreshCw, Loader2 } from 'lucide-react';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { useIndexStatus, useSyncIndex, useRebuildIndex, useWatcherStatus, codexLensKeys, type IndexStatusData } from '@/hooks/useCodexLens';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\ninterface ProjectStatusCardProps {\r\n projectPath: string;\r\n}\r\n\r\nfunction ProjectStatusCard({ projectPath }: ProjectStatusCardProps) {\r\n const { formatMessage } = useIntl();\r\n const queryClient = useQueryClient();\r\n const { data: statusData, isLoading, isError } = useIndexStatus(projectPath);\r\n const { syncIndex, isSyncing } = useSyncIndex();\r\n const { rebuildIndex, isRebuilding } = useRebuildIndex();\r\n\r\n const status: IndexStatusData | undefined = statusData;\r\n\r\n const handleRefresh = () => {\r\n queryClient.invalidateQueries({ queryKey: codexLensKeys.indexStatus(projectPath) });\r\n };\r\n\r\n return (\r\n <Card>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-sm font-medium truncate\">{projectPath}</CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n {/* Status stats */}\r\n {isLoading && (\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {formatMessage({ id: 'codexlens.index.loading' })}\r\n </div>\r\n )}\r\n {isError && (\r\n <p className=\"text-sm text-destructive\">{formatMessage({ id: 'codexlens.index.error' })}</p>\r\n )}\r\n {!isLoading && !isError && status && (\r\n <div className=\"grid grid-cols-3 gap-3\">\r\n <div className=\"text-center\">\r\n <p className=\"text-lg font-semibold\">{status.files_tracked ?? 0}</p>\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'codexlens.index.filesTracked' })}</p>\r\n </div>\r\n <div className=\"text-center\">\r\n <p className=\"text-lg font-semibold\">{status.total_chunks ?? 0}</p>\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'codexlens.index.totalChunks' })}</p>\r\n </div>\r\n <div className=\"text-center\">\r\n <p className=\"text-lg font-semibold\">{status.deleted_chunks ?? 0}</p>\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'codexlens.index.deletedChunks' })}</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Action buttons */}\r\n <div className=\"flex gap-2 flex-wrap\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => syncIndex(projectPath)}\r\n disabled={isSyncing}\r\n >\r\n {isSyncing ? <Loader2 className=\"w-4 h-4 animate-spin mr-1\" /> : null}\r\n {formatMessage({ id: 'codexlens.index.sync' })}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => rebuildIndex(projectPath)}\r\n disabled={isRebuilding}\r\n >\r\n {isRebuilding ? <Loader2 className=\"w-4 h-4 animate-spin mr-1\" /> : null}\r\n {formatMessage({ id: 'codexlens.index.rebuild' })}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={handleRefresh}\r\n >\r\n <RefreshCw className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'codexlens.index.refresh' })}\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n\r\nexport function IndexManagerTab() {\r\n const { formatMessage } = useIntl();\r\n const currentWorkspacePath = useWorkflowStore(selectProjectPath);\r\n const [paths, setPaths] = useState<string[]>([]);\r\n const [inputValue, setInputValue] = useState('');\r\n\r\n // Auto-add current workspace path on mount and when workspace changes\r\n useEffect(() => {\r\n if (currentWorkspacePath) {\r\n setPaths((prev) => {\r\n if (prev.includes(currentWorkspacePath)) return prev;\r\n return [currentWorkspacePath, ...prev];\r\n });\r\n }\r\n }, [currentWorkspacePath]);\r\n\r\n const handleAdd = () => {\r\n const trimmed = inputValue.trim();\r\n if (trimmed && !paths.includes(trimmed)) {\r\n setPaths((prev) => [...prev, trimmed]);\r\n }\r\n setInputValue('');\r\n };\r\n\r\n const handleRemove = (path: string) => {\r\n setPaths((prev) => prev.filter((p) => p !== path));\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n handleAdd();\r\n }\r\n };\r\n\r\n const { autoWatch } = useWatcherStatus();\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Global watcher status */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className={`text-xs px-2 py-0.5 rounded-full ${autoWatch ? 'bg-green-100 text-green-700' : 'bg-gray-100 text-gray-500'}`}>\r\n {autoWatch ? 'Auto-watch ON' : 'Auto-watch OFF'}\r\n </span>\r\n </div>\r\n\r\n {/* Add project path */}\r\n <div className=\"flex gap-2\">\r\n <Input\r\n placeholder={formatMessage({ id: 'codexlens.index.pathPlaceholder' })}\r\n value={inputValue}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n className=\"flex-1\"\r\n />\r\n <Button onClick={handleAdd} disabled={!inputValue.trim()}>\r\n <Plus className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'codexlens.index.add' })}\r\n </Button>\r\n </div>\r\n\r\n {paths.length === 0 && (\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'codexlens.index.empty' })}\r\n </p>\r\n )}\r\n\r\n {/* Project status cards */}\r\n {paths.map((path) => (\r\n <div key={path} className=\"relative\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"absolute top-2 right-2 z-10 h-7 w-7 p-0\"\r\n onClick={() => handleRemove(path)}\r\n title={formatMessage({ id: 'codexlens.index.removeProject' })}\r\n >\r\n <Trash2 className=\"w-4 h-4 text-muted-foreground\" />\r\n </Button>\r\n <ProjectStatusCard projectPath={path} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// EnvSettingsTab Component\r\n// ========================================\r\n// Grouped env var form with save/reset actions\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { Eye, EyeOff, Save, RotateCcw } from 'lucide-react';\r\nimport { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { useCodexLensEnv, useSaveCodexLensEnv } from '@/hooks/useCodexLens';\r\n\r\ntype EmbedMode = 'local' | 'api';\r\n\r\n// ========================================\r\n// ENV group definitions\r\n// ========================================\r\n\r\ninterface EnvField {\r\n key: string;\r\n label: string;\r\n sensitive?: boolean;\r\n}\r\n\r\ninterface EnvGroup {\r\n title: string;\r\n fields: EnvField[];\r\n}\r\n\r\nconst ENV_GROUPS: EnvGroup[] = [\r\n {\r\n title: 'embed',\r\n fields: [\r\n { key: 'CODEXLENS_EMBED_API_URL', label: 'Embed API URL' },\r\n { key: 'CODEXLENS_EMBED_API_KEY', label: 'Embed API Key', sensitive: true },\r\n { key: 'CODEXLENS_EMBED_API_MODEL', label: 'Embed API Model' },\r\n { key: 'CODEXLENS_EMBED_DIM', label: 'Embed Dimension' },\r\n { key: 'CODEXLENS_EMBED_API_ENDPOINTS', label: 'Embed API Endpoints', sensitive: true },\r\n { key: 'CODEXLENS_EMBED_BATCH_SIZE', label: 'Embed Batch Size' },\r\n { key: 'CODEXLENS_EMBED_API_CONCURRENCY', label: 'Embed API Concurrency' },\r\n ],\r\n },\r\n {\r\n title: 'reranker',\r\n fields: [\r\n { key: 'CODEXLENS_RERANKER_API_URL', label: 'Reranker API URL' },\r\n { key: 'CODEXLENS_RERANKER_API_KEY', label: 'Reranker API Key', sensitive: true },\r\n { key: 'CODEXLENS_RERANKER_API_MODEL', label: 'Reranker API Model' },\r\n ],\r\n },\r\n {\r\n title: 'performance',\r\n fields: [\r\n { key: 'CODEXLENS_BINARY_TOP_K', label: 'Binary Top K' },\r\n { key: 'CODEXLENS_ANN_TOP_K', label: 'ANN Top K' },\r\n { key: 'CODEXLENS_FTS_TOP_K', label: 'FTS Top K' },\r\n { key: 'CODEXLENS_FUSION_K', label: 'Fusion K' },\r\n { key: 'CODEXLENS_RERANKER_TOP_K', label: 'Reranker Top K' },\r\n { key: 'CODEXLENS_RERANKER_BATCH_SIZE', label: 'Reranker Batch Size' },\r\n ],\r\n },\r\n {\r\n title: 'index',\r\n fields: [\r\n { key: 'CODEXLENS_DB_PATH', label: 'DB Path' },\r\n { key: 'CODEXLENS_INDEX_WORKERS', label: 'Index Workers' },\r\n { key: 'CODEXLENS_CODE_AWARE_CHUNKING', label: 'Code Aware Chunking' },\r\n { key: 'CODEXLENS_AST_CHUNKING', label: 'AST Chunking' },\r\n { key: 'CODEXLENS_MAX_FILE_SIZE', label: 'Max File Size' },\r\n { key: 'CODEXLENS_HNSW_EF', label: 'HNSW EF' },\r\n { key: 'CODEXLENS_HNSW_M', label: 'HNSW M' },\r\n ],\r\n },\r\n {\r\n title: 'watcher',\r\n fields: [\r\n { key: 'CODEXLENS_AUTO_WATCH', label: 'Auto Watch' },\r\n { key: 'CODEXLENS_WATCHER_DEBOUNCE_MS', label: 'Watch Debounce (ms)' },\r\n ],\r\n },\r\n];\r\n\r\n// Fields that are only relevant in API mode\r\nconst API_ONLY_KEYS = new Set([\r\n 'CODEXLENS_EMBED_API_URL',\r\n 'CODEXLENS_EMBED_API_KEY',\r\n 'CODEXLENS_EMBED_API_ENDPOINTS',\r\n 'CODEXLENS_EMBED_API_CONCURRENCY',\r\n]);\r\n\r\n// Default placeholder values\r\nconst FIELD_DEFAULTS: Record<string, string> = {\r\n CODEXLENS_EMBED_API_MODEL: 'text-embedding-3-small',\r\n CODEXLENS_EMBED_DIM: '1536',\r\n CODEXLENS_EMBED_BATCH_SIZE: '64',\r\n CODEXLENS_EMBED_API_CONCURRENCY: '4',\r\n CODEXLENS_BINARY_TOP_K: '200',\r\n CODEXLENS_ANN_TOP_K: '50',\r\n CODEXLENS_FTS_TOP_K: '50',\r\n CODEXLENS_FUSION_K: '60',\r\n CODEXLENS_RERANKER_TOP_K: '20',\r\n CODEXLENS_RERANKER_BATCH_SIZE: '32',\r\n CODEXLENS_INDEX_WORKERS: '2',\r\n CODEXLENS_CODE_AWARE_CHUNKING: 'true',\r\n CODEXLENS_AST_CHUNKING: 'true',\r\n CODEXLENS_AUTO_WATCH: 'false',\r\n CODEXLENS_WATCHER_DEBOUNCE_MS: '1000',\r\n CODEXLENS_MAX_FILE_SIZE: '1000000',\r\n CODEXLENS_HNSW_EF: '150',\r\n CODEXLENS_HNSW_M: '32',\r\n};\r\n\r\n// Collect all keys\r\nconst ALL_KEYS = ENV_GROUPS.flatMap((g) => g.fields.map((f) => f.key));\r\n\r\nfunction buildEmptyEnv(): Record<string, string> {\r\n return Object.fromEntries(ALL_KEYS.map((k) => [k, '']));\r\n}\r\n\r\nfunction buildEffectiveEnv(\r\n values: Record<string, string>,\r\n defaults: Record<string, string>,\r\n): Record<string, string> {\r\n return Object.fromEntries(\r\n ALL_KEYS.map((key) => [key, values[key] ?? defaults[key] ?? '']),\r\n );\r\n}\r\n\r\n// ========================================\r\n// Sensitive field with show/hide toggle\r\n// ========================================\r\n\r\ninterface SensitiveInputProps {\r\n value: string;\r\n onChange: (v: string) => void;\r\n id: string;\r\n}\r\n\r\nfunction SensitiveInput({ value, onChange, id }: SensitiveInputProps) {\r\n const [show, setShow] = useState(false);\r\n return (\r\n <div className=\"relative\">\r\n <Input\r\n id={id}\r\n type={show ? 'text' : 'password'}\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n className=\"pr-10\"\r\n />\r\n <button\r\n type=\"button\"\r\n className=\"absolute inset-y-0 right-2 flex items-center text-muted-foreground hover:text-foreground\"\r\n onClick={() => setShow((s) => !s)}\r\n tabIndex={-1}\r\n >\r\n {show ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\n// ========================================\r\n// Main component\r\n// ========================================\r\n\r\nexport function EnvSettingsTab() {\r\n const { formatMessage } = useIntl();\r\n const { data: envData, isLoading } = useCodexLensEnv();\r\n const { saveEnv, isSaving } = useSaveCodexLensEnv();\r\n\r\n const [embedMode, setEmbedMode] = useState<EmbedMode>('local');\r\n const [localEnv, setLocalEnv] = useState<Record<string, string>>(buildEmptyEnv);\r\n\r\n const serverValues = envData?.values ?? {};\r\n const serverDefaults = { ...FIELD_DEFAULTS, ...(envData?.defaults ?? {}) };\r\n const serverRecord = buildEffectiveEnv(serverValues, serverDefaults);\r\n\r\n // Sync server state into local when loaded and detect embed mode\r\n useEffect(() => {\r\n if (envData) {\r\n const nextDefaults = { ...FIELD_DEFAULTS, ...(envData.defaults ?? {}) };\r\n const nextValues = envData.values ?? {};\r\n setLocalEnv(buildEffectiveEnv(nextValues, nextDefaults));\r\n // Auto-detect mode from saved env\r\n if (nextValues.CODEXLENS_EMBED_API_URL) {\r\n setEmbedMode('api');\r\n }\r\n }\r\n }, [envData]);\r\n\r\n const isDirty = ALL_KEYS.some((k) => localEnv[k] !== (serverRecord[k] ?? ''));\r\n\r\n const handleChange = (key: string, value: string) => {\r\n setLocalEnv((prev) => ({ ...prev, [key]: value }));\r\n };\r\n\r\n const handleSave = async () => {\r\n const payload = Object.fromEntries(\r\n Object.entries(localEnv).flatMap(([key, value]) => {\r\n const trimmed = value.trim();\r\n const defaultValue = serverDefaults[key] ?? '';\r\n if (!trimmed || trimmed === defaultValue) {\r\n return [];\r\n }\r\n return [[key, trimmed]];\r\n }),\r\n );\r\n await saveEnv(payload);\r\n };\r\n\r\n const handleReset = () => {\r\n setLocalEnv(buildEmptyEnv());\r\n };\r\n\r\n if (isLoading) {\r\n return <p className=\"text-sm text-muted-foreground p-4\">{formatMessage({ id: 'codexlens.env.loading' })}</p>;\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Mode toggle */}\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"text-sm font-medium\">{formatMessage({ id: 'codexlens.env.mode' })}:</span>\r\n <div className=\"flex rounded-md border border-border overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setEmbedMode('local')}\r\n className={`px-3 py-1.5 text-sm transition-colors ${\r\n embedMode === 'local'\r\n ? 'bg-primary text-primary-foreground'\r\n : 'bg-background text-muted-foreground hover:bg-muted'\r\n }`}\r\n >\r\n {formatMessage({ id: 'codexlens.env.localMode' })}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setEmbedMode('api')}\r\n className={`px-3 py-1.5 text-sm transition-colors ${\r\n embedMode === 'api'\r\n ? 'bg-primary text-primary-foreground'\r\n : 'bg-background text-muted-foreground hover:bg-muted'\r\n }`}\r\n >\r\n {formatMessage({ id: 'codexlens.env.apiMode' })}\r\n </button>\r\n </div>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {embedMode === 'local'\r\n ? formatMessage({ id: 'codexlens.env.localModeDesc' })\r\n : formatMessage({ id: 'codexlens.env.apiModeDesc' })}\r\n </span>\r\n </div>\r\n\r\n {ENV_GROUPS.map((group) => {\r\n // In local mode, filter out API-only fields from embed group\r\n const visibleFields = embedMode === 'local'\r\n ? group.fields.filter((f) => !API_ONLY_KEYS.has(f.key))\r\n : group.fields;\r\n if (visibleFields.length === 0) return null;\r\n return (\r\n <Card key={group.title}>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-base\">{formatMessage({ id: `codexlens.env.sections.${group.title}` })}</CardTitle>\r\n </CardHeader>\r\n <CardContent className=\"space-y-3\">\r\n {visibleFields.map((field) => (\r\n <div key={field.key} className=\"grid grid-cols-3 gap-3 items-center\">\r\n <label\r\n htmlFor={field.key}\r\n className=\"text-sm text-muted-foreground col-span-1\"\r\n >\r\n {field.label}\r\n </label>\r\n <div className=\"col-span-2\">\r\n {field.sensitive ? (\r\n <SensitiveInput\r\n id={field.key}\r\n value={localEnv[field.key] ?? ''}\r\n onChange={(v) => handleChange(field.key, v)}\r\n />\r\n ) : (\r\n <Input\r\n id={field.key}\r\n value={localEnv[field.key] ?? ''}\r\n placeholder={serverDefaults[field.key] ?? ''}\r\n onChange={(e) => handleChange(field.key, e.target.value)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </CardContent>\r\n </Card>\r\n );\r\n })}\r\n\r\n {/* Action buttons */}\r\n <div className=\"flex justify-between pt-2\">\r\n <Button variant=\"outline\" onClick={handleReset}>\r\n <RotateCcw className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'codexlens.env.clearForm' })}\r\n </Button>\r\n <Button onClick={handleSave} disabled={!isDirty || isSaving}>\r\n <Save className=\"w-4 h-4 mr-2\" />\r\n {isSaving ? formatMessage({ id: 'codexlens.env.saving' }) : formatMessage({ id: 'codexlens.env.save' })}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ========================================\r\n// CodexLens Page\r\n// ========================================\r\n// Main page for CodexLens v2 management: MCP config, models, index, env\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { Search } from 'lucide-react';\r\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\r\nimport { McpConfigTab } from '@/components/codexlens/McpConfigTab';\r\nimport { ModelManagerTab } from '@/components/codexlens/ModelManagerTab';\r\nimport { IndexManagerTab } from '@/components/codexlens/IndexManagerTab';\r\nimport { EnvSettingsTab } from '@/components/codexlens/EnvSettingsTab';\r\n\r\ntype TabType = 'mcp' | 'models' | 'index' | 'env';\r\n\r\nexport function CodexLensPage() {\r\n const { formatMessage } = useIntl();\r\n const [activeTab, setActiveTab] = useState<TabType>('mcp');\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Page Header */}\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\r\n <Search className=\"w-6 h-6 text-primary\" />\r\n {formatMessage({ id: 'codexlens.page.title' })}\r\n </h1>\r\n <p className=\"text-muted-foreground mt-1\">\r\n {formatMessage({ id: 'codexlens.page.description' })}\r\n </p>\r\n </div>\r\n\r\n {/* Tab Navigation */}\r\n <TabsNavigation\r\n value={activeTab}\r\n onValueChange={(v) => setActiveTab(v as TabType)}\r\n tabs={[\r\n { value: 'mcp', label: formatMessage({ id: 'codexlens.tabs.mcp' }) },\r\n { value: 'models', label: formatMessage({ id: 'codexlens.tabs.models' }) },\r\n { value: 'index', label: formatMessage({ id: 'codexlens.tabs.index' }) },\r\n { value: 'env', label: formatMessage({ id: 'codexlens.tabs.env' }) },\r\n ]}\r\n />\r\n\r\n {/* Tab Content */}\r\n <div className=\"mt-4\">\r\n {activeTab === 'mcp' && <McpConfigTab />}\r\n {activeTab === 'models' && <ModelManagerTab />}\r\n {activeTab === 'index' && <IndexManagerTab />}\r\n {activeTab === 'env' && <EnvSettingsTab />}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default CodexLensPage;\r\n"],"names":["codexLensKeys","path","useCodexLensModels","useQuery","fetchApi","r","useDownloadModel","queryClient","useQueryClient","mutation","useMutation","modelName","useDeleteModel","useIndexStatus","projectPath","useSyncIndex","useRebuildIndex","useCodexLensEnv","useSaveCodexLensEnv","env","useCodexLensMcpConfig","useWatcherStatus","envData","autoWatch","_a","debounceMs","_b","McpConfigTab","formatMessage","useIntl","mcpConfig","isLoading","isError","refetch","copied","setCopied","useState","installing","setInstalling","installResult","setInstallResult","useWorkflowStore","selectProjectPath","handleInstall","scope","mcpServers","serverConfig","typedConfig","copyMcpServerToProject","addGlobalMcpServer","err","hasApiUrl","embedMode","configJson","handleCopy","handleRegenerate","jsxs","Badge","Card","jsx","CardHeader","CardTitle","Button","Check","Copy","RefreshCw","CardContent","Loader2","Download","ModelManagerTab","modelsData","downloadModel","isDownloading","deleteModel","isDeleting","models","model","Trash2","ProjectStatusCard","statusData","syncIndex","isSyncing","rebuildIndex","isRebuilding","status","handleRefresh","IndexManagerTab","currentWorkspacePath","paths","setPaths","inputValue","setInputValue","useEffect","prev","handleAdd","trimmed","handleRemove","p","handleKeyDown","e","Input","Plus","ENV_GROUPS","API_ONLY_KEYS","FIELD_DEFAULTS","ALL_KEYS","g","f","buildEmptyEnv","k","buildEffectiveEnv","values","defaults","key","SensitiveInput","value","onChange","id","show","setShow","s","EyeOff","Eye","EnvSettingsTab","saveEnv","isSaving","setEmbedMode","localEnv","setLocalEnv","serverValues","serverDefaults","serverRecord","nextDefaults","nextValues","isDirty","handleChange","handleSave","payload","defaultValue","handleReset","group","visibleFields","field","v","RotateCcw","Save","CodexLensPage","activeTab","setActiveTab","Search","TabsNavigation"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{b0 as e,e5 as n,r as l,j as r,b1 as a,c as i}from"./index-DZGHdspr.js";const p=e,m=n,c=l.forwardRef(({className:s,...o},t)=>r.jsx(a,{ref:t,className:i("transition-all data-[state=closed]:overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",s),...o}));c.displayName=a.displayName;export{p as C,m as a,c as b};
2
- //# sourceMappingURL=Collapsible-D5zS2wef.js.map
1
+ import{b0 as e,e5 as n,r as l,j as r,b1 as a,c as i}from"./index-DP_mTJI8.js";const p=e,m=n,c=l.forwardRef(({className:s,...o},t)=>r.jsx(a,{ref:t,className:i("transition-all data-[state=closed]:overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",s),...o}));c.displayName=a.displayName;export{p as C,m as a,c as b};
2
+ //# sourceMappingURL=Collapsible-C2qk3yV0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Collapsible-D5zS2wef.js","sources":["../../src/components/ui/Collapsible.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst Collapsible = CollapsiblePrimitive.Root;\r\n\r\nconst CollapsibleTrigger = CollapsiblePrimitive.Trigger;\r\n\r\nconst CollapsibleContent = React.forwardRef<\r\n React.ElementRef<typeof CollapsiblePrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof CollapsiblePrimitive.Content>\r\n>(({ className, ...props }, ref) => (\r\n <CollapsiblePrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"transition-all data-[state=closed]:overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nCollapsibleContent.displayName = CollapsiblePrimitive.Content.displayName;\r\n\r\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\r\n"],"names":["Collapsible","CollapsiblePrimitive.Root","CollapsibleTrigger","CollapsiblePrimitive.Trigger","CollapsibleContent","React.forwardRef","className","props","ref","jsx","CollapsiblePrimitive.Content","cn"],"mappings":"8EAIA,MAAMA,EAAcC,EAEdC,EAAqBC,EAErBC,EAAqBC,EAAAA,WAGzB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACC,EAAA,CACC,IAAAF,EACA,UAAWG,EACT,uIACAL,CAAA,EAED,GAAGC,CAAA,CACN,CACD,EACDH,EAAmB,YAAcM,EAA6B"}
1
+ {"version":3,"file":"Collapsible-C2qk3yV0.js","sources":["../../src/components/ui/Collapsible.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst Collapsible = CollapsiblePrimitive.Root;\r\n\r\nconst CollapsibleTrigger = CollapsiblePrimitive.Trigger;\r\n\r\nconst CollapsibleContent = React.forwardRef<\r\n React.ElementRef<typeof CollapsiblePrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof CollapsiblePrimitive.Content>\r\n>(({ className, ...props }, ref) => (\r\n <CollapsiblePrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"transition-all data-[state=closed]:overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nCollapsibleContent.displayName = CollapsiblePrimitive.Content.displayName;\r\n\r\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\r\n"],"names":["Collapsible","CollapsiblePrimitive.Root","CollapsibleTrigger","CollapsiblePrimitive.Trigger","CollapsibleContent","React.forwardRef","className","props","ref","jsx","CollapsiblePrimitive.Content","cn"],"mappings":"8EAIA,MAAMA,EAAcC,EAEdC,EAAqBC,EAErBC,EAAqBC,EAAAA,WAGzB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACC,EAAA,CACC,IAAAF,EACA,UAAWG,EACT,uIACAL,CAAA,EAED,GAAGC,CAAA,CACN,CACD,EACDH,EAAmB,YAAcM,EAA6B"}