claude-code-workflow 7.2.10 → 7.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/.claude/agents/cli-planning-agent.md +3 -0
  2. package/.claude/agents/debug-explore-agent.md +1 -0
  3. package/.claude/agents/tdd-developer.md +1 -0
  4. package/.claude/agents/team-worker.md +1 -1
  5. package/.claude/agents/test-action-planning-agent.md +3 -0
  6. package/.claude/agents/test-context-search-agent.md +1 -0
  7. package/.claude/agents/test-fix-agent.md +3 -0
  8. package/.claude/commands/workflow/analyze-with-file.md +108 -54
  9. package/.claude/commands/workflow-tune.md +811 -0
  10. package/.claude/skills/review-code/SKILL.md +2 -0
  11. package/.claude/skills/review-cycle/SKILL.md +4 -0
  12. package/.claude/skills/skill-simplify/phases/02-optimize.md +4 -0
  13. package/.claude/skills/spec-generator/phases/05-epics-stories.md +4 -0
  14. package/.claude/skills/team-arch-opt/specs/team-config.json +5 -5
  15. package/.claude/skills/team-frontend-debug/roles/analyzer/role.md +3 -2
  16. package/.claude/skills/team-perf-opt/roles/coordinator/commands/monitor.md +1 -1
  17. package/.claude/skills/team-perf-opt/specs/team-config.json +5 -5
  18. package/.claude/skills/team-quality-assurance/roles/executor/role.md +2 -1
  19. package/.claude/skills/team-review/roles/reviewer/role.md +2 -1
  20. package/.claude/skills/team-tech-debt/roles/scanner/role.md +2 -1
  21. package/.claude/skills/team-testing/roles/executor/role.md +2 -1
  22. package/.claude/skills/team-testing/roles/generator/role.md +2 -1
  23. package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +2 -1
  24. package/.claude/skills/team-ux-improve/specs/team-config.json +6 -6
  25. package/.claude/skills/workflow-execute/phases/06-review.md +4 -4
  26. package/.claude/skills/workflow-lite-execute/SKILL.md +106 -14
  27. package/.claude/skills/workflow-lite-plan/SKILL.md +34 -72
  28. package/.claude/skills/workflow-lite-test-review/SKILL.md +41 -26
  29. package/.claude/skills/workflow-plan/phases/05-plan-verify.md +4 -0
  30. package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +1 -0
  31. package/.claude/skills/workflow-tdd-plan/phases/05-tdd-task-generation.md +2 -1
  32. package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +1 -0
  33. package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +2 -1
  34. package/.codex/skills/analyze-with-file/SKILL.md +2 -0
  35. package/.codex/skills/debug-with-file/SKILL.md +4 -0
  36. package/.codex/skills/issue-discover/SKILL.md +1 -0
  37. package/.codex/skills/review-cycle/phases/02-parallel-review.md +3 -0
  38. package/.codex/skills/team-designer/agents/validation-reporter.md +186 -0
  39. package/.codex/skills/team-iterdev/agents/gc-controller.md +193 -0
  40. package/.codex/skills/team-iterdev/agents/task-analyzer.md +206 -0
  41. package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +165 -0
  42. package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +163 -0
  43. package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +182 -0
  44. package/.codex/skills/team-uidesign/agents/completion-handler.md +177 -0
  45. package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +162 -0
  46. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +4 -0
  47. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +2 -0
  48. package/ccw/dist/commands/spec.d.ts.map +1 -1
  49. package/ccw/dist/commands/spec.js +9 -4
  50. package/ccw/dist/commands/spec.js.map +1 -1
  51. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  52. package/ccw/dist/core/routes/codexlens-routes.js +3 -1
  53. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  54. package/ccw/dist/tools/spec-index-builder.d.ts +8 -4
  55. package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -1
  56. package/ccw/dist/tools/spec-index-builder.js +8 -4
  57. package/ccw/dist/tools/spec-index-builder.js.map +1 -1
  58. package/ccw/dist/tools/spec-init.d.ts +1 -1
  59. package/ccw/dist/tools/spec-init.d.ts.map +1 -1
  60. package/ccw/dist/tools/spec-init.js +127 -0
  61. package/ccw/dist/tools/spec-init.js.map +1 -1
  62. package/ccw/dist/tools/spec-loader.d.ts.map +1 -1
  63. package/ccw/dist/tools/spec-loader.js +2 -1
  64. package/ccw/dist/tools/spec-loader.js.map +1 -1
  65. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js → AlertDialog-BW9jiZ-p.js} +2 -2
  66. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js.map → AlertDialog-BW9jiZ-p.js.map} +1 -1
  67. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js → AnalysisPage-ds-w_nVO.js} +2 -2
  68. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js.map → AnalysisPage-ds-w_nVO.js.map} +1 -1
  69. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js → ApiSettingsPage-DlCbXxTz.js} +2 -2
  70. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js.map → ApiSettingsPage-DlCbXxTz.js.map} +1 -1
  71. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js → CliModeToggle-Dq3nL4fF.js} +2 -2
  72. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js.map → CliModeToggle-Dq3nL4fF.js.map} +1 -1
  73. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js → CliSessionSharePage-BNDkEE4u.js} +2 -2
  74. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js.map → CliSessionSharePage-BNDkEE4u.js.map} +1 -1
  75. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js → CliViewerPage-ChM-uNx_.js} +2 -2
  76. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js.map → CliViewerPage-ChM-uNx_.js.map} +1 -1
  77. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js +2 -0
  78. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js.map +1 -0
  79. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js → Collapsible-CRNbykXN.js} +2 -2
  80. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js.map → Collapsible-CRNbykXN.js.map} +1 -1
  81. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js → CommandsManagerPage-C2JWcemF.js} +2 -2
  82. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js.map → CommandsManagerPage-C2JWcemF.js.map} +1 -1
  83. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js → DeepWikiPage-CvleOtJy.js} +2 -2
  84. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js.map → DeepWikiPage-CvleOtJy.js.map} +1 -1
  85. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js → EndpointsPage-CMOWQG64.js} +2 -2
  86. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js.map → EndpointsPage-CMOWQG64.js.map} +1 -1
  87. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js → ExplorerPage-DaFPRlNo.js} +2 -2
  88. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js.map → ExplorerPage-DaFPRlNo.js.map} +1 -1
  89. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js → FixSessionPage-CC4p04Az.js} +2 -2
  90. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js.map → FixSessionPage-CC4p04Az.js.map} +1 -1
  91. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js → FloatingFileBrowser-DROn1xZ5.js} +2 -2
  92. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js.map → FloatingFileBrowser-DROn1xZ5.js.map} +1 -1
  93. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js → FloatingPanel-CmL_yhDv.js} +2 -2
  94. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js.map → FloatingPanel-CmL_yhDv.js.map} +1 -1
  95. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js → GraphExplorerPage-DCV5ybKE.js} +2 -2
  96. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js.map → GraphExplorerPage-DCV5ybKE.js.map} +1 -1
  97. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js → HistoryPage-D0fYQZgc.js} +2 -2
  98. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js.map → HistoryPage-D0fYQZgc.js.map} +1 -1
  99. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js → HookManagerPage-D2FuJfsM.js} +2 -2
  100. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js.map → HookManagerPage-D2FuJfsM.js.map} +1 -1
  101. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js → InstallationsPage-tjklillZ.js} +2 -2
  102. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js.map → InstallationsPage-tjklillZ.js.map} +1 -1
  103. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js → IssueHubPage-E4JVrhO1.js} +2 -2
  104. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js.map → IssueHubPage-E4JVrhO1.js.map} +1 -1
  105. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js → LiteTasksPage-aJuRoyLt.js} +2 -2
  106. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js.map → LiteTasksPage-aJuRoyLt.js.map} +1 -1
  107. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js → McpManagerPage-BJeuWJv1.js} +2 -2
  108. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js.map → McpManagerPage-BJeuWJv1.js.map} +1 -1
  109. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js → MemoryPage-BI4FAXhs.js} +2 -2
  110. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js.map → MemoryPage-BI4FAXhs.js.map} +1 -1
  111. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js → NotFoundPage-DD2svchp.js} +2 -2
  112. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js.map → NotFoundPage-DD2svchp.js.map} +1 -1
  113. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js → OrchestratorPage-FC__7yYa.js} +2 -2
  114. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js.map → OrchestratorPage-FC__7yYa.js.map} +1 -1
  115. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js → ProjectOverviewPage-DBB_-FzV.js} +2 -2
  116. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js.map → ProjectOverviewPage-DBB_-FzV.js.map} +1 -1
  117. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js → PromptHistoryPage-BwOAvCH8.js} +2 -2
  118. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js.map → PromptHistoryPage-BwOAvCH8.js.map} +1 -1
  119. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js → ReviewSessionPage-Dd1-g_gp.js} +2 -2
  120. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js.map → ReviewSessionPage-Dd1-g_gp.js.map} +1 -1
  121. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js → RulesManagerPage-B3RGdsKD.js} +2 -2
  122. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js.map → RulesManagerPage-B3RGdsKD.js.map} +1 -1
  123. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js → SessionDetailPage-DM-W5R8K.js} +2 -2
  124. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js.map → SessionDetailPage-DM-W5R8K.js.map} +1 -1
  125. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js → SessionsPage-BVz1KCc7.js} +2 -2
  126. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js.map → SessionsPage-BVz1KCc7.js.map} +1 -1
  127. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js → SettingsPage-ComW7EZS.js} +4 -4
  128. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js.map → SettingsPage-ComW7EZS.js.map} +1 -1
  129. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js → SkillsManagerPage-CKom9XwV.js} +2 -2
  130. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js.map → SkillsManagerPage-CKom9XwV.js.map} +1 -1
  131. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js → SpecsSettingsPage-DQz7WP2s.js} +2 -2
  132. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js.map → SpecsSettingsPage-DQz7WP2s.js.map} +1 -1
  133. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js → Switch-BPMdND9H.js} +2 -2
  134. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js.map → Switch-BPMdND9H.js.map} +1 -1
  135. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js → TabsNavigation-qqt70VYL.js} +2 -2
  136. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js.map → TabsNavigation-qqt70VYL.js.map} +1 -1
  137. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js → TaskDrawer-BqK_qiHX.js} +2 -2
  138. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js.map → TaskDrawer-BqK_qiHX.js.map} +1 -1
  139. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js → TeamPage-u5_i0Rgh.js} +2 -2
  140. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js.map → TeamPage-u5_i0Rgh.js.map} +1 -1
  141. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js → TerminalDashboardPage-rUtC9e40.js} +2 -2
  142. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js.map → TerminalDashboardPage-rUtC9e40.js.map} +1 -1
  143. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js → archive-C3u8YNQF.js} +2 -2
  144. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js.map → archive-C3u8YNQF.js.map} +1 -1
  145. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js → archive-restore-DfQ998g5.js} +2 -2
  146. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js.map → archive-restore-DfQ998g5.js.map} +1 -1
  147. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js → arrow-right-BshJM9Po.js} +2 -2
  148. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js.map → arrow-right-BshJM9Po.js.map} +1 -1
  149. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js → bookmark-plus-D03qJyOZ.js} +2 -2
  150. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js.map → bookmark-plus-D03qJyOZ.js.map} +1 -1
  151. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js → bot-CyzWuwq0.js} +2 -2
  152. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js.map → bot-CyzWuwq0.js.map} +1 -1
  153. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js → braces-BPgtyjsG.js} +2 -2
  154. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js.map → braces-BPgtyjsG.js.map} +1 -1
  155. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js → circle-stop-Dix1AOmw.js} +2 -2
  156. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js.map → circle-stop-Dix1AOmw.js.map} +1 -1
  157. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js → cpu-CCQ4Q0Zh.js} +2 -2
  158. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js.map → cpu-CCQ4Q0Zh.js.map} +1 -1
  159. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js → ellipsis-vertical-BpTysg-Y.js} +2 -2
  160. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js.map → ellipsis-vertical-BpTysg-Y.js.map} +1 -1
  161. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js → eye-DGY1rAZs.js} +2 -2
  162. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js.map → eye-DGY1rAZs.js.map} +1 -1
  163. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js → eye-off-D8t3JfWG.js} +2 -2
  164. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js.map → eye-off-D8t3JfWG.js.map} +1 -1
  165. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js → file-json-BAdJb0n8.js} +2 -2
  166. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js.map → file-json-BAdJb0n8.js.map} +1 -1
  167. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js → file-text-DrJFiOUB.js} +2 -2
  168. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js.map → file-text-DrJFiOUB.js.map} +1 -1
  169. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js → filter-CKqzYbz7.js} +2 -2
  170. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js.map → filter-CKqzYbz7.js.map} +1 -1
  171. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js → folder-CV8511y9.js} +2 -2
  172. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js.map → folder-CV8511y9.js.map} +1 -1
  173. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js → gauge-XKvmu_uU.js} +2 -2
  174. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js.map → gauge-XKvmu_uU.js.map} +1 -1
  175. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js → globe-C56cDUzX.js} +2 -2
  176. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js.map → globe-C56cDUzX.js.map} +1 -1
  177. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js → grid-3x3-Bya-suFW.js} +2 -2
  178. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js.map → grid-3x3-Bya-suFW.js.map} +1 -1
  179. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js → hard-drive-CmuTZpsB.js} +2 -2
  180. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js.map → hard-drive-CmuTZpsB.js.map} +1 -1
  181. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js → hash-CRPT_tJQ.js} +2 -2
  182. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js.map → hash-CRPT_tJQ.js.map} +1 -1
  183. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js → history-C1pJZQCL.js} +2 -2
  184. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js.map → history-C1pJZQCL.js.map} +1 -1
  185. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js → index-B6TpijCe.js} +2 -2
  186. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js.map → index-B6TpijCe.js.map} +1 -1
  187. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js → index-Bcq-7r6F.js} +2 -2
  188. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js.map → index-Bcq-7r6F.js.map} +1 -1
  189. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js → index-CI8-rBff.js} +2 -2
  190. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js.map → index-CI8-rBff.js.map} +1 -1
  191. package/ccw/frontend/dist/assets/{index-CY6Lueph.js → index-Dmt9OiEf.js} +2 -2
  192. package/ccw/frontend/dist/assets/{index-CY6Lueph.js.map → index-Dmt9OiEf.js.map} +1 -1
  193. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js → index-anSMmEF8.js} +2 -2
  194. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js.map → index-anSMmEF8.js.map} +1 -1
  195. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js → index-dWT2M6Ef.js} +4 -4
  196. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js.map → index-dWT2M6Ef.js.map} +1 -1
  197. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js → layout-grid-TSO0BFQE.js} +2 -2
  198. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js.map → layout-grid-TSO0BFQE.js.map} +1 -1
  199. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js → lightbulb-Caj6fIQD.js} +2 -2
  200. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js.map → lightbulb-Caj6fIQD.js.map} +1 -1
  201. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js → link-2-DE9lMxa-.js} +2 -2
  202. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js.map → link-2-DE9lMxa-.js.map} +1 -1
  203. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js → link-BZtPgLW0.js} +2 -2
  204. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js.map → link-BZtPgLW0.js.map} +1 -1
  205. package/ccw/frontend/dist/assets/{list-CDmYFcio.js → list-DubWyY-U.js} +2 -2
  206. package/ccw/frontend/dist/assets/{list-CDmYFcio.js.map → list-DubWyY-U.js.map} +1 -1
  207. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js → map-pin-DwN_48AF.js} +2 -2
  208. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js.map → map-pin-DwN_48AF.js.map} +1 -1
  209. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js → messages-square-bjxvaiM9.js} +2 -2
  210. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js.map → messages-square-bjxvaiM9.js.map} +1 -1
  211. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js → minimize-2-CGfBKD_V.js} +2 -2
  212. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js.map → minimize-2-CGfBKD_V.js.map} +1 -1
  213. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js → package-nzWY6ilt.js} +2 -2
  214. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js.map → package-nzWY6ilt.js.map} +1 -1
  215. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js → plug-CiLce49C.js} +2 -2
  216. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js.map → plug-CiLce49C.js.map} +1 -1
  217. package/ccw/frontend/dist/assets/{power-DmIojFl-.js → power-CFLmB-U9.js} +2 -2
  218. package/ccw/frontend/dist/assets/{power-DmIojFl-.js.map → power-CFLmB-U9.js.map} +1 -1
  219. package/ccw/frontend/dist/assets/{save-BFa03OnG.js → save-DuO6OF0C.js} +2 -2
  220. package/ccw/frontend/dist/assets/{save-BFa03OnG.js.map → save-DuO6OF0C.js.map} +1 -1
  221. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js → send-CZk9p0mM.js} +2 -2
  222. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js.map → send-CZk9p0mM.js.map} +1 -1
  223. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js → square-check-big-BY_1YQQg.js} +2 -2
  224. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js.map → square-check-big-BY_1YQQg.js.map} +1 -1
  225. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js → square-pen-CnZgm6g-.js} +2 -2
  226. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js.map → square-pen-CnZgm6g-.js.map} +1 -1
  227. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js → star-Cn1F0qy7.js} +2 -2
  228. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js.map → star-Cn1F0qy7.js.map} +1 -1
  229. package/ccw/frontend/dist/assets/{style-CJsrp48L.js → style-Dxs1iXCV.js} +2 -2
  230. package/ccw/frontend/dist/assets/{style-CJsrp48L.js.map → style-Dxs1iXCV.js.map} +1 -1
  231. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js → target-Bz1fLRKH.js} +2 -2
  232. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js.map → target-Bz1fLRKH.js.map} +1 -1
  233. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js → test-tube-C6qCYlDr.js} +2 -2
  234. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js.map → test-tube-C6qCYlDr.js.map} +1 -1
  235. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js → upload-C71kd4Qs.js} +2 -2
  236. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js.map → upload-C71kd4Qs.js.map} +1 -1
  237. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js → useApiSettings-CqP2BAJ7.js} +2 -2
  238. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js.map → useApiSettings-CqP2BAJ7.js.map} +1 -1
  239. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js → useCli-PCoPoVeM.js} +2 -2
  240. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js.map → useCli-PCoPoVeM.js.map} +1 -1
  241. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js → useCommands-3OfPQPw4.js} +2 -2
  242. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js.map → useCommands-3OfPQPw4.js.map} +1 -1
  243. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js → useDebounce-bXiFhQx9.js} +2 -2
  244. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js.map → useDebounce-bXiFhQx9.js.map} +1 -1
  245. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js → useFileExplorer-DEyUm46_.js} +2 -2
  246. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js.map → useFileExplorer-DEyUm46_.js.map} +1 -1
  247. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js → useLocale-sXTrdxcJ.js} +2 -2
  248. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js.map → useLocale-sXTrdxcJ.js.map} +1 -1
  249. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js → useSkills-D0W0kXYm.js} +3 -3
  250. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js.map → useSkills-D0W0kXYm.js.map} +1 -1
  251. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js → useSystemSettings-DZ-8lZsG.js} +2 -2
  252. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js.map → useSystemSettings-DZ-8lZsG.js.map} +1 -1
  253. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js → wand-sparkles-83GmAYuw.js} +2 -2
  254. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js.map → wand-sparkles-83GmAYuw.js.map} +1 -1
  255. package/ccw/frontend/dist/index.html +1 -1
  256. package/package.json +1 -1
  257. package/.claude/commands/ddd/auto.md +0 -359
  258. package/.claude/commands/ddd/doc-generate.md +0 -222
  259. package/.claude/commands/ddd/doc-refresh.md +0 -218
  260. package/.claude/commands/ddd/execute.md +0 -416
  261. package/.claude/commands/ddd/index-build.md +0 -212
  262. package/.claude/commands/ddd/plan.md +0 -611
  263. package/.claude/commands/ddd/scan.md +0 -365
  264. package/.claude/commands/ddd/sync.md +0 -353
  265. package/.claude/commands/ddd/update.md +0 -160
  266. package/.claude/commands/idaw/add.md +0 -287
  267. package/.claude/commands/idaw/resume.md +0 -442
  268. package/.claude/commands/idaw/run-coordinate.md +0 -648
  269. package/.claude/commands/idaw/run.md +0 -539
  270. package/.claude/commands/idaw/status.md +0 -182
  271. package/.claude/skills/team-arch-opt/role-specs/analyzer.md +0 -80
  272. package/.claude/skills/team-arch-opt/role-specs/designer.md +0 -118
  273. package/.claude/skills/team-arch-opt/role-specs/refactorer.md +0 -106
  274. package/.claude/skills/team-arch-opt/role-specs/reviewer.md +0 -116
  275. package/.claude/skills/team-arch-opt/role-specs/validator.md +0 -117
  276. package/.claude/skills/team-brainstorm/role-specs/challenger.md +0 -63
  277. package/.claude/skills/team-brainstorm/role-specs/evaluator.md +0 -58
  278. package/.claude/skills/team-brainstorm/role-specs/ideator.md +0 -71
  279. package/.claude/skills/team-brainstorm/role-specs/synthesizer.md +0 -59
  280. package/.claude/skills/team-frontend/role-specs/analyst.md +0 -91
  281. package/.claude/skills/team-frontend/role-specs/architect.md +0 -85
  282. package/.claude/skills/team-frontend/role-specs/developer.md +0 -92
  283. package/.claude/skills/team-frontend/role-specs/qa.md +0 -78
  284. package/.claude/skills/team-issue/role-specs/explorer.md +0 -95
  285. package/.claude/skills/team-issue/role-specs/implementer.md +0 -89
  286. package/.claude/skills/team-issue/role-specs/integrator.md +0 -86
  287. package/.claude/skills/team-issue/role-specs/planner.md +0 -83
  288. package/.claude/skills/team-issue/role-specs/reviewer.md +0 -89
  289. package/.claude/skills/team-iterdev/role-specs/architect.md +0 -64
  290. package/.claude/skills/team-iterdev/role-specs/developer.md +0 -73
  291. package/.claude/skills/team-iterdev/role-specs/reviewer.md +0 -65
  292. package/.claude/skills/team-iterdev/role-specs/tester.md +0 -87
  293. package/.claude/skills/team-perf-opt/role-specs/benchmarker.md +0 -110
  294. package/.claude/skills/team-perf-opt/role-specs/optimizer.md +0 -102
  295. package/.claude/skills/team-perf-opt/role-specs/profiler.md +0 -73
  296. package/.claude/skills/team-perf-opt/role-specs/reviewer.md +0 -91
  297. package/.claude/skills/team-perf-opt/role-specs/strategist.md +0 -114
  298. package/.claude/skills/team-planex/role-specs/executor.md +0 -90
  299. package/.claude/skills/team-planex/role-specs/planner.md +0 -110
  300. package/.claude/skills/team-quality-assurance/role-specs/analyst.md +0 -79
  301. package/.claude/skills/team-quality-assurance/role-specs/executor.md +0 -64
  302. package/.claude/skills/team-quality-assurance/role-specs/generator.md +0 -67
  303. package/.claude/skills/team-quality-assurance/role-specs/scout.md +0 -66
  304. package/.claude/skills/team-quality-assurance/role-specs/strategist.md +0 -70
  305. package/.claude/skills/team-review/role-specs/fixer.md +0 -75
  306. package/.claude/skills/team-review/role-specs/reviewer.md +0 -66
  307. package/.claude/skills/team-review/role-specs/scanner.md +0 -70
  308. package/.claude/skills/team-roadmap-dev/role-specs/executor.md +0 -71
  309. package/.claude/skills/team-roadmap-dev/role-specs/planner.md +0 -77
  310. package/.claude/skills/team-roadmap-dev/role-specs/verifier.md +0 -73
  311. package/.claude/skills/team-tech-debt/role-specs/assessor.md +0 -70
  312. package/.claude/skills/team-tech-debt/role-specs/executor.md +0 -80
  313. package/.claude/skills/team-tech-debt/role-specs/planner.md +0 -71
  314. package/.claude/skills/team-tech-debt/role-specs/scanner.md +0 -85
  315. package/.claude/skills/team-tech-debt/role-specs/validator.md +0 -83
  316. package/.claude/skills/team-testing/role-specs/analyst.md +0 -94
  317. package/.claude/skills/team-testing/role-specs/executor.md +0 -97
  318. package/.claude/skills/team-testing/role-specs/generator.md +0 -96
  319. package/.claude/skills/team-testing/role-specs/strategist.md +0 -82
  320. package/.claude/skills/team-uidesign/role-specs/designer.md +0 -72
  321. package/.claude/skills/team-uidesign/role-specs/implementer.md +0 -74
  322. package/.claude/skills/team-uidesign/role-specs/researcher.md +0 -84
  323. package/.claude/skills/team-uidesign/role-specs/reviewer.md +0 -70
  324. package/.claude/skills/team-ux-improve/role-specs/designer.md +0 -191
  325. package/.claude/skills/team-ux-improve/role-specs/diagnoser.md +0 -110
  326. package/.claude/skills/team-ux-improve/role-specs/explorer.md +0 -109
  327. package/.claude/skills/team-ux-improve/role-specs/implementer.md +0 -164
  328. package/.claude/skills/team-ux-improve/role-specs/scanner.md +0 -117
  329. package/.claude/skills/team-ux-improve/role-specs/tester.md +0 -163
  330. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js +0 -2
  331. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexLensPage-DOcsYNQk.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":"4ZA+CO,MAAMA,EAAgB,CAC3B,IAAK,CAAC,WAAW,EACjB,OAAQ,IAAM,CAAC,GAAGA,EAAc,IAAK,QAAQ,EAC7C,YAAcC,GAAiB,CAAC,GAAGD,EAAc,IAAK,cAAeC,CAAI,EACzE,IAAK,IAAM,CAAC,GAAGD,EAAc,IAAK,KAAK,EACvC,UAAW,IAAM,CAAC,GAAGA,EAAc,IAAK,WAAW,CACrD,EAMO,SAASE,IAAqB,CACnC,OAAOC,EAAS,CACd,SAAUH,EAAc,OAAA,EACxB,QAAS,IAAMI,EAAyB,uBAAuB,EAAE,KAAKC,GAAKA,EAAE,MAAM,EACnF,UAAW,GAAA,CACZ,CACH,CAEO,SAASC,IAAmB,CACjC,MAAMC,EAAcC,EAAA,EAEdC,EAAWC,EAAY,CAC3B,WAAaC,GACXP,EAA+B,iCAAkC,CAC/D,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAMO,EAAW,CAAA,CACzC,EACH,UAAW,IAAM,CACfJ,EAAY,kBAAkB,CAAE,SAAUP,EAAc,OAAA,EAAU,CACpE,CAAA,CACD,EAED,MAAO,CACL,cAAeS,EAAS,YACxB,cAAeA,EAAS,UACxB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASG,IAAiB,CAC/B,MAAML,EAAcC,EAAA,EAEdC,EAAWC,EAAY,CAC3B,WAAaC,GACXP,EAA+B,+BAAgC,CAC7D,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAMO,EAAW,CAAA,CACzC,EACH,UAAW,IAAM,CACfJ,EAAY,kBAAkB,CAAE,SAAUP,EAAc,OAAA,EAAU,CACpE,CAAA,CACD,EAED,MAAO,CACL,YAAaS,EAAS,YACtB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAMO,SAASI,GAAeC,EAAqB,CAClD,OAAOX,EAAS,CACd,SAAUH,EAAc,YAAYc,CAAW,EAC/C,QAAS,IACPV,EACE,2CAA2C,mBAAmBU,CAAW,CAAC,EAAA,EAC1E,KAAKT,GAAKA,EAAE,MAAM,EACtB,QAAS,CAAC,CAACS,EACX,UAAW,GAAA,CACZ,CACH,CAEO,SAASC,IAAe,CAC7B,MAAMN,EAAWC,EAAY,CAC3B,WAAaI,GACXV,EAA+B,4BAA6B,CAC1D,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,YAAAU,EAAa,CAAA,CACrC,CAAA,CACJ,EAED,MAAO,CACL,UAAWL,EAAS,YACpB,UAAWA,EAAS,UACpB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASO,IAAkB,CAChC,MAAMP,EAAWC,EAAY,CAC3B,WAAaI,GACXV,EAA+B,+BAAgC,CAC7D,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,YAAAU,EAAa,CAAA,CACrC,CAAA,CACJ,EAED,MAAO,CACL,aAAcL,EAAS,YACvB,aAAcA,EAAS,UACvB,MAAOA,EAAS,KAAA,CAEpB,CAMO,SAASQ,GAAkB,CAChC,OAAOd,EAAS,CACd,SAAUH,EAAc,IAAA,EACxB,QAAS,IACPI,EAAsB,oBAAoB,EAAE,KAAMC,IAAyB,CACzE,OAAQA,EAAE,KAAO,CAAA,EACjB,SAAUA,EAAE,UAAY,CAAA,CAAC,EACzB,EACJ,UAAW,GAAA,CACZ,CACH,CAEO,SAASa,IAAsB,CACpC,MAAMX,EAAcC,EAAA,EAEdC,EAAWC,EAAY,CAC3B,WAAaS,GACXf,EAA+B,qBAAsB,CACnD,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,IAAAe,EAAK,CAAA,CAC7B,EACH,UAAW,IAAM,CACfZ,EAAY,kBAAkB,CAAE,SAAUP,EAAc,IAAA,EAAO,EAC/DO,EAAY,kBAAkB,CAAE,SAAUP,EAAc,UAAA,EAAa,CACvE,CAAA,CACD,EAED,MAAO,CACL,QAASS,EAAS,YAClB,SAAUA,EAAS,UACnB,MAAOA,EAAS,KAAA,CAEpB,CAMO,SAASW,IAAwB,CACtC,OAAOjB,EAAS,CACd,SAAUH,EAAc,UAAA,EACxB,QAAS,IAAMI,EAA4B,2BAA2B,EAAE,KAAKC,GAAKA,EAAE,MAAM,EAC1F,UAAW,GAAA,CACZ,CACH,CAMO,SAASgB,IAAmB,SACjC,KAAM,CAAE,KAAMC,CAAA,EAAYL,EAAA,EACpBM,IAAYC,EAAAF,GAAA,YAAAA,EAAS,SAAT,YAAAE,EAAiB,wBAAyB,OACtDC,IAAaC,EAAAJ,GAAA,YAAAA,EAAS,SAAT,YAAAI,EAAiB,gCAAiC,OAErE,MAAO,CACL,UAAAH,EACA,WAAAE,CAAA,CAEJ,CC7MO,SAASE,IAAe,CAC7B,KAAM,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EACpB,CAAE,KAAMC,EAAW,UAAAC,EAAW,QAAAC,EAAS,QAAAC,CAAA,EAAYb,GAAA,EACnD,CAAE,KAAME,CAAA,EAAYL,EAAA,EACpB,CAACiB,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EACpC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,EAAK,EAC5C,CAACG,EAAeC,CAAgB,EAAIJ,EAAAA,SAA8C,IAAI,EACtFtB,EAAc2B,EAAiBC,CAAiB,EAEhDC,EAAgB,MAAOC,GAAgC,CAC3DN,EAAc,EAAI,EAClBE,EAAiB,IAAI,EACrB,GAAI,CACF,MAAMK,EAAaf,GAAA,YAAAA,EAAY,WACzBgB,EAAeD,GAAc,OAAOA,GAAe,SACpDA,EAAuC,UACxC,OAEJ,GAAI,CAACC,GAAgB,OAAOA,GAAiB,SAC3C,MAAM,IAAI,MAAMlB,EAAc,CAAE,GAAI,wBAAA,CAA0B,CAAC,EAGjE,MAAMmB,EAAcD,EAOpB,GAAIF,IAAU,UAAW,CACvB,GAAI,CAAC9B,EACH,MAAM,IAAI,MAAMc,EAAc,CAAE,GAAI,4BAAA,CAA8B,CAAC,EAErE,MAAMoB,EAAuB,YAAaD,EAAajC,CAAW,CACpE,MACE,MAAMmC,EAAmB,YAAaF,CAAW,EAGnDP,EAAiB,CACf,GAAI,GACJ,IAAKZ,EAAc,CAAE,GAAI,+BAAgC,CAAA,CAC1D,CACH,OAASsB,EAAK,CACZV,EAAiB,CAAE,GAAI,GAAO,IAAMU,EAAc,QAAS,CAC7D,QAAA,CACEZ,EAAc,EAAK,CACrB,CACF,EAEMa,EAAY,CAAC,EAAE7B,GAAA,MAAAA,EAAS,OAAO,yBAC/B8B,EAAYD,EAAY,MAAQ,kBAEhCE,EAAavB,EAAY,KAAK,UAAUA,EAAW,KAAM,CAAC,EAAI,GAE9DwB,EAAa,IAAM,CACvB,UAAU,UAAU,UAAUD,CAAU,EAAE,KAAK,IAAM,CACnDlB,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,CACzC,CAAC,CACH,EAEMoB,EAAmB,IAAM,CAC7BtB,EAAA,CACF,EAEA,OACEuB,EAAAA,KAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,gCAAiC,SAAA,CAAA5B,EAAc,CAAE,GAAI,0BAA2B,EAAE,GAAA,EAAC,QAClG6B,EAAA,CAAM,QAASN,EAAY,UAAY,YACrC,SAAAC,CAAA,CACH,CAAA,EACF,SAGCM,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,GAAW,UAAU,OACpB,SAAAJ,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAG,EAAAA,IAACE,EAAA,CAAU,UAAU,YAAa,SAAAjC,EAAc,CAAE,GAAI,2BAAA,CAA6B,EAAE,EACrF4B,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAA,EAAAA,KAACM,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAASR,EACT,SAAU,CAACD,GAActB,EAExB,SAAA,CAAAG,EAASyB,EAAAA,IAACI,GAAM,UAAU,cAAA,CAAe,EAAKJ,EAAAA,IAACK,EAAA,CAAK,UAAU,cAAA,CAAe,EACpEpC,EAATM,EAAuB,CAAE,GAAI,sBAAA,EAA0C,CAAE,GAAI,oBAAA,CAAxB,CAA8C,CAAA,CAAA,EAEtGsB,EAAAA,KAACM,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAASP,EACT,SAAUxB,EAEV,SAAA,CAAA4B,MAACM,GAAU,UAAW,gBAAgBlC,EAAY,eAAiB,EAAE,GAAI,EACxEH,EAAc,CAAE,GAAI,0BAAA,CAA4B,CAAA,CAAA,CAAA,CACnD,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,SACCsC,EAAA,CACE,SAAA,CAAAnC,GACC4B,EAAAA,IAAC,KAAE,UAAU,gCAAiC,WAAc,CAAE,GAAI,uBAAA,CAAyB,CAAA,CAAE,EAE9F3B,GACC2B,EAAAA,IAAC,IAAA,CAAE,UAAU,2BAA4B,WAAc,CAAE,GAAI,qBAAA,CAAuB,CAAA,CAAE,EAEvF,CAAC5B,GAAa,CAACC,SACb,MAAA,CAAI,UAAU,mEACZ,SAAAqB,GAAczB,EAAc,CAAE,GAAI,wBAAA,CAA0B,CAAA,CAC/D,CAAA,CAAA,CAEJ,CAAA,EACF,SAGC8B,EAAA,CACC,SAAA,CAAAF,EAAAA,KAACI,EAAA,CAAW,UAAU,OACpB,SAAA,CAAAD,EAAAA,IAACE,EAAA,CAAU,UAAU,YAAa,SAAAjC,EAAc,CAAE,GAAI,iCAAA,CAAmC,EAAE,EAC3F+B,MAAC,KAAE,UAAU,qCAAsC,WAAc,CAAE,GAAI,gCAAA,CAAkC,CAAA,CAAE,CAAA,EAC7G,EACAH,EAAAA,KAACU,EAAA,CAAY,UAAU,YACrB,SAAA,CAAAV,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAA,EAAAA,KAACM,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMnB,EAAc,SAAS,EACtC,SAAUN,GAAc,CAACvB,EAExB,SAAA,CAAAuB,EAAasB,EAAAA,IAACQ,GAAQ,UAAU,2BAAA,CAA4B,EAAKR,EAAAA,IAACS,EAAA,CAAS,UAAU,cAAA,CAAe,EACvFxC,EAAbS,EAA2B,CAAE,GAAI,0BAAA,EAA8C,CAAE,GAAI,8BAAA,CAAxB,CAAwD,CAAA,CAAA,EAExHmB,EAAAA,KAACM,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMnB,EAAc,QAAQ,EACrC,SAAUN,EAET,SAAA,CAAAA,EAAasB,EAAAA,IAACQ,GAAQ,UAAU,2BAAA,CAA4B,EAAKR,EAAAA,IAACS,EAAA,CAAS,UAAU,cAAA,CAAe,EACvFxC,EAAbS,EAA2B,CAAE,GAAI,0BAAA,EAA8C,CAAE,GAAI,6BAAA,CAAxB,CAAuD,CAAA,CAAA,CACvH,EACF,EACCE,GACCoB,EAAAA,IAAC,IAAA,CAAE,UAAW,WAAWpB,EAAc,GAAK,eAAiB,kBAAkB,GAC5E,SAAAA,EAAc,GAAA,CACjB,CAAA,CAAA,CAEJ,CAAA,EACF,SAGCmB,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAW,UAAU,OACpB,SAAAD,EAAAA,IAACE,EAAA,CAAU,UAAU,YAAa,SAAAjC,EAAc,CAAE,GAAI,4BAAA,CAA8B,EAAE,EACxF,EACA+B,MAACO,EAAA,CACC,SAAAV,EAAAA,KAAC,KAAA,CAAG,UAAU,mEACZ,SAAA,CAAAG,MAAC,MAAI,SAAA/B,EAAc,CAAE,GAAI,kCAAA,CAAoC,EAAE,QAC9D,KAAA,CAAI,SAAAA,EAAc,CAAE,GAAI,kCAAA,CAAoC,EAAE,QAC9D,KAAA,CAAI,SAAAA,EAAc,CAAE,GAAI,kCAAA,CAAoC,EAAE,QAC9D,KAAA,CAAI,SAAAA,EAAc,CAAE,GAAI,kCAAA,CAAoC,EAAE,QAC9D,KAAA,CAAI,SAAAA,EAAc,CAAE,GAAI,kCAAA,CAAoC,CAAA,CAAE,CAAA,CAAA,CACjE,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CCtKO,SAASyC,IAAkB,CAChC,KAAM,CAAE,cAAAzC,CAAA,EAAkBC,EAAA,EACpB,CAAE,KAAMyC,EAAY,UAAAvC,EAAW,QAAAC,CAAA,EAAY9B,GAAA,EAC3C,CAAE,KAAMoB,CAAA,EAAYL,EAAA,EACpB,CAAE,cAAAsD,EAAe,cAAAC,CAAA,EAAkBlE,GAAA,EACnC,CAAE,YAAAmE,EAAa,WAAAC,CAAA,EAAe9D,GAAA,EAE9BuC,EAAY,CAAC,EAAE7B,GAAA,MAAAA,EAAS,OAAO,yBAC/B8B,EAAYD,EAAY,MAAQ,kBAEhCwB,EAAuBL,GAAc,CAAA,EAE3C,OACEd,EAAAA,KAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0DACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,wBAAyB,SAAA,CAAA5B,EAAc,CAAE,GAAI,6BAA8B,EAAE,GAAA,EAAC,QAC7F6B,EAAA,CAAM,QAASN,EAAY,UAAY,YAAc,SAAAC,CAAA,CAAU,CAAA,EAClE,EAGCrB,GACCyB,EAAAA,KAAC,MAAA,CAAI,UAAU,4DACb,SAAA,CAAAG,EAAAA,IAACQ,EAAA,CAAQ,UAAU,sBAAA,CAAuB,EACzCvC,EAAc,CAAE,GAAI,0BAAA,CAA4B,CAAA,EACnD,EAGDI,GACC2B,EAAAA,IAAC,IAAA,CAAE,UAAU,+BAAgC,WAAc,CAAE,GAAI,wBAAA,CAA0B,CAAA,CAAE,EAI9F,CAAC5B,GAAa,CAACC,GAAW2C,EAAO,SAAW,GAC3ChB,EAAAA,IAAC,IAAA,CAAE,UAAU,oCAAqC,SAAA/B,EAAc,CAAE,GAAI,2BAAA,CAA6B,EAAE,EAGtG,CAACG,GAAa,CAACC,GAAW2C,EAAO,OAAS,SACxCjB,EAAA,CACC,SAAAC,EAAAA,IAACO,GAAY,UAAU,MACrB,eAAC,MAAA,CAAI,UAAU,yBACZ,SAAAS,EAAO,IAAKC,GACXpB,EAAAA,KAAC,MAAA,CAEC,UAAU,8CAEV,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAG,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAuB,SAAAiB,EAAM,KAAK,EAClDjB,MAACF,GAAM,QAASmB,EAAM,UAAY,UAAY,YAC3C,WAAM,UACHhD,EAAc,CAAE,GAAI,4BAAA,CAA8B,EAClDA,EAAc,CAAE,GAAI,+BAAA,CAAiC,CAAA,CAC3D,CAAA,EACF,EACA4B,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAA,EAAAA,KAACM,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMS,EAAcK,EAAM,IAAI,EACvC,SAAUJ,EAET,SAAA,CAAAA,EACCb,EAAAA,IAACQ,GAAQ,UAAU,sBAAA,CAAuB,EAE1CR,EAAAA,IAACS,EAAA,CAAS,UAAU,SAAA,CAAU,EAEhCT,MAAC,QAAK,UAAU,OAAQ,WAAc,CAAE,GAAI,2BAAA,CAA6B,CAAA,CAAE,CAAA,CAAA,CAAA,EAE7EH,EAAAA,KAACM,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMW,EAAYG,EAAM,IAAI,EACrC,SAAU,CAACA,EAAM,WAAaF,EAE7B,SAAA,CAAAA,EACCf,EAAAA,IAACQ,GAAQ,UAAU,sBAAA,CAAuB,EAE1CR,EAAAA,IAACkB,EAAA,CAAO,UAAU,SAAA,CAAU,EAE9BlB,MAAC,QAAK,UAAU,OAAQ,WAAc,CAAE,GAAI,yBAAA,CAA2B,CAAA,CAAE,CAAA,CAAA,CAAA,CAC3E,CAAA,CACF,CAAA,CAAA,EAtCKiB,EAAM,IAAA,CAwCd,CAAA,CACH,CAAA,CACF,CAAA,CACF,CAAA,EAEJ,CAEJ,CCzFA,SAASE,GAAkB,CAAE,YAAAhE,GAAuC,CAClE,KAAM,CAAE,cAAAc,CAAA,EAAkBC,EAAA,EACpBtB,EAAcC,EAAA,EACd,CAAE,KAAMuE,EAAY,UAAAhD,EAAW,QAAAC,CAAA,EAAYnB,GAAeC,CAAW,EACrE,CAAE,UAAAkE,EAAW,UAAAC,CAAA,EAAclE,GAAA,EAC3B,CAAE,aAAAmE,EAAc,aAAAC,CAAA,EAAiBnE,GAAA,EAEjCoE,EAAsCL,EAEtCM,EAAgB,IAAM,CAC1B9E,EAAY,kBAAkB,CAAE,SAAUP,EAAc,YAAYc,CAAW,EAAG,CACpF,EAEA,cACG4C,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAW,UAAU,OACpB,SAAAD,EAAAA,IAACE,GAAU,UAAU,+BAAgC,WAAY,CAAA,CACnE,EACAL,EAAAA,KAACU,EAAA,CAAY,UAAU,YAEpB,SAAA,CAAAnC,GACCyB,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAAG,EAAAA,IAACQ,EAAA,CAAQ,UAAU,sBAAA,CAAuB,EACzCvC,EAAc,CAAE,GAAI,yBAAA,CAA2B,CAAA,EAClD,EAEDI,GACC2B,EAAAA,IAAC,IAAA,CAAE,UAAU,2BAA4B,WAAc,CAAE,GAAI,uBAAA,CAAyB,CAAA,CAAE,EAEzF,CAAC5B,GAAa,CAACC,GAAWoD,GACzB5B,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAG,MAAC,IAAA,CAAE,UAAU,wBAAyB,SAAAyB,EAAO,eAAiB,EAAE,EAChEzB,MAAC,KAAE,UAAU,gCAAiC,WAAc,CAAE,GAAI,8BAAA,CAAgC,CAAA,CAAE,CAAA,EACtG,EACAH,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAG,MAAC,IAAA,CAAE,UAAU,wBAAyB,SAAAyB,EAAO,cAAgB,EAAE,EAC/DzB,MAAC,KAAE,UAAU,gCAAiC,WAAc,CAAE,GAAI,6BAAA,CAA+B,CAAA,CAAE,CAAA,EACrG,EACAH,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAG,MAAC,IAAA,CAAE,UAAU,wBAAyB,SAAAyB,EAAO,gBAAkB,EAAE,EACjEzB,MAAC,KAAE,UAAU,gCAAiC,WAAc,CAAE,GAAI,+BAAA,CAAiC,CAAA,CAAE,CAAA,CAAA,CACvG,CAAA,EACF,EAIFH,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAA,EAAAA,KAACM,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMkB,EAAUlE,CAAW,EACpC,SAAUmE,EAET,SAAA,CAAAA,EAAYtB,EAAAA,IAACQ,EAAA,CAAQ,UAAU,2BAAA,CAA4B,EAAK,KAChEvC,EAAc,CAAE,GAAI,sBAAA,CAAwB,CAAA,CAAA,CAAA,EAE/C4B,EAAAA,KAACM,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMoB,EAAapE,CAAW,EACvC,SAAUqE,EAET,SAAA,CAAAA,EAAexB,EAAAA,IAACQ,EAAA,CAAQ,UAAU,2BAAA,CAA4B,EAAK,KACnEvC,EAAc,CAAE,GAAI,yBAAA,CAA2B,CAAA,CAAA,CAAA,EAElD4B,EAAAA,KAACM,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAASuB,EAET,SAAA,CAAA1B,EAAAA,IAACM,EAAA,CAAU,UAAU,cAAA,CAAe,EACnCrC,EAAc,CAAE,GAAI,yBAAA,CAA2B,CAAA,CAAA,CAAA,CAClD,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAEO,SAAS0D,IAAkB,CAChC,KAAM,CAAE,cAAA1D,CAAA,EAAkBC,EAAA,EACpB0D,EAAuB9C,EAAiBC,CAAiB,EACzD,CAAC8C,EAAOC,CAAQ,EAAIrD,EAAAA,SAAmB,CAAA,CAAE,EACzC,CAACsD,EAAYC,CAAa,EAAIvD,EAAAA,SAAS,EAAE,EAG/CwD,EAAAA,UAAU,IAAM,CACVL,GACFE,EAAUI,GACJA,EAAK,SAASN,CAAoB,EAAUM,EACzC,CAACN,EAAsB,GAAGM,CAAI,CACtC,CAEL,EAAG,CAACN,CAAoB,CAAC,EAEzB,MAAMO,EAAY,IAAM,CACtB,MAAMC,EAAUL,EAAW,KAAA,EACvBK,GAAW,CAACP,EAAM,SAASO,CAAO,GACpCN,EAAUI,GAAS,CAAC,GAAGA,EAAME,CAAO,CAAC,EAEvCJ,EAAc,EAAE,CAClB,EAEMK,EAAgB/F,GAAiB,CACrCwF,EAAUI,GAASA,EAAK,OAAQI,GAAMA,IAAMhG,CAAI,CAAC,CACnD,EAEMiG,EAAiBC,GAA6C,CAC9DA,EAAE,MAAQ,SACZL,EAAA,CAEJ,EAEM,CAAE,UAAAvE,CAAA,EAAcF,GAAA,EAEtB,OACEmC,EAAAA,KAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAG,MAAC,MAAA,CAAI,UAAU,0BACb,SAAAA,EAAAA,IAAC,QAAK,UAAW,oCAAoCpC,EAAY,8BAAgC,2BAA2B,GACzH,SAAAA,EAAY,gBAAkB,iBACjC,EACF,EAGAiC,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAG,EAAAA,IAACyC,EAAA,CACC,YAAaxE,EAAc,CAAE,GAAI,kCAAmC,EACpE,MAAO8D,EACP,SAAWS,GAAMR,EAAcQ,EAAE,OAAO,KAAK,EAC7C,UAAWD,EACX,UAAU,QAAA,CAAA,EAEZ1C,OAACM,GAAO,QAASgC,EAAW,SAAU,CAACJ,EAAW,OAChD,SAAA,CAAA/B,EAAAA,IAAC0C,GAAA,CAAK,UAAU,cAAA,CAAe,EAC9BzE,EAAc,CAAE,GAAI,qBAAA,CAAuB,CAAA,CAAA,CAC9C,CAAA,EACF,EAEC4D,EAAM,SAAW,GAChB7B,EAAAA,IAAC,IAAA,CAAE,UAAU,gCACV,SAAA/B,EAAc,CAAE,GAAI,uBAAA,CAAyB,CAAA,CAChD,EAID4D,EAAM,IAAKvF,GACVuD,EAAAA,KAAC,MAAA,CAAe,UAAU,WACxB,SAAA,CAAAG,EAAAA,IAACG,EAAA,CACC,QAAQ,QACR,KAAK,KACL,UAAU,0CACV,QAAS,IAAMkC,EAAa/F,CAAI,EAChC,MAAO2B,EAAc,CAAE,GAAI,gCAAiC,EAE5D,SAAA+B,EAAAA,IAACkB,EAAA,CAAO,UAAU,+BAAA,CAAgC,CAAA,CAAA,EAEpDlB,EAAAA,IAACmB,GAAA,CAAkB,YAAa7E,CAAA,CAAM,CAAA,CAAA,EAV9BA,CAWV,CACD,CAAA,EACH,CAEJ,CCxJA,MAAMqG,EAAyB,CAC7B,CACE,MAAO,QACP,OAAQ,CACN,CAAE,IAAK,0BAA2B,MAAO,eAAA,EACzC,CAAE,IAAK,0BAA2B,MAAO,gBAAiB,UAAW,EAAA,EACrE,CAAE,IAAK,4BAA6B,MAAO,iBAAA,EAC3C,CAAE,IAAK,sBAAuB,MAAO,iBAAA,EACrC,CAAE,IAAK,gCAAiC,MAAO,sBAAuB,UAAW,EAAA,EACjF,CAAE,IAAK,6BAA8B,MAAO,kBAAA,EAC5C,CAAE,IAAK,kCAAmC,MAAO,uBAAA,CAAwB,CAC3E,EAEF,CACE,MAAO,WACP,OAAQ,CACN,CAAE,IAAK,6BAA8B,MAAO,kBAAA,EAC5C,CAAE,IAAK,6BAA8B,MAAO,mBAAoB,UAAW,EAAA,EAC3E,CAAE,IAAK,+BAAgC,MAAO,oBAAA,CAAqB,CACrE,EAEF,CACE,MAAO,cACP,OAAQ,CACN,CAAE,IAAK,yBAA0B,MAAO,cAAA,EACxC,CAAE,IAAK,sBAAuB,MAAO,WAAA,EACrC,CAAE,IAAK,sBAAuB,MAAO,WAAA,EACrC,CAAE,IAAK,qBAAsB,MAAO,UAAA,EACpC,CAAE,IAAK,2BAA4B,MAAO,gBAAA,EAC1C,CAAE,IAAK,gCAAiC,MAAO,qBAAA,CAAsB,CACvE,EAEF,CACE,MAAO,QACP,OAAQ,CACN,CAAE,IAAK,oBAAqB,MAAO,SAAA,EACnC,CAAE,IAAK,0BAA2B,MAAO,eAAA,EACzC,CAAE,IAAK,gCAAiC,MAAO,qBAAA,EAC/C,CAAE,IAAK,yBAA0B,MAAO,cAAA,EACxC,CAAE,IAAK,0BAA2B,MAAO,eAAA,EACzC,CAAE,IAAK,oBAAqB,MAAO,SAAA,EACnC,CAAE,IAAK,mBAAoB,MAAO,QAAA,CAAS,CAC7C,EAEF,CACE,MAAO,UACP,OAAQ,CACN,CAAE,IAAK,uBAAwB,MAAO,YAAA,EACtC,CAAE,IAAK,gCAAiC,MAAO,qBAAA,CAAsB,CACvE,CAEJ,EAGMC,OAAoB,IAAI,CAC5B,0BACA,0BACA,gCACA,iCACF,CAAC,EAGKC,EAAyC,CAC7C,0BAA2B,yBAC3B,oBAAqB,OACrB,2BAA4B,KAC5B,gCAAiC,IACjC,uBAAwB,MACxB,oBAAqB,KACrB,oBAAqB,KACrB,mBAAoB,KACpB,yBAA0B,KAC1B,8BAA+B,KAC/B,wBAAyB,IACzB,8BAA+B,OAC/B,uBAAwB,OACxB,qBAAsB,QACtB,8BAA+B,OAC/B,wBAAyB,UACzB,kBAAmB,MACnB,iBAAkB,IACpB,EAGMC,EAAWH,EAAW,QAASI,GAAMA,EAAE,OAAO,IAAKC,GAAMA,EAAE,GAAG,CAAC,EAErE,SAASC,GAAwC,CAC/C,OAAO,OAAO,YAAYH,EAAS,IAAKI,GAAM,CAACA,EAAG,EAAE,CAAC,CAAC,CACxD,CAEA,SAASC,EACPC,EACAC,EACwB,CACxB,OAAO,OAAO,YACZP,EAAS,IAAKQ,GAAQ,CAACA,EAAKF,EAAOE,CAAG,GAAKD,EAASC,CAAG,GAAK,EAAE,CAAC,CAAA,CAEnE,CAYA,SAASC,GAAe,CAAE,MAAAC,EAAO,SAAAC,EAAU,GAAAC,GAA2B,CACpE,KAAM,CAACC,EAAMC,CAAO,EAAInF,EAAAA,SAAS,EAAK,EACtC,OACEoB,EAAAA,KAAC,MAAA,CAAI,UAAU,WACb,SAAA,CAAAG,EAAAA,IAACyC,EAAA,CACC,GAAAiB,EACA,KAAMC,EAAO,OAAS,WACtB,MAAAH,EACA,SAAWhB,GAAMiB,EAASjB,EAAE,OAAO,KAAK,EACxC,UAAU,OAAA,CAAA,EAEZxC,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,2FACV,QAAS,IAAM4D,EAASC,GAAM,CAACA,CAAC,EAChC,SAAU,GAET,SAAAF,QAAQG,GAAA,CAAO,UAAU,UAAU,EAAK9D,EAAAA,IAAC+D,GAAA,CAAI,UAAU,SAAA,CAAU,CAAA,CAAA,CACpE,EACF,CAEJ,CAMO,SAASC,IAAiB,CAC/B,KAAM,CAAE,cAAA/F,CAAA,EAAkBC,EAAA,EACpB,CAAE,KAAMP,EAAS,UAAAS,CAAA,EAAcd,EAAA,EAC/B,CAAE,QAAA2G,EAAS,SAAAC,CAAA,EAAa3G,GAAA,EAExB,CAACkC,EAAW0E,CAAY,EAAI1F,EAAAA,SAAoB,OAAO,EACvD,CAAC2F,EAAUC,CAAW,EAAI5F,EAAAA,SAAiCwE,CAAa,EAExEqB,GAAe3G,GAAA,YAAAA,EAAS,SAAU,CAAA,EAClC4G,EAAiB,CAAE,GAAG1B,EAAgB,IAAIlF,GAAA,YAAAA,EAAS,WAAY,EAAC,EAChE6G,EAAerB,EAAkBmB,EAAcC,CAAc,EAGnEtC,EAAAA,UAAU,IAAM,CACd,GAAItE,EAAS,CACX,MAAM8G,EAAe,CAAE,GAAG5B,EAAgB,GAAIlF,EAAQ,UAAY,EAAC,EAC7D+G,EAAa/G,EAAQ,QAAU,CAAA,EACrC0G,EAAYlB,EAAkBuB,EAAYD,CAAY,CAAC,EAEnDC,EAAW,yBACbP,EAAa,KAAK,CAEtB,CACF,EAAG,CAACxG,CAAO,CAAC,EAEZ,MAAMgH,EAAU7B,EAAS,KAAMI,GAAMkB,EAASlB,CAAC,KAAOsB,EAAatB,CAAC,GAAK,GAAG,EAEtE0B,EAAe,CAACtB,EAAaE,IAAkB,CACnDa,EAAanC,IAAU,CAAE,GAAGA,EAAM,CAACoB,CAAG,EAAGE,CAAA,EAAQ,CACnD,EAEMqB,EAAa,SAAY,CAC7B,MAAMC,EAAU,OAAO,YACrB,OAAO,QAAQV,CAAQ,EAAE,QAAQ,CAAC,CAACd,EAAKE,CAAK,IAAM,CACjD,MAAMpB,EAAUoB,EAAM,KAAA,EAChBuB,EAAeR,EAAejB,CAAG,GAAK,GAC5C,MAAI,CAAClB,GAAWA,IAAY2C,EACnB,CAAA,EAEF,CAAC,CAACzB,EAAKlB,CAAO,CAAC,CACxB,CAAC,CAAA,EAEH,MAAM6B,EAAQa,CAAO,CACvB,EAEME,EAAc,IAAM,CACxBX,EAAYpB,GAAe,CAC7B,EAEA,OAAI7E,EACK4B,MAAC,KAAE,UAAU,oCAAqC,WAAc,CAAE,GAAI,uBAAA,CAAyB,CAAA,CAAE,EAIxGH,EAAAA,KAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,sBAAuB,SAAA,CAAA5B,EAAc,CAAE,GAAI,qBAAsB,EAAE,GAAA,EAAC,EACpF4B,EAAAA,KAAC,MAAA,CAAI,UAAU,uDACb,SAAA,CAAAG,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAMmE,EAAa,OAAO,EACnC,UAAW,yCACT1E,IAAc,QACV,qCACA,oDACN,GAEC,SAAAxB,EAAc,CAAE,GAAI,yBAAA,CAA2B,CAAA,CAAA,EAElD+B,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAMmE,EAAa,KAAK,EACjC,UAAW,yCACT1E,IAAc,MACV,qCACA,oDACN,GAEC,SAAAxB,EAAc,CAAE,GAAI,uBAAA,CAAyB,CAAA,CAAA,CAChD,EACF,QACC,OAAA,CAAK,UAAU,gCACb,SACGA,EADHwB,IAAc,QACG,CAAE,GAAI,6BAAA,EACN,CAAE,GAAI,2BAAA,CAD+B,CACF,CACvD,CAAA,EACF,EAECkD,EAAW,IAAKsC,GAAU,CAEzB,MAAMC,EAAgBzF,IAAc,QAChCwF,EAAM,OAAO,OAAQjC,GAAM,CAACJ,GAAc,IAAII,EAAE,GAAG,CAAC,EACpDiC,EAAM,OACV,OAAIC,EAAc,SAAW,EAAU,YAEtCnF,EAAA,CACC,SAAA,CAAAC,MAACC,GAAW,UAAU,OACpB,SAAAD,MAACE,EAAA,CAAU,UAAU,YAAa,SAAAjC,EAAc,CAAE,GAAI,0BAA0BgH,EAAM,KAAK,EAAA,CAAI,EAAE,EACnG,EACAjF,EAAAA,IAACO,EAAA,CAAY,UAAU,YACpB,SAAA2E,EAAc,IAAKC,GAClBtF,EAAAA,KAAC,MAAA,CAAoB,UAAU,sCAC7B,SAAA,CAAAG,EAAAA,IAAC,QAAA,CACC,QAASmF,EAAM,IACf,UAAU,2CAET,SAAAA,EAAM,KAAA,CAAA,EAETnF,EAAAA,IAAC,MAAA,CAAI,UAAU,aACZ,WAAM,UACLA,EAAAA,IAACuD,GAAA,CACC,GAAI4B,EAAM,IACV,MAAOf,EAASe,EAAM,GAAG,GAAK,GAC9B,SAAWC,GAAMR,EAAaO,EAAM,IAAKC,CAAC,CAAA,CAAA,EAG5CpF,EAAAA,IAACyC,EAAA,CACC,GAAI0C,EAAM,IACV,MAAOf,EAASe,EAAM,GAAG,GAAK,GAC9B,YAAaZ,EAAeY,EAAM,GAAG,GAAK,GAC1C,SAAW3C,GAAMoC,EAAaO,EAAM,IAAK3C,EAAE,OAAO,KAAK,CAAA,CAAA,CACzD,CAEJ,CAAA,GAtBQ2C,EAAM,GAuBhB,CACD,CAAA,CACH,CAAA,CAAA,EA/BSF,EAAM,KAgCjB,CAEF,CAAC,EAGDpF,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,EAAAA,KAACM,EAAA,CAAO,QAAQ,UAAU,QAAS6E,EACjC,SAAA,CAAAhF,EAAAA,IAACqF,GAAA,CAAU,UAAU,cAAA,CAAe,EACnCpH,EAAc,CAAE,GAAI,yBAAA,CAA2B,CAAA,EAClD,SACCkC,EAAA,CAAO,QAAS0E,EAAY,SAAU,CAACF,GAAWT,EACjD,SAAA,CAAAlE,EAAAA,IAACsF,GAAA,CAAK,UAAU,cAAA,CAAe,EACnBrH,EAAXiG,EAAyB,CAAE,GAAI,sBAAA,EAA0C,CAAE,GAAI,oBAAA,CAAxB,CAA8C,CAAA,CACxG,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CCvSO,SAASqB,IAAgB,CAC9B,KAAM,CAAE,cAAAtH,CAAA,EAAkBC,EAAA,EACpB,CAACsH,EAAWC,CAAY,EAAIhH,EAAAA,SAAkB,KAAK,EAEzD,OACEoB,EAAAA,KAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,6DACZ,SAAA,CAAAG,EAAAA,IAAC0F,GAAA,CAAO,UAAU,sBAAA,CAAuB,EACxCzH,EAAc,CAAE,GAAI,sBAAA,CAAwB,CAAA,EAC/C,EACA+B,MAAC,KAAE,UAAU,6BACV,WAAc,CAAE,GAAI,4BAAA,CAA8B,CAAA,CACrD,CAAA,EACF,EAGAA,EAAAA,IAAC2F,GAAA,CACC,MAAOH,EACP,cAAgBJ,GAAMK,EAAaL,CAAY,EAC/C,KAAM,CACJ,CAAE,MAAO,MAAO,MAAOnH,EAAc,CAAE,GAAI,oBAAA,CAAsB,CAAA,EACjE,CAAE,MAAO,SAAU,MAAOA,EAAc,CAAE,GAAI,uBAAA,CAAyB,CAAA,EACvE,CAAE,MAAO,QAAS,MAAOA,EAAc,CAAE,GAAI,sBAAA,CAAwB,CAAA,EACrE,CAAE,MAAO,MAAO,MAAOA,EAAc,CAAE,GAAI,qBAAsB,CAAA,CAAE,CACrE,CAAA,EAIF4B,EAAAA,KAAC,MAAA,CAAI,UAAU,OACZ,SAAA,CAAA2F,IAAc,aAAUxH,GAAA,CAAA,CAAa,EACrCwH,IAAc,UAAYxF,MAACU,GAAA,CAAA,CAAgB,EAC3C8E,IAAc,SAAWxF,MAAC2B,GAAA,CAAA,CAAgB,EAC1C6D,IAAc,OAASxF,MAACgE,GAAA,CAAA,CAAe,CAAA,CAAA,CAC1C,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{b0 as e,e2 as n,r as l,j as r,b1 as a,c as i}from"./index-B6I7GQC5.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-B_xd1Qbg.js.map
1
+ import{b0 as e,e2 as n,r as l,j as r,b1 as a,c as i}from"./index-dWT2M6Ef.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-CRNbykXN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Collapsible-B_xd1Qbg.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-CRNbykXN.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,2 +1,2 @@
1
- import{u as H,j as e,ap as q,ao as J,c as j,B as $,a9 as Y,aa as ee,r as d,bZ as se,b_ as te,x as ae,y as re,z as ne,A as oe,E as le,bu as D,aS as Q,af as ie,U as de,I as G,e as f,aU as ce,N as U,M as me,K,bO as xe,av as he,G as pe,o as R,s as ue,aP as Z,a7 as je,R as ge,m as fe,C as T,k as ve,b as be}from"./index-B6I7GQC5.js";import{T as Ne}from"./TabsNavigation-drSnu5jn.js";import{u as we,a as ye}from"./useCommands-BvKIoOzB.js";import{S as X}from"./Switch-BgAFC-Wk.js";import{C as Ce,a as ke,b as Se}from"./Collapsible-B_xd1Qbg.js";import{F as Le}from"./FloatingFileBrowser-x_-6y_n2.js";import{F as _}from"./folder-BKhwCNFG.js";import{M as Me,a as Ie}from"./minimize-2-Cbu2yRzi.js";import{E as Pe}from"./eye-DUy7aLEx.js";import{E as Fe}from"./eye-off-CGRUVRDR.js";import"./errorSanitizer-IY9pf5g4.js";import"./FloatingPanel-BGwmbJR1.js";import"./useFileExplorer-G5UoArCU.js";function De(s){const n={cli:"terminal",workflow:"git-branch",memory:"brain",task:"clipboard-list",issue:"alert-circle",loop:"repeat",skill:"sparkles",other:"folder"},a=s.split("/")[0];return n[a]||"folder"}function Ee(s){const n={cli:"text-primary bg-primary/10",workflow:"text-success bg-success/10",memory:"text-indigo bg-indigo/10",task:"text-warning bg-warning/10",issue:"text-destructive bg-destructive/10",loop:"text-purple bg-purple/10",skill:"text-pink bg-pink/10",other:"text-muted-foreground bg-muted"},a=s.split("/")[0];return n[a]||"text-muted-foreground bg-muted"}function Ae(s){return s.includes("/")?s.split("/").map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" > "):s}function Be(s){const n={terminal:({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("polyline",{points:"4 17 10 11 4 5"}),e.jsx("line",{x1:"12",y1:"19",x2:"20",y2:"19"})]}),"git-branch":({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("line",{x1:"6",y1:"3",x2:"6",y2:"15"}),e.jsx("circle",{cx:"18",cy:"6",r:"3"}),e.jsx("circle",{cx:"6",cy:"18",r:"3"}),e.jsx("path",{d:"M18 9a9 9 0 0 1-9 9"})]}),brain:({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("path",{d:"M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z"}),e.jsx("path",{d:"M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z"})]}),"clipboard-list":({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1"}),e.jsx("path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"}),e.jsx("path",{d:"M12 11h4"}),e.jsx("path",{d:"M12 16h4"}),e.jsx("path",{d:"M8 11h.01"}),e.jsx("path",{d:"M8 16h.01"})]}),"alert-circle":({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),e.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]}),repeat:({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("path",{d:"m17 2 4 4-4 4"}),e.jsx("path",{d:"M3 11V9a4 4 0 0 1 4-4h14"}),e.jsx("path",{d:"m7 22-4-4 4-4"}),e.jsx("path",{d:"M21 13v2a4 4 0 0 1-4 4H3"})]}),sparkles:({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("path",{d:"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z"}),e.jsx("path",{d:"M5 3v4"}),e.jsx("path",{d:"M19 17v4"}),e.jsx("path",{d:"M3 5h4"}),e.jsx("path",{d:"M17 19h4"})]}),folder:({className:a})=>e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:e.jsx("path",{d:"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"})})};return n[s]||n.folder}function Te({groupName:s,commands:n,isExpanded:a,onToggleExpand:p,onToggleCommand:t,onToggleGroup:v,isToggling:l,showDisabled:b=!1}){const{formatMessage:m}=H(),N=n.filter(h=>h.enabled),c=N.length===n.length&&n.length>0,u=b?n:N,k=De(s),I=Ee(s),i=Ae(s),x=Be(k),g=(s.match(/\//g)||[]).length,y=h=>{v(s,h)};return e.jsx("div",{className:j("mb-4",g>0&&"ml-5"),style:g>0?{marginLeft:`${g*20}px`}:void 0,children:e.jsxs(Ce,{open:a,onOpenChange:()=>p(s),children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 bg-card border border-border rounded-lg hover:bg-muted/50 transition-colors",children:[e.jsx(ke,{asChild:!0,children:e.jsxs("div",{className:"flex items-center gap-3 flex-1 cursor-pointer",children:[a?e.jsx(q,{className:"w-5 h-5 text-muted-foreground transition-transform"}):e.jsx(J,{className:"w-5 h-5 text-muted-foreground transition-transform"}),e.jsx("div",{className:j("w-8 h-8 rounded-lg flex items-center justify-center",I),children:e.jsx(x,{className:"w-4 h-4"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base font-semibold text-foreground",children:i}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[N.length,"/",n.length," ",m({id:"commands.group.enabled"})]})]})]})}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(X,{checked:c,onCheckedChange:y,disabled:l||n.length===0,className:j("data-[state=checked]:bg-success"),title:m(c?{id:"commands.group.clickToDisableAll"}:{id:"commands.group.clickToEnableAll"})}),e.jsx($,{variant:"secondary",className:"text-xs",children:n.length})]})]}),e.jsx(Se,{className:"mt-3",children:e.jsx("div",{className:"bg-card border border-border rounded-lg overflow-hidden",children:e.jsxs("table",{className:"w-full",style:{tableLayout:"fixed"},children:[e.jsxs("colgroup",{children:[e.jsx("col",{style:{width:"200px"}}),e.jsx("col",{style:{width:"auto"}}),e.jsx("col",{style:{width:"100px"}}),e.jsx("col",{style:{width:"80px"}})]}),e.jsx("thead",{className:"bg-muted/30 border-b border-border",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-2 text-left text-xs font-medium text-muted-foreground uppercase",children:m({id:"commands.table.name"})}),e.jsx("th",{className:"px-4 py-2 text-left text-xs font-medium text-muted-foreground uppercase",children:m({id:"commands.table.description"})}),e.jsx("th",{className:"px-4 py-2 text-center text-xs font-medium text-muted-foreground uppercase",children:m({id:"commands.table.scope"})}),e.jsx("th",{className:"px-4 py-2 text-center text-xs font-medium text-muted-foreground uppercase",children:m({id:"commands.table.status"})})]})}),e.jsxs("tbody",{className:"divide-y divide-border",children:[u.map(h=>e.jsx(Ge,{command:h,onToggle:t,disabled:l},`${h.name}-${h.location||"default"}`)),u.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:"px-4 py-8 text-center text-sm text-muted-foreground",children:m(b?{id:"commands.group.noCommands"}:{id:"commands.group.noEnabledCommands"})})})]})]})})})]})})}function Ge({command:s,onToggle:n,disabled:a}){const{formatMessage:p}=H(),t=!s.enabled;return e.jsxs("tr",{className:j("hover:bg-muted/20 transition-colors",t&&"opacity-60"),children:[e.jsx("td",{className:"px-4 py-3 text-sm font-medium text-foreground",children:e.jsxs("code",{className:"break-words",children:["/",s.name]})}),e.jsx("td",{className:"px-4 py-3 text-sm text-muted-foreground",children:e.jsx("div",{className:"line-clamp-2 break-words",children:s.description||p({id:"commands.card.noDescription"})})}),e.jsx("td",{className:"px-4 py-3 text-center text-xs text-muted-foreground",children:e.jsx("span",{className:"whitespace-nowrap",children:s.location||"project"})}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(X,{checked:s.enabled,onCheckedChange:v=>n(s.name,v),disabled:a,className:"data-[state=checked]:bg-primary"})})})]})}function He({open:s,onOpenChange:n,onCreated:a,cliType:p="claude"}){const{formatMessage:t}=H(),v=Y(ee),[l,b]=d.useState("import"),[m,N]=d.useState("project"),[c,u]=d.useState(""),[k,I]=d.useState(""),[i,x]=d.useState(null),[g,y]=d.useState(!1),[h,A]=d.useState(""),[S,E]=d.useState(""),[w,L]=d.useState(!1),[O,P]=d.useState(!1),C=d.useCallback(()=>{b("import"),N("project"),u(""),I(""),x(null),y(!1),A(""),E(""),L(!1),P(!1)},[]),F=d.useCallback(r=>{r||C(),n(r)},[n,C]),W=d.useCallback(async()=>{if(c.trim()){y(!0),x(null);try{const r=await se(c.trim());x(r)}catch(r){x({valid:!1,errors:[r instanceof Error?r.message:String(r)]})}finally{y(!1)}}},[c]),z=d.useCallback(async()=>{if(l==="import"){if(!c.trim()||!(i!=null&&i.valid))return}else if(!h.trim()||!S.trim())return;L(!0);try{await te({mode:l,location:m,sourcePath:l==="import"?c.trim():void 0,commandName:l==="import"?k.trim()||void 0:h.trim(),description:l==="cli-generate"?S.trim():void 0,generationType:l==="cli-generate"?"description":void 0,projectPath:v,cliType:p}),F(!1),a()}catch(r){console.error("Failed to create command:",r),l==="import"&&x({valid:!1,errors:[r instanceof Error?r.message:t({id:"commands.create.createError"})]})}finally{L(!1)}},[l,m,c,k,h,S,i,v,F,a,t]),V=l==="import"?c.trim()&&(i==null?void 0:i.valid)&&!w:h.trim()&&S.trim()&&!w;return e.jsxs(ae,{open:s,onOpenChange:F,children:[e.jsxs(re,{className:"max-w-2xl max-h-[90vh] overflow-y-auto",children:[e.jsxs(ne,{children:[e.jsx(oe,{children:t({id:"commands.create.title"})}),e.jsx(le,{children:t({id:"commands.description"})})]}),e.jsxs("div",{className:"space-y-5 py-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{children:t({id:"commands.create.location"})}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx("button",{type:"button",className:j("px-4 py-3 text-left border-2 rounded-lg transition-all",m==="project"?"border-primary bg-primary/10":"border-border hover:border-primary/50"),onClick:()=>N("project"),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{className:"w-5 h-5"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-sm",children:t({id:"commands.create.locationProject"})}),e.jsx("div",{className:"text-xs text-muted-foreground",children:`.${p}/commands/`})]})]})}),e.jsx("button",{type:"button",className:j("px-4 py-3 text-left border-2 rounded-lg transition-all",m==="user"?"border-primary bg-primary/10":"border-border hover:border-primary/50"),onClick:()=>N("user"),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Q,{className:"w-5 h-5"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-sm",children:t({id:"commands.create.locationUser"})}),e.jsx("div",{className:"text-xs text-muted-foreground",children:`~/.${p}/commands/`})]})]})})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{children:t({id:"commands.create.mode"})}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx("button",{type:"button",className:j("px-4 py-3 text-left border-2 rounded-lg transition-all",l==="import"?"border-primary bg-primary/10":"border-border hover:border-primary/50"),onClick:()=>b("import"),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ie,{className:"w-5 h-5"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-sm",children:t({id:"commands.create.modeImport"})}),e.jsx("div",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.modeImportHint"})})]})]})}),e.jsx("button",{type:"button",className:j("px-4 py-3 text-left border-2 rounded-lg transition-all",l==="cli-generate"?"border-primary bg-primary/10":"border-border hover:border-primary/50"),onClick:()=>b("cli-generate"),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(de,{className:"w-5 h-5"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-sm",children:t({id:"commands.create.modeGenerate"})}),e.jsx("div",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.modeGenerateHint"})})]})]})})]})]}),l==="import"&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"sourcePath",children:t({id:"commands.create.sourcePath"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(G,{id:"sourcePath",value:c,onChange:r=>{u(r.target.value),x(null)},placeholder:t({id:"commands.create.sourcePathPlaceholder"}),className:"font-mono text-sm flex-1"}),e.jsx(f,{type:"button",variant:"outline",size:"icon",onClick:()=>P(!0),title:t({id:"commands.create.browseFile"}),children:e.jsx(ce,{className:"w-4 h-4"})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.sourcePathHint"})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(D,{htmlFor:"customName",children:[t({id:"commands.create.customName"}),e.jsxs("span",{className:"text-muted-foreground ml-1",children:["(",t({id:"commands.create.customNameHint"}),")"]})]}),e.jsx(G,{id:"customName",value:k,onChange:r=>I(r.target.value),placeholder:t({id:"commands.create.customNamePlaceholder"})})]}),g&&e.jsxs("div",{className:"flex items-center gap-2 p-3 bg-muted/50 rounded-lg",children:[e.jsx(U,{className:"w-4 h-4 animate-spin"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:t({id:"commands.create.validating"})})]}),i&&!g&&(i.valid?e.jsxs("div",{className:"p-4 bg-green-500/10 border border-green-500/20 rounded-lg",children:[e.jsxs("div",{className:"flex items-center gap-2 text-green-600 mb-2",children:[e.jsx(me,{className:"w-5 h-5"}),e.jsx("span",{className:"font-medium",children:t({id:"commands.create.validCommand"})})]}),i.commandInfo&&e.jsxs("div",{className:"space-y-1 text-sm",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"text-muted-foreground",children:[t({id:"commands.card.name"}),": "]}),e.jsx("span",{children:i.commandInfo.name})]}),i.commandInfo.description&&e.jsxs("div",{children:[e.jsxs("span",{className:"text-muted-foreground",children:[t({id:"commands.card.description"}),": "]}),e.jsx("span",{children:i.commandInfo.description})]}),i.commandInfo.usage&&e.jsxs("div",{children:[e.jsxs("span",{className:"text-muted-foreground",children:[t({id:"commands.card.usage"}),": "]}),e.jsx("span",{children:i.commandInfo.usage})]})]})]}):e.jsxs("div",{className:"p-4 bg-destructive/10 border border-destructive/20 rounded-lg",children:[e.jsxs("div",{className:"flex items-center gap-2 text-destructive mb-2",children:[e.jsx(K,{className:"w-5 h-5"}),e.jsx("span",{className:"font-medium",children:t({id:"commands.create.invalidCommand"})})]}),i.errors&&e.jsx("ul",{className:"space-y-1 text-sm",children:i.errors.map((r,o)=>e.jsx("li",{className:"text-destructive",children:r},o))})]}))]}),l==="cli-generate"&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(D,{htmlFor:"commandName",children:[t({id:"commands.create.commandName"})," ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(G,{id:"commandName",value:h,onChange:r=>A(r.target.value),placeholder:t({id:"commands.create.commandNamePlaceholder"})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.commandNameHint"})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(D,{htmlFor:"description",children:[t({id:"commands.create.descriptionLabel"})," ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(xe,{id:"description",value:S,onChange:r=>E(r.target.value),placeholder:t({id:"commands.create.descriptionPlaceholder"}),rows:6}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.descriptionHint"})})]}),e.jsx("div",{className:"p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(he,{className:"w-4 h-4 text-blue-600 mt-0.5"}),e.jsxs("div",{className:"text-sm text-blue-600",children:[e.jsx("p",{className:"font-medium",children:t({id:"commands.create.generateInfo"})}),e.jsx("p",{className:"text-xs mt-1",children:t({id:"commands.create.generateTimeHint"})})]})]})})]})]}),e.jsxs(pe,{className:"gap-2",children:[e.jsx(f,{variant:"outline",onClick:()=>F(!1),disabled:w,children:t({id:"commands.actions.cancel"})}),l==="import"&&e.jsxs(f,{variant:"outline",onClick:W,disabled:!c.trim()||g||w,children:[g&&e.jsx(U,{className:"w-4 h-4 mr-2 animate-spin"}),t({id:"commands.create.validate"})]}),e.jsxs(f,{onClick:z,disabled:!V,children:[w&&e.jsx(U,{className:"w-4 h-4 mr-2 animate-spin"}),t(w?{id:"commands.create.creating"}:l==="import"?{id:"commands.create.import"}:{id:"commands.create.generate"})]})]})]}),e.jsx(Le,{isOpen:O,onClose:()=>P(!1),rootPath:v,onInsertPath:r=>{u(r),x(null),P(!1)},initialSelectedPath:c||null})]})}function Je(){const{formatMessage:s}=H(),[n,a]=d.useState("project"),[p,t]=d.useState(!1),[v,l]=d.useState(new Set(["cli","workflow"])),[b,m]=d.useState(""),[N,c]=d.useState(!1),u=R(ue),k=R(o=>o.toggleImmersiveMode),{commands:I,groupedCommands:i,groups:x,enabledCount:g,disabledCount:y,projectCount:h,userCount:A,isLoading:S,isFetching:E,error:w,refetch:L}=we({filter:{location:n,showDisabled:p,search:b||void 0}}),{toggleCommand:O,toggleGroup:P,isToggling:C}=ye(),F=o=>{l(M=>{const B=new Set(M);return B.has(o)?B.delete(o):B.add(o),B})},W=()=>{l(new Set(x))},z=()=>{l(new Set)},V=(o,M)=>{O(o,M,n)},r=(o,M)=>{P(o,M,n)};return e.jsxs("div",{className:j("space-y-6",u&&"h-screen overflow-hidden"),children:[e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold text-foreground flex items-center gap-2",children:[e.jsx(Z,{className:"w-6 h-6 text-primary"}),s({id:"commands.title"})]}),e.jsx("p",{className:"text-muted-foreground mt-1",children:s({id:"commands.description"})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(f,{onClick:()=>c(!0),disabled:C,children:[e.jsx(je,{className:"w-4 h-4 mr-2"}),s({id:"commands.actions.create"})]}),e.jsx("button",{onClick:k,className:j("p-2 rounded-md transition-colors",u?"bg-primary/10 text-primary":"text-muted-foreground hover:text-foreground hover:bg-muted"),title:u?"Exit Fullscreen":"Fullscreen",children:u?e.jsx(Me,{className:"w-4 h-4"}):e.jsx(Ie,{className:"w-4 h-4"})}),e.jsxs(f,{variant:"outline",onClick:()=>L(),disabled:E,children:[e.jsx(ge,{className:j("w-4 h-4 mr-2",E&&"animate-spin")}),s({id:"common.actions.refresh"})]})]})]}),w&&e.jsxs("div",{className:"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive",children:[e.jsx(fe,{className:"h-5 w-5 flex-shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium",children:s({id:"common.errors.loadFailed"})}),e.jsx("p",{className:"text-xs mt-0.5",children:w.message})]}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>L(),children:s({id:"home.errors.retry"})})]}),e.jsx(Ne,{value:n,onValueChange:o=>a(o),tabs:[{value:"project",label:s({id:"commands.location.project"}),icon:e.jsx(_,{className:"h-4 w-4"}),badge:e.jsx($,{variant:"secondary",className:"ml-2",children:h}),disabled:C},{value:"user",label:s({id:"commands.location.user"}),icon:e.jsx(Q,{className:"h-4 w-4"}),badge:e.jsx($,{variant:"secondary",className:"ml-2",children:A}),disabled:C}]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsxs(T,{className:"p-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Z,{className:"w-5 h-5 text-primary"}),e.jsx("span",{className:"text-2xl font-bold",children:I.length})]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:s({id:"commands.stats.total"})})]}),e.jsxs(T,{className:"p-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ve,{className:"w-5 h-5 text-success"}),e.jsx("span",{className:"text-2xl font-bold",children:g})]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:s({id:"commands.stats.enabled"})})]}),e.jsxs(T,{className:"p-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(K,{className:"w-5 h-5 text-muted-foreground"}),e.jsx("span",{className:"text-2xl font-bold",children:y})]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:s({id:"commands.stats.disabled"})})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-3",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(be,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"}),e.jsx(G,{placeholder:s({id:"commands.filters.searchPlaceholder"}),value:b,onChange:o=>m(o.target.value),className:"pl-9"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(f,{variant:p?"default":"outline",size:"sm",onClick:()=>t(o=>!o),disabled:C,children:[p?e.jsx(Pe,{className:"w-4 h-4 mr-2"}):e.jsx(Fe,{className:"w-4 h-4 mr-2"}),s(p?{id:"commands.actions.hideDisabled"}:{id:"commands.actions.showDisabled"}),e.jsxs("span",{className:"ml-1 text-xs opacity-70",children:["(",y,")"]})]}),e.jsx(f,{variant:"outline",size:"sm",onClick:W,disabled:x.length===0,children:s({id:"commands.actions.expandAll"})}),e.jsx(f,{variant:"outline",size:"sm",onClick:z,disabled:x.length===0,children:s({id:"commands.actions.collapseAll"})})]})]}),S?e.jsx("div",{className:"space-y-4",children:[1,2,3,4,5].map(o=>e.jsx("div",{className:"h-32 bg-muted animate-pulse rounded-lg"},o))}):x.length===0?e.jsxs(T,{className:"p-8 text-center",children:[e.jsx(Z,{className:"w-12 h-12 mx-auto text-muted-foreground/50"}),e.jsx("h3",{className:"mt-4 text-lg font-medium text-foreground",children:s({id:"commands.emptyState.title"})}),e.jsx("p",{className:"mt-2 text-muted-foreground",children:s({id:"commands.emptyState.message"})})]}):e.jsx("div",{className:"commands-accordion",children:x.map(o=>{const M=i[o]||[];return e.jsx(Te,{groupName:o,commands:M,isExpanded:v.has(o),onToggleExpand:F,onToggleCommand:V,onToggleGroup:r,isToggling:C,showDisabled:p},o)})}),e.jsx(He,{open:N,onOpenChange:c,onCreated:()=>{c(!1),L()}})]})}export{Je as CommandsManagerPage,Je as default};
2
- //# sourceMappingURL=CommandsManagerPage-Bjx1bPbH.js.map
1
+ import{u as H,j as e,ap as q,ao as J,c as j,B as $,a9 as Y,aa as ee,r as d,bZ as se,b_ as te,x as ae,y as re,z as ne,A as oe,E as le,bu as D,aS as Q,af as ie,U as de,I as G,e as f,aU as ce,N as U,M as me,K,bO as xe,av as he,G as pe,o as R,s as ue,aP as Z,a7 as je,R as ge,m as fe,C as T,k as ve,b as be}from"./index-dWT2M6Ef.js";import{T as Ne}from"./TabsNavigation-qqt70VYL.js";import{u as we,a as ye}from"./useCommands-3OfPQPw4.js";import{S as X}from"./Switch-BPMdND9H.js";import{C as Ce,a as ke,b as Se}from"./Collapsible-CRNbykXN.js";import{F as Le}from"./FloatingFileBrowser-DROn1xZ5.js";import{F as _}from"./folder-CV8511y9.js";import{M as Me,a as Ie}from"./minimize-2-CGfBKD_V.js";import{E as Pe}from"./eye-DGY1rAZs.js";import{E as Fe}from"./eye-off-D8t3JfWG.js";import"./errorSanitizer-IY9pf5g4.js";import"./FloatingPanel-CmL_yhDv.js";import"./useFileExplorer-DEyUm46_.js";function De(s){const n={cli:"terminal",workflow:"git-branch",memory:"brain",task:"clipboard-list",issue:"alert-circle",loop:"repeat",skill:"sparkles",other:"folder"},a=s.split("/")[0];return n[a]||"folder"}function Ee(s){const n={cli:"text-primary bg-primary/10",workflow:"text-success bg-success/10",memory:"text-indigo bg-indigo/10",task:"text-warning bg-warning/10",issue:"text-destructive bg-destructive/10",loop:"text-purple bg-purple/10",skill:"text-pink bg-pink/10",other:"text-muted-foreground bg-muted"},a=s.split("/")[0];return n[a]||"text-muted-foreground bg-muted"}function Ae(s){return s.includes("/")?s.split("/").map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" > "):s}function Be(s){const n={terminal:({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("polyline",{points:"4 17 10 11 4 5"}),e.jsx("line",{x1:"12",y1:"19",x2:"20",y2:"19"})]}),"git-branch":({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("line",{x1:"6",y1:"3",x2:"6",y2:"15"}),e.jsx("circle",{cx:"18",cy:"6",r:"3"}),e.jsx("circle",{cx:"6",cy:"18",r:"3"}),e.jsx("path",{d:"M18 9a9 9 0 0 1-9 9"})]}),brain:({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("path",{d:"M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z"}),e.jsx("path",{d:"M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z"})]}),"clipboard-list":({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1"}),e.jsx("path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"}),e.jsx("path",{d:"M12 11h4"}),e.jsx("path",{d:"M12 16h4"}),e.jsx("path",{d:"M8 11h.01"}),e.jsx("path",{d:"M8 16h.01"})]}),"alert-circle":({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),e.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]}),repeat:({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("path",{d:"m17 2 4 4-4 4"}),e.jsx("path",{d:"M3 11V9a4 4 0 0 1 4-4h14"}),e.jsx("path",{d:"m7 22-4-4 4-4"}),e.jsx("path",{d:"M21 13v2a4 4 0 0 1-4 4H3"})]}),sparkles:({className:a})=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:[e.jsx("path",{d:"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z"}),e.jsx("path",{d:"M5 3v4"}),e.jsx("path",{d:"M19 17v4"}),e.jsx("path",{d:"M3 5h4"}),e.jsx("path",{d:"M17 19h4"})]}),folder:({className:a})=>e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:a,children:e.jsx("path",{d:"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"})})};return n[s]||n.folder}function Te({groupName:s,commands:n,isExpanded:a,onToggleExpand:p,onToggleCommand:t,onToggleGroup:v,isToggling:l,showDisabled:b=!1}){const{formatMessage:m}=H(),N=n.filter(h=>h.enabled),c=N.length===n.length&&n.length>0,u=b?n:N,k=De(s),I=Ee(s),i=Ae(s),x=Be(k),g=(s.match(/\//g)||[]).length,y=h=>{v(s,h)};return e.jsx("div",{className:j("mb-4",g>0&&"ml-5"),style:g>0?{marginLeft:`${g*20}px`}:void 0,children:e.jsxs(Ce,{open:a,onOpenChange:()=>p(s),children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 bg-card border border-border rounded-lg hover:bg-muted/50 transition-colors",children:[e.jsx(ke,{asChild:!0,children:e.jsxs("div",{className:"flex items-center gap-3 flex-1 cursor-pointer",children:[a?e.jsx(q,{className:"w-5 h-5 text-muted-foreground transition-transform"}):e.jsx(J,{className:"w-5 h-5 text-muted-foreground transition-transform"}),e.jsx("div",{className:j("w-8 h-8 rounded-lg flex items-center justify-center",I),children:e.jsx(x,{className:"w-4 h-4"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base font-semibold text-foreground",children:i}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[N.length,"/",n.length," ",m({id:"commands.group.enabled"})]})]})]})}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(X,{checked:c,onCheckedChange:y,disabled:l||n.length===0,className:j("data-[state=checked]:bg-success"),title:m(c?{id:"commands.group.clickToDisableAll"}:{id:"commands.group.clickToEnableAll"})}),e.jsx($,{variant:"secondary",className:"text-xs",children:n.length})]})]}),e.jsx(Se,{className:"mt-3",children:e.jsx("div",{className:"bg-card border border-border rounded-lg overflow-hidden",children:e.jsxs("table",{className:"w-full",style:{tableLayout:"fixed"},children:[e.jsxs("colgroup",{children:[e.jsx("col",{style:{width:"200px"}}),e.jsx("col",{style:{width:"auto"}}),e.jsx("col",{style:{width:"100px"}}),e.jsx("col",{style:{width:"80px"}})]}),e.jsx("thead",{className:"bg-muted/30 border-b border-border",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-2 text-left text-xs font-medium text-muted-foreground uppercase",children:m({id:"commands.table.name"})}),e.jsx("th",{className:"px-4 py-2 text-left text-xs font-medium text-muted-foreground uppercase",children:m({id:"commands.table.description"})}),e.jsx("th",{className:"px-4 py-2 text-center text-xs font-medium text-muted-foreground uppercase",children:m({id:"commands.table.scope"})}),e.jsx("th",{className:"px-4 py-2 text-center text-xs font-medium text-muted-foreground uppercase",children:m({id:"commands.table.status"})})]})}),e.jsxs("tbody",{className:"divide-y divide-border",children:[u.map(h=>e.jsx(Ge,{command:h,onToggle:t,disabled:l},`${h.name}-${h.location||"default"}`)),u.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:"px-4 py-8 text-center text-sm text-muted-foreground",children:m(b?{id:"commands.group.noCommands"}:{id:"commands.group.noEnabledCommands"})})})]})]})})})]})})}function Ge({command:s,onToggle:n,disabled:a}){const{formatMessage:p}=H(),t=!s.enabled;return e.jsxs("tr",{className:j("hover:bg-muted/20 transition-colors",t&&"opacity-60"),children:[e.jsx("td",{className:"px-4 py-3 text-sm font-medium text-foreground",children:e.jsxs("code",{className:"break-words",children:["/",s.name]})}),e.jsx("td",{className:"px-4 py-3 text-sm text-muted-foreground",children:e.jsx("div",{className:"line-clamp-2 break-words",children:s.description||p({id:"commands.card.noDescription"})})}),e.jsx("td",{className:"px-4 py-3 text-center text-xs text-muted-foreground",children:e.jsx("span",{className:"whitespace-nowrap",children:s.location||"project"})}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(X,{checked:s.enabled,onCheckedChange:v=>n(s.name,v),disabled:a,className:"data-[state=checked]:bg-primary"})})})]})}function He({open:s,onOpenChange:n,onCreated:a,cliType:p="claude"}){const{formatMessage:t}=H(),v=Y(ee),[l,b]=d.useState("import"),[m,N]=d.useState("project"),[c,u]=d.useState(""),[k,I]=d.useState(""),[i,x]=d.useState(null),[g,y]=d.useState(!1),[h,A]=d.useState(""),[S,E]=d.useState(""),[w,L]=d.useState(!1),[O,P]=d.useState(!1),C=d.useCallback(()=>{b("import"),N("project"),u(""),I(""),x(null),y(!1),A(""),E(""),L(!1),P(!1)},[]),F=d.useCallback(r=>{r||C(),n(r)},[n,C]),W=d.useCallback(async()=>{if(c.trim()){y(!0),x(null);try{const r=await se(c.trim());x(r)}catch(r){x({valid:!1,errors:[r instanceof Error?r.message:String(r)]})}finally{y(!1)}}},[c]),z=d.useCallback(async()=>{if(l==="import"){if(!c.trim()||!(i!=null&&i.valid))return}else if(!h.trim()||!S.trim())return;L(!0);try{await te({mode:l,location:m,sourcePath:l==="import"?c.trim():void 0,commandName:l==="import"?k.trim()||void 0:h.trim(),description:l==="cli-generate"?S.trim():void 0,generationType:l==="cli-generate"?"description":void 0,projectPath:v,cliType:p}),F(!1),a()}catch(r){console.error("Failed to create command:",r),l==="import"&&x({valid:!1,errors:[r instanceof Error?r.message:t({id:"commands.create.createError"})]})}finally{L(!1)}},[l,m,c,k,h,S,i,v,F,a,t]),V=l==="import"?c.trim()&&(i==null?void 0:i.valid)&&!w:h.trim()&&S.trim()&&!w;return e.jsxs(ae,{open:s,onOpenChange:F,children:[e.jsxs(re,{className:"max-w-2xl max-h-[90vh] overflow-y-auto",children:[e.jsxs(ne,{children:[e.jsx(oe,{children:t({id:"commands.create.title"})}),e.jsx(le,{children:t({id:"commands.description"})})]}),e.jsxs("div",{className:"space-y-5 py-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{children:t({id:"commands.create.location"})}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx("button",{type:"button",className:j("px-4 py-3 text-left border-2 rounded-lg transition-all",m==="project"?"border-primary bg-primary/10":"border-border hover:border-primary/50"),onClick:()=>N("project"),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{className:"w-5 h-5"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-sm",children:t({id:"commands.create.locationProject"})}),e.jsx("div",{className:"text-xs text-muted-foreground",children:`.${p}/commands/`})]})]})}),e.jsx("button",{type:"button",className:j("px-4 py-3 text-left border-2 rounded-lg transition-all",m==="user"?"border-primary bg-primary/10":"border-border hover:border-primary/50"),onClick:()=>N("user"),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Q,{className:"w-5 h-5"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-sm",children:t({id:"commands.create.locationUser"})}),e.jsx("div",{className:"text-xs text-muted-foreground",children:`~/.${p}/commands/`})]})]})})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{children:t({id:"commands.create.mode"})}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx("button",{type:"button",className:j("px-4 py-3 text-left border-2 rounded-lg transition-all",l==="import"?"border-primary bg-primary/10":"border-border hover:border-primary/50"),onClick:()=>b("import"),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ie,{className:"w-5 h-5"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-sm",children:t({id:"commands.create.modeImport"})}),e.jsx("div",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.modeImportHint"})})]})]})}),e.jsx("button",{type:"button",className:j("px-4 py-3 text-left border-2 rounded-lg transition-all",l==="cli-generate"?"border-primary bg-primary/10":"border-border hover:border-primary/50"),onClick:()=>b("cli-generate"),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(de,{className:"w-5 h-5"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-sm",children:t({id:"commands.create.modeGenerate"})}),e.jsx("div",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.modeGenerateHint"})})]})]})})]})]}),l==="import"&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"sourcePath",children:t({id:"commands.create.sourcePath"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(G,{id:"sourcePath",value:c,onChange:r=>{u(r.target.value),x(null)},placeholder:t({id:"commands.create.sourcePathPlaceholder"}),className:"font-mono text-sm flex-1"}),e.jsx(f,{type:"button",variant:"outline",size:"icon",onClick:()=>P(!0),title:t({id:"commands.create.browseFile"}),children:e.jsx(ce,{className:"w-4 h-4"})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.sourcePathHint"})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(D,{htmlFor:"customName",children:[t({id:"commands.create.customName"}),e.jsxs("span",{className:"text-muted-foreground ml-1",children:["(",t({id:"commands.create.customNameHint"}),")"]})]}),e.jsx(G,{id:"customName",value:k,onChange:r=>I(r.target.value),placeholder:t({id:"commands.create.customNamePlaceholder"})})]}),g&&e.jsxs("div",{className:"flex items-center gap-2 p-3 bg-muted/50 rounded-lg",children:[e.jsx(U,{className:"w-4 h-4 animate-spin"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:t({id:"commands.create.validating"})})]}),i&&!g&&(i.valid?e.jsxs("div",{className:"p-4 bg-green-500/10 border border-green-500/20 rounded-lg",children:[e.jsxs("div",{className:"flex items-center gap-2 text-green-600 mb-2",children:[e.jsx(me,{className:"w-5 h-5"}),e.jsx("span",{className:"font-medium",children:t({id:"commands.create.validCommand"})})]}),i.commandInfo&&e.jsxs("div",{className:"space-y-1 text-sm",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"text-muted-foreground",children:[t({id:"commands.card.name"}),": "]}),e.jsx("span",{children:i.commandInfo.name})]}),i.commandInfo.description&&e.jsxs("div",{children:[e.jsxs("span",{className:"text-muted-foreground",children:[t({id:"commands.card.description"}),": "]}),e.jsx("span",{children:i.commandInfo.description})]}),i.commandInfo.usage&&e.jsxs("div",{children:[e.jsxs("span",{className:"text-muted-foreground",children:[t({id:"commands.card.usage"}),": "]}),e.jsx("span",{children:i.commandInfo.usage})]})]})]}):e.jsxs("div",{className:"p-4 bg-destructive/10 border border-destructive/20 rounded-lg",children:[e.jsxs("div",{className:"flex items-center gap-2 text-destructive mb-2",children:[e.jsx(K,{className:"w-5 h-5"}),e.jsx("span",{className:"font-medium",children:t({id:"commands.create.invalidCommand"})})]}),i.errors&&e.jsx("ul",{className:"space-y-1 text-sm",children:i.errors.map((r,o)=>e.jsx("li",{className:"text-destructive",children:r},o))})]}))]}),l==="cli-generate"&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(D,{htmlFor:"commandName",children:[t({id:"commands.create.commandName"})," ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(G,{id:"commandName",value:h,onChange:r=>A(r.target.value),placeholder:t({id:"commands.create.commandNamePlaceholder"})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.commandNameHint"})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(D,{htmlFor:"description",children:[t({id:"commands.create.descriptionLabel"})," ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(xe,{id:"description",value:S,onChange:r=>E(r.target.value),placeholder:t({id:"commands.create.descriptionPlaceholder"}),rows:6}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t({id:"commands.create.descriptionHint"})})]}),e.jsx("div",{className:"p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(he,{className:"w-4 h-4 text-blue-600 mt-0.5"}),e.jsxs("div",{className:"text-sm text-blue-600",children:[e.jsx("p",{className:"font-medium",children:t({id:"commands.create.generateInfo"})}),e.jsx("p",{className:"text-xs mt-1",children:t({id:"commands.create.generateTimeHint"})})]})]})})]})]}),e.jsxs(pe,{className:"gap-2",children:[e.jsx(f,{variant:"outline",onClick:()=>F(!1),disabled:w,children:t({id:"commands.actions.cancel"})}),l==="import"&&e.jsxs(f,{variant:"outline",onClick:W,disabled:!c.trim()||g||w,children:[g&&e.jsx(U,{className:"w-4 h-4 mr-2 animate-spin"}),t({id:"commands.create.validate"})]}),e.jsxs(f,{onClick:z,disabled:!V,children:[w&&e.jsx(U,{className:"w-4 h-4 mr-2 animate-spin"}),t(w?{id:"commands.create.creating"}:l==="import"?{id:"commands.create.import"}:{id:"commands.create.generate"})]})]})]}),e.jsx(Le,{isOpen:O,onClose:()=>P(!1),rootPath:v,onInsertPath:r=>{u(r),x(null),P(!1)},initialSelectedPath:c||null})]})}function Je(){const{formatMessage:s}=H(),[n,a]=d.useState("project"),[p,t]=d.useState(!1),[v,l]=d.useState(new Set(["cli","workflow"])),[b,m]=d.useState(""),[N,c]=d.useState(!1),u=R(ue),k=R(o=>o.toggleImmersiveMode),{commands:I,groupedCommands:i,groups:x,enabledCount:g,disabledCount:y,projectCount:h,userCount:A,isLoading:S,isFetching:E,error:w,refetch:L}=we({filter:{location:n,showDisabled:p,search:b||void 0}}),{toggleCommand:O,toggleGroup:P,isToggling:C}=ye(),F=o=>{l(M=>{const B=new Set(M);return B.has(o)?B.delete(o):B.add(o),B})},W=()=>{l(new Set(x))},z=()=>{l(new Set)},V=(o,M)=>{O(o,M,n)},r=(o,M)=>{P(o,M,n)};return e.jsxs("div",{className:j("space-y-6",u&&"h-screen overflow-hidden"),children:[e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold text-foreground flex items-center gap-2",children:[e.jsx(Z,{className:"w-6 h-6 text-primary"}),s({id:"commands.title"})]}),e.jsx("p",{className:"text-muted-foreground mt-1",children:s({id:"commands.description"})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(f,{onClick:()=>c(!0),disabled:C,children:[e.jsx(je,{className:"w-4 h-4 mr-2"}),s({id:"commands.actions.create"})]}),e.jsx("button",{onClick:k,className:j("p-2 rounded-md transition-colors",u?"bg-primary/10 text-primary":"text-muted-foreground hover:text-foreground hover:bg-muted"),title:u?"Exit Fullscreen":"Fullscreen",children:u?e.jsx(Me,{className:"w-4 h-4"}):e.jsx(Ie,{className:"w-4 h-4"})}),e.jsxs(f,{variant:"outline",onClick:()=>L(),disabled:E,children:[e.jsx(ge,{className:j("w-4 h-4 mr-2",E&&"animate-spin")}),s({id:"common.actions.refresh"})]})]})]}),w&&e.jsxs("div",{className:"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive",children:[e.jsx(fe,{className:"h-5 w-5 flex-shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium",children:s({id:"common.errors.loadFailed"})}),e.jsx("p",{className:"text-xs mt-0.5",children:w.message})]}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>L(),children:s({id:"home.errors.retry"})})]}),e.jsx(Ne,{value:n,onValueChange:o=>a(o),tabs:[{value:"project",label:s({id:"commands.location.project"}),icon:e.jsx(_,{className:"h-4 w-4"}),badge:e.jsx($,{variant:"secondary",className:"ml-2",children:h}),disabled:C},{value:"user",label:s({id:"commands.location.user"}),icon:e.jsx(Q,{className:"h-4 w-4"}),badge:e.jsx($,{variant:"secondary",className:"ml-2",children:A}),disabled:C}]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsxs(T,{className:"p-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Z,{className:"w-5 h-5 text-primary"}),e.jsx("span",{className:"text-2xl font-bold",children:I.length})]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:s({id:"commands.stats.total"})})]}),e.jsxs(T,{className:"p-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ve,{className:"w-5 h-5 text-success"}),e.jsx("span",{className:"text-2xl font-bold",children:g})]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:s({id:"commands.stats.enabled"})})]}),e.jsxs(T,{className:"p-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(K,{className:"w-5 h-5 text-muted-foreground"}),e.jsx("span",{className:"text-2xl font-bold",children:y})]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:s({id:"commands.stats.disabled"})})]})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-3",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(be,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"}),e.jsx(G,{placeholder:s({id:"commands.filters.searchPlaceholder"}),value:b,onChange:o=>m(o.target.value),className:"pl-9"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(f,{variant:p?"default":"outline",size:"sm",onClick:()=>t(o=>!o),disabled:C,children:[p?e.jsx(Pe,{className:"w-4 h-4 mr-2"}):e.jsx(Fe,{className:"w-4 h-4 mr-2"}),s(p?{id:"commands.actions.hideDisabled"}:{id:"commands.actions.showDisabled"}),e.jsxs("span",{className:"ml-1 text-xs opacity-70",children:["(",y,")"]})]}),e.jsx(f,{variant:"outline",size:"sm",onClick:W,disabled:x.length===0,children:s({id:"commands.actions.expandAll"})}),e.jsx(f,{variant:"outline",size:"sm",onClick:z,disabled:x.length===0,children:s({id:"commands.actions.collapseAll"})})]})]}),S?e.jsx("div",{className:"space-y-4",children:[1,2,3,4,5].map(o=>e.jsx("div",{className:"h-32 bg-muted animate-pulse rounded-lg"},o))}):x.length===0?e.jsxs(T,{className:"p-8 text-center",children:[e.jsx(Z,{className:"w-12 h-12 mx-auto text-muted-foreground/50"}),e.jsx("h3",{className:"mt-4 text-lg font-medium text-foreground",children:s({id:"commands.emptyState.title"})}),e.jsx("p",{className:"mt-2 text-muted-foreground",children:s({id:"commands.emptyState.message"})})]}):e.jsx("div",{className:"commands-accordion",children:x.map(o=>{const M=i[o]||[];return e.jsx(Te,{groupName:o,commands:M,isExpanded:v.has(o),onToggleExpand:F,onToggleCommand:V,onToggleGroup:r,isToggling:C,showDisabled:p},o)})}),e.jsx(He,{open:N,onOpenChange:c,onCreated:()=>{c(!1),L()}})]})}export{Je as CommandsManagerPage,Je as default};
2
+ //# sourceMappingURL=CommandsManagerPage-C2JWcemF.js.map