claude-code-workflow 7.2.10 → 7.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/.claude/agents/cli-planning-agent.md +3 -0
  2. package/.claude/agents/debug-explore-agent.md +1 -0
  3. package/.claude/agents/tdd-developer.md +1 -0
  4. package/.claude/agents/team-worker.md +1 -1
  5. package/.claude/agents/test-action-planning-agent.md +3 -0
  6. package/.claude/agents/test-context-search-agent.md +1 -0
  7. package/.claude/agents/test-fix-agent.md +3 -0
  8. package/.claude/skills/review-code/SKILL.md +2 -0
  9. package/.claude/skills/review-cycle/SKILL.md +4 -0
  10. package/.claude/skills/skill-simplify/phases/02-optimize.md +4 -0
  11. package/.claude/skills/spec-generator/phases/05-epics-stories.md +4 -0
  12. package/.claude/skills/team-arch-opt/specs/team-config.json +5 -5
  13. package/.claude/skills/team-frontend-debug/roles/analyzer/role.md +3 -2
  14. package/.claude/skills/team-perf-opt/roles/coordinator/commands/monitor.md +1 -1
  15. package/.claude/skills/team-perf-opt/specs/team-config.json +5 -5
  16. package/.claude/skills/team-quality-assurance/roles/executor/role.md +2 -1
  17. package/.claude/skills/team-review/roles/reviewer/role.md +2 -1
  18. package/.claude/skills/team-tech-debt/roles/scanner/role.md +2 -1
  19. package/.claude/skills/team-testing/roles/executor/role.md +2 -1
  20. package/.claude/skills/team-testing/roles/generator/role.md +2 -1
  21. package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +2 -1
  22. package/.claude/skills/team-ux-improve/specs/team-config.json +6 -6
  23. package/.claude/skills/workflow-execute/phases/06-review.md +4 -4
  24. package/.claude/skills/workflow-lite-test-review/SKILL.md +2 -0
  25. package/.claude/skills/workflow-plan/phases/05-plan-verify.md +4 -0
  26. package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +1 -0
  27. package/.claude/skills/workflow-tdd-plan/phases/05-tdd-task-generation.md +2 -1
  28. package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +1 -0
  29. package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +2 -1
  30. package/.claude/skills/workflow-tune/SKILL.md +487 -0
  31. package/.claude/skills/workflow-tune/phases/01-setup.md +548 -0
  32. package/.claude/skills/workflow-tune/phases/02-step-execute.md +197 -0
  33. package/.claude/skills/workflow-tune/phases/03-step-analyze.md +386 -0
  34. package/.claude/skills/workflow-tune/phases/04-synthesize.md +257 -0
  35. package/.claude/skills/workflow-tune/phases/05-optimize-report.md +246 -0
  36. package/.claude/skills/workflow-tune/specs/workflow-eval-criteria.md +57 -0
  37. package/.claude/skills/workflow-tune/templates/step-analysis-prompt.md +88 -0
  38. package/.claude/skills/workflow-tune/templates/synthesis-prompt.md +90 -0
  39. package/.codex/skills/analyze-with-file/SKILL.md +2 -0
  40. package/.codex/skills/debug-with-file/SKILL.md +4 -0
  41. package/.codex/skills/issue-discover/SKILL.md +1 -0
  42. package/.codex/skills/review-cycle/phases/02-parallel-review.md +3 -0
  43. package/.codex/skills/team-designer/agents/validation-reporter.md +186 -0
  44. package/.codex/skills/team-iterdev/agents/gc-controller.md +193 -0
  45. package/.codex/skills/team-iterdev/agents/task-analyzer.md +206 -0
  46. package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +165 -0
  47. package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +163 -0
  48. package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +182 -0
  49. package/.codex/skills/team-uidesign/agents/completion-handler.md +177 -0
  50. package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +162 -0
  51. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +4 -0
  52. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +2 -0
  53. package/ccw/dist/commands/spec.d.ts.map +1 -1
  54. package/ccw/dist/commands/spec.js +9 -4
  55. package/ccw/dist/commands/spec.js.map +1 -1
  56. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  57. package/ccw/dist/core/routes/codexlens-routes.js +3 -1
  58. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  59. package/ccw/dist/tools/spec-index-builder.d.ts +8 -4
  60. package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -1
  61. package/ccw/dist/tools/spec-index-builder.js +8 -4
  62. package/ccw/dist/tools/spec-index-builder.js.map +1 -1
  63. package/ccw/dist/tools/spec-init.d.ts +1 -1
  64. package/ccw/dist/tools/spec-init.d.ts.map +1 -1
  65. package/ccw/dist/tools/spec-init.js +127 -0
  66. package/ccw/dist/tools/spec-init.js.map +1 -1
  67. package/ccw/dist/tools/spec-loader.d.ts.map +1 -1
  68. package/ccw/dist/tools/spec-loader.js +2 -1
  69. package/ccw/dist/tools/spec-loader.js.map +1 -1
  70. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js → AlertDialog-BW9jiZ-p.js} +2 -2
  71. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js.map → AlertDialog-BW9jiZ-p.js.map} +1 -1
  72. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js → AnalysisPage-ds-w_nVO.js} +2 -2
  73. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js.map → AnalysisPage-ds-w_nVO.js.map} +1 -1
  74. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js → ApiSettingsPage-DlCbXxTz.js} +2 -2
  75. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js.map → ApiSettingsPage-DlCbXxTz.js.map} +1 -1
  76. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js → CliModeToggle-Dq3nL4fF.js} +2 -2
  77. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js.map → CliModeToggle-Dq3nL4fF.js.map} +1 -1
  78. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js → CliSessionSharePage-BNDkEE4u.js} +2 -2
  79. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js.map → CliSessionSharePage-BNDkEE4u.js.map} +1 -1
  80. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js → CliViewerPage-ChM-uNx_.js} +2 -2
  81. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js.map → CliViewerPage-ChM-uNx_.js.map} +1 -1
  82. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js +2 -0
  83. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js.map +1 -0
  84. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js → Collapsible-CRNbykXN.js} +2 -2
  85. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js.map → Collapsible-CRNbykXN.js.map} +1 -1
  86. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js → CommandsManagerPage-C2JWcemF.js} +2 -2
  87. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js.map → CommandsManagerPage-C2JWcemF.js.map} +1 -1
  88. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js → DeepWikiPage-CvleOtJy.js} +2 -2
  89. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js.map → DeepWikiPage-CvleOtJy.js.map} +1 -1
  90. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js → EndpointsPage-CMOWQG64.js} +2 -2
  91. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js.map → EndpointsPage-CMOWQG64.js.map} +1 -1
  92. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js → ExplorerPage-DaFPRlNo.js} +2 -2
  93. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js.map → ExplorerPage-DaFPRlNo.js.map} +1 -1
  94. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js → FixSessionPage-CC4p04Az.js} +2 -2
  95. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js.map → FixSessionPage-CC4p04Az.js.map} +1 -1
  96. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js → FloatingFileBrowser-DROn1xZ5.js} +2 -2
  97. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js.map → FloatingFileBrowser-DROn1xZ5.js.map} +1 -1
  98. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js → FloatingPanel-CmL_yhDv.js} +2 -2
  99. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js.map → FloatingPanel-CmL_yhDv.js.map} +1 -1
  100. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js → GraphExplorerPage-DCV5ybKE.js} +2 -2
  101. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js.map → GraphExplorerPage-DCV5ybKE.js.map} +1 -1
  102. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js → HistoryPage-D0fYQZgc.js} +2 -2
  103. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js.map → HistoryPage-D0fYQZgc.js.map} +1 -1
  104. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js → HookManagerPage-D2FuJfsM.js} +2 -2
  105. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js.map → HookManagerPage-D2FuJfsM.js.map} +1 -1
  106. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js → InstallationsPage-tjklillZ.js} +2 -2
  107. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js.map → InstallationsPage-tjklillZ.js.map} +1 -1
  108. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js → IssueHubPage-E4JVrhO1.js} +2 -2
  109. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js.map → IssueHubPage-E4JVrhO1.js.map} +1 -1
  110. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js → LiteTasksPage-aJuRoyLt.js} +2 -2
  111. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js.map → LiteTasksPage-aJuRoyLt.js.map} +1 -1
  112. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js → McpManagerPage-BJeuWJv1.js} +2 -2
  113. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js.map → McpManagerPage-BJeuWJv1.js.map} +1 -1
  114. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js → MemoryPage-BI4FAXhs.js} +2 -2
  115. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js.map → MemoryPage-BI4FAXhs.js.map} +1 -1
  116. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js → NotFoundPage-DD2svchp.js} +2 -2
  117. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js.map → NotFoundPage-DD2svchp.js.map} +1 -1
  118. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js → OrchestratorPage-FC__7yYa.js} +2 -2
  119. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js.map → OrchestratorPage-FC__7yYa.js.map} +1 -1
  120. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js → ProjectOverviewPage-DBB_-FzV.js} +2 -2
  121. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js.map → ProjectOverviewPage-DBB_-FzV.js.map} +1 -1
  122. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js → PromptHistoryPage-BwOAvCH8.js} +2 -2
  123. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js.map → PromptHistoryPage-BwOAvCH8.js.map} +1 -1
  124. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js → ReviewSessionPage-Dd1-g_gp.js} +2 -2
  125. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js.map → ReviewSessionPage-Dd1-g_gp.js.map} +1 -1
  126. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js → RulesManagerPage-B3RGdsKD.js} +2 -2
  127. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js.map → RulesManagerPage-B3RGdsKD.js.map} +1 -1
  128. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js → SessionDetailPage-DM-W5R8K.js} +2 -2
  129. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js.map → SessionDetailPage-DM-W5R8K.js.map} +1 -1
  130. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js → SessionsPage-BVz1KCc7.js} +2 -2
  131. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js.map → SessionsPage-BVz1KCc7.js.map} +1 -1
  132. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js → SettingsPage-ComW7EZS.js} +4 -4
  133. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js.map → SettingsPage-ComW7EZS.js.map} +1 -1
  134. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js → SkillsManagerPage-CKom9XwV.js} +2 -2
  135. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js.map → SkillsManagerPage-CKom9XwV.js.map} +1 -1
  136. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js → SpecsSettingsPage-DQz7WP2s.js} +2 -2
  137. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js.map → SpecsSettingsPage-DQz7WP2s.js.map} +1 -1
  138. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js → Switch-BPMdND9H.js} +2 -2
  139. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js.map → Switch-BPMdND9H.js.map} +1 -1
  140. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js → TabsNavigation-qqt70VYL.js} +2 -2
  141. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js.map → TabsNavigation-qqt70VYL.js.map} +1 -1
  142. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js → TaskDrawer-BqK_qiHX.js} +2 -2
  143. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js.map → TaskDrawer-BqK_qiHX.js.map} +1 -1
  144. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js → TeamPage-u5_i0Rgh.js} +2 -2
  145. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js.map → TeamPage-u5_i0Rgh.js.map} +1 -1
  146. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js → TerminalDashboardPage-rUtC9e40.js} +2 -2
  147. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js.map → TerminalDashboardPage-rUtC9e40.js.map} +1 -1
  148. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js → archive-C3u8YNQF.js} +2 -2
  149. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js.map → archive-C3u8YNQF.js.map} +1 -1
  150. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js → archive-restore-DfQ998g5.js} +2 -2
  151. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js.map → archive-restore-DfQ998g5.js.map} +1 -1
  152. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js → arrow-right-BshJM9Po.js} +2 -2
  153. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js.map → arrow-right-BshJM9Po.js.map} +1 -1
  154. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js → bookmark-plus-D03qJyOZ.js} +2 -2
  155. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js.map → bookmark-plus-D03qJyOZ.js.map} +1 -1
  156. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js → bot-CyzWuwq0.js} +2 -2
  157. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js.map → bot-CyzWuwq0.js.map} +1 -1
  158. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js → braces-BPgtyjsG.js} +2 -2
  159. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js.map → braces-BPgtyjsG.js.map} +1 -1
  160. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js → circle-stop-Dix1AOmw.js} +2 -2
  161. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js.map → circle-stop-Dix1AOmw.js.map} +1 -1
  162. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js → cpu-CCQ4Q0Zh.js} +2 -2
  163. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js.map → cpu-CCQ4Q0Zh.js.map} +1 -1
  164. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js → ellipsis-vertical-BpTysg-Y.js} +2 -2
  165. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js.map → ellipsis-vertical-BpTysg-Y.js.map} +1 -1
  166. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js → eye-DGY1rAZs.js} +2 -2
  167. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js.map → eye-DGY1rAZs.js.map} +1 -1
  168. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js → eye-off-D8t3JfWG.js} +2 -2
  169. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js.map → eye-off-D8t3JfWG.js.map} +1 -1
  170. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js → file-json-BAdJb0n8.js} +2 -2
  171. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js.map → file-json-BAdJb0n8.js.map} +1 -1
  172. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js → file-text-DrJFiOUB.js} +2 -2
  173. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js.map → file-text-DrJFiOUB.js.map} +1 -1
  174. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js → filter-CKqzYbz7.js} +2 -2
  175. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js.map → filter-CKqzYbz7.js.map} +1 -1
  176. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js → folder-CV8511y9.js} +2 -2
  177. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js.map → folder-CV8511y9.js.map} +1 -1
  178. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js → gauge-XKvmu_uU.js} +2 -2
  179. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js.map → gauge-XKvmu_uU.js.map} +1 -1
  180. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js → globe-C56cDUzX.js} +2 -2
  181. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js.map → globe-C56cDUzX.js.map} +1 -1
  182. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js → grid-3x3-Bya-suFW.js} +2 -2
  183. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js.map → grid-3x3-Bya-suFW.js.map} +1 -1
  184. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js → hard-drive-CmuTZpsB.js} +2 -2
  185. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js.map → hard-drive-CmuTZpsB.js.map} +1 -1
  186. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js → hash-CRPT_tJQ.js} +2 -2
  187. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js.map → hash-CRPT_tJQ.js.map} +1 -1
  188. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js → history-C1pJZQCL.js} +2 -2
  189. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js.map → history-C1pJZQCL.js.map} +1 -1
  190. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js → index-B6TpijCe.js} +2 -2
  191. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js.map → index-B6TpijCe.js.map} +1 -1
  192. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js → index-Bcq-7r6F.js} +2 -2
  193. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js.map → index-Bcq-7r6F.js.map} +1 -1
  194. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js → index-CI8-rBff.js} +2 -2
  195. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js.map → index-CI8-rBff.js.map} +1 -1
  196. package/ccw/frontend/dist/assets/{index-CY6Lueph.js → index-Dmt9OiEf.js} +2 -2
  197. package/ccw/frontend/dist/assets/{index-CY6Lueph.js.map → index-Dmt9OiEf.js.map} +1 -1
  198. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js → index-anSMmEF8.js} +2 -2
  199. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js.map → index-anSMmEF8.js.map} +1 -1
  200. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js → index-dWT2M6Ef.js} +4 -4
  201. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js.map → index-dWT2M6Ef.js.map} +1 -1
  202. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js → layout-grid-TSO0BFQE.js} +2 -2
  203. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js.map → layout-grid-TSO0BFQE.js.map} +1 -1
  204. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js → lightbulb-Caj6fIQD.js} +2 -2
  205. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js.map → lightbulb-Caj6fIQD.js.map} +1 -1
  206. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js → link-2-DE9lMxa-.js} +2 -2
  207. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js.map → link-2-DE9lMxa-.js.map} +1 -1
  208. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js → link-BZtPgLW0.js} +2 -2
  209. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js.map → link-BZtPgLW0.js.map} +1 -1
  210. package/ccw/frontend/dist/assets/{list-CDmYFcio.js → list-DubWyY-U.js} +2 -2
  211. package/ccw/frontend/dist/assets/{list-CDmYFcio.js.map → list-DubWyY-U.js.map} +1 -1
  212. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js → map-pin-DwN_48AF.js} +2 -2
  213. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js.map → map-pin-DwN_48AF.js.map} +1 -1
  214. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js → messages-square-bjxvaiM9.js} +2 -2
  215. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js.map → messages-square-bjxvaiM9.js.map} +1 -1
  216. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js → minimize-2-CGfBKD_V.js} +2 -2
  217. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js.map → minimize-2-CGfBKD_V.js.map} +1 -1
  218. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js → package-nzWY6ilt.js} +2 -2
  219. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js.map → package-nzWY6ilt.js.map} +1 -1
  220. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js → plug-CiLce49C.js} +2 -2
  221. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js.map → plug-CiLce49C.js.map} +1 -1
  222. package/ccw/frontend/dist/assets/{power-DmIojFl-.js → power-CFLmB-U9.js} +2 -2
  223. package/ccw/frontend/dist/assets/{power-DmIojFl-.js.map → power-CFLmB-U9.js.map} +1 -1
  224. package/ccw/frontend/dist/assets/{save-BFa03OnG.js → save-DuO6OF0C.js} +2 -2
  225. package/ccw/frontend/dist/assets/{save-BFa03OnG.js.map → save-DuO6OF0C.js.map} +1 -1
  226. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js → send-CZk9p0mM.js} +2 -2
  227. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js.map → send-CZk9p0mM.js.map} +1 -1
  228. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js → square-check-big-BY_1YQQg.js} +2 -2
  229. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js.map → square-check-big-BY_1YQQg.js.map} +1 -1
  230. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js → square-pen-CnZgm6g-.js} +2 -2
  231. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js.map → square-pen-CnZgm6g-.js.map} +1 -1
  232. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js → star-Cn1F0qy7.js} +2 -2
  233. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js.map → star-Cn1F0qy7.js.map} +1 -1
  234. package/ccw/frontend/dist/assets/{style-CJsrp48L.js → style-Dxs1iXCV.js} +2 -2
  235. package/ccw/frontend/dist/assets/{style-CJsrp48L.js.map → style-Dxs1iXCV.js.map} +1 -1
  236. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js → target-Bz1fLRKH.js} +2 -2
  237. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js.map → target-Bz1fLRKH.js.map} +1 -1
  238. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js → test-tube-C6qCYlDr.js} +2 -2
  239. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js.map → test-tube-C6qCYlDr.js.map} +1 -1
  240. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js → upload-C71kd4Qs.js} +2 -2
  241. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js.map → upload-C71kd4Qs.js.map} +1 -1
  242. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js → useApiSettings-CqP2BAJ7.js} +2 -2
  243. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js.map → useApiSettings-CqP2BAJ7.js.map} +1 -1
  244. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js → useCli-PCoPoVeM.js} +2 -2
  245. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js.map → useCli-PCoPoVeM.js.map} +1 -1
  246. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js → useCommands-3OfPQPw4.js} +2 -2
  247. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js.map → useCommands-3OfPQPw4.js.map} +1 -1
  248. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js → useDebounce-bXiFhQx9.js} +2 -2
  249. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js.map → useDebounce-bXiFhQx9.js.map} +1 -1
  250. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js → useFileExplorer-DEyUm46_.js} +2 -2
  251. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js.map → useFileExplorer-DEyUm46_.js.map} +1 -1
  252. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js → useLocale-sXTrdxcJ.js} +2 -2
  253. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js.map → useLocale-sXTrdxcJ.js.map} +1 -1
  254. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js → useSkills-D0W0kXYm.js} +3 -3
  255. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js.map → useSkills-D0W0kXYm.js.map} +1 -1
  256. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js → useSystemSettings-DZ-8lZsG.js} +2 -2
  257. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js.map → useSystemSettings-DZ-8lZsG.js.map} +1 -1
  258. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js → wand-sparkles-83GmAYuw.js} +2 -2
  259. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js.map → wand-sparkles-83GmAYuw.js.map} +1 -1
  260. package/ccw/frontend/dist/index.html +1 -1
  261. package/package.json +1 -1
  262. package/.claude/skills/team-arch-opt/role-specs/analyzer.md +0 -80
  263. package/.claude/skills/team-arch-opt/role-specs/designer.md +0 -118
  264. package/.claude/skills/team-arch-opt/role-specs/refactorer.md +0 -106
  265. package/.claude/skills/team-arch-opt/role-specs/reviewer.md +0 -116
  266. package/.claude/skills/team-arch-opt/role-specs/validator.md +0 -117
  267. package/.claude/skills/team-brainstorm/role-specs/challenger.md +0 -63
  268. package/.claude/skills/team-brainstorm/role-specs/evaluator.md +0 -58
  269. package/.claude/skills/team-brainstorm/role-specs/ideator.md +0 -71
  270. package/.claude/skills/team-brainstorm/role-specs/synthesizer.md +0 -59
  271. package/.claude/skills/team-frontend/role-specs/analyst.md +0 -91
  272. package/.claude/skills/team-frontend/role-specs/architect.md +0 -85
  273. package/.claude/skills/team-frontend/role-specs/developer.md +0 -92
  274. package/.claude/skills/team-frontend/role-specs/qa.md +0 -78
  275. package/.claude/skills/team-issue/role-specs/explorer.md +0 -95
  276. package/.claude/skills/team-issue/role-specs/implementer.md +0 -89
  277. package/.claude/skills/team-issue/role-specs/integrator.md +0 -86
  278. package/.claude/skills/team-issue/role-specs/planner.md +0 -83
  279. package/.claude/skills/team-issue/role-specs/reviewer.md +0 -89
  280. package/.claude/skills/team-iterdev/role-specs/architect.md +0 -64
  281. package/.claude/skills/team-iterdev/role-specs/developer.md +0 -73
  282. package/.claude/skills/team-iterdev/role-specs/reviewer.md +0 -65
  283. package/.claude/skills/team-iterdev/role-specs/tester.md +0 -87
  284. package/.claude/skills/team-perf-opt/role-specs/benchmarker.md +0 -110
  285. package/.claude/skills/team-perf-opt/role-specs/optimizer.md +0 -102
  286. package/.claude/skills/team-perf-opt/role-specs/profiler.md +0 -73
  287. package/.claude/skills/team-perf-opt/role-specs/reviewer.md +0 -91
  288. package/.claude/skills/team-perf-opt/role-specs/strategist.md +0 -114
  289. package/.claude/skills/team-planex/role-specs/executor.md +0 -90
  290. package/.claude/skills/team-planex/role-specs/planner.md +0 -110
  291. package/.claude/skills/team-quality-assurance/role-specs/analyst.md +0 -79
  292. package/.claude/skills/team-quality-assurance/role-specs/executor.md +0 -64
  293. package/.claude/skills/team-quality-assurance/role-specs/generator.md +0 -67
  294. package/.claude/skills/team-quality-assurance/role-specs/scout.md +0 -66
  295. package/.claude/skills/team-quality-assurance/role-specs/strategist.md +0 -70
  296. package/.claude/skills/team-review/role-specs/fixer.md +0 -75
  297. package/.claude/skills/team-review/role-specs/reviewer.md +0 -66
  298. package/.claude/skills/team-review/role-specs/scanner.md +0 -70
  299. package/.claude/skills/team-roadmap-dev/role-specs/executor.md +0 -71
  300. package/.claude/skills/team-roadmap-dev/role-specs/planner.md +0 -77
  301. package/.claude/skills/team-roadmap-dev/role-specs/verifier.md +0 -73
  302. package/.claude/skills/team-tech-debt/role-specs/assessor.md +0 -70
  303. package/.claude/skills/team-tech-debt/role-specs/executor.md +0 -80
  304. package/.claude/skills/team-tech-debt/role-specs/planner.md +0 -71
  305. package/.claude/skills/team-tech-debt/role-specs/scanner.md +0 -85
  306. package/.claude/skills/team-tech-debt/role-specs/validator.md +0 -83
  307. package/.claude/skills/team-testing/role-specs/analyst.md +0 -94
  308. package/.claude/skills/team-testing/role-specs/executor.md +0 -97
  309. package/.claude/skills/team-testing/role-specs/generator.md +0 -96
  310. package/.claude/skills/team-testing/role-specs/strategist.md +0 -82
  311. package/.claude/skills/team-uidesign/role-specs/designer.md +0 -72
  312. package/.claude/skills/team-uidesign/role-specs/implementer.md +0 -74
  313. package/.claude/skills/team-uidesign/role-specs/researcher.md +0 -84
  314. package/.claude/skills/team-uidesign/role-specs/reviewer.md +0 -70
  315. package/.claude/skills/team-ux-improve/role-specs/designer.md +0 -191
  316. package/.claude/skills/team-ux-improve/role-specs/diagnoser.md +0 -110
  317. package/.claude/skills/team-ux-improve/role-specs/explorer.md +0 -109
  318. package/.claude/skills/team-ux-improve/role-specs/implementer.md +0 -164
  319. package/.claude/skills/team-ux-improve/role-specs/scanner.md +0 -117
  320. package/.claude/skills/team-ux-improve/role-specs/tester.md +0 -163
  321. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js +0 -2
  322. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useApiSettings-CFPww7gU.js","sources":["../../src/hooks/useApiSettings.ts"],"sourcesContent":["// ========================================\n// useApiSettings Hook\n// ========================================\n// TanStack Query hooks for API Settings management\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useFormatMessage } from '../hooks/useLocale';\nimport { useNotifications } from '../hooks/useNotifications';\nimport { sanitizeErrorMessage } from '../utils/errorSanitizer';\nimport {\n fetchProviders,\n createProvider,\n updateProvider,\n deleteProvider,\n testProvider,\n testProviderKey,\n getProviderHealthStatus,\n triggerProviderHealthCheck,\n fetchEndpoints,\n createEndpoint,\n updateEndpoint,\n deleteEndpoint,\n fetchCacheStats,\n clearCache,\n updateCacheSettings,\n fetchModelPools,\n fetchModelPool,\n createModelPool,\n updateModelPool,\n deleteModelPool,\n getAvailableModelsForPool,\n discoverModelsForPool,\n fetchApiConfig,\n syncApiConfig,\n previewYamlConfig,\n fetchCliSettings,\n createCliSettings,\n updateCliSettings,\n deleteCliSettings,\n toggleCliSettingsEnabled,\n type ProviderCredential,\n type CustomEndpoint,\n type CacheStats,\n type ModelPoolConfig,\n type ModelPoolType,\n type CliSettingsEndpoint,\n type SaveCliSettingsRequest,\n} from '../lib/api';\n\n// Query key factory\nexport const apiSettingsKeys = {\n all: ['apiSettings'] as const,\n providers: () => [...apiSettingsKeys.all, 'providers'] as const,\n provider: (id: string) => [...apiSettingsKeys.providers(), id] as const,\n endpoints: () => [...apiSettingsKeys.all, 'endpoints'] as const,\n endpoint: (id: string) => [...apiSettingsKeys.endpoints(), id] as const,\n cache: () => [...apiSettingsKeys.all, 'cache'] as const,\n modelPools: () => [...apiSettingsKeys.all, 'modelPools'] as const,\n modelPool: (id: string) => [...apiSettingsKeys.modelPools(), id] as const,\n cliSettings: () => [...apiSettingsKeys.all, 'cliSettings'] as const,\n cliSetting: (id: string) => [...apiSettingsKeys.cliSettings(), id] as const,\n};\n\nconst STALE_TIME = 2 * 60 * 1000;\n\n// ========================================\n// Provider Hooks\n// ========================================\n\nexport interface UseProvidersOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseProvidersReturn {\n providers: ProviderCredential[];\n totalCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useProviders(options: UseProvidersOptions = {}): UseProvidersReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: apiSettingsKeys.providers(),\n queryFn: fetchProviders,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const providers = query.data?.providers ?? [];\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: apiSettingsKeys.providers() });\n };\n\n return {\n providers,\n totalCount: providers.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useCreateProvider() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (provider: Omit<ProviderCredential, 'id' | 'createdAt' | 'updatedAt'>) =>\n createProvider(provider),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.creating' }),\n formatMessage({ id: 'common.feedback.providerCreate.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.providers() });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.providerCreate.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'providerCreate');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n });\n\n return {\n createProvider: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateProvider() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: ({ providerId, updates }: { providerId: string; updates: Partial<Omit<ProviderCredential, 'id' | 'createdAt' | 'updatedAt'>> }) =>\n updateProvider(providerId, updates),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.inProgress' }),\n formatMessage({ id: 'common.feedback.providerUpdate.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.providers() });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.providerUpdate.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'providerUpdate');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n });\n\n return {\n updateProvider: (providerId: string, updates: Partial<Omit<ProviderCredential, 'id' | 'createdAt' | 'updatedAt'>>) =>\n mutation.mutateAsync({ providerId, updates }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteProvider() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (providerId: string) => deleteProvider(providerId),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.deleting' }),\n formatMessage({ id: 'common.feedback.providerDelete.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.providers() });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.providerDelete.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'providerDelete');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n });\n\n return {\n deleteProvider: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useTestProvider() {\n const mutation = useMutation({\n mutationFn: (providerId: string) => testProvider(providerId),\n });\n\n return {\n testProvider: mutation.mutateAsync,\n isTesting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useTestProviderKey() {\n const mutation = useMutation({\n mutationFn: ({ providerId, keyId }: { providerId: string; keyId: string }) =>\n testProviderKey(providerId, keyId),\n });\n\n return {\n testProviderKey: mutation.mutateAsync,\n isTesting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useProviderHealthStatus(providerId: string) {\n return useQuery({\n queryKey: [...apiSettingsKeys.provider(providerId), 'health'],\n queryFn: () => getProviderHealthStatus(providerId),\n enabled: !!providerId,\n staleTime: 30000, // 30 seconds\n refetchInterval: 60000, // Refetch every minute\n });\n}\n\nexport function useTriggerProviderHealthCheck() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (providerId: string) => triggerProviderHealthCheck(providerId),\n onSuccess: (_, providerId) => {\n queryClient.invalidateQueries({ queryKey: [...apiSettingsKeys.provider(providerId), 'health'] });\n },\n });\n\n return {\n triggerHealthCheck: mutation.mutateAsync,\n isChecking: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Endpoint Hooks\n// ========================================\n\nexport interface UseEndpointsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseEndpointsReturn {\n endpoints: CustomEndpoint[];\n totalCount: number;\n cachedCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useEndpoints(options: UseEndpointsOptions = {}): UseEndpointsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: apiSettingsKeys.endpoints(),\n queryFn: fetchEndpoints,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const endpoints = query.data?.endpoints ?? [];\n const cachedEndpoints = endpoints.filter((e) => e.cacheStrategy.enabled);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: apiSettingsKeys.endpoints() });\n };\n\n return {\n endpoints,\n totalCount: endpoints.length,\n cachedCount: cachedEndpoints.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useCreateEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpoint: Omit<CustomEndpoint, 'createdAt' | 'updatedAt'>) =>\n createEndpoint(endpoint),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.endpoints() });\n },\n });\n\n return {\n createEndpoint: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, updates }: { endpointId: string; updates: Partial<Omit<CustomEndpoint, 'id' | 'createdAt' | 'updatedAt'>> }) =>\n updateEndpoint(endpointId, updates),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.endpoints() });\n },\n });\n\n return {\n updateEndpoint: (endpointId: string, updates: Partial<Omit<CustomEndpoint, 'id' | 'createdAt' | 'updatedAt'>>) =>\n mutation.mutateAsync({ endpointId, updates }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpointId: string) => deleteEndpoint(endpointId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.endpoints() });\n },\n });\n\n return {\n deleteEndpoint: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Cache Hooks\n// ========================================\n\nexport interface UseCacheStatsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseCacheStatsReturn {\n stats: CacheStats | null;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport function useCacheStats(options: UseCacheStatsOptions = {}): UseCacheStatsReturn {\n const { staleTime = 30000, enabled = true } = options; // 30 seconds stale time for cache stats\n\n const query = useQuery({\n queryKey: apiSettingsKeys.cache(),\n queryFn: fetchCacheStats,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const refetch = async () => {\n await query.refetch();\n };\n\n return {\n stats: query.data ?? null,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n };\n}\n\nexport function useClearCache() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: () => clearCache(),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cache() });\n },\n });\n\n return {\n clearCache: mutation.mutateAsync,\n isClearing: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateCacheSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (settings: Partial<{ enabled: boolean; cacheDir: string; maxTotalSizeMB: number }>) =>\n updateCacheSettings(settings),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cache() });\n },\n });\n\n return {\n updateCacheSettings: mutation.mutateAsync,\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Model Pool Hooks\n// ========================================\n\nexport interface UseModelPoolsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseModelPoolsReturn {\n pools: ModelPoolConfig[];\n totalCount: number;\n enabledCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useModelPools(options: UseModelPoolsOptions = {}): UseModelPoolsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: apiSettingsKeys.modelPools(),\n queryFn: fetchModelPools,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const pools = query.data?.pools ?? [];\n const enabledPools = pools.filter((p) => p.enabled);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPools() });\n };\n\n return {\n pools,\n totalCount: pools.length,\n enabledCount: enabledPools.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useModelPool(poolId: string) {\n return useQuery({\n queryKey: apiSettingsKeys.modelPool(poolId),\n queryFn: () => fetchModelPool(poolId),\n enabled: !!poolId,\n staleTime: STALE_TIME,\n retry: 2,\n });\n}\n\nexport function useCreateModelPool() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (pool: Omit<ModelPoolConfig, 'id'>) => createModelPool(pool),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPools() });\n },\n });\n\n return {\n createModelPool: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateModelPool() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ poolId, updates }: { poolId: string; updates: Partial<ModelPoolConfig> }) =>\n updateModelPool(poolId, updates),\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPools() });\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPool(variables.poolId) });\n },\n });\n\n return {\n updateModelPool: (poolId: string, updates: Partial<ModelPoolConfig>) =>\n mutation.mutateAsync({ poolId, updates }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteModelPool() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (poolId: string) => deleteModelPool(poolId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPools() });\n },\n });\n\n return {\n deleteModelPool: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useAvailableModelsForPool(modelType: ModelPoolType) {\n return useQuery({\n queryKey: [...apiSettingsKeys.modelPools(), 'available', modelType],\n queryFn: () => getAvailableModelsForPool(modelType),\n enabled: !!modelType,\n staleTime: STALE_TIME,\n });\n}\n\nexport function useDiscoverModelsForPool() {\n const mutation = useMutation({\n mutationFn: ({ modelType, targetModel }: { modelType: ModelPoolType; targetModel: string }) =>\n discoverModelsForPool(modelType, targetModel),\n });\n\n return {\n discoverModels: (modelType: ModelPoolType, targetModel: string) =>\n mutation.mutateAsync({ modelType, targetModel }),\n isDiscovering: mutation.isPending,\n error: mutation.error,\n data: mutation.data,\n };\n}\n\n// ========================================\n// Config Hooks\n// ========================================\n\nexport function useApiConfig() {\n return useQuery({\n queryKey: [...apiSettingsKeys.all, 'config'],\n queryFn: fetchApiConfig,\n staleTime: STALE_TIME,\n });\n}\n\nexport function useSyncApiConfig() {\n return useMutation({\n mutationFn: () => syncApiConfig(),\n });\n}\n\nexport function usePreviewYamlConfig() {\n return useMutation({\n mutationFn: () => previewYamlConfig(),\n });\n}\n\n// ========================================\n// CLI Settings Hooks\n// ========================================\n\nexport interface UseCliSettingsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseCliSettingsReturn {\n cliSettings: CliSettingsEndpoint[];\n totalCount: number;\n enabledCount: number;\n /** Count per provider type */\n providerCounts: Record<string, number>;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useCliSettings(options: UseCliSettingsOptions = {}): UseCliSettingsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: apiSettingsKeys.cliSettings(),\n queryFn: fetchCliSettings,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const cliSettings = query.data?.endpoints ?? [];\n const enabledCliSettings = cliSettings.filter((s) => s.enabled);\n\n // Count settings per provider type\n const providerCounts = cliSettings.reduce<Record<string, number>>((acc, s) => {\n const provider = s.provider || 'claude';\n acc[provider] = (acc[provider] || 0) + 1;\n return acc;\n }, {});\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n };\n\n return {\n cliSettings,\n totalCount: cliSettings.length,\n enabledCount: enabledCliSettings.length,\n providerCounts,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useCreateCliSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (request: SaveCliSettingsRequest) => createCliSettings(request),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n },\n });\n\n return {\n createCliSettings: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateCliSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, request }: { endpointId: string; request: Partial<SaveCliSettingsRequest> }) =>\n updateCliSettings(endpointId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n },\n });\n\n return {\n updateCliSettings: (endpointId: string, request: Partial<SaveCliSettingsRequest>) =>\n mutation.mutateAsync({ endpointId, request }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteCliSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpointId: string) => deleteCliSettings(endpointId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n },\n });\n\n return {\n deleteCliSettings: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useToggleCliSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, enabled }: { endpointId: string; enabled: boolean }) =>\n toggleCliSettingsEnabled(endpointId, enabled),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n },\n });\n\n return {\n toggleCliSettings: (endpointId: string, enabled: boolean) =>\n mutation.mutateAsync({ endpointId, enabled }),\n isToggling: mutation.isPending,\n error: mutation.error,\n };\n}\n"],"names":["apiSettingsKeys","id","STALE_TIME","useProviders","options","staleTime","enabled","queryClient","useQueryClient","query","useQuery","fetchProviders","providers","_a","refetch","invalidate","useCreateProvider","formatMessage","useFormatMessage","success","info","errorToast","useNotifications","mutation","useMutation","provider","createProvider","err","sanitized","sanitizeErrorMessage","message","title","useUpdateProvider","providerId","updates","updateProvider","useDeleteProvider","deleteProvider","useTestProvider","testProvider","useTriggerProviderHealthCheck","triggerProviderHealthCheck","_","useEndpoints","fetchEndpoints","endpoints","cachedEndpoints","e","useCreateEndpoint","endpoint","createEndpoint","useUpdateEndpoint","endpointId","updateEndpoint","useDeleteEndpoint","deleteEndpoint","useCacheStats","fetchCacheStats","useClearCache","clearCache","useUpdateCacheSettings","settings","updateCacheSettings","useModelPools","fetchModelPools","pools","enabledPools","p","useCreateModelPool","pool","createModelPool","useUpdateModelPool","poolId","updateModelPool","variables","useDeleteModelPool","deleteModelPool","useAvailableModelsForPool","modelType","getAvailableModelsForPool","useDiscoverModelsForPool","targetModel","discoverModelsForPool","useSyncApiConfig","syncApiConfig","useCliSettings","fetchCliSettings","cliSettings","enabledCliSettings","s","providerCounts","acc","useCreateCliSettings","request","createCliSettings","useUpdateCliSettings","updateCliSettings","useDeleteCliSettings","deleteCliSettings","useToggleCliSettings","toggleCliSettingsEnabled"],"mappings":"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"}
1
+ {"version":3,"file":"useApiSettings-CqP2BAJ7.js","sources":["../../src/hooks/useApiSettings.ts"],"sourcesContent":["// ========================================\n// useApiSettings Hook\n// ========================================\n// TanStack Query hooks for API Settings management\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useFormatMessage } from '../hooks/useLocale';\nimport { useNotifications } from '../hooks/useNotifications';\nimport { sanitizeErrorMessage } from '../utils/errorSanitizer';\nimport {\n fetchProviders,\n createProvider,\n updateProvider,\n deleteProvider,\n testProvider,\n testProviderKey,\n getProviderHealthStatus,\n triggerProviderHealthCheck,\n fetchEndpoints,\n createEndpoint,\n updateEndpoint,\n deleteEndpoint,\n fetchCacheStats,\n clearCache,\n updateCacheSettings,\n fetchModelPools,\n fetchModelPool,\n createModelPool,\n updateModelPool,\n deleteModelPool,\n getAvailableModelsForPool,\n discoverModelsForPool,\n fetchApiConfig,\n syncApiConfig,\n previewYamlConfig,\n fetchCliSettings,\n createCliSettings,\n updateCliSettings,\n deleteCliSettings,\n toggleCliSettingsEnabled,\n type ProviderCredential,\n type CustomEndpoint,\n type CacheStats,\n type ModelPoolConfig,\n type ModelPoolType,\n type CliSettingsEndpoint,\n type SaveCliSettingsRequest,\n} from '../lib/api';\n\n// Query key factory\nexport const apiSettingsKeys = {\n all: ['apiSettings'] as const,\n providers: () => [...apiSettingsKeys.all, 'providers'] as const,\n provider: (id: string) => [...apiSettingsKeys.providers(), id] as const,\n endpoints: () => [...apiSettingsKeys.all, 'endpoints'] as const,\n endpoint: (id: string) => [...apiSettingsKeys.endpoints(), id] as const,\n cache: () => [...apiSettingsKeys.all, 'cache'] as const,\n modelPools: () => [...apiSettingsKeys.all, 'modelPools'] as const,\n modelPool: (id: string) => [...apiSettingsKeys.modelPools(), id] as const,\n cliSettings: () => [...apiSettingsKeys.all, 'cliSettings'] as const,\n cliSetting: (id: string) => [...apiSettingsKeys.cliSettings(), id] as const,\n};\n\nconst STALE_TIME = 2 * 60 * 1000;\n\n// ========================================\n// Provider Hooks\n// ========================================\n\nexport interface UseProvidersOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseProvidersReturn {\n providers: ProviderCredential[];\n totalCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useProviders(options: UseProvidersOptions = {}): UseProvidersReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: apiSettingsKeys.providers(),\n queryFn: fetchProviders,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const providers = query.data?.providers ?? [];\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: apiSettingsKeys.providers() });\n };\n\n return {\n providers,\n totalCount: providers.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useCreateProvider() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (provider: Omit<ProviderCredential, 'id' | 'createdAt' | 'updatedAt'>) =>\n createProvider(provider),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.creating' }),\n formatMessage({ id: 'common.feedback.providerCreate.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.providers() });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.providerCreate.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'providerCreate');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n });\n\n return {\n createProvider: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateProvider() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: ({ providerId, updates }: { providerId: string; updates: Partial<Omit<ProviderCredential, 'id' | 'createdAt' | 'updatedAt'>> }) =>\n updateProvider(providerId, updates),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.inProgress' }),\n formatMessage({ id: 'common.feedback.providerUpdate.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.providers() });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.providerUpdate.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'providerUpdate');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n });\n\n return {\n updateProvider: (providerId: string, updates: Partial<Omit<ProviderCredential, 'id' | 'createdAt' | 'updatedAt'>>) =>\n mutation.mutateAsync({ providerId, updates }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteProvider() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (providerId: string) => deleteProvider(providerId),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.deleting' }),\n formatMessage({ id: 'common.feedback.providerDelete.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.providers() });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.providerDelete.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'providerDelete');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n });\n\n return {\n deleteProvider: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useTestProvider() {\n const mutation = useMutation({\n mutationFn: (providerId: string) => testProvider(providerId),\n });\n\n return {\n testProvider: mutation.mutateAsync,\n isTesting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useTestProviderKey() {\n const mutation = useMutation({\n mutationFn: ({ providerId, keyId }: { providerId: string; keyId: string }) =>\n testProviderKey(providerId, keyId),\n });\n\n return {\n testProviderKey: mutation.mutateAsync,\n isTesting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useProviderHealthStatus(providerId: string) {\n return useQuery({\n queryKey: [...apiSettingsKeys.provider(providerId), 'health'],\n queryFn: () => getProviderHealthStatus(providerId),\n enabled: !!providerId,\n staleTime: 30000, // 30 seconds\n refetchInterval: 60000, // Refetch every minute\n });\n}\n\nexport function useTriggerProviderHealthCheck() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (providerId: string) => triggerProviderHealthCheck(providerId),\n onSuccess: (_, providerId) => {\n queryClient.invalidateQueries({ queryKey: [...apiSettingsKeys.provider(providerId), 'health'] });\n },\n });\n\n return {\n triggerHealthCheck: mutation.mutateAsync,\n isChecking: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Endpoint Hooks\n// ========================================\n\nexport interface UseEndpointsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseEndpointsReturn {\n endpoints: CustomEndpoint[];\n totalCount: number;\n cachedCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useEndpoints(options: UseEndpointsOptions = {}): UseEndpointsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: apiSettingsKeys.endpoints(),\n queryFn: fetchEndpoints,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const endpoints = query.data?.endpoints ?? [];\n const cachedEndpoints = endpoints.filter((e) => e.cacheStrategy.enabled);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: apiSettingsKeys.endpoints() });\n };\n\n return {\n endpoints,\n totalCount: endpoints.length,\n cachedCount: cachedEndpoints.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useCreateEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpoint: Omit<CustomEndpoint, 'createdAt' | 'updatedAt'>) =>\n createEndpoint(endpoint),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.endpoints() });\n },\n });\n\n return {\n createEndpoint: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, updates }: { endpointId: string; updates: Partial<Omit<CustomEndpoint, 'id' | 'createdAt' | 'updatedAt'>> }) =>\n updateEndpoint(endpointId, updates),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.endpoints() });\n },\n });\n\n return {\n updateEndpoint: (endpointId: string, updates: Partial<Omit<CustomEndpoint, 'id' | 'createdAt' | 'updatedAt'>>) =>\n mutation.mutateAsync({ endpointId, updates }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpointId: string) => deleteEndpoint(endpointId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.endpoints() });\n },\n });\n\n return {\n deleteEndpoint: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Cache Hooks\n// ========================================\n\nexport interface UseCacheStatsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseCacheStatsReturn {\n stats: CacheStats | null;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport function useCacheStats(options: UseCacheStatsOptions = {}): UseCacheStatsReturn {\n const { staleTime = 30000, enabled = true } = options; // 30 seconds stale time for cache stats\n\n const query = useQuery({\n queryKey: apiSettingsKeys.cache(),\n queryFn: fetchCacheStats,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const refetch = async () => {\n await query.refetch();\n };\n\n return {\n stats: query.data ?? null,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n };\n}\n\nexport function useClearCache() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: () => clearCache(),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cache() });\n },\n });\n\n return {\n clearCache: mutation.mutateAsync,\n isClearing: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateCacheSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (settings: Partial<{ enabled: boolean; cacheDir: string; maxTotalSizeMB: number }>) =>\n updateCacheSettings(settings),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cache() });\n },\n });\n\n return {\n updateCacheSettings: mutation.mutateAsync,\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// Model Pool Hooks\n// ========================================\n\nexport interface UseModelPoolsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseModelPoolsReturn {\n pools: ModelPoolConfig[];\n totalCount: number;\n enabledCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useModelPools(options: UseModelPoolsOptions = {}): UseModelPoolsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: apiSettingsKeys.modelPools(),\n queryFn: fetchModelPools,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const pools = query.data?.pools ?? [];\n const enabledPools = pools.filter((p) => p.enabled);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPools() });\n };\n\n return {\n pools,\n totalCount: pools.length,\n enabledCount: enabledPools.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useModelPool(poolId: string) {\n return useQuery({\n queryKey: apiSettingsKeys.modelPool(poolId),\n queryFn: () => fetchModelPool(poolId),\n enabled: !!poolId,\n staleTime: STALE_TIME,\n retry: 2,\n });\n}\n\nexport function useCreateModelPool() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (pool: Omit<ModelPoolConfig, 'id'>) => createModelPool(pool),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPools() });\n },\n });\n\n return {\n createModelPool: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateModelPool() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ poolId, updates }: { poolId: string; updates: Partial<ModelPoolConfig> }) =>\n updateModelPool(poolId, updates),\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPools() });\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPool(variables.poolId) });\n },\n });\n\n return {\n updateModelPool: (poolId: string, updates: Partial<ModelPoolConfig>) =>\n mutation.mutateAsync({ poolId, updates }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteModelPool() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (poolId: string) => deleteModelPool(poolId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.modelPools() });\n },\n });\n\n return {\n deleteModelPool: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useAvailableModelsForPool(modelType: ModelPoolType) {\n return useQuery({\n queryKey: [...apiSettingsKeys.modelPools(), 'available', modelType],\n queryFn: () => getAvailableModelsForPool(modelType),\n enabled: !!modelType,\n staleTime: STALE_TIME,\n });\n}\n\nexport function useDiscoverModelsForPool() {\n const mutation = useMutation({\n mutationFn: ({ modelType, targetModel }: { modelType: ModelPoolType; targetModel: string }) =>\n discoverModelsForPool(modelType, targetModel),\n });\n\n return {\n discoverModels: (modelType: ModelPoolType, targetModel: string) =>\n mutation.mutateAsync({ modelType, targetModel }),\n isDiscovering: mutation.isPending,\n error: mutation.error,\n data: mutation.data,\n };\n}\n\n// ========================================\n// Config Hooks\n// ========================================\n\nexport function useApiConfig() {\n return useQuery({\n queryKey: [...apiSettingsKeys.all, 'config'],\n queryFn: fetchApiConfig,\n staleTime: STALE_TIME,\n });\n}\n\nexport function useSyncApiConfig() {\n return useMutation({\n mutationFn: () => syncApiConfig(),\n });\n}\n\nexport function usePreviewYamlConfig() {\n return useMutation({\n mutationFn: () => previewYamlConfig(),\n });\n}\n\n// ========================================\n// CLI Settings Hooks\n// ========================================\n\nexport interface UseCliSettingsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseCliSettingsReturn {\n cliSettings: CliSettingsEndpoint[];\n totalCount: number;\n enabledCount: number;\n /** Count per provider type */\n providerCounts: Record<string, number>;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useCliSettings(options: UseCliSettingsOptions = {}): UseCliSettingsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: apiSettingsKeys.cliSettings(),\n queryFn: fetchCliSettings,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const cliSettings = query.data?.endpoints ?? [];\n const enabledCliSettings = cliSettings.filter((s) => s.enabled);\n\n // Count settings per provider type\n const providerCounts = cliSettings.reduce<Record<string, number>>((acc, s) => {\n const provider = s.provider || 'claude';\n acc[provider] = (acc[provider] || 0) + 1;\n return acc;\n }, {});\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n };\n\n return {\n cliSettings,\n totalCount: cliSettings.length,\n enabledCount: enabledCliSettings.length,\n providerCounts,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useCreateCliSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (request: SaveCliSettingsRequest) => createCliSettings(request),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n },\n });\n\n return {\n createCliSettings: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateCliSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, request }: { endpointId: string; request: Partial<SaveCliSettingsRequest> }) =>\n updateCliSettings(endpointId, request),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n },\n });\n\n return {\n updateCliSettings: (endpointId: string, request: Partial<SaveCliSettingsRequest>) =>\n mutation.mutateAsync({ endpointId, request }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteCliSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpointId: string) => deleteCliSettings(endpointId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n },\n });\n\n return {\n deleteCliSettings: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useToggleCliSettings() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, enabled }: { endpointId: string; enabled: boolean }) =>\n toggleCliSettingsEnabled(endpointId, enabled),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.cliSettings() });\n },\n });\n\n return {\n toggleCliSettings: (endpointId: string, enabled: boolean) =>\n mutation.mutateAsync({ endpointId, enabled }),\n isToggling: mutation.isPending,\n error: mutation.error,\n };\n}\n"],"names":["apiSettingsKeys","id","STALE_TIME","useProviders","options","staleTime","enabled","queryClient","useQueryClient","query","useQuery","fetchProviders","providers","_a","refetch","invalidate","useCreateProvider","formatMessage","useFormatMessage","success","info","errorToast","useNotifications","mutation","useMutation","provider","createProvider","err","sanitized","sanitizeErrorMessage","message","title","useUpdateProvider","providerId","updates","updateProvider","useDeleteProvider","deleteProvider","useTestProvider","testProvider","useTriggerProviderHealthCheck","triggerProviderHealthCheck","_","useEndpoints","fetchEndpoints","endpoints","cachedEndpoints","e","useCreateEndpoint","endpoint","createEndpoint","useUpdateEndpoint","endpointId","updateEndpoint","useDeleteEndpoint","deleteEndpoint","useCacheStats","fetchCacheStats","useClearCache","clearCache","useUpdateCacheSettings","settings","updateCacheSettings","useModelPools","fetchModelPools","pools","enabledPools","p","useCreateModelPool","pool","createModelPool","useUpdateModelPool","poolId","updateModelPool","variables","useDeleteModelPool","deleteModelPool","useAvailableModelsForPool","modelType","getAvailableModelsForPool","useDiscoverModelsForPool","targetModel","discoverModelsForPool","useSyncApiConfig","syncApiConfig","useCliSettings","fetchCliSettings","cliSettings","enabledCliSettings","s","providerCounts","acc","useCreateCliSettings","request","createCliSettings","useUpdateCliSettings","updateCliSettings","useDeleteCliSettings","deleteCliSettings","useToggleCliSettings","toggleCliSettingsEnabled"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{aF as c,ab as C,aH as g,al as E,a9 as h,aa as K,aC as f,dw as F,dx as b,dy as P,dz as w,dA as S,dB as H,dC as L,dD as M,dE as R,du as _,dF as A,dG as I,dH as U,dI as j,dJ as z,dK as B}from"./index-B6I7GQC5.js";import{a as T}from"./useLocale-D2iHK44M.js";import{s as D}from"./errorSanitizer-IY9pf5g4.js";const l={all:["cliEndpoints"],lists:()=>[...l.all,"list"]},k=120*1e3;function O(s={}){var v;const{staleTime:t=k,enabled:n=!0}=s,r=c(),e=C({queryKey:l.lists(),queryFn:U,staleTime:t,enabled:n,retry:2}),i=((v=e.data)==null?void 0:v.endpoints)??[],o=i.filter(q=>q.enabled),a=i.filter(q=>q.type==="litellm"),u=i.filter(q=>q.type==="custom"),d=i.filter(q=>q.type==="wrapper"),p=async()=>{await e.refetch()},Q=async()=>{await r.invalidateQueries({queryKey:l.all})};return{endpoints:i,litellmEndpoints:a,customEndpoints:u,wrapperEndpoints:d,totalCount:i.length,enabledCount:o.length,isLoading:e.isLoading,isFetching:e.isFetching,error:e.error,refetch:p,invalidate:Q}}function V(){const s=c(),t=g({mutationFn:({endpointId:n,enabled:r})=>F(n,r),onMutate:async({endpointId:n,enabled:r})=>{await s.cancelQueries({queryKey:l.all});const e=s.getQueryData(l.lists());return s.setQueryData(l.lists(),i=>i&&{endpoints:i.endpoints.map(o=>o.id===n?{...o,enabled:r}:o)}),{previousEndpoints:e}},onError:(n,r,e)=>{e!=null&&e.previousEndpoints&&s.setQueryData(l.lists(),e.previousEndpoints)},onSettled:()=>{s.invalidateQueries({queryKey:l.all})}});return{toggleEndpoint:(n,r)=>t.mutateAsync({endpointId:n,enabled:r}),isToggling:t.isPending,error:t.error}}function X(){const s=c(),t=g({mutationFn:n=>b(n),onSuccess:n=>{s.setQueryData(l.lists(),r=>r?{endpoints:[n,...r.endpoints]}:{endpoints:[n]})},onSettled:()=>{s.invalidateQueries({queryKey:l.all})}});return{createEndpoint:t.mutateAsync,isCreating:t.isPending,error:t.error}}function Y(){const s=c(),t=g({mutationFn:({endpointId:n,updates:r})=>P(n,r),onMutate:async({endpointId:n,updates:r})=>{await s.cancelQueries({queryKey:l.all});const e=s.getQueryData(l.lists());return s.setQueryData(l.lists(),i=>i&&{endpoints:i.endpoints.map(o=>o.id===n?{...o,...r}:o)}),{previous:e}},onError:(n,r,e)=>{e!=null&&e.previous&&s.setQueryData(l.lists(),e.previous)},onSettled:()=>{s.invalidateQueries({queryKey:l.all})}});return{updateEndpoint:(n,r)=>t.mutateAsync({endpointId:n,updates:r}),isUpdating:t.isPending,error:t.error}}function Z(){const s=c(),t=g({mutationFn:n=>w(n),onMutate:async n=>{await s.cancelQueries({queryKey:l.all});const r=s.getQueryData(l.lists());return s.setQueryData(l.lists(),e=>e&&{endpoints:e.endpoints.filter(i=>i.id!==n)}),{previous:r}},onError:(n,r,e)=>{e!=null&&e.previous&&s.setQueryData(l.lists(),e.previous)},onSettled:()=>{s.invalidateQueries({queryKey:l.all})}});return{deleteEndpoint:t.mutateAsync,isDeleting:t.isPending,error:t.error}}const m={all:["cliInstallations"],lists:()=>[...m.all,"list"]};function $(s={}){var d;const{staleTime:t=k,enabled:n=!0}=s,r=c(),e=C({queryKey:m.lists(),queryFn:j,staleTime:t,enabled:n,retry:2}),i=((d=e.data)==null?void 0:d.tools)??[],o=i.filter(p=>p.installed),a=async()=>{await e.refetch()},u=async()=>{await r.invalidateQueries({queryKey:m.all})};return{installations:i,installedTools:o,totalCount:i.length,installedCount:o.length,isLoading:e.isLoading,isFetching:e.isFetching,error:e.error,refetch:a,invalidate:u}}function x(){const s=c(),t=T(),{success:n,info:r,error:e}=E(),i=g({mutationFn:o=>S(o),onMutate:()=>{r(t({id:"status.inProgress"}),t({id:"common.feedback.cliToolInstall.success"}))},onSuccess:()=>{s.invalidateQueries({queryKey:m.all}),n(t({id:"common.success"}),t({id:"common.feedback.cliToolInstall.success"}))},onError:o=>{const a=D(o,"cliToolInstall"),u=t({id:a.messageKey}),d=t({id:"common.error"});e(d,u)},onSettled:()=>{s.invalidateQueries({queryKey:m.all})}});return{installTool:i.mutateAsync,isInstalling:i.isPending,error:i.error}}function ee(){const s=c(),t=T(),{success:n,info:r,error:e}=E(),i=g({mutationFn:o=>H(o),onMutate:()=>{r(t({id:"status.inProgress"}),t({id:"common.feedback.cliToolUninstall.success"}))},onSuccess:()=>{s.invalidateQueries({queryKey:m.all}),n(t({id:"common.success"}),t({id:"common.feedback.cliToolUninstall.success"}))},onError:o=>{const a=D(o,"cliToolUninstall"),u=t({id:a.messageKey}),d=t({id:"common.error"});e(d,u)},onSettled:()=>{s.invalidateQueries({queryKey:m.all})}});return{uninstallTool:i.mutateAsync,isUninstalling:i.isPending,error:i.error}}function te(){const s=c(),t=T(),{success:n,info:r,error:e}=E(),i=g({mutationFn:o=>L(o),onMutate:()=>{r(t({id:"status.inProgress"}),t({id:"common.feedback.cliToolUpgrade.success"}))},onSuccess:()=>{s.invalidateQueries({queryKey:m.all}),n(t({id:"common.success"}),t({id:"common.feedback.cliToolUpgrade.success"}))},onError:o=>{const a=D(o,"cliToolUpgrade"),u=t({id:a.messageKey}),d=t({id:"common.error"});e(d,u)},onSettled:()=>{s.invalidateQueries({queryKey:m.all})}});return{upgradeTool:i.mutateAsync,isUpgrading:i.isPending,error:i.error}}const G={all:["hooks"]};function se(s={}){var Q;const{staleTime:t=k,enabled:n=!0}=s,r=c(),e=h(K),i=n&&!!e,o=C({queryKey:f.hooksList(e),queryFn:()=>z(e),staleTime:t,enabled:i,retry:2}),a=((Q=o.data)==null?void 0:Q.hooks)??[],u=a.filter(v=>v.enabled),d=async()=>{await o.refetch()},p=async()=>{await r.invalidateQueries({queryKey:G.all})};return{hooks:a,enabledHooks:u,totalCount:a.length,enabledCount:u.length,isLoading:o.isLoading,isFetching:o.isFetching,error:o.error,refetch:d,invalidate:p}}function ne(){const s=c(),t=h(K),n=g({mutationFn:({hookName:r,enabled:e})=>M(r,e),onMutate:async({hookName:r,enabled:e})=>{const i=f.hooksList(t||"");await s.cancelQueries({queryKey:i});const o=s.getQueryData(i);return s.setQueryData(i,a=>a&&{hooks:a.hooks.map(u=>u.name===r?{...u,enabled:e}:u)}),{previousHooks:o}},onError:(r,e,i)=>{const o=f.hooksList(t||"");i!=null&&i.previousHooks&&s.setQueryData(o,i.previousHooks)},onSettled:()=>{s.invalidateQueries({queryKey:f.hooksList(t||"")})}});return{toggleHook:(r,e)=>n.mutateAsync({hookName:r,enabled:e}),isToggling:n.isPending,error:n.error}}function re(){const s=c(),t=h(K),n=g({mutationFn:r=>{const e=r.scope||"project",i=r.index??0;return R({projectPath:t||void 0,scope:e,event:r.trigger,hookIndex:i})},onMutate:async r=>{const e=f.hooksList(t||"");await s.cancelQueries({queryKey:e});const i=s.getQueryData(e);return s.setQueryData(e,o=>o&&{hooks:o.hooks.filter(a=>a.name!==r.name)}),{previousHooks:i}},onError:(r,e,i)=>{const o=f.hooksList(t||"");i!=null&&i.previousHooks&&s.setQueryData(o,i.previousHooks)},onSettled:()=>{s.invalidateQueries({queryKey:f.hooksList(t||"")})}});return{deleteHook:n.mutateAsync,isDeleting:n.isPending,error:n.error}}const y={all:["rules"],lists:()=>[...y.all,"list"]};function ie(s={}){var p;const{staleTime:t=k,enabled:n=!0}=s,r=c(),e=h(K),i=C({queryKey:f.rulesList(e),queryFn:()=>B(e),staleTime:t,enabled:n,retry:2}),o=((p=i.data)==null?void 0:p.rules)??[],a=o.filter(Q=>Q.enabled),u=async()=>{await i.refetch()},d=async()=>{await r.invalidateQueries({queryKey:y.all})};return{rules:o,enabledRules:a,totalCount:o.length,enabledCount:a.length,isLoading:i.isLoading,isFetching:i.isFetching,error:i.error,refetch:u,invalidate:d}}function oe(){const s=c(),t=g({mutationFn:({ruleId:n,enabled:r})=>I(n,r),onMutate:async({ruleId:n,enabled:r})=>{await s.cancelQueries({queryKey:y.all});const e=s.getQueryData(y.lists());return s.setQueryData(y.lists(),i=>i&&{rules:i.rules.map(o=>o.id===n?{...o,enabled:r}:o)}),{previousRules:e}},onError:(n,r,e)=>{e!=null&&e.previousRules&&s.setQueryData(y.lists(),e.previousRules)},onSettled:()=>{s.invalidateQueries({queryKey:y.all})}});return{toggleRule:(n,r)=>t.mutateAsync({ruleId:n,enabled:r}),isToggling:t.isPending,error:t.error}}function ae(){const s=c(),t=g({mutationFn:n=>_(n),onSuccess:n=>{s.setQueryData(y.lists(),r=>r?{rules:[n,...r.rules]}:{rules:[n]})},onSettled:()=>{s.invalidateQueries({queryKey:y.all})}});return{createRule:t.mutateAsync,isCreating:t.isPending,error:t.error}}function le(){const s=c(),t=g({mutationFn:({ruleId:n,location:r})=>A(n,r),onMutate:async({ruleId:n})=>{await s.cancelQueries({queryKey:y.all});const r=s.getQueryData(y.lists());return s.setQueryData(y.lists(),e=>e&&{rules:e.rules.filter(i=>i.id!==n)}),{previousRules:r}},onError:(n,r,e)=>{e!=null&&e.previousRules&&s.setQueryData(y.lists(),e.previousRules)},onSettled:()=>{s.invalidateQueries({queryKey:y.all})}});return{deleteRule:(n,r)=>t.mutateAsync({ruleId:n,location:r}),isDeleting:t.isPending,error:t.error}}export{V as a,X as b,Y as c,Z as d,$ as e,x as f,ee as g,te as h,se as i,ne as j,re as k,ie as l,ae as m,le as n,oe as o,y as r,O as u};
2
- //# sourceMappingURL=useCli-ByL_a5CD.js.map
1
+ import{aF as c,ab as C,aH as g,al as E,a9 as h,aa as K,aC as f,dw as F,dx as b,dy as P,dz as w,dA as S,dB as H,dC as L,dD as M,dE as R,du as _,dF as A,dG as I,dH as U,dI as j,dJ as z,dK as B}from"./index-dWT2M6Ef.js";import{a as T}from"./useLocale-sXTrdxcJ.js";import{s as D}from"./errorSanitizer-IY9pf5g4.js";const l={all:["cliEndpoints"],lists:()=>[...l.all,"list"]},k=120*1e3;function O(s={}){var v;const{staleTime:t=k,enabled:n=!0}=s,r=c(),e=C({queryKey:l.lists(),queryFn:U,staleTime:t,enabled:n,retry:2}),i=((v=e.data)==null?void 0:v.endpoints)??[],o=i.filter(q=>q.enabled),a=i.filter(q=>q.type==="litellm"),u=i.filter(q=>q.type==="custom"),d=i.filter(q=>q.type==="wrapper"),p=async()=>{await e.refetch()},Q=async()=>{await r.invalidateQueries({queryKey:l.all})};return{endpoints:i,litellmEndpoints:a,customEndpoints:u,wrapperEndpoints:d,totalCount:i.length,enabledCount:o.length,isLoading:e.isLoading,isFetching:e.isFetching,error:e.error,refetch:p,invalidate:Q}}function V(){const s=c(),t=g({mutationFn:({endpointId:n,enabled:r})=>F(n,r),onMutate:async({endpointId:n,enabled:r})=>{await s.cancelQueries({queryKey:l.all});const e=s.getQueryData(l.lists());return s.setQueryData(l.lists(),i=>i&&{endpoints:i.endpoints.map(o=>o.id===n?{...o,enabled:r}:o)}),{previousEndpoints:e}},onError:(n,r,e)=>{e!=null&&e.previousEndpoints&&s.setQueryData(l.lists(),e.previousEndpoints)},onSettled:()=>{s.invalidateQueries({queryKey:l.all})}});return{toggleEndpoint:(n,r)=>t.mutateAsync({endpointId:n,enabled:r}),isToggling:t.isPending,error:t.error}}function X(){const s=c(),t=g({mutationFn:n=>b(n),onSuccess:n=>{s.setQueryData(l.lists(),r=>r?{endpoints:[n,...r.endpoints]}:{endpoints:[n]})},onSettled:()=>{s.invalidateQueries({queryKey:l.all})}});return{createEndpoint:t.mutateAsync,isCreating:t.isPending,error:t.error}}function Y(){const s=c(),t=g({mutationFn:({endpointId:n,updates:r})=>P(n,r),onMutate:async({endpointId:n,updates:r})=>{await s.cancelQueries({queryKey:l.all});const e=s.getQueryData(l.lists());return s.setQueryData(l.lists(),i=>i&&{endpoints:i.endpoints.map(o=>o.id===n?{...o,...r}:o)}),{previous:e}},onError:(n,r,e)=>{e!=null&&e.previous&&s.setQueryData(l.lists(),e.previous)},onSettled:()=>{s.invalidateQueries({queryKey:l.all})}});return{updateEndpoint:(n,r)=>t.mutateAsync({endpointId:n,updates:r}),isUpdating:t.isPending,error:t.error}}function Z(){const s=c(),t=g({mutationFn:n=>w(n),onMutate:async n=>{await s.cancelQueries({queryKey:l.all});const r=s.getQueryData(l.lists());return s.setQueryData(l.lists(),e=>e&&{endpoints:e.endpoints.filter(i=>i.id!==n)}),{previous:r}},onError:(n,r,e)=>{e!=null&&e.previous&&s.setQueryData(l.lists(),e.previous)},onSettled:()=>{s.invalidateQueries({queryKey:l.all})}});return{deleteEndpoint:t.mutateAsync,isDeleting:t.isPending,error:t.error}}const m={all:["cliInstallations"],lists:()=>[...m.all,"list"]};function $(s={}){var d;const{staleTime:t=k,enabled:n=!0}=s,r=c(),e=C({queryKey:m.lists(),queryFn:j,staleTime:t,enabled:n,retry:2}),i=((d=e.data)==null?void 0:d.tools)??[],o=i.filter(p=>p.installed),a=async()=>{await e.refetch()},u=async()=>{await r.invalidateQueries({queryKey:m.all})};return{installations:i,installedTools:o,totalCount:i.length,installedCount:o.length,isLoading:e.isLoading,isFetching:e.isFetching,error:e.error,refetch:a,invalidate:u}}function x(){const s=c(),t=T(),{success:n,info:r,error:e}=E(),i=g({mutationFn:o=>S(o),onMutate:()=>{r(t({id:"status.inProgress"}),t({id:"common.feedback.cliToolInstall.success"}))},onSuccess:()=>{s.invalidateQueries({queryKey:m.all}),n(t({id:"common.success"}),t({id:"common.feedback.cliToolInstall.success"}))},onError:o=>{const a=D(o,"cliToolInstall"),u=t({id:a.messageKey}),d=t({id:"common.error"});e(d,u)},onSettled:()=>{s.invalidateQueries({queryKey:m.all})}});return{installTool:i.mutateAsync,isInstalling:i.isPending,error:i.error}}function ee(){const s=c(),t=T(),{success:n,info:r,error:e}=E(),i=g({mutationFn:o=>H(o),onMutate:()=>{r(t({id:"status.inProgress"}),t({id:"common.feedback.cliToolUninstall.success"}))},onSuccess:()=>{s.invalidateQueries({queryKey:m.all}),n(t({id:"common.success"}),t({id:"common.feedback.cliToolUninstall.success"}))},onError:o=>{const a=D(o,"cliToolUninstall"),u=t({id:a.messageKey}),d=t({id:"common.error"});e(d,u)},onSettled:()=>{s.invalidateQueries({queryKey:m.all})}});return{uninstallTool:i.mutateAsync,isUninstalling:i.isPending,error:i.error}}function te(){const s=c(),t=T(),{success:n,info:r,error:e}=E(),i=g({mutationFn:o=>L(o),onMutate:()=>{r(t({id:"status.inProgress"}),t({id:"common.feedback.cliToolUpgrade.success"}))},onSuccess:()=>{s.invalidateQueries({queryKey:m.all}),n(t({id:"common.success"}),t({id:"common.feedback.cliToolUpgrade.success"}))},onError:o=>{const a=D(o,"cliToolUpgrade"),u=t({id:a.messageKey}),d=t({id:"common.error"});e(d,u)},onSettled:()=>{s.invalidateQueries({queryKey:m.all})}});return{upgradeTool:i.mutateAsync,isUpgrading:i.isPending,error:i.error}}const G={all:["hooks"]};function se(s={}){var Q;const{staleTime:t=k,enabled:n=!0}=s,r=c(),e=h(K),i=n&&!!e,o=C({queryKey:f.hooksList(e),queryFn:()=>z(e),staleTime:t,enabled:i,retry:2}),a=((Q=o.data)==null?void 0:Q.hooks)??[],u=a.filter(v=>v.enabled),d=async()=>{await o.refetch()},p=async()=>{await r.invalidateQueries({queryKey:G.all})};return{hooks:a,enabledHooks:u,totalCount:a.length,enabledCount:u.length,isLoading:o.isLoading,isFetching:o.isFetching,error:o.error,refetch:d,invalidate:p}}function ne(){const s=c(),t=h(K),n=g({mutationFn:({hookName:r,enabled:e})=>M(r,e),onMutate:async({hookName:r,enabled:e})=>{const i=f.hooksList(t||"");await s.cancelQueries({queryKey:i});const o=s.getQueryData(i);return s.setQueryData(i,a=>a&&{hooks:a.hooks.map(u=>u.name===r?{...u,enabled:e}:u)}),{previousHooks:o}},onError:(r,e,i)=>{const o=f.hooksList(t||"");i!=null&&i.previousHooks&&s.setQueryData(o,i.previousHooks)},onSettled:()=>{s.invalidateQueries({queryKey:f.hooksList(t||"")})}});return{toggleHook:(r,e)=>n.mutateAsync({hookName:r,enabled:e}),isToggling:n.isPending,error:n.error}}function re(){const s=c(),t=h(K),n=g({mutationFn:r=>{const e=r.scope||"project",i=r.index??0;return R({projectPath:t||void 0,scope:e,event:r.trigger,hookIndex:i})},onMutate:async r=>{const e=f.hooksList(t||"");await s.cancelQueries({queryKey:e});const i=s.getQueryData(e);return s.setQueryData(e,o=>o&&{hooks:o.hooks.filter(a=>a.name!==r.name)}),{previousHooks:i}},onError:(r,e,i)=>{const o=f.hooksList(t||"");i!=null&&i.previousHooks&&s.setQueryData(o,i.previousHooks)},onSettled:()=>{s.invalidateQueries({queryKey:f.hooksList(t||"")})}});return{deleteHook:n.mutateAsync,isDeleting:n.isPending,error:n.error}}const y={all:["rules"],lists:()=>[...y.all,"list"]};function ie(s={}){var p;const{staleTime:t=k,enabled:n=!0}=s,r=c(),e=h(K),i=C({queryKey:f.rulesList(e),queryFn:()=>B(e),staleTime:t,enabled:n,retry:2}),o=((p=i.data)==null?void 0:p.rules)??[],a=o.filter(Q=>Q.enabled),u=async()=>{await i.refetch()},d=async()=>{await r.invalidateQueries({queryKey:y.all})};return{rules:o,enabledRules:a,totalCount:o.length,enabledCount:a.length,isLoading:i.isLoading,isFetching:i.isFetching,error:i.error,refetch:u,invalidate:d}}function oe(){const s=c(),t=g({mutationFn:({ruleId:n,enabled:r})=>I(n,r),onMutate:async({ruleId:n,enabled:r})=>{await s.cancelQueries({queryKey:y.all});const e=s.getQueryData(y.lists());return s.setQueryData(y.lists(),i=>i&&{rules:i.rules.map(o=>o.id===n?{...o,enabled:r}:o)}),{previousRules:e}},onError:(n,r,e)=>{e!=null&&e.previousRules&&s.setQueryData(y.lists(),e.previousRules)},onSettled:()=>{s.invalidateQueries({queryKey:y.all})}});return{toggleRule:(n,r)=>t.mutateAsync({ruleId:n,enabled:r}),isToggling:t.isPending,error:t.error}}function ae(){const s=c(),t=g({mutationFn:n=>_(n),onSuccess:n=>{s.setQueryData(y.lists(),r=>r?{rules:[n,...r.rules]}:{rules:[n]})},onSettled:()=>{s.invalidateQueries({queryKey:y.all})}});return{createRule:t.mutateAsync,isCreating:t.isPending,error:t.error}}function le(){const s=c(),t=g({mutationFn:({ruleId:n,location:r})=>A(n,r),onMutate:async({ruleId:n})=>{await s.cancelQueries({queryKey:y.all});const r=s.getQueryData(y.lists());return s.setQueryData(y.lists(),e=>e&&{rules:e.rules.filter(i=>i.id!==n)}),{previousRules:r}},onError:(n,r,e)=>{e!=null&&e.previousRules&&s.setQueryData(y.lists(),e.previousRules)},onSettled:()=>{s.invalidateQueries({queryKey:y.all})}});return{deleteRule:(n,r)=>t.mutateAsync({ruleId:n,location:r}),isDeleting:t.isPending,error:t.error}}export{V as a,X as b,Y as c,Z as d,$ as e,x as f,ee as g,te as h,se as i,ne as j,re as k,ie as l,ae as m,le as n,oe as o,y as r,O as u};
2
+ //# sourceMappingURL=useCli-PCoPoVeM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCli-ByL_a5CD.js","sources":["../../src/hooks/useCli.ts"],"sourcesContent":["// ========================================\r\n// useCliEndpoints Hook\r\n// ========================================\r\n// TanStack Query hooks for CLI endpoint management\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport { useFormatMessage } from '../hooks/useLocale';\r\nimport { useNotifications } from '../hooks/useNotifications';\r\nimport { sanitizeErrorMessage } from '../utils/errorSanitizer';\r\nimport {\r\n fetchCliEndpoints,\r\n toggleCliEndpoint,\r\n createCliEndpoint,\r\n updateCliEndpoint,\r\n deleteCliEndpoint,\r\n type CliEndpoint,\r\n type CliEndpointsResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\n// Query key factory\r\nexport const cliEndpointsKeys = {\r\n all: ['cliEndpoints'] as const,\r\n lists: () => [...cliEndpointsKeys.all, 'list'] as const,\r\n};\r\n\r\nconst STALE_TIME = 2 * 60 * 1000;\r\n\r\nexport interface UseCliEndpointsOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseCliEndpointsReturn {\r\n endpoints: CliEndpoint[];\r\n litellmEndpoints: CliEndpoint[];\r\n customEndpoints: CliEndpoint[];\r\n wrapperEndpoints: CliEndpoint[];\r\n totalCount: number;\r\n enabledCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\nexport function useCliEndpoints(options: UseCliEndpointsOptions = {}): UseCliEndpointsReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n\r\n const query = useQuery({\r\n queryKey: cliEndpointsKeys.lists(),\r\n queryFn: fetchCliEndpoints,\r\n staleTime,\r\n enabled,\r\n retry: 2,\r\n });\r\n\r\n const endpoints = query.data?.endpoints ?? [];\r\n const enabledEndpoints = endpoints.filter((e) => e.enabled);\r\n\r\n const litellmEndpoints = endpoints.filter((e) => e.type === 'litellm');\r\n const customEndpoints = endpoints.filter((e) => e.type === 'custom');\r\n const wrapperEndpoints = endpoints.filter((e) => e.type === 'wrapper');\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n };\r\n\r\n return {\r\n endpoints,\r\n litellmEndpoints,\r\n customEndpoints,\r\n wrapperEndpoints,\r\n totalCount: endpoints.length,\r\n enabledCount: enabledEndpoints.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\nexport function useToggleCliEndpoint() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ endpointId, enabled }: { endpointId: string; enabled: boolean }) =>\r\n toggleCliEndpoint(endpointId, enabled),\r\n onMutate: async ({ endpointId, enabled }) => {\r\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\r\n const previousEndpoints = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\r\n\r\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n endpoints: old.endpoints.map((e) => (e.id === endpointId ? { ...e, enabled } : e)),\r\n };\r\n });\r\n\r\n return { previousEndpoints };\r\n },\r\n onError: (_error, _vars, context) => {\r\n if (context?.previousEndpoints) {\r\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previousEndpoints);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n toggleEndpoint: (endpointId: string, enabled: boolean) => mutation.mutateAsync({ endpointId, enabled }),\r\n isToggling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useCreateCliEndpoint() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (endpoint: Omit<CliEndpoint, 'id'>) => createCliEndpoint(endpoint),\r\n onSuccess: (created) => {\r\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\r\n if (!old) return { endpoints: [created] };\r\n return { endpoints: [created, ...old.endpoints] };\r\n });\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n createEndpoint: mutation.mutateAsync,\r\n isCreating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useUpdateCliEndpoint() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ endpointId, updates }: { endpointId: string; updates: Partial<CliEndpoint> }) =>\r\n updateCliEndpoint(endpointId, updates),\r\n onMutate: async ({ endpointId, updates }) => {\r\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\r\n const previous = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\r\n\r\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n endpoints: old.endpoints.map((e) => (e.id === endpointId ? { ...e, ...updates } : e)),\r\n };\r\n });\r\n\r\n return { previous };\r\n },\r\n onError: (_err, _vars, context) => {\r\n if (context?.previous) {\r\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previous);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n updateEndpoint: (endpointId: string, updates: Partial<CliEndpoint>) =>\r\n mutation.mutateAsync({ endpointId, updates }),\r\n isUpdating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useDeleteCliEndpoint() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (endpointId: string) => deleteCliEndpoint(endpointId),\r\n onMutate: async (endpointId) => {\r\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\r\n const previous = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\r\n\r\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n endpoints: old.endpoints.filter((e) => e.id !== endpointId),\r\n };\r\n });\r\n\r\n return { previous };\r\n },\r\n onError: (_err, _endpointId, context) => {\r\n if (context?.previous) {\r\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previous);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n deleteEndpoint: mutation.mutateAsync,\r\n isDeleting: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\n// ========================================\r\n// useCliInstallations Hook\r\n// ========================================\r\n\r\nimport {\r\n fetchCliInstallations,\r\n installCliTool,\r\n uninstallCliTool,\r\n upgradeCliTool,\r\n type CliInstallation,\r\n} from '../lib/api';\r\n\r\nexport const cliInstallationsKeys = {\r\n all: ['cliInstallations'] as const,\r\n lists: () => [...cliInstallationsKeys.all, 'list'] as const,\r\n};\r\n\r\nexport interface UseCliInstallationsOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseCliInstallationsReturn {\r\n installations: CliInstallation[];\r\n installedTools: CliInstallation[];\r\n totalCount: number;\r\n installedCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\nexport function useCliInstallations(options: UseCliInstallationsOptions = {}): UseCliInstallationsReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n\r\n const query = useQuery({\r\n queryKey: cliInstallationsKeys.lists(),\r\n queryFn: fetchCliInstallations,\r\n staleTime,\r\n enabled,\r\n retry: 2,\r\n });\r\n\r\n const installations = query.data?.tools ?? [];\r\n const installedTools = installations.filter((t) => t.installed);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n };\r\n\r\n return {\r\n installations,\r\n installedTools,\r\n totalCount: installations.length,\r\n installedCount: installedTools.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\nexport function useInstallCliTool() {\r\n const queryClient = useQueryClient();\r\n const formatMessage = useFormatMessage();\r\n const { success, info, error: errorToast } = useNotifications();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (toolName: string) => installCliTool(toolName),\r\n onMutate: () => {\r\n info(\r\n formatMessage({ id: 'status.inProgress' }),\r\n formatMessage({ id: 'common.feedback.cliToolInstall.success' })\r\n );\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n success(\r\n formatMessage({ id: 'common.success' }),\r\n formatMessage({ id: 'common.feedback.cliToolInstall.success' })\r\n );\r\n },\r\n onError: (err) => {\r\n const sanitized = sanitizeErrorMessage(err, 'cliToolInstall');\r\n const message = formatMessage({ id: sanitized.messageKey });\r\n const title = formatMessage({ id: 'common.error' });\r\n errorToast(title, message);\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n installTool: mutation.mutateAsync,\r\n isInstalling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useUninstallCliTool() {\r\n const queryClient = useQueryClient();\r\n const formatMessage = useFormatMessage();\r\n const { success, info, error: errorToast } = useNotifications();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (toolName: string) => uninstallCliTool(toolName),\r\n onMutate: () => {\r\n info(\r\n formatMessage({ id: 'status.inProgress' }),\r\n formatMessage({ id: 'common.feedback.cliToolUninstall.success' })\r\n );\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n success(\r\n formatMessage({ id: 'common.success' }),\r\n formatMessage({ id: 'common.feedback.cliToolUninstall.success' })\r\n );\r\n },\r\n onError: (err) => {\r\n const sanitized = sanitizeErrorMessage(err, 'cliToolUninstall');\r\n const message = formatMessage({ id: sanitized.messageKey });\r\n const title = formatMessage({ id: 'common.error' });\r\n errorToast(title, message);\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n uninstallTool: mutation.mutateAsync,\r\n isUninstalling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useUpgradeCliTool() {\r\n const queryClient = useQueryClient();\r\n const formatMessage = useFormatMessage();\r\n const { success, info, error: errorToast } = useNotifications();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (toolName: string) => upgradeCliTool(toolName),\r\n onMutate: () => {\r\n info(\r\n formatMessage({ id: 'status.inProgress' }),\r\n formatMessage({ id: 'common.feedback.cliToolUpgrade.success' })\r\n );\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n success(\r\n formatMessage({ id: 'common.success' }),\r\n formatMessage({ id: 'common.feedback.cliToolUpgrade.success' })\r\n );\r\n },\r\n onError: (err) => {\r\n const sanitized = sanitizeErrorMessage(err, 'cliToolUpgrade');\r\n const message = formatMessage({ id: sanitized.messageKey });\r\n const title = formatMessage({ id: 'common.error' });\r\n errorToast(title, message);\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n upgradeTool: mutation.mutateAsync,\r\n isUpgrading: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\n// ========================================\r\n// useHooks Hook\r\n// ========================================\r\n\r\nimport {\r\n fetchHooks,\r\n toggleHook,\r\n deleteHook,\r\n type Hook,\r\n type HooksResponse,\r\n} from '../lib/api';\r\n\r\nexport const hooksKeys = {\r\n all: ['hooks'] as const,\r\n lists: () => [...hooksKeys.all, 'list'] as const,\r\n};\r\n\r\nexport interface UseHooksOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseHooksReturn {\r\n hooks: Hook[];\r\n enabledHooks: Hook[];\r\n totalCount: number;\r\n enabledCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\nexport function useHooks(options: UseHooksOptions = {}): UseHooksReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const queryEnabled = enabled && !!projectPath;\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.hooksList(projectPath),\r\n queryFn: () => fetchHooks(projectPath),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n });\r\n\r\n const hooks = query.data?.hooks ?? [];\r\n const enabledHooks = hooks.filter((h) => h.enabled);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: hooksKeys.all });\r\n };\r\n\r\n return {\r\n hooks,\r\n enabledHooks,\r\n totalCount: hooks.length,\r\n enabledCount: enabledHooks.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\nexport function useToggleHook() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ hookName, enabled }: { hookName: string; enabled: boolean }) =>\r\n toggleHook(hookName, enabled),\r\n onMutate: async ({ hookName, enabled }) => {\r\n const queryKey = workspaceQueryKeys.hooksList(projectPath || '');\r\n await queryClient.cancelQueries({ queryKey });\r\n const previousHooks = queryClient.getQueryData<HooksResponse>(queryKey);\r\n\r\n queryClient.setQueryData<HooksResponse>(queryKey, (old) => {\r\n if (!old) return old;\r\n return {\r\n hooks: old.hooks.map((h) => (h.name === hookName ? { ...h, enabled } : h)),\r\n };\r\n });\r\n\r\n return { previousHooks };\r\n },\r\n onError: (_error, _vars, context) => {\r\n const queryKey = workspaceQueryKeys.hooksList(projectPath || '');\r\n if (context?.previousHooks) {\r\n queryClient.setQueryData(queryKey, context.previousHooks);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.hooksList(projectPath || '') });\r\n },\r\n });\r\n\r\n return {\r\n toggleHook: (hookName: string, enabled: boolean) => mutation.mutateAsync({ hookName, enabled }),\r\n isToggling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useDeleteHook() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (hook: { name: string; scope?: 'global' | 'project'; trigger: string; index?: number }) => {\r\n const scope = hook.scope || 'project';\r\n const hookIndex = hook.index ?? 0;\r\n return deleteHook({\r\n projectPath: projectPath || undefined,\r\n scope,\r\n event: hook.trigger,\r\n hookIndex,\r\n });\r\n },\r\n onMutate: async (hook) => {\r\n const queryKey = workspaceQueryKeys.hooksList(projectPath || '');\r\n await queryClient.cancelQueries({ queryKey });\r\n const previousHooks = queryClient.getQueryData<HooksResponse>(queryKey);\r\n\r\n queryClient.setQueryData<HooksResponse>(queryKey, (old) => {\r\n if (!old) return old;\r\n return {\r\n hooks: old.hooks.filter((h) => h.name !== hook.name),\r\n };\r\n });\r\n\r\n return { previousHooks };\r\n },\r\n onError: (_error, _hook, context) => {\r\n const queryKey = workspaceQueryKeys.hooksList(projectPath || '');\r\n if (context?.previousHooks) {\r\n queryClient.setQueryData(queryKey, context.previousHooks);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.hooksList(projectPath || '') });\r\n },\r\n });\r\n\r\n return {\r\n deleteHook: mutation.mutateAsync,\r\n isDeleting: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\n// ========================================\r\n// useRules Hook\r\n// ========================================\r\n\r\nimport {\r\n fetchRules,\r\n toggleRule,\r\n createRule as createRuleApi,\r\n deleteRule as deleteRuleApi,\r\n type Rule,\r\n type RulesResponse,\r\n type RuleCreateInput,\r\n} from '../lib/api';\r\n\r\nexport const rulesKeys = {\r\n all: ['rules'] as const,\r\n lists: () => [...rulesKeys.all, 'list'] as const,\r\n};\r\n\r\nexport interface UseRulesOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseRulesReturn {\r\n rules: Rule[];\r\n enabledRules: Rule[];\r\n totalCount: number;\r\n enabledCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\nexport function useRules(options: UseRulesOptions = {}): UseRulesReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.rulesList(projectPath),\r\n queryFn: () => fetchRules(projectPath),\r\n staleTime,\r\n enabled: enabled, // Remove projectPath requirement\r\n retry: 2,\r\n });\r\n\r\n const rules = query.data?.rules ?? [];\r\n const enabledRules = rules.filter((r) => r.enabled);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: rulesKeys.all });\r\n };\r\n\r\n return {\r\n rules,\r\n enabledRules,\r\n totalCount: rules.length,\r\n enabledCount: enabledRules.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\nexport function useToggleRule() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ ruleId, enabled }: { ruleId: string; enabled: boolean }) =>\r\n toggleRule(ruleId, enabled),\r\n onMutate: async ({ ruleId, enabled }) => {\r\n await queryClient.cancelQueries({ queryKey: rulesKeys.all });\r\n const previousRules = queryClient.getQueryData<RulesResponse>(rulesKeys.lists());\r\n\r\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n rules: old.rules.map((r) => (r.id === ruleId ? { ...r, enabled } : r)),\r\n };\r\n });\r\n\r\n return { previousRules };\r\n },\r\n onError: (_error, _vars, context) => {\r\n if (context?.previousRules) {\r\n queryClient.setQueryData(rulesKeys.lists(), context.previousRules);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n toggleRule: (ruleId: string, enabled: boolean) => mutation.mutateAsync({ ruleId, enabled }),\r\n isToggling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useCreateRule() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (input: RuleCreateInput) => createRuleApi(input),\r\n onSuccess: (newRule) => {\r\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\r\n if (!old) return { rules: [newRule] };\r\n return {\r\n rules: [newRule, ...old.rules],\r\n };\r\n });\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n createRule: mutation.mutateAsync,\r\n isCreating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useDeleteRule() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ ruleId, location }: { ruleId: string; location?: string }) =>\r\n deleteRuleApi(ruleId, location),\r\n onMutate: async ({ ruleId }) => {\r\n await queryClient.cancelQueries({ queryKey: rulesKeys.all });\r\n const previousRules = queryClient.getQueryData<RulesResponse>(rulesKeys.lists());\r\n\r\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n rules: old.rules.filter((r) => r.id !== ruleId),\r\n };\r\n });\r\n\r\n return { previousRules };\r\n },\r\n onError: (_error, _vars, context) => {\r\n if (context?.previousRules) {\r\n queryClient.setQueryData(rulesKeys.lists(), context.previousRules);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n deleteRule: (ruleId: string, location?: string) => mutation.mutateAsync({ ruleId, location }),\r\n isDeleting: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n"],"names":["cliEndpointsKeys","STALE_TIME","useCliEndpoints","options","staleTime","enabled","queryClient","useQueryClient","query","useQuery","fetchCliEndpoints","endpoints","_a","enabledEndpoints","e","litellmEndpoints","customEndpoints","wrapperEndpoints","refetch","invalidate","useToggleCliEndpoint","mutation","useMutation","endpointId","toggleCliEndpoint","previousEndpoints","old","_error","_vars","context","useCreateCliEndpoint","endpoint","createCliEndpoint","created","useUpdateCliEndpoint","updates","updateCliEndpoint","previous","_err","useDeleteCliEndpoint","deleteCliEndpoint","_endpointId","cliInstallationsKeys","useCliInstallations","fetchCliInstallations","installations","installedTools","t","useInstallCliTool","formatMessage","useFormatMessage","success","info","errorToast","useNotifications","toolName","installCliTool","err","sanitized","sanitizeErrorMessage","message","title","useUninstallCliTool","uninstallCliTool","useUpgradeCliTool","upgradeCliTool","hooksKeys","useHooks","projectPath","useWorkflowStore","selectProjectPath","queryEnabled","workspaceQueryKeys","fetchHooks","hooks","enabledHooks","h","useToggleHook","hookName","toggleHook","queryKey","previousHooks","useDeleteHook","hook","scope","hookIndex","deleteHook","_hook","rulesKeys","useRules","fetchRules","rules","enabledRules","r","useToggleRule","ruleId","toggleRule","previousRules","useCreateRule","input","createRuleApi","newRule","useDeleteRule","location","deleteRuleApi"],"mappings":"sTAsBO,MAAMA,EAAmB,CAC9B,IAAK,CAAC,cAAc,EACpB,MAAO,IAAM,CAAC,GAAGA,EAAiB,IAAK,MAAM,CAC/C,EAEMC,EAAa,IAAS,IAqBrB,SAASC,EAAgBC,EAAkC,GAA2B,OAC3F,KAAM,CAAE,UAAAC,EAAYH,EAAY,QAAAI,EAAU,IAASF,EAC7CG,EAAcC,EAAA,EAEdC,EAAQC,EAAS,CACrB,SAAUT,EAAiB,MAAA,EAC3B,QAASU,EACT,UAAAN,EACA,QAAAC,EACA,MAAO,CAAA,CACR,EAEKM,IAAYC,EAAAJ,EAAM,OAAN,YAAAI,EAAY,YAAa,CAAA,EACrCC,EAAmBF,EAAU,OAAQG,GAAMA,EAAE,OAAO,EAEpDC,EAAmBJ,EAAU,OAAQG,GAAMA,EAAE,OAAS,SAAS,EAC/DE,EAAkBL,EAAU,OAAQG,GAAMA,EAAE,OAAS,QAAQ,EAC7DG,EAAmBN,EAAU,OAAQG,GAAMA,EAAE,OAAS,SAAS,EAE/DI,EAAU,SAAY,CAC1B,MAAMV,EAAM,QAAA,CACd,EAEMW,EAAa,SAAY,CAC7B,MAAMb,EAAY,kBAAkB,CAAE,SAAUN,EAAiB,IAAK,CACxE,EAEA,MAAO,CACL,UAAAW,EACA,iBAAAI,EACA,gBAAAC,EACA,iBAAAC,EACA,WAAYN,EAAU,OACtB,aAAcE,EAAiB,OAC/B,UAAWL,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAU,EACA,WAAAC,CAAA,CAEJ,CAEO,SAASC,GAAuB,CACrC,MAAMd,EAAcC,EAAA,EAEdc,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,WAAAC,EAAY,QAAAlB,KACzBmB,EAAkBD,EAAYlB,CAAO,EACvC,SAAU,MAAO,CAAE,WAAAkB,EAAY,QAAAlB,KAAc,CAC3C,MAAMC,EAAY,cAAc,CAAE,SAAUN,EAAiB,IAAK,EAClE,MAAMyB,EAAoBnB,EAAY,aAAmCN,EAAiB,OAAO,EAEjG,OAAAM,EAAY,aAAmCN,EAAiB,MAAA,EAAU0B,GACnEA,GACE,CACL,UAAWA,EAAI,UAAU,IAAKZ,GAAOA,EAAE,KAAOS,EAAa,CAAE,GAAGT,EAAG,QAAAT,CAAA,EAAYS,CAAE,CAAA,CAEpF,EAEM,CAAE,kBAAAW,CAAA,CACX,EACA,QAAS,CAACE,EAAQC,EAAOC,IAAY,CAC/BA,GAAA,MAAAA,EAAS,mBACXvB,EAAY,aAAaN,EAAiB,MAAA,EAAS6B,EAAQ,iBAAiB,CAEhF,EACA,UAAW,IAAM,CACfvB,EAAY,kBAAkB,CAAE,SAAUN,EAAiB,IAAK,CAClE,CAAA,CACD,EAED,MAAO,CACL,eAAgB,CAACuB,EAAoBlB,IAAqBgB,EAAS,YAAY,CAAE,WAAAE,EAAY,QAAAlB,EAAS,EACtG,WAAYgB,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASS,GAAuB,CACrC,MAAMxB,EAAcC,EAAA,EAEdc,EAAWC,EAAY,CAC3B,WAAaS,GAAsCC,EAAkBD,CAAQ,EAC7E,UAAYE,GAAY,CACtB3B,EAAY,aAAmCN,EAAiB,MAAA,EAAU0B,GACnEA,EACE,CAAE,UAAW,CAACO,EAAS,GAAGP,EAAI,SAAS,CAAA,EAD7B,CAAE,UAAW,CAACO,CAAO,CAAA,CAEvC,CACH,EACA,UAAW,IAAM,CACf3B,EAAY,kBAAkB,CAAE,SAAUN,EAAiB,IAAK,CAClE,CAAA,CACD,EAED,MAAO,CACL,eAAgBqB,EAAS,YACzB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASa,GAAuB,CACrC,MAAM5B,EAAcC,EAAA,EAEdc,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,WAAAC,EAAY,QAAAY,KACzBC,EAAkBb,EAAYY,CAAO,EACvC,SAAU,MAAO,CAAE,WAAAZ,EAAY,QAAAY,KAAc,CAC3C,MAAM7B,EAAY,cAAc,CAAE,SAAUN,EAAiB,IAAK,EAClE,MAAMqC,EAAW/B,EAAY,aAAmCN,EAAiB,OAAO,EAExF,OAAAM,EAAY,aAAmCN,EAAiB,MAAA,EAAU0B,GACnEA,GACE,CACL,UAAWA,EAAI,UAAU,IAAKZ,GAAOA,EAAE,KAAOS,EAAa,CAAE,GAAGT,EAAG,GAAGqB,CAAA,EAAYrB,CAAE,CAAA,CAEvF,EAEM,CAAE,SAAAuB,CAAA,CACX,EACA,QAAS,CAACC,EAAMV,EAAOC,IAAY,CAC7BA,GAAA,MAAAA,EAAS,UACXvB,EAAY,aAAaN,EAAiB,MAAA,EAAS6B,EAAQ,QAAQ,CAEvE,EACA,UAAW,IAAM,CACfvB,EAAY,kBAAkB,CAAE,SAAUN,EAAiB,IAAK,CAClE,CAAA,CACD,EAED,MAAO,CACL,eAAgB,CAACuB,EAAoBY,IACnCd,EAAS,YAAY,CAAE,WAAAE,EAAY,QAAAY,EAAS,EAC9C,WAAYd,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASkB,GAAuB,CACrC,MAAMjC,EAAcC,EAAA,EAEdc,EAAWC,EAAY,CAC3B,WAAaC,GAAuBiB,EAAkBjB,CAAU,EAChE,SAAU,MAAOA,GAAe,CAC9B,MAAMjB,EAAY,cAAc,CAAE,SAAUN,EAAiB,IAAK,EAClE,MAAMqC,EAAW/B,EAAY,aAAmCN,EAAiB,OAAO,EAExF,OAAAM,EAAY,aAAmCN,EAAiB,MAAA,EAAU0B,GACnEA,GACE,CACL,UAAWA,EAAI,UAAU,OAAQZ,GAAMA,EAAE,KAAOS,CAAU,CAAA,CAE7D,EAEM,CAAE,SAAAc,CAAA,CACX,EACA,QAAS,CAACC,EAAMG,EAAaZ,IAAY,CACnCA,GAAA,MAAAA,EAAS,UACXvB,EAAY,aAAaN,EAAiB,MAAA,EAAS6B,EAAQ,QAAQ,CAEvE,EACA,UAAW,IAAM,CACfvB,EAAY,kBAAkB,CAAE,SAAUN,EAAiB,IAAK,CAClE,CAAA,CACD,EAED,MAAO,CACL,eAAgBqB,EAAS,YACzB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAcO,MAAMqB,EAAuB,CAClC,IAAK,CAAC,kBAAkB,EACxB,MAAO,IAAM,CAAC,GAAGA,EAAqB,IAAK,MAAM,CACnD,EAmBO,SAASC,EAAoBxC,EAAsC,GAA+B,OACvG,KAAM,CAAE,UAAAC,EAAYH,EAAY,QAAAI,EAAU,IAASF,EAC7CG,EAAcC,EAAA,EAEdC,EAAQC,EAAS,CACrB,SAAUiC,EAAqB,MAAA,EAC/B,QAASE,EACT,UAAAxC,EACA,QAAAC,EACA,MAAO,CAAA,CACR,EAEKwC,IAAgBjC,EAAAJ,EAAM,OAAN,YAAAI,EAAY,QAAS,CAAA,EACrCkC,EAAiBD,EAAc,OAAQE,GAAMA,EAAE,SAAS,EAExD7B,EAAU,SAAY,CAC1B,MAAMV,EAAM,QAAA,CACd,EAEMW,EAAa,SAAY,CAC7B,MAAMb,EAAY,kBAAkB,CAAE,SAAUoC,EAAqB,IAAK,CAC5E,EAEA,MAAO,CACL,cAAAG,EACA,eAAAC,EACA,WAAYD,EAAc,OAC1B,eAAgBC,EAAe,OAC/B,UAAWtC,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAU,EACA,WAAAC,CAAA,CAEJ,CAEO,SAAS6B,GAAoB,CAClC,MAAM1C,EAAcC,EAAA,EACd0C,EAAgBC,EAAA,EAChB,CAAE,QAAAC,EAAS,KAAAC,EAAM,MAAOC,CAAA,EAAeC,EAAA,EAEvCjC,EAAWC,EAAY,CAC3B,WAAaiC,GAAqBC,EAAeD,CAAQ,EACzD,SAAU,IAAM,CACdH,EACEH,EAAc,CAAE,GAAI,oBAAqB,EACzCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,UAAW,IAAM,CACf3C,EAAY,kBAAkB,CAAE,SAAUoC,EAAqB,IAAK,EACpES,EACEF,EAAc,CAAE,GAAI,iBAAkB,EACtCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,QAAUQ,GAAQ,CAChB,MAAMC,EAAYC,EAAqBF,EAAK,gBAAgB,EACtDG,EAAUX,EAAc,CAAE,GAAIS,EAAU,WAAY,EACpDG,EAAQZ,EAAc,CAAE,GAAI,eAAgB,EAClDI,EAAWQ,EAAOD,CAAO,CAC3B,EACA,UAAW,IAAM,CACftD,EAAY,kBAAkB,CAAE,SAAUoC,EAAqB,IAAK,CACtE,CAAA,CACD,EAED,MAAO,CACL,YAAarB,EAAS,YACtB,aAAcA,EAAS,UACvB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASyC,IAAsB,CACpC,MAAMxD,EAAcC,EAAA,EACd0C,EAAgBC,EAAA,EAChB,CAAE,QAAAC,EAAS,KAAAC,EAAM,MAAOC,CAAA,EAAeC,EAAA,EAEvCjC,EAAWC,EAAY,CAC3B,WAAaiC,GAAqBQ,EAAiBR,CAAQ,EAC3D,SAAU,IAAM,CACdH,EACEH,EAAc,CAAE,GAAI,oBAAqB,EACzCA,EAAc,CAAE,GAAI,0CAAA,CAA4C,CAAA,CAEpE,EACA,UAAW,IAAM,CACf3C,EAAY,kBAAkB,CAAE,SAAUoC,EAAqB,IAAK,EACpES,EACEF,EAAc,CAAE,GAAI,iBAAkB,EACtCA,EAAc,CAAE,GAAI,0CAAA,CAA4C,CAAA,CAEpE,EACA,QAAUQ,GAAQ,CAChB,MAAMC,EAAYC,EAAqBF,EAAK,kBAAkB,EACxDG,EAAUX,EAAc,CAAE,GAAIS,EAAU,WAAY,EACpDG,EAAQZ,EAAc,CAAE,GAAI,eAAgB,EAClDI,EAAWQ,EAAOD,CAAO,CAC3B,EACA,UAAW,IAAM,CACftD,EAAY,kBAAkB,CAAE,SAAUoC,EAAqB,IAAK,CACtE,CAAA,CACD,EAED,MAAO,CACL,cAAerB,EAAS,YACxB,eAAgBA,EAAS,UACzB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAAS2C,IAAoB,CAClC,MAAM1D,EAAcC,EAAA,EACd0C,EAAgBC,EAAA,EAChB,CAAE,QAAAC,EAAS,KAAAC,EAAM,MAAOC,CAAA,EAAeC,EAAA,EAEvCjC,EAAWC,EAAY,CAC3B,WAAaiC,GAAqBU,EAAeV,CAAQ,EACzD,SAAU,IAAM,CACdH,EACEH,EAAc,CAAE,GAAI,oBAAqB,EACzCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,UAAW,IAAM,CACf3C,EAAY,kBAAkB,CAAE,SAAUoC,EAAqB,IAAK,EACpES,EACEF,EAAc,CAAE,GAAI,iBAAkB,EACtCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,QAAUQ,GAAQ,CAChB,MAAMC,EAAYC,EAAqBF,EAAK,gBAAgB,EACtDG,EAAUX,EAAc,CAAE,GAAIS,EAAU,WAAY,EACpDG,EAAQZ,EAAc,CAAE,GAAI,eAAgB,EAClDI,EAAWQ,EAAOD,CAAO,CAC3B,EACA,UAAW,IAAM,CACftD,EAAY,kBAAkB,CAAE,SAAUoC,EAAqB,IAAK,CACtE,CAAA,CACD,EAED,MAAO,CACL,YAAarB,EAAS,YACtB,YAAaA,EAAS,UACtB,MAAOA,EAAS,KAAA,CAEpB,CAcO,MAAM6C,EAAY,CACvB,IAAK,CAAC,OAAO,CAEf,EAmBO,SAASC,GAAShE,EAA2B,GAAoB,OACtE,KAAM,CAAE,UAAAC,EAAYH,EAAY,QAAAI,EAAU,IAASF,EAC7CG,EAAcC,EAAA,EACd6D,EAAcC,EAAiBC,CAAiB,EAEhDC,EAAelE,GAAW,CAAC,CAAC+D,EAE5B5D,EAAQC,EAAS,CACrB,SAAU+D,EAAmB,UAAUJ,CAAW,EAClD,QAAS,IAAMK,EAAWL,CAAW,EACrC,UAAAhE,EACA,QAASmE,EACT,MAAO,CAAA,CACR,EAEKG,IAAQ9D,EAAAJ,EAAM,OAAN,YAAAI,EAAY,QAAS,CAAA,EAC7B+D,EAAeD,EAAM,OAAQE,GAAMA,EAAE,OAAO,EAE5C1D,EAAU,SAAY,CAC1B,MAAMV,EAAM,QAAA,CACd,EAEMW,EAAa,SAAY,CAC7B,MAAMb,EAAY,kBAAkB,CAAE,SAAU4D,EAAU,IAAK,CACjE,EAEA,MAAO,CACL,MAAAQ,EACA,aAAAC,EACA,WAAYD,EAAM,OAClB,aAAcC,EAAa,OAC3B,UAAWnE,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAU,EACA,WAAAC,CAAA,CAEJ,CAEO,SAAS0D,IAAgB,CAC9B,MAAMvE,EAAcC,EAAA,EACd6D,EAAcC,EAAiBC,CAAiB,EAEhDjD,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,SAAAwD,EAAU,QAAAzE,KACvB0E,EAAWD,EAAUzE,CAAO,EAC9B,SAAU,MAAO,CAAE,SAAAyE,EAAU,QAAAzE,KAAc,CACzC,MAAM2E,EAAWR,EAAmB,UAAUJ,GAAe,EAAE,EAC/D,MAAM9D,EAAY,cAAc,CAAE,SAAA0E,EAAU,EAC5C,MAAMC,EAAgB3E,EAAY,aAA4B0E,CAAQ,EAEtE,OAAA1E,EAAY,aAA4B0E,EAAWtD,GAC5CA,GACE,CACL,MAAOA,EAAI,MAAM,IAAKkD,GAAOA,EAAE,OAASE,EAAW,CAAE,GAAGF,EAAG,QAAAvE,CAAA,EAAYuE,CAAE,CAAA,CAE5E,EAEM,CAAE,cAAAK,CAAA,CACX,EACA,QAAS,CAACtD,EAAQC,EAAOC,IAAY,CACnC,MAAMmD,EAAWR,EAAmB,UAAUJ,GAAe,EAAE,EAC3DvC,GAAA,MAAAA,EAAS,eACXvB,EAAY,aAAa0E,EAAUnD,EAAQ,aAAa,CAE5D,EACA,UAAW,IAAM,CACfvB,EAAY,kBAAkB,CAAE,SAAUkE,EAAmB,UAAUJ,GAAe,EAAE,EAAG,CAC7F,CAAA,CACD,EAED,MAAO,CACL,WAAY,CAACU,EAAkBzE,IAAqBgB,EAAS,YAAY,CAAE,SAAAyD,EAAU,QAAAzE,EAAS,EAC9F,WAAYgB,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAAS6D,IAAgB,CAC9B,MAAM5E,EAAcC,EAAA,EACd6D,EAAcC,EAAiBC,CAAiB,EAEhDjD,EAAWC,EAAY,CAC3B,WAAa6D,GAA0F,CACrG,MAAMC,EAAQD,EAAK,OAAS,UACtBE,EAAYF,EAAK,OAAS,EAChC,OAAOG,EAAW,CAChB,YAAalB,GAAe,OAC5B,MAAAgB,EACA,MAAOD,EAAK,QACZ,UAAAE,CAAA,CACD,CACH,EACA,SAAU,MAAOF,GAAS,CACxB,MAAMH,EAAWR,EAAmB,UAAUJ,GAAe,EAAE,EAC/D,MAAM9D,EAAY,cAAc,CAAE,SAAA0E,EAAU,EAC5C,MAAMC,EAAgB3E,EAAY,aAA4B0E,CAAQ,EAEtE,OAAA1E,EAAY,aAA4B0E,EAAWtD,GAC5CA,GACE,CACL,MAAOA,EAAI,MAAM,OAAQkD,GAAMA,EAAE,OAASO,EAAK,IAAI,CAAA,CAEtD,EAEM,CAAE,cAAAF,CAAA,CACX,EACA,QAAS,CAACtD,EAAQ4D,EAAO1D,IAAY,CACnC,MAAMmD,EAAWR,EAAmB,UAAUJ,GAAe,EAAE,EAC3DvC,GAAA,MAAAA,EAAS,eACXvB,EAAY,aAAa0E,EAAUnD,EAAQ,aAAa,CAE5D,EACA,UAAW,IAAM,CACfvB,EAAY,kBAAkB,CAAE,SAAUkE,EAAmB,UAAUJ,GAAe,EAAE,EAAG,CAC7F,CAAA,CACD,EAED,MAAO,CACL,WAAY/C,EAAS,YACrB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAgBO,MAAMmE,EAAY,CACvB,IAAK,CAAC,OAAO,EACb,MAAO,IAAM,CAAC,GAAGA,EAAU,IAAK,MAAM,CACxC,EAmBO,SAASC,GAAStF,EAA2B,GAAoB,OACtE,KAAM,CAAE,UAAAC,EAAYH,EAAY,QAAAI,EAAU,IAASF,EAC7CG,EAAcC,EAAA,EACd6D,EAAcC,EAAiBC,CAAiB,EAEhD9D,EAAQC,EAAS,CACrB,SAAU+D,EAAmB,UAAUJ,CAAW,EAClD,QAAS,IAAMsB,EAAWtB,CAAW,EACrC,UAAAhE,EACA,QAAAC,EACA,MAAO,CAAA,CACR,EAEKsF,IAAQ/E,EAAAJ,EAAM,OAAN,YAAAI,EAAY,QAAS,CAAA,EAC7BgF,EAAeD,EAAM,OAAQE,GAAMA,EAAE,OAAO,EAE5C3E,EAAU,SAAY,CAC1B,MAAMV,EAAM,QAAA,CACd,EAEMW,EAAa,SAAY,CAC7B,MAAMb,EAAY,kBAAkB,CAAE,SAAUkF,EAAU,IAAK,CACjE,EAEA,MAAO,CACL,MAAAG,EACA,aAAAC,EACA,WAAYD,EAAM,OAClB,aAAcC,EAAa,OAC3B,UAAWpF,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAU,EACA,WAAAC,CAAA,CAEJ,CAEO,SAAS2E,IAAgB,CAC9B,MAAMxF,EAAcC,EAAA,EAEdc,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,OAAAyE,EAAQ,QAAA1F,KACrB2F,EAAWD,EAAQ1F,CAAO,EAC5B,SAAU,MAAO,CAAE,OAAA0F,EAAQ,QAAA1F,KAAc,CACvC,MAAMC,EAAY,cAAc,CAAE,SAAUkF,EAAU,IAAK,EAC3D,MAAMS,EAAgB3F,EAAY,aAA4BkF,EAAU,OAAO,EAE/E,OAAAlF,EAAY,aAA4BkF,EAAU,MAAA,EAAU9D,GACrDA,GACE,CACL,MAAOA,EAAI,MAAM,IAAKmE,GAAOA,EAAE,KAAOE,EAAS,CAAE,GAAGF,EAAG,QAAAxF,CAAA,EAAYwF,CAAE,CAAA,CAExE,EAEM,CAAE,cAAAI,CAAA,CACX,EACA,QAAS,CAACtE,EAAQC,EAAOC,IAAY,CAC/BA,GAAA,MAAAA,EAAS,eACXvB,EAAY,aAAakF,EAAU,MAAA,EAAS3D,EAAQ,aAAa,CAErE,EACA,UAAW,IAAM,CACfvB,EAAY,kBAAkB,CAAE,SAAUkF,EAAU,IAAK,CAC3D,CAAA,CACD,EAED,MAAO,CACL,WAAY,CAACO,EAAgB1F,IAAqBgB,EAAS,YAAY,CAAE,OAAA0E,EAAQ,QAAA1F,EAAS,EAC1F,WAAYgB,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAAS6E,IAAgB,CAC9B,MAAM5F,EAAcC,EAAA,EAEdc,EAAWC,EAAY,CAC3B,WAAa6E,GAA2BC,EAAcD,CAAK,EAC3D,UAAYE,GAAY,CACtB/F,EAAY,aAA4BkF,EAAU,MAAA,EAAU9D,GACrDA,EACE,CACL,MAAO,CAAC2E,EAAS,GAAG3E,EAAI,KAAK,CAAA,EAFd,CAAE,MAAO,CAAC2E,CAAO,CAAA,CAInC,CACH,EACA,UAAW,IAAM,CACf/F,EAAY,kBAAkB,CAAE,SAAUkF,EAAU,IAAK,CAC3D,CAAA,CACD,EAED,MAAO,CACL,WAAYnE,EAAS,YACrB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASiF,IAAgB,CAC9B,MAAMhG,EAAcC,EAAA,EAEdc,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,OAAAyE,EAAQ,SAAAQ,KACrBC,EAAcT,EAAQQ,CAAQ,EAChC,SAAU,MAAO,CAAE,OAAAR,KAAa,CAC9B,MAAMzF,EAAY,cAAc,CAAE,SAAUkF,EAAU,IAAK,EAC3D,MAAMS,EAAgB3F,EAAY,aAA4BkF,EAAU,OAAO,EAE/E,OAAAlF,EAAY,aAA4BkF,EAAU,MAAA,EAAU9D,GACrDA,GACE,CACL,MAAOA,EAAI,MAAM,OAAQmE,GAAMA,EAAE,KAAOE,CAAM,CAAA,CAEjD,EAEM,CAAE,cAAAE,CAAA,CACX,EACA,QAAS,CAACtE,EAAQC,EAAOC,IAAY,CAC/BA,GAAA,MAAAA,EAAS,eACXvB,EAAY,aAAakF,EAAU,MAAA,EAAS3D,EAAQ,aAAa,CAErE,EACA,UAAW,IAAM,CACfvB,EAAY,kBAAkB,CAAE,SAAUkF,EAAU,IAAK,CAC3D,CAAA,CACD,EAED,MAAO,CACL,WAAY,CAACO,EAAgBQ,IAAsBlF,EAAS,YAAY,CAAE,OAAA0E,EAAQ,SAAAQ,EAAU,EAC5F,WAAYlF,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB"}
1
+ {"version":3,"file":"useCli-PCoPoVeM.js","sources":["../../src/hooks/useCli.ts"],"sourcesContent":["// ========================================\r\n// useCliEndpoints Hook\r\n// ========================================\r\n// TanStack Query hooks for CLI endpoint management\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport { useFormatMessage } from '../hooks/useLocale';\r\nimport { useNotifications } from '../hooks/useNotifications';\r\nimport { sanitizeErrorMessage } from '../utils/errorSanitizer';\r\nimport {\r\n fetchCliEndpoints,\r\n toggleCliEndpoint,\r\n createCliEndpoint,\r\n updateCliEndpoint,\r\n deleteCliEndpoint,\r\n type CliEndpoint,\r\n type CliEndpointsResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\n// Query key factory\r\nexport const cliEndpointsKeys = {\r\n all: ['cliEndpoints'] as const,\r\n lists: () => [...cliEndpointsKeys.all, 'list'] as const,\r\n};\r\n\r\nconst STALE_TIME = 2 * 60 * 1000;\r\n\r\nexport interface UseCliEndpointsOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseCliEndpointsReturn {\r\n endpoints: CliEndpoint[];\r\n litellmEndpoints: CliEndpoint[];\r\n customEndpoints: CliEndpoint[];\r\n wrapperEndpoints: CliEndpoint[];\r\n totalCount: number;\r\n enabledCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\nexport function useCliEndpoints(options: UseCliEndpointsOptions = {}): UseCliEndpointsReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n\r\n const query = useQuery({\r\n queryKey: cliEndpointsKeys.lists(),\r\n queryFn: fetchCliEndpoints,\r\n staleTime,\r\n enabled,\r\n retry: 2,\r\n });\r\n\r\n const endpoints = query.data?.endpoints ?? [];\r\n const enabledEndpoints = endpoints.filter((e) => e.enabled);\r\n\r\n const litellmEndpoints = endpoints.filter((e) => e.type === 'litellm');\r\n const customEndpoints = endpoints.filter((e) => e.type === 'custom');\r\n const wrapperEndpoints = endpoints.filter((e) => e.type === 'wrapper');\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n };\r\n\r\n return {\r\n endpoints,\r\n litellmEndpoints,\r\n customEndpoints,\r\n wrapperEndpoints,\r\n totalCount: endpoints.length,\r\n enabledCount: enabledEndpoints.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\nexport function useToggleCliEndpoint() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ endpointId, enabled }: { endpointId: string; enabled: boolean }) =>\r\n toggleCliEndpoint(endpointId, enabled),\r\n onMutate: async ({ endpointId, enabled }) => {\r\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\r\n const previousEndpoints = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\r\n\r\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n endpoints: old.endpoints.map((e) => (e.id === endpointId ? { ...e, enabled } : e)),\r\n };\r\n });\r\n\r\n return { previousEndpoints };\r\n },\r\n onError: (_error, _vars, context) => {\r\n if (context?.previousEndpoints) {\r\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previousEndpoints);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n toggleEndpoint: (endpointId: string, enabled: boolean) => mutation.mutateAsync({ endpointId, enabled }),\r\n isToggling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useCreateCliEndpoint() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (endpoint: Omit<CliEndpoint, 'id'>) => createCliEndpoint(endpoint),\r\n onSuccess: (created) => {\r\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\r\n if (!old) return { endpoints: [created] };\r\n return { endpoints: [created, ...old.endpoints] };\r\n });\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n createEndpoint: mutation.mutateAsync,\r\n isCreating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useUpdateCliEndpoint() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ endpointId, updates }: { endpointId: string; updates: Partial<CliEndpoint> }) =>\r\n updateCliEndpoint(endpointId, updates),\r\n onMutate: async ({ endpointId, updates }) => {\r\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\r\n const previous = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\r\n\r\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n endpoints: old.endpoints.map((e) => (e.id === endpointId ? { ...e, ...updates } : e)),\r\n };\r\n });\r\n\r\n return { previous };\r\n },\r\n onError: (_err, _vars, context) => {\r\n if (context?.previous) {\r\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previous);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n updateEndpoint: (endpointId: string, updates: Partial<CliEndpoint>) =>\r\n mutation.mutateAsync({ endpointId, updates }),\r\n isUpdating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useDeleteCliEndpoint() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (endpointId: string) => deleteCliEndpoint(endpointId),\r\n onMutate: async (endpointId) => {\r\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\r\n const previous = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\r\n\r\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n endpoints: old.endpoints.filter((e) => e.id !== endpointId),\r\n };\r\n });\r\n\r\n return { previous };\r\n },\r\n onError: (_err, _endpointId, context) => {\r\n if (context?.previous) {\r\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previous);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n deleteEndpoint: mutation.mutateAsync,\r\n isDeleting: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\n// ========================================\r\n// useCliInstallations Hook\r\n// ========================================\r\n\r\nimport {\r\n fetchCliInstallations,\r\n installCliTool,\r\n uninstallCliTool,\r\n upgradeCliTool,\r\n type CliInstallation,\r\n} from '../lib/api';\r\n\r\nexport const cliInstallationsKeys = {\r\n all: ['cliInstallations'] as const,\r\n lists: () => [...cliInstallationsKeys.all, 'list'] as const,\r\n};\r\n\r\nexport interface UseCliInstallationsOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseCliInstallationsReturn {\r\n installations: CliInstallation[];\r\n installedTools: CliInstallation[];\r\n totalCount: number;\r\n installedCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\nexport function useCliInstallations(options: UseCliInstallationsOptions = {}): UseCliInstallationsReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n\r\n const query = useQuery({\r\n queryKey: cliInstallationsKeys.lists(),\r\n queryFn: fetchCliInstallations,\r\n staleTime,\r\n enabled,\r\n retry: 2,\r\n });\r\n\r\n const installations = query.data?.tools ?? [];\r\n const installedTools = installations.filter((t) => t.installed);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n };\r\n\r\n return {\r\n installations,\r\n installedTools,\r\n totalCount: installations.length,\r\n installedCount: installedTools.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\nexport function useInstallCliTool() {\r\n const queryClient = useQueryClient();\r\n const formatMessage = useFormatMessage();\r\n const { success, info, error: errorToast } = useNotifications();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (toolName: string) => installCliTool(toolName),\r\n onMutate: () => {\r\n info(\r\n formatMessage({ id: 'status.inProgress' }),\r\n formatMessage({ id: 'common.feedback.cliToolInstall.success' })\r\n );\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n success(\r\n formatMessage({ id: 'common.success' }),\r\n formatMessage({ id: 'common.feedback.cliToolInstall.success' })\r\n );\r\n },\r\n onError: (err) => {\r\n const sanitized = sanitizeErrorMessage(err, 'cliToolInstall');\r\n const message = formatMessage({ id: sanitized.messageKey });\r\n const title = formatMessage({ id: 'common.error' });\r\n errorToast(title, message);\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n installTool: mutation.mutateAsync,\r\n isInstalling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useUninstallCliTool() {\r\n const queryClient = useQueryClient();\r\n const formatMessage = useFormatMessage();\r\n const { success, info, error: errorToast } = useNotifications();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (toolName: string) => uninstallCliTool(toolName),\r\n onMutate: () => {\r\n info(\r\n formatMessage({ id: 'status.inProgress' }),\r\n formatMessage({ id: 'common.feedback.cliToolUninstall.success' })\r\n );\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n success(\r\n formatMessage({ id: 'common.success' }),\r\n formatMessage({ id: 'common.feedback.cliToolUninstall.success' })\r\n );\r\n },\r\n onError: (err) => {\r\n const sanitized = sanitizeErrorMessage(err, 'cliToolUninstall');\r\n const message = formatMessage({ id: sanitized.messageKey });\r\n const title = formatMessage({ id: 'common.error' });\r\n errorToast(title, message);\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n uninstallTool: mutation.mutateAsync,\r\n isUninstalling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useUpgradeCliTool() {\r\n const queryClient = useQueryClient();\r\n const formatMessage = useFormatMessage();\r\n const { success, info, error: errorToast } = useNotifications();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (toolName: string) => upgradeCliTool(toolName),\r\n onMutate: () => {\r\n info(\r\n formatMessage({ id: 'status.inProgress' }),\r\n formatMessage({ id: 'common.feedback.cliToolUpgrade.success' })\r\n );\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n success(\r\n formatMessage({ id: 'common.success' }),\r\n formatMessage({ id: 'common.feedback.cliToolUpgrade.success' })\r\n );\r\n },\r\n onError: (err) => {\r\n const sanitized = sanitizeErrorMessage(err, 'cliToolUpgrade');\r\n const message = formatMessage({ id: sanitized.messageKey });\r\n const title = formatMessage({ id: 'common.error' });\r\n errorToast(title, message);\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n upgradeTool: mutation.mutateAsync,\r\n isUpgrading: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\n// ========================================\r\n// useHooks Hook\r\n// ========================================\r\n\r\nimport {\r\n fetchHooks,\r\n toggleHook,\r\n deleteHook,\r\n type Hook,\r\n type HooksResponse,\r\n} from '../lib/api';\r\n\r\nexport const hooksKeys = {\r\n all: ['hooks'] as const,\r\n lists: () => [...hooksKeys.all, 'list'] as const,\r\n};\r\n\r\nexport interface UseHooksOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseHooksReturn {\r\n hooks: Hook[];\r\n enabledHooks: Hook[];\r\n totalCount: number;\r\n enabledCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\nexport function useHooks(options: UseHooksOptions = {}): UseHooksReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const queryEnabled = enabled && !!projectPath;\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.hooksList(projectPath),\r\n queryFn: () => fetchHooks(projectPath),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n });\r\n\r\n const hooks = query.data?.hooks ?? [];\r\n const enabledHooks = hooks.filter((h) => h.enabled);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: hooksKeys.all });\r\n };\r\n\r\n return {\r\n hooks,\r\n enabledHooks,\r\n totalCount: hooks.length,\r\n enabledCount: enabledHooks.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\nexport function useToggleHook() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ hookName, enabled }: { hookName: string; enabled: boolean }) =>\r\n toggleHook(hookName, enabled),\r\n onMutate: async ({ hookName, enabled }) => {\r\n const queryKey = workspaceQueryKeys.hooksList(projectPath || '');\r\n await queryClient.cancelQueries({ queryKey });\r\n const previousHooks = queryClient.getQueryData<HooksResponse>(queryKey);\r\n\r\n queryClient.setQueryData<HooksResponse>(queryKey, (old) => {\r\n if (!old) return old;\r\n return {\r\n hooks: old.hooks.map((h) => (h.name === hookName ? { ...h, enabled } : h)),\r\n };\r\n });\r\n\r\n return { previousHooks };\r\n },\r\n onError: (_error, _vars, context) => {\r\n const queryKey = workspaceQueryKeys.hooksList(projectPath || '');\r\n if (context?.previousHooks) {\r\n queryClient.setQueryData(queryKey, context.previousHooks);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.hooksList(projectPath || '') });\r\n },\r\n });\r\n\r\n return {\r\n toggleHook: (hookName: string, enabled: boolean) => mutation.mutateAsync({ hookName, enabled }),\r\n isToggling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useDeleteHook() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (hook: { name: string; scope?: 'global' | 'project'; trigger: string; index?: number }) => {\r\n const scope = hook.scope || 'project';\r\n const hookIndex = hook.index ?? 0;\r\n return deleteHook({\r\n projectPath: projectPath || undefined,\r\n scope,\r\n event: hook.trigger,\r\n hookIndex,\r\n });\r\n },\r\n onMutate: async (hook) => {\r\n const queryKey = workspaceQueryKeys.hooksList(projectPath || '');\r\n await queryClient.cancelQueries({ queryKey });\r\n const previousHooks = queryClient.getQueryData<HooksResponse>(queryKey);\r\n\r\n queryClient.setQueryData<HooksResponse>(queryKey, (old) => {\r\n if (!old) return old;\r\n return {\r\n hooks: old.hooks.filter((h) => h.name !== hook.name),\r\n };\r\n });\r\n\r\n return { previousHooks };\r\n },\r\n onError: (_error, _hook, context) => {\r\n const queryKey = workspaceQueryKeys.hooksList(projectPath || '');\r\n if (context?.previousHooks) {\r\n queryClient.setQueryData(queryKey, context.previousHooks);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.hooksList(projectPath || '') });\r\n },\r\n });\r\n\r\n return {\r\n deleteHook: mutation.mutateAsync,\r\n isDeleting: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\n// ========================================\r\n// useRules Hook\r\n// ========================================\r\n\r\nimport {\r\n fetchRules,\r\n toggleRule,\r\n createRule as createRuleApi,\r\n deleteRule as deleteRuleApi,\r\n type Rule,\r\n type RulesResponse,\r\n type RuleCreateInput,\r\n} from '../lib/api';\r\n\r\nexport const rulesKeys = {\r\n all: ['rules'] as const,\r\n lists: () => [...rulesKeys.all, 'list'] as const,\r\n};\r\n\r\nexport interface UseRulesOptions {\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseRulesReturn {\r\n rules: Rule[];\r\n enabledRules: Rule[];\r\n totalCount: number;\r\n enabledCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\nexport function useRules(options: UseRulesOptions = {}): UseRulesReturn {\r\n const { staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.rulesList(projectPath),\r\n queryFn: () => fetchRules(projectPath),\r\n staleTime,\r\n enabled: enabled, // Remove projectPath requirement\r\n retry: 2,\r\n });\r\n\r\n const rules = query.data?.rules ?? [];\r\n const enabledRules = rules.filter((r) => r.enabled);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: rulesKeys.all });\r\n };\r\n\r\n return {\r\n rules,\r\n enabledRules,\r\n totalCount: rules.length,\r\n enabledCount: enabledRules.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\nexport function useToggleRule() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ ruleId, enabled }: { ruleId: string; enabled: boolean }) =>\r\n toggleRule(ruleId, enabled),\r\n onMutate: async ({ ruleId, enabled }) => {\r\n await queryClient.cancelQueries({ queryKey: rulesKeys.all });\r\n const previousRules = queryClient.getQueryData<RulesResponse>(rulesKeys.lists());\r\n\r\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n rules: old.rules.map((r) => (r.id === ruleId ? { ...r, enabled } : r)),\r\n };\r\n });\r\n\r\n return { previousRules };\r\n },\r\n onError: (_error, _vars, context) => {\r\n if (context?.previousRules) {\r\n queryClient.setQueryData(rulesKeys.lists(), context.previousRules);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n toggleRule: (ruleId: string, enabled: boolean) => mutation.mutateAsync({ ruleId, enabled }),\r\n isToggling: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useCreateRule() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: (input: RuleCreateInput) => createRuleApi(input),\r\n onSuccess: (newRule) => {\r\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\r\n if (!old) return { rules: [newRule] };\r\n return {\r\n rules: [newRule, ...old.rules],\r\n };\r\n });\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n createRule: mutation.mutateAsync,\r\n isCreating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport function useDeleteRule() {\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ ruleId, location }: { ruleId: string; location?: string }) =>\r\n deleteRuleApi(ruleId, location),\r\n onMutate: async ({ ruleId }) => {\r\n await queryClient.cancelQueries({ queryKey: rulesKeys.all });\r\n const previousRules = queryClient.getQueryData<RulesResponse>(rulesKeys.lists());\r\n\r\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\r\n if (!old) return old;\r\n return {\r\n rules: old.rules.filter((r) => r.id !== ruleId),\r\n };\r\n });\r\n\r\n return { previousRules };\r\n },\r\n onError: (_error, _vars, context) => {\r\n if (context?.previousRules) {\r\n queryClient.setQueryData(rulesKeys.lists(), context.previousRules);\r\n }\r\n },\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\r\n },\r\n });\r\n\r\n return {\r\n deleteRule: (ruleId: string, location?: string) => mutation.mutateAsync({ ruleId, location }),\r\n isDeleting: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n"],"names":["cliEndpointsKeys","STALE_TIME","useCliEndpoints","options","staleTime","enabled","queryClient","useQueryClient","query","useQuery","fetchCliEndpoints","endpoints","_a","enabledEndpoints","e","litellmEndpoints","customEndpoints","wrapperEndpoints","refetch","invalidate","useToggleCliEndpoint","mutation","useMutation","endpointId","toggleCliEndpoint","previousEndpoints","old","_error","_vars","context","useCreateCliEndpoint","endpoint","createCliEndpoint","created","useUpdateCliEndpoint","updates","updateCliEndpoint","previous","_err","useDeleteCliEndpoint","deleteCliEndpoint","_endpointId","cliInstallationsKeys","useCliInstallations","fetchCliInstallations","installations","installedTools","t","useInstallCliTool","formatMessage","useFormatMessage","success","info","errorToast","useNotifications","toolName","installCliTool","err","sanitized","sanitizeErrorMessage","message","title","useUninstallCliTool","uninstallCliTool","useUpgradeCliTool","upgradeCliTool","hooksKeys","useHooks","projectPath","useWorkflowStore","selectProjectPath","queryEnabled","workspaceQueryKeys","fetchHooks","hooks","enabledHooks","h","useToggleHook","hookName","toggleHook","queryKey","previousHooks","useDeleteHook","hook","scope","hookIndex","deleteHook","_hook","rulesKeys","useRules","fetchRules","rules","enabledRules","r","useToggleRule","ruleId","toggleRule","previousRules","useCreateRule","input","createRuleApi","newRule","useDeleteRule","location","deleteRuleApi"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{aF as q,a9 as v,aa as F,ab as j,aC as p,al as A,aH as L,bU as u,b$ as E,c0 as k,c1 as z}from"./index-B6I7GQC5.js";import{s as M}from"./errorSanitizer-IY9pf5g4.js";const G=600*1e3;function B(){const l=q(),o=v(F),{addToast:f,removeToast:m,success:y,error:g}=A(),c=L({mutationFn:({name:a,enabled:t,location:n})=>E(a,t,n,o),onMutate:()=>({loadingId:f("info",u("common.loading"),void 0,{duration:0})}),onSuccess:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r),y(u("feedback.commandToggle.success")),l.invalidateQueries({queryKey:p.commands(o)})},onError:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r);const d=M(a,"commandToggle");g(u("common.error"),u(d.messageKey))}}),i=L({mutationFn:({groupName:a,enable:t,location:n})=>k(a,t,n,o),onMutate:()=>({loadingId:f("info",u("common.loading"),void 0,{duration:0})}),onSuccess:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r),y(u("feedback.commandToggle.success")),l.invalidateQueries({queryKey:p.commands(o)})},onError:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r);const d=M(a,"commandToggle");g(u("common.error"),u(d.messageKey))}});return{toggleCommand:(a,t,n)=>c.mutateAsync({name:a,enabled:t,location:n}),toggleGroup:(a,t,n)=>i.mutateAsync({groupName:a,enable:t,location:n}),isToggling:c.isPending||i.isPending}}function D(l={}){var _;const{filter:o,staleTime:f=G,enabled:m=!0}=l,y=q(),g=v(F),c=j({queryKey:p.commandsList(g),queryFn:()=>z(g),staleTime:f,enabled:m,retry:2}),i=((_=c.data)==null?void 0:_.commands)??[],a=i.filter(e=>e.location==="project").length,t=i.filter(e=>e.location==="user").length,n=(()=>{let e=i;if(o!=null&&o.search){const s=o.search.toLowerCase();e=e.filter(h=>{var T;return h.name.toLowerCase().includes(s)||h.description.toLowerCase().includes(s)||((T=h.aliases)==null?void 0:T.some(S=>S.toLowerCase().includes(s)))})}return o!=null&&o.category&&(e=e.filter(s=>s.category===o.category)),o!=null&&o.source&&(e=e.filter(s=>s.source===o.source)),o!=null&&o.group&&(e=e.filter(s=>s.group===o.group)),o!=null&&o.location&&(e=e.filter(s=>s.location===o.location)),e})(),r=(o==null?void 0:o.showDisabled)===!1?n.filter(e=>e.enabled!==!1):n,d={},I=new Set;for(const e of i){const s=e.category||"Uncategorized";I.add(s),d[s]||(d[s]=[]),d[s].push(e)}const C={},b=new Set,w=n.filter(e=>e.enabled!==!1).length,K=n.length-w;for(const e of n){const s=e.group||"other";b.add(s),C[s]||(C[s]=[]),C[s].push(e)}const P=async()=>{await c.refetch()},Q=async()=>{await y.invalidateQueries({queryKey:p.commands(g)})};return{commands:r,categories:Array.from(I).sort(),commandsByCategory:d,groupedCommands:C,groups:Array.from(b).sort(),enabledCount:w,disabledCount:K,projectCount:a,userCount:t,totalCount:i.length,isLoading:c.isLoading,isFetching:c.isFetching,error:c.error,refetch:P,invalidate:Q}}export{B as a,D as u};
2
- //# sourceMappingURL=useCommands-BvKIoOzB.js.map
1
+ import{aF as q,a9 as v,aa as F,ab as j,aC as p,al as A,aH as L,bU as u,b$ as E,c0 as k,c1 as z}from"./index-dWT2M6Ef.js";import{s as M}from"./errorSanitizer-IY9pf5g4.js";const G=600*1e3;function B(){const l=q(),o=v(F),{addToast:f,removeToast:m,success:y,error:g}=A(),c=L({mutationFn:({name:a,enabled:t,location:n})=>E(a,t,n,o),onMutate:()=>({loadingId:f("info",u("common.loading"),void 0,{duration:0})}),onSuccess:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r),y(u("feedback.commandToggle.success")),l.invalidateQueries({queryKey:p.commands(o)})},onError:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r);const d=M(a,"commandToggle");g(u("common.error"),u(d.messageKey))}}),i=L({mutationFn:({groupName:a,enable:t,location:n})=>k(a,t,n,o),onMutate:()=>({loadingId:f("info",u("common.loading"),void 0,{duration:0})}),onSuccess:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r),y(u("feedback.commandToggle.success")),l.invalidateQueries({queryKey:p.commands(o)})},onError:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r);const d=M(a,"commandToggle");g(u("common.error"),u(d.messageKey))}});return{toggleCommand:(a,t,n)=>c.mutateAsync({name:a,enabled:t,location:n}),toggleGroup:(a,t,n)=>i.mutateAsync({groupName:a,enable:t,location:n}),isToggling:c.isPending||i.isPending}}function D(l={}){var _;const{filter:o,staleTime:f=G,enabled:m=!0}=l,y=q(),g=v(F),c=j({queryKey:p.commandsList(g),queryFn:()=>z(g),staleTime:f,enabled:m,retry:2}),i=((_=c.data)==null?void 0:_.commands)??[],a=i.filter(e=>e.location==="project").length,t=i.filter(e=>e.location==="user").length,n=(()=>{let e=i;if(o!=null&&o.search){const s=o.search.toLowerCase();e=e.filter(h=>{var T;return h.name.toLowerCase().includes(s)||h.description.toLowerCase().includes(s)||((T=h.aliases)==null?void 0:T.some(S=>S.toLowerCase().includes(s)))})}return o!=null&&o.category&&(e=e.filter(s=>s.category===o.category)),o!=null&&o.source&&(e=e.filter(s=>s.source===o.source)),o!=null&&o.group&&(e=e.filter(s=>s.group===o.group)),o!=null&&o.location&&(e=e.filter(s=>s.location===o.location)),e})(),r=(o==null?void 0:o.showDisabled)===!1?n.filter(e=>e.enabled!==!1):n,d={},I=new Set;for(const e of i){const s=e.category||"Uncategorized";I.add(s),d[s]||(d[s]=[]),d[s].push(e)}const C={},b=new Set,w=n.filter(e=>e.enabled!==!1).length,K=n.length-w;for(const e of n){const s=e.group||"other";b.add(s),C[s]||(C[s]=[]),C[s].push(e)}const P=async()=>{await c.refetch()},Q=async()=>{await y.invalidateQueries({queryKey:p.commands(g)})};return{commands:r,categories:Array.from(I).sort(),commandsByCategory:d,groupedCommands:C,groups:Array.from(b).sort(),enabledCount:w,disabledCount:K,projectCount:a,userCount:t,totalCount:i.length,isLoading:c.isLoading,isFetching:c.isFetching,error:c.error,refetch:P,invalidate:Q}}export{B as a,D as u};
2
+ //# sourceMappingURL=useCommands-3OfPQPw4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCommands-BvKIoOzB.js","sources":["../../src/hooks/useCommands.ts"],"sourcesContent":["// ========================================\r\n// useCommands Hook\r\n// ========================================\r\n// TanStack Query hooks for commands management\r\n\r\nimport { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';\r\nimport {\r\n fetchCommands,\r\n toggleCommand as toggleCommandApi,\r\n toggleCommandGroup as toggleCommandGroupApi,\r\n type Command,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { useNotifications } from './useNotifications';\r\nimport { sanitizeErrorMessage } from '@/utils/errorSanitizer';\r\nimport { formatMessage } from '@/lib/i18n';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\n// Default stale time: 10 minutes (commands are static)\r\nconst STALE_TIME = 10 * 60 * 1000;\r\n\r\nexport interface CommandsFilter {\r\n search?: string;\r\n category?: string;\r\n source?: Command['source'];\r\n group?: string;\r\n location?: 'project' | 'user';\r\n showDisabled?: boolean;\r\n}\r\n\r\nexport interface UseCommandsOptions {\r\n filter?: CommandsFilter;\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseCommandsReturn {\r\n commands: Command[];\r\n categories: string[];\r\n commandsByCategory: Record<string, Command[]>;\r\n groupedCommands: Record<string, Command[]>;\r\n groups: string[];\r\n totalCount: number;\r\n enabledCount: number;\r\n disabledCount: number;\r\n projectCount: number;\r\n userCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching and filtering commands\r\n */\r\n\r\nexport interface UseCommandMutationsReturn {\r\n toggleCommand: (name: string, enabled: boolean, location: 'project' | 'user') => Promise<any>;\r\n toggleGroup: (groupName: string, enable: boolean, location: 'project' | 'user') => Promise<any>;\r\n isToggling: boolean;\r\n}\r\n\r\nexport function useCommandMutations(): UseCommandMutationsReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n const { addToast, removeToast, success, error } = useNotifications();\r\n\r\n const toggleMutation = useMutation({\r\n mutationFn: ({ name, enabled, location }: { name: string; enabled: boolean; location: 'project' | 'user' }) =>\r\n toggleCommandApi(name, enabled, location, projectPath),\r\n onMutate: (): { loadingId: string } => {\r\n const loadingId = addToast('info', formatMessage('common.loading'), undefined, { duration: 0 });\r\n return { loadingId };\r\n },\r\n onSuccess: (_, __, context) => {\r\n const { loadingId } = context ?? { loadingId: '' };\r\n if (loadingId) removeToast(loadingId);\r\n success(formatMessage('feedback.commandToggle.success'));\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.commands(projectPath) });\r\n },\r\n onError: (err, __, context) => {\r\n const { loadingId } = context ?? { loadingId: '' };\r\n if (loadingId) removeToast(loadingId);\r\n const sanitized = sanitizeErrorMessage(err, 'commandToggle');\r\n error(formatMessage('common.error'), formatMessage(sanitized.messageKey));\r\n },\r\n });\r\n\r\n const toggleGroupMutation = useMutation({\r\n mutationFn: ({ groupName, enable, location }: { groupName: string; enable: boolean; location: 'project' | 'user' }) =>\r\n toggleCommandGroupApi(groupName, enable, location, projectPath),\r\n onMutate: (): { loadingId: string } => {\r\n const loadingId = addToast('info', formatMessage('common.loading'), undefined, { duration: 0 });\r\n return { loadingId };\r\n },\r\n onSuccess: (_, __, context) => {\r\n const { loadingId } = context ?? { loadingId: '' };\r\n if (loadingId) removeToast(loadingId);\r\n success(formatMessage('feedback.commandToggle.success'));\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.commands(projectPath) });\r\n },\r\n onError: (err, __, context) => {\r\n const { loadingId } = context ?? { loadingId: '' };\r\n if (loadingId) removeToast(loadingId);\r\n const sanitized = sanitizeErrorMessage(err, 'commandToggle');\r\n error(formatMessage('common.error'), formatMessage(sanitized.messageKey));\r\n },\r\n });\r\n\r\n return {\r\n toggleCommand: (name, enabled, location) => toggleMutation.mutateAsync({ name, enabled, location }),\r\n toggleGroup: (groupName, enable, location) => toggleGroupMutation.mutateAsync({ groupName, enable, location }),\r\n isToggling: toggleMutation.isPending || toggleGroupMutation.isPending,\r\n };\r\n}\r\n\r\nexport function useCommands(options: UseCommandsOptions = {}): UseCommandsReturn {\r\n const { filter, staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.commandsList(projectPath),\r\n queryFn: () => fetchCommands(projectPath),\r\n staleTime,\r\n enabled: enabled,\r\n retry: 2,\r\n });\r\n\r\n const allCommands = query.data?.commands ?? [];\r\n\r\n // Per-location total counts (unfiltered, for tab badges)\r\n const projectCount = allCommands.filter(c => c.location === 'project').length;\r\n const userCount = allCommands.filter(c => c.location === 'user').length;\r\n\r\n // Apply filters (except showDisabled) for counts and grouping\r\n const baseFiltered = (() => {\r\n let commands = allCommands;\r\n\r\n if (filter?.search) {\r\n const searchLower = filter.search.toLowerCase();\r\n commands = commands.filter(\r\n (c) =>\r\n c.name.toLowerCase().includes(searchLower) ||\r\n c.description.toLowerCase().includes(searchLower) ||\r\n c.aliases?.some((a) => a.toLowerCase().includes(searchLower))\r\n );\r\n }\r\n\r\n if (filter?.category) {\r\n commands = commands.filter((c) => c.category === filter.category);\r\n }\r\n\r\n if (filter?.source) {\r\n commands = commands.filter((c) => c.source === filter.source);\r\n }\r\n\r\n if (filter?.group) {\r\n commands = commands.filter((c) => c.group === filter.group);\r\n }\r\n\r\n if (filter?.location) {\r\n commands = commands.filter((c) => c.location === filter.location);\r\n }\r\n\r\n return commands;\r\n })();\r\n\r\n // Apply showDisabled filter for the returned commands list\r\n const filteredCommands = filter?.showDisabled === false\r\n ? baseFiltered.filter((c) => c.enabled !== false)\r\n : baseFiltered;\r\n\r\n // Group by category (from allCommands for global view)\r\n const commandsByCategory: Record<string, Command[]> = {};\r\n const categories = new Set<string>();\r\n\r\n for (const command of allCommands) {\r\n const category = command.category || 'Uncategorized';\r\n categories.add(category);\r\n if (!commandsByCategory[category]) {\r\n commandsByCategory[category] = [];\r\n }\r\n commandsByCategory[category].push(command);\r\n }\r\n\r\n // Group by group (from baseFiltered - respects location filter, includes disabled for accordion)\r\n const groupedCommands: Record<string, Command[]> = {};\r\n const groups = new Set<string>();\r\n const enabledCount = baseFiltered.filter(c => c.enabled !== false).length;\r\n const disabledCount = baseFiltered.length - enabledCount;\r\n\r\n for (const command of baseFiltered) {\r\n const group = command.group || 'other';\r\n groups.add(group);\r\n if (!groupedCommands[group]) {\r\n groupedCommands[group] = [];\r\n }\r\n groupedCommands[group].push(command);\r\n }\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.commands(projectPath) });\r\n };\r\n\r\n return {\r\n commands: filteredCommands,\r\n categories: Array.from(categories).sort(),\r\n commandsByCategory,\r\n groupedCommands,\r\n groups: Array.from(groups).sort(),\r\n enabledCount,\r\n disabledCount,\r\n projectCount,\r\n userCount,\r\n totalCount: allCommands.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\n/**\r\n * Hook to search commands by name or alias\r\n */\r\nexport function useCommandSearch(searchTerm: string) {\r\n const { commands } = useCommands({ filter: { search: searchTerm } });\r\n return commands;\r\n}\r\n"],"names":["STALE_TIME","useCommandMutations","queryClient","useQueryClient","projectPath","useWorkflowStore","selectProjectPath","addToast","removeToast","success","error","useNotifications","toggleMutation","useMutation","name","enabled","location","toggleCommandApi","formatMessage","_","__","context","loadingId","workspaceQueryKeys","err","sanitized","sanitizeErrorMessage","toggleGroupMutation","groupName","enable","toggleCommandGroupApi","useCommands","options","filter","staleTime","query","useQuery","fetchCommands","allCommands","_a","projectCount","c","userCount","baseFiltered","commands","searchLower","a","filteredCommands","commandsByCategory","categories","command","category","groupedCommands","groups","enabledCount","disabledCount","group","refetch","invalidate"],"mappings":"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"}
1
+ {"version":3,"file":"useCommands-3OfPQPw4.js","sources":["../../src/hooks/useCommands.ts"],"sourcesContent":["// ========================================\r\n// useCommands Hook\r\n// ========================================\r\n// TanStack Query hooks for commands management\r\n\r\nimport { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';\r\nimport {\r\n fetchCommands,\r\n toggleCommand as toggleCommandApi,\r\n toggleCommandGroup as toggleCommandGroupApi,\r\n type Command,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { useNotifications } from './useNotifications';\r\nimport { sanitizeErrorMessage } from '@/utils/errorSanitizer';\r\nimport { formatMessage } from '@/lib/i18n';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\n// Default stale time: 10 minutes (commands are static)\r\nconst STALE_TIME = 10 * 60 * 1000;\r\n\r\nexport interface CommandsFilter {\r\n search?: string;\r\n category?: string;\r\n source?: Command['source'];\r\n group?: string;\r\n location?: 'project' | 'user';\r\n showDisabled?: boolean;\r\n}\r\n\r\nexport interface UseCommandsOptions {\r\n filter?: CommandsFilter;\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseCommandsReturn {\r\n commands: Command[];\r\n categories: string[];\r\n commandsByCategory: Record<string, Command[]>;\r\n groupedCommands: Record<string, Command[]>;\r\n groups: string[];\r\n totalCount: number;\r\n enabledCount: number;\r\n disabledCount: number;\r\n projectCount: number;\r\n userCount: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching and filtering commands\r\n */\r\n\r\nexport interface UseCommandMutationsReturn {\r\n toggleCommand: (name: string, enabled: boolean, location: 'project' | 'user') => Promise<any>;\r\n toggleGroup: (groupName: string, enable: boolean, location: 'project' | 'user') => Promise<any>;\r\n isToggling: boolean;\r\n}\r\n\r\nexport function useCommandMutations(): UseCommandMutationsReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n const { addToast, removeToast, success, error } = useNotifications();\r\n\r\n const toggleMutation = useMutation({\r\n mutationFn: ({ name, enabled, location }: { name: string; enabled: boolean; location: 'project' | 'user' }) =>\r\n toggleCommandApi(name, enabled, location, projectPath),\r\n onMutate: (): { loadingId: string } => {\r\n const loadingId = addToast('info', formatMessage('common.loading'), undefined, { duration: 0 });\r\n return { loadingId };\r\n },\r\n onSuccess: (_, __, context) => {\r\n const { loadingId } = context ?? { loadingId: '' };\r\n if (loadingId) removeToast(loadingId);\r\n success(formatMessage('feedback.commandToggle.success'));\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.commands(projectPath) });\r\n },\r\n onError: (err, __, context) => {\r\n const { loadingId } = context ?? { loadingId: '' };\r\n if (loadingId) removeToast(loadingId);\r\n const sanitized = sanitizeErrorMessage(err, 'commandToggle');\r\n error(formatMessage('common.error'), formatMessage(sanitized.messageKey));\r\n },\r\n });\r\n\r\n const toggleGroupMutation = useMutation({\r\n mutationFn: ({ groupName, enable, location }: { groupName: string; enable: boolean; location: 'project' | 'user' }) =>\r\n toggleCommandGroupApi(groupName, enable, location, projectPath),\r\n onMutate: (): { loadingId: string } => {\r\n const loadingId = addToast('info', formatMessage('common.loading'), undefined, { duration: 0 });\r\n return { loadingId };\r\n },\r\n onSuccess: (_, __, context) => {\r\n const { loadingId } = context ?? { loadingId: '' };\r\n if (loadingId) removeToast(loadingId);\r\n success(formatMessage('feedback.commandToggle.success'));\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.commands(projectPath) });\r\n },\r\n onError: (err, __, context) => {\r\n const { loadingId } = context ?? { loadingId: '' };\r\n if (loadingId) removeToast(loadingId);\r\n const sanitized = sanitizeErrorMessage(err, 'commandToggle');\r\n error(formatMessage('common.error'), formatMessage(sanitized.messageKey));\r\n },\r\n });\r\n\r\n return {\r\n toggleCommand: (name, enabled, location) => toggleMutation.mutateAsync({ name, enabled, location }),\r\n toggleGroup: (groupName, enable, location) => toggleGroupMutation.mutateAsync({ groupName, enable, location }),\r\n isToggling: toggleMutation.isPending || toggleGroupMutation.isPending,\r\n };\r\n}\r\n\r\nexport function useCommands(options: UseCommandsOptions = {}): UseCommandsReturn {\r\n const { filter, staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.commandsList(projectPath),\r\n queryFn: () => fetchCommands(projectPath),\r\n staleTime,\r\n enabled: enabled,\r\n retry: 2,\r\n });\r\n\r\n const allCommands = query.data?.commands ?? [];\r\n\r\n // Per-location total counts (unfiltered, for tab badges)\r\n const projectCount = allCommands.filter(c => c.location === 'project').length;\r\n const userCount = allCommands.filter(c => c.location === 'user').length;\r\n\r\n // Apply filters (except showDisabled) for counts and grouping\r\n const baseFiltered = (() => {\r\n let commands = allCommands;\r\n\r\n if (filter?.search) {\r\n const searchLower = filter.search.toLowerCase();\r\n commands = commands.filter(\r\n (c) =>\r\n c.name.toLowerCase().includes(searchLower) ||\r\n c.description.toLowerCase().includes(searchLower) ||\r\n c.aliases?.some((a) => a.toLowerCase().includes(searchLower))\r\n );\r\n }\r\n\r\n if (filter?.category) {\r\n commands = commands.filter((c) => c.category === filter.category);\r\n }\r\n\r\n if (filter?.source) {\r\n commands = commands.filter((c) => c.source === filter.source);\r\n }\r\n\r\n if (filter?.group) {\r\n commands = commands.filter((c) => c.group === filter.group);\r\n }\r\n\r\n if (filter?.location) {\r\n commands = commands.filter((c) => c.location === filter.location);\r\n }\r\n\r\n return commands;\r\n })();\r\n\r\n // Apply showDisabled filter for the returned commands list\r\n const filteredCommands = filter?.showDisabled === false\r\n ? baseFiltered.filter((c) => c.enabled !== false)\r\n : baseFiltered;\r\n\r\n // Group by category (from allCommands for global view)\r\n const commandsByCategory: Record<string, Command[]> = {};\r\n const categories = new Set<string>();\r\n\r\n for (const command of allCommands) {\r\n const category = command.category || 'Uncategorized';\r\n categories.add(category);\r\n if (!commandsByCategory[category]) {\r\n commandsByCategory[category] = [];\r\n }\r\n commandsByCategory[category].push(command);\r\n }\r\n\r\n // Group by group (from baseFiltered - respects location filter, includes disabled for accordion)\r\n const groupedCommands: Record<string, Command[]> = {};\r\n const groups = new Set<string>();\r\n const enabledCount = baseFiltered.filter(c => c.enabled !== false).length;\r\n const disabledCount = baseFiltered.length - enabledCount;\r\n\r\n for (const command of baseFiltered) {\r\n const group = command.group || 'other';\r\n groups.add(group);\r\n if (!groupedCommands[group]) {\r\n groupedCommands[group] = [];\r\n }\r\n groupedCommands[group].push(command);\r\n }\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n await queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.commands(projectPath) });\r\n };\r\n\r\n return {\r\n commands: filteredCommands,\r\n categories: Array.from(categories).sort(),\r\n commandsByCategory,\r\n groupedCommands,\r\n groups: Array.from(groups).sort(),\r\n enabledCount,\r\n disabledCount,\r\n projectCount,\r\n userCount,\r\n totalCount: allCommands.length,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\n/**\r\n * Hook to search commands by name or alias\r\n */\r\nexport function useCommandSearch(searchTerm: string) {\r\n const { commands } = useCommands({ filter: { search: searchTerm } });\r\n return commands;\r\n}\r\n"],"names":["STALE_TIME","useCommandMutations","queryClient","useQueryClient","projectPath","useWorkflowStore","selectProjectPath","addToast","removeToast","success","error","useNotifications","toggleMutation","useMutation","name","enabled","location","toggleCommandApi","formatMessage","_","__","context","loadingId","workspaceQueryKeys","err","sanitized","sanitizeErrorMessage","toggleGroupMutation","groupName","enable","toggleCommandGroupApi","useCommands","options","filter","staleTime","query","useQuery","fetchCommands","allCommands","_a","projectCount","c","userCount","baseFiltered","commands","searchLower","a","filteredCommands","commandsByCategory","categories","command","category","groupedCommands","groups","enabledCount","disabledCount","group","refetch","invalidate"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as o}from"./index-B6I7GQC5.js";function c(e,t){const[r,u]=o.useState(e);return o.useEffect(()=>{const n=setTimeout(()=>{u(e)},t);return()=>{clearTimeout(n)}},[e,t]),r}export{c as u};
2
- //# sourceMappingURL=useDebounce-CmKmoP7n.js.map
1
+ import{r as o}from"./index-dWT2M6Ef.js";function c(e,t){const[r,u]=o.useState(e);return o.useEffect(()=>{const n=setTimeout(()=>{u(e)},t);return()=>{clearTimeout(n)}},[e,t]),r}export{c as u};
2
+ //# sourceMappingURL=useDebounce-bXiFhQx9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDebounce-CmKmoP7n.js","sources":["../../src/hooks/useDebounce.ts"],"sourcesContent":["// ========================================\r\n// useDebounce Hook\r\n// ========================================\r\n// Debounces a value to delay expensive computations or API calls.\r\n\r\nimport { useState, useEffect } from 'react';\r\n\r\n/**\r\n * Debounces a value.\r\n *\r\n * @param value The value to debounce.\r\n * @param delay The debounce delay in milliseconds.\r\n * @returns The debounced value.\r\n */\r\nexport function useDebounce<T>(value: T, delay: number): T {\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\r\n\r\n useEffect(() => {\r\n const handler = setTimeout(() => {\r\n setDebouncedValue(value);\r\n }, delay);\r\n\r\n return () => {\r\n clearTimeout(handler);\r\n };\r\n }, [value, delay]);\r\n\r\n return debouncedValue;\r\n}\r\n"],"names":["useDebounce","value","delay","debouncedValue","setDebouncedValue","useState","useEffect","handler"],"mappings":"wCAcO,SAASA,EAAeC,EAAUC,EAAkB,CACzD,KAAM,CAACC,EAAgBC,CAAiB,EAAIC,EAAAA,SAAYJ,CAAK,EAE7DK,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAU,WAAW,IAAM,CAC/BH,EAAkBH,CAAK,CACzB,EAAGC,CAAK,EAER,MAAO,IAAM,CACX,aAAaK,CAAO,CACtB,CACF,EAAG,CAACN,EAAOC,CAAK,CAAC,EAEVC,CACT"}
1
+ {"version":3,"file":"useDebounce-bXiFhQx9.js","sources":["../../src/hooks/useDebounce.ts"],"sourcesContent":["// ========================================\r\n// useDebounce Hook\r\n// ========================================\r\n// Debounces a value to delay expensive computations or API calls.\r\n\r\nimport { useState, useEffect } from 'react';\r\n\r\n/**\r\n * Debounces a value.\r\n *\r\n * @param value The value to debounce.\r\n * @param delay The debounce delay in milliseconds.\r\n * @returns The debounced value.\r\n */\r\nexport function useDebounce<T>(value: T, delay: number): T {\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\r\n\r\n useEffect(() => {\r\n const handler = setTimeout(() => {\r\n setDebouncedValue(value);\r\n }, delay);\r\n\r\n return () => {\r\n clearTimeout(handler);\r\n };\r\n }, [value, delay]);\r\n\r\n return debouncedValue;\r\n}\r\n"],"names":["useDebounce","value","delay","debouncedValue","setDebouncedValue","useState","useEffect","handler"],"mappings":"wCAcO,SAASA,EAAeC,EAAUC,EAAkB,CACzD,KAAM,CAACC,EAAgBC,CAAiB,EAAIC,EAAAA,SAAYJ,CAAK,EAE7DK,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAU,WAAW,IAAM,CAC/BH,EAAkBH,CAAK,CACzB,EAAGC,CAAK,EAER,MAAO,IAAM,CACX,aAAaK,CAAO,CACtB,CACF,EAAG,CAACN,EAAOC,CAAK,CAAC,EAEVC,CACT"}
@@ -1,7 +1,7 @@
1
- import{j as t,c as h,ao as le,F as k,af as Q,aU as ce,u as oe,r as l,N as de,m as A,e as xe,bq as ue,am as me,aF as pe,ab as K,f0 as R,f1 as he,f2 as fe,f3 as ye}from"./index-B6I7GQC5.js";import{F as $}from"./folder-BKhwCNFG.js";function ge(e){var c;const s=(c=e.split(".").pop())==null?void 0:c.toLowerCase(),a=["ts","tsx","js","jsx","vue","svelte","py","rb","go","rs","java","cs","php","scala","kt"],i=["json","yaml","yml","toml","ini","conf","xml","config"];return a.includes(s||"")?Q:i.includes(s||"")?Q:k}function je(e){if(!e)return"";const s=["B","KB","MB","GB"];let a=e,i=0;for(;a>=1024&&i<s.length-1;)a/=1024,i++;return`${a.toFixed(1)}${s[i]}`}function _({node:e,level:s,expandedPaths:a,selectedPath:i,maxDepth:c=0,showIcons:f=!0,showSizes:n=!1,onNodeClick:y,onNodeDoubleClick:d,onToggle:g}){const u=e.type==="directory",p=a.has(e.path),N=i===e.path,F=u&&e.children&&e.children.length>0,S=p&&F,b=c>0&&s>=c;let j=k;u?j=p?ce:$:f&&(j=ge(e.name));const T=m=>{m.stopPropagation(),y==null||y(e),u&&F&&(g==null||g(e.path))},E=m=>{m.stopPropagation(),d==null||d(e)},L=m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),T(m))};return t.jsxs("div",{className:h("tree-node",u&&"tree-directory",N&&"selected"),role:"treeitem","aria-expanded":u?p:void 0,"aria-selected":N,children:[t.jsxs("div",{className:h("flex items-center gap-1 px-2 py-1 rounded-sm cursor-pointer transition-colors","hover:bg-hover hover:text-foreground",N&&"bg-primary/10 text-primary","text-foreground text-sm"),style:{paddingLeft:`${s*16+8}px`},onClick:T,onDoubleClick:E,onKeyDown:L,tabIndex:0,title:e.path,children:[u&&t.jsx(le,{className:h("h-4 w-4 flex-shrink-0 text-muted-foreground transition-transform",p&&"rotate-90")}),f&&t.jsx(j,{className:h("h-4 w-4 flex-shrink-0",u?p?"text-blue-500":"text-blue-400":"text-muted-foreground")}),t.jsx("span",{className:"flex-1 truncate",children:e.name}),e.hasClaudeMd&&t.jsx("span",{className:"ml-1 px-1.5 py-0.5 text-[10px] font-semibold rounded bg-purple-500/20 text-purple-500",title:"Contains CLAUDE.md context",children:"MD"}),n&&!u&&e.size&&t.jsx("span",{className:"text-xs text-muted-foreground ml-auto",children:je(e.size)})]}),S&&!b&&e.children&&t.jsx("div",{className:"tree-children",role:"group",children:e.children.map(m=>t.jsx(_,{node:m,level:s+1,expandedPaths:a,selectedPath:i,maxDepth:c,showIcons:f,showSizes:n,onNodeClick:y,onNodeDoubleClick:d,onToggle:g},m.path))})]})}function Te({nodes:e,expandedPaths:s,selectedPath:a,onNodeClick:i,onNodeDoubleClick:c,onToggle:f,maxDepth:n=0,depth:y=0,showIcons:d=!0,showSizes:g=!1,className:u}){return e.length===0?t.jsxs("div",{className:"flex flex-col items-center justify-center py-8 px-4 text-center",children:[t.jsx($,{className:"h-12 w-12 text-muted-foreground mb-3"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:"No files found"})]}):t.jsx("div",{className:h("tree-view",u),role:"tree","aria-label":"File tree",children:e.map(p=>t.jsx(_,{node:p,level:y,expandedPaths:s,selectedPath:a,maxDepth:n,showIcons:d,showSizes:g,onNodeClick:i,onNodeDoubleClick:c,onToggle:f},p.path))})}function we(e){return e?{typescript:"TypeScript",tsx:"TypeScript JSX",javascript:"JavaScript",jsx:"React JSX",python:"Python",ruby:"Ruby",go:"Go",rust:"Rust",java:"Java",csharp:"C#",php:"PHP",scala:"Scala",kotlin:"Kotlin",markdown:"Markdown",json:"JSON",yaml:"YAML",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",less:"Less",sql:"SQL",bash:"Bash",text:"Plain Text"}[e]||e.charAt(0).toUpperCase()+e.slice(1):"Plain Text"}function I(e){const s=e.split(".");return s.length>1?s[s.length-1]:""}function be(e){const s=["png","jpg","jpeg","gif","bmp","ico","webp","svg","pdf","doc","docx","xls","xlsx","ppt","pptx","zip","tar","gz","rar","7z","mp3","mp4","avi","mov","wav","ttf","otf","woff","woff2","eot","exe","dll","so","dylib","class","jar","war","pdb","obj","o"],a=I(e).toLowerCase();return s.includes(a)}function z(e){if(!e)return"";const s=["B","KB","MB","GB"];let a=e,i=0;for(;a>=1024&&i<s.length-1;)a/=1024,i++;return`${a.toFixed(1)} ${s[i]}`}function ve(e,s=1e3){const a=e.split(`
1
+ import{j as t,c as h,ao as le,F as k,af as Q,aU as ce,u as oe,r as l,N as de,m as A,e as xe,bq as ue,am as me,aF as pe,ab as K,f0 as R,f1 as he,f2 as fe,f3 as ye}from"./index-dWT2M6Ef.js";import{F as $}from"./folder-CV8511y9.js";function ge(e){var c;const s=(c=e.split(".").pop())==null?void 0:c.toLowerCase(),a=["ts","tsx","js","jsx","vue","svelte","py","rb","go","rs","java","cs","php","scala","kt"],i=["json","yaml","yml","toml","ini","conf","xml","config"];return a.includes(s||"")?Q:i.includes(s||"")?Q:k}function je(e){if(!e)return"";const s=["B","KB","MB","GB"];let a=e,i=0;for(;a>=1024&&i<s.length-1;)a/=1024,i++;return`${a.toFixed(1)}${s[i]}`}function _({node:e,level:s,expandedPaths:a,selectedPath:i,maxDepth:c=0,showIcons:f=!0,showSizes:n=!1,onNodeClick:y,onNodeDoubleClick:d,onToggle:g}){const u=e.type==="directory",p=a.has(e.path),N=i===e.path,F=u&&e.children&&e.children.length>0,S=p&&F,b=c>0&&s>=c;let j=k;u?j=p?ce:$:f&&(j=ge(e.name));const T=m=>{m.stopPropagation(),y==null||y(e),u&&F&&(g==null||g(e.path))},E=m=>{m.stopPropagation(),d==null||d(e)},L=m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),T(m))};return t.jsxs("div",{className:h("tree-node",u&&"tree-directory",N&&"selected"),role:"treeitem","aria-expanded":u?p:void 0,"aria-selected":N,children:[t.jsxs("div",{className:h("flex items-center gap-1 px-2 py-1 rounded-sm cursor-pointer transition-colors","hover:bg-hover hover:text-foreground",N&&"bg-primary/10 text-primary","text-foreground text-sm"),style:{paddingLeft:`${s*16+8}px`},onClick:T,onDoubleClick:E,onKeyDown:L,tabIndex:0,title:e.path,children:[u&&t.jsx(le,{className:h("h-4 w-4 flex-shrink-0 text-muted-foreground transition-transform",p&&"rotate-90")}),f&&t.jsx(j,{className:h("h-4 w-4 flex-shrink-0",u?p?"text-blue-500":"text-blue-400":"text-muted-foreground")}),t.jsx("span",{className:"flex-1 truncate",children:e.name}),e.hasClaudeMd&&t.jsx("span",{className:"ml-1 px-1.5 py-0.5 text-[10px] font-semibold rounded bg-purple-500/20 text-purple-500",title:"Contains CLAUDE.md context",children:"MD"}),n&&!u&&e.size&&t.jsx("span",{className:"text-xs text-muted-foreground ml-auto",children:je(e.size)})]}),S&&!b&&e.children&&t.jsx("div",{className:"tree-children",role:"group",children:e.children.map(m=>t.jsx(_,{node:m,level:s+1,expandedPaths:a,selectedPath:i,maxDepth:c,showIcons:f,showSizes:n,onNodeClick:y,onNodeDoubleClick:d,onToggle:g},m.path))})]})}function Te({nodes:e,expandedPaths:s,selectedPath:a,onNodeClick:i,onNodeDoubleClick:c,onToggle:f,maxDepth:n=0,depth:y=0,showIcons:d=!0,showSizes:g=!1,className:u}){return e.length===0?t.jsxs("div",{className:"flex flex-col items-center justify-center py-8 px-4 text-center",children:[t.jsx($,{className:"h-12 w-12 text-muted-foreground mb-3"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:"No files found"})]}):t.jsx("div",{className:h("tree-view",u),role:"tree","aria-label":"File tree",children:e.map(p=>t.jsx(_,{node:p,level:y,expandedPaths:s,selectedPath:a,maxDepth:n,showIcons:d,showSizes:g,onNodeClick:i,onNodeDoubleClick:c,onToggle:f},p.path))})}function we(e){return e?{typescript:"TypeScript",tsx:"TypeScript JSX",javascript:"JavaScript",jsx:"React JSX",python:"Python",ruby:"Ruby",go:"Go",rust:"Rust",java:"Java",csharp:"C#",php:"PHP",scala:"Scala",kotlin:"Kotlin",markdown:"Markdown",json:"JSON",yaml:"YAML",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",less:"Less",sql:"SQL",bash:"Bash",text:"Plain Text"}[e]||e.charAt(0).toUpperCase()+e.slice(1):"Plain Text"}function I(e){const s=e.split(".");return s.length>1?s[s.length-1]:""}function be(e){const s=["png","jpg","jpeg","gif","bmp","ico","webp","svg","pdf","doc","docx","xls","xlsx","ppt","pptx","zip","tar","gz","rar","7z","mp3","mp4","avi","mov","wav","ttf","otf","woff","woff2","eot","exe","dll","so","dylib","class","jar","war","pdb","obj","o"],a=I(e).toLowerCase();return s.includes(a)}function z(e){if(!e)return"";const s=["B","KB","MB","GB"];let a=e,i=0;for(;a>=1024&&i<s.length-1;)a/=1024,i++;return`${a.toFixed(1)} ${s[i]}`}function ve(e,s=1e3){const a=e.split(`
2
2
  `);return a.length<=s?e:a.slice(0,s).join(`
3
3
  `)+`
4
4
 
5
5
  ... (${a.length-s} more lines)`}function Ee({fileContent:e,isLoading:s=!1,error:a=null,className:i,maxSize:c=1024*1024,showLineNumbers:f=!0}){const{formatMessage:n}=oe(),[y,d]=l.useState(!1),g=l.useRef(null),u=async()=>{if(e!=null&&e.content)try{await navigator.clipboard.writeText(e.content),d(!0),setTimeout(()=>d(!1),2e3)}catch(E){console.error("Failed to copy content:",E)}};if(s)return t.jsxs("div",{className:h("flex items-center justify-center py-12",i),children:[t.jsx(de,{className:"h-8 w-8 animate-spin text-muted-foreground"}),t.jsx("span",{className:"ml-3 text-sm text-muted-foreground",children:n({id:"explorer.preview.loading"})})]});if(a)return t.jsxs("div",{className:h("flex flex-col items-center justify-center py-12 px-4 text-center",i),children:[t.jsx(A,{className:"h-12 w-12 text-destructive mb-3"}),t.jsx("h3",{className:"text-sm font-medium text-foreground mb-1",children:n({id:"explorer.preview.errorTitle"})}),t.jsx("p",{className:"text-xs text-muted-foreground max-w-md",children:a})]});if(!e)return t.jsxs("div",{className:h("flex flex-col items-center justify-center py-12 px-4 text-center",i),children:[t.jsx(k,{className:"h-12 w-12 text-muted-foreground mb-3"}),t.jsx("h3",{className:"text-sm font-medium text-foreground mb-1",children:n({id:"explorer.preview.emptyTitle"})}),t.jsx("p",{className:"text-xs text-muted-foreground",children:n({id:"explorer.preview.emptyMessage"})})]});const p=c>0&&(e.size||0)>c;if(be(e.path))return t.jsxs("div",{className:h("flex flex-col items-center justify-center py-12 px-4 text-center",i),children:[t.jsx(k,{className:"h-12 w-12 text-muted-foreground mb-3"}),t.jsx("h3",{className:"text-sm font-medium text-foreground mb-1",children:n({id:"explorer.preview.binaryTitle"})}),t.jsx("p",{className:"text-xs text-muted-foreground mb-4",children:n({id:"explorer.preview.binaryMessage"})}),t.jsxs("div",{className:"text-xs text-muted-foreground",children:[t.jsx("span",{children:e.path}),e.size&&t.jsxs("span",{className:"ml-2",children:["(",z(e.size),")"]})]})]});if(p)return t.jsxs("div",{className:h("flex flex-col items-center justify-center py-12 px-4 text-center",i),children:[t.jsx(A,{className:"h-12 w-12 text-warning mb-3"}),t.jsx("h3",{className:"text-sm font-medium text-foreground mb-1",children:n({id:"explorer.preview.tooLargeTitle"})}),t.jsx("p",{className:"text-xs text-muted-foreground mb-4",children:n({id:"explorer.preview.tooLargeMessage"},{size:z(c)})}),t.jsxs("div",{className:"text-xs text-muted-foreground",children:[t.jsx("span",{children:e.path}),e.size&&t.jsxs("span",{className:"ml-2",children:["(",z(e.size),")"]})]})]});const F=e.path.split("/").pop()||"",S=I(e.path),b=e.language||we(e.language),j=ve(e.content),T=j.split(`
6
6
  `);return t.jsxs("div",{className:h("file-preview flex flex-col h-full",i),children:[t.jsxs("div",{className:"flex items-center justify-between px-4 py-2 border-b border-border bg-muted/30",children:[t.jsxs("div",{className:"flex items-center gap-2 min-w-0 flex-1",children:[t.jsx(k,{className:"h-4 w-4 text-muted-foreground flex-shrink-0"}),t.jsx("span",{className:"text-sm font-medium truncate",children:F}),S&&t.jsxs("span",{className:"text-xs text-muted-foreground uppercase",children:[".",S]}),e.size&&t.jsxs("span",{className:"text-xs text-muted-foreground",children:["(",z(e.size),")"]})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[e.language&&t.jsx("span",{className:"text-xs text-muted-foreground px-2 py-0.5 rounded bg-muted",children:b}),t.jsx(xe,{variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:u,title:n({id:"explorer.preview.copy"}),children:y?t.jsx(ue,{className:"h-4 w-4 text-success"}):t.jsx(me,{className:"h-4 w-4"})})]})]}),t.jsx("div",{className:"flex-1 overflow-auto custom-scrollbar",children:t.jsx("pre",{ref:g,className:h("text-sm p-4 m-0 bg-background","font-mono leading-relaxed","whitespace-pre-wrap break-words","[&_::selection]:bg-primary/20 [&_::selection]:text-primary"),children:f?t.jsxs("div",{className:"flex",children:[t.jsx("div",{className:"text-right text-muted-foreground select-none pr-4 border-r border-border mr-4 min-w-[3rem]",children:T.map((E,L)=>t.jsx("div",{className:"leading-relaxed",children:L+1},L))}),t.jsx("code",{className:"flex-1",children:j})]}):t.jsx("code",{children:j})})}),e.modifiedTime&&t.jsx("div",{className:"px-4 py-2 border-t border-border text-xs text-muted-foreground",children:n({id:"explorer.preview.lastModified"},{time:new Date(e.modifiedTime).toLocaleString()})})]})}const x={all:["fileExplorer"],trees:()=>[...x.all,"tree"],tree:e=>[...x.trees(),e],contents:()=>[...x.all,"content"],content:e=>[...x.contents(),e],roots:()=>[...x.all,"roots"],search:e=>[...x.all,"search",e]},H=300*1e3,B=600*1e3;function Le(e={}){var P,D;const{rootPath:s="/",maxDepth:a=5,excludePatterns:i,staleTime:c,enabled:f=!0}=e,n=pe(),[y,d]=l.useState(new Set([s])),[g,u]=l.useState(null),[p,N]=l.useState("tree"),[F,S]=l.useState("name"),[b,j]=l.useState(!1),[T,E]=l.useState(""),[L,m]=l.useState(),v=K({queryKey:[...x.tree(s),{showHidden:b}],queryFn:()=>fe(s,{maxDepth:a,includeHidden:b,excludePatterns:i}),staleTime:c??H,enabled:f,retry:2,retryDelay:r=>Math.min(1e3*2**r,1e4)}),C=K({queryKey:x.roots(),queryFn:ye,staleTime:H,enabled:f,retry:1}),M=((P=v.data)==null?void 0:P.rootNodes)??[],O=C.data,J=l.useCallback(r=>{d(o=>{const w=new Set(o);return w.has(r)?w.delete(r):w.add(r),w})},[]),G=l.useCallback(r=>{d(o=>new Set([...o,r]))},[]),U=l.useCallback(r=>{d(o=>{const w=new Set(o);return w.delete(r),w})},[]),V=l.useCallback(()=>{const r=new Set,o=w=>{for(const q of w)q.type==="directory"&&(r.add(q.path),q.children&&o(q.children))};o(M),d(r)},[M]),X=l.useCallback(()=>{d(new Set([s]))},[s]),Y=l.useCallback(r=>{u(r),r&&n.prefetchQuery({queryKey:x.content(r),queryFn:()=>R(r),staleTime:B})},[n]),W=l.useCallback(r=>{N(r)},[]),Z=l.useCallback(r=>{S(r)},[]),ee=l.useCallback(()=>{j(r=>!r)},[]),te=l.useCallback(r=>{E(r)},[]),se=l.useCallback(async r=>{try{return await n.fetchQuery({queryKey:x.content(r),queryFn:()=>R(r),staleTime:B})}catch(o){throw console.error(`[useFileExplorer] Failed to load file content: ${r}`,o),o}},[n]),re=l.useCallback(async r=>{if(!r.trim()){m(void 0);return}try{const o=await n.fetchQuery({queryKey:x.search(r),queryFn:()=>he({rootPath:s,query:r,maxResults:100}),staleTime:6e4});return m(o),o}catch(o){throw console.error("[useFileExplorer] Search failed:",o),o}},[n,s]),ae=n.isFetching({queryKey:x.all})>0,ne=l.useCallback(r=>{r?n.removeQueries({queryKey:x.content(r)}):n.removeQueries({queryKey:x.contents()})},[n]),ie=async()=>{await v.refetch()};return{state:{currentPath:s,selectedFile:g,expandedPaths:y,fileTree:M,viewMode:p,sortOrder:F,showHiddenFiles:b,filter:T,isLoading:v.isLoading,error:((D=v.error)==null?void 0:D.message)??null,fileContents:{},recentFiles:[],maxRecentFiles:10,directoriesFirst:!0},rootNodes:M,isLoading:v.isLoading,isFetching:v.isFetching,error:v.error,refetch:ie,setSelectedFile:Y,toggleExpanded:J,expandDirectory:G,collapseDirectory:U,expandAll:V,collapseAll:X,setViewMode:W,setSortOrder:Z,toggleShowHidden:ee,setFilter:te,loadFileContent:se,rootDirectories:O,isLoadingRoots:C.isLoading,searchFiles:re,searchResults:L,isSearching:ae,clearFileCache:ne}}function ke(e,s={}){const{enabled:a=!0,staleTime:i=B}=s,c=K({queryKey:x.content(e??""),queryFn:()=>R(e??""),staleTime:i,enabled:a&&!!e,retry:1});return{content:c.data,isLoading:c.isLoading,error:c.error,refetch:()=>c.refetch()}}export{Ee as F,Te as T,ke as a,Le as u};
7
- //# sourceMappingURL=useFileExplorer-G5UoArCU.js.map
7
+ //# sourceMappingURL=useFileExplorer-DEyUm46_.js.map