claude-code-workflow 7.2.28 → 7.2.30
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.
- package/.ccw/workflows/cli-templates/schemas/plan-overview-base-schema.json +2 -2
- package/.ccw/workflows/cli-templates/schemas/task-schema.json +14 -7
- package/.claude/agents/action-planning-agent.md +7 -4
- package/.claude/agents/cli-explore-agent.md +77 -63
- package/.claude/agents/cli-lite-planning-agent.md +11 -10
- package/.claude/agents/issue-plan-agent.md +421 -426
- package/.claude/commands/workflow/spec/setup.md +1 -1
- package/.claude/skills/ccw-chain/SKILL.md +119 -0
- package/.claude/skills/ccw-chain/chains/ccw-cycle.json +21 -0
- package/.claude/skills/ccw-chain/chains/ccw-exploration.json +47 -0
- package/.claude/skills/ccw-chain/chains/ccw-issue.json +33 -0
- package/.claude/skills/ccw-chain/chains/ccw-lightweight.json +57 -0
- package/.claude/skills/ccw-chain/chains/ccw-main.json +52 -0
- package/.claude/skills/ccw-chain/chains/ccw-standard.json +39 -0
- package/.claude/skills/ccw-chain/chains/ccw-team.json +10 -0
- package/.claude/skills/ccw-chain/chains/ccw-with-file.json +31 -0
- package/.claude/skills/ccw-chain/phases/analyze-with-file.md +788 -0
- package/.claude/skills/ccw-chain/phases/brainstorm/SKILL.md +408 -0
- package/.claude/skills/ccw-chain/phases/brainstorm/phases/01-mode-routing.md +207 -0
- package/.claude/skills/ccw-chain/phases/brainstorm/phases/02-artifacts.md +567 -0
- package/.claude/skills/ccw-chain/phases/brainstorm/phases/03-role-analysis.md +748 -0
- package/.claude/skills/ccw-chain/phases/brainstorm/phases/04-synthesis.md +827 -0
- package/.claude/skills/ccw-chain/phases/brainstorm-with-file.md +482 -0
- package/.claude/skills/ccw-chain/phases/collaborative-plan-with-file.md +639 -0
- package/.claude/skills/ccw-chain/phases/debug-with-file.md +656 -0
- package/.claude/skills/ccw-chain/phases/integration-test-cycle.md +936 -0
- package/.claude/skills/ccw-chain/phases/issue-convert-to-plan.md +720 -0
- package/.claude/skills/ccw-chain/phases/issue-discover.md +483 -0
- package/.claude/skills/ccw-chain/phases/issue-execute.md +629 -0
- package/.claude/skills/ccw-chain/phases/issue-from-brainstorm.md +382 -0
- package/.claude/skills/ccw-chain/phases/issue-plan.md +343 -0
- package/.claude/skills/ccw-chain/phases/issue-queue.md +464 -0
- package/.claude/skills/ccw-chain/phases/refactor-cycle.md +852 -0
- package/.claude/skills/ccw-chain/phases/review-cycle/SKILL.md +132 -0
- package/.claude/skills/ccw-chain/phases/review-cycle/phases/review-fix.md +760 -0
- package/.claude/skills/ccw-chain/phases/review-cycle/phases/review-module.md +764 -0
- package/.claude/skills/ccw-chain/phases/review-cycle/phases/review-session.md +775 -0
- package/.claude/skills/ccw-chain/phases/roadmap-with-file.md +544 -0
- package/.claude/skills/ccw-chain/phases/spec-generator/SKILL.md +338 -0
- package/.claude/skills/ccw-chain/phases/spec-generator/phases/01-5-requirement-clarification.md +404 -0
- package/.claude/skills/ccw-chain/phases/spec-generator/phases/01-discovery.md +257 -0
- package/.claude/skills/ccw-chain/phases/spec-generator/phases/02-product-brief.md +274 -0
- package/.claude/skills/ccw-chain/phases/spec-generator/phases/03-requirements.md +184 -0
- package/.claude/skills/ccw-chain/phases/spec-generator/phases/04-architecture.md +248 -0
- package/.claude/skills/ccw-chain/phases/spec-generator/phases/05-epics-stories.md +178 -0
- package/.claude/skills/ccw-chain/phases/spec-generator/phases/06-5-auto-fix.md +144 -0
- package/.claude/skills/ccw-chain/phases/spec-generator/phases/06-readiness-check.md +480 -0
- package/.claude/skills/ccw-chain/phases/team-planex.md +123 -0
- package/.claude/skills/ccw-chain/phases/ui-design-explore-auto.md +678 -0
- package/.claude/skills/ccw-chain/phases/unified-execute-with-file.md +870 -0
- package/.claude/skills/ccw-chain/phases/workflow-execute/SKILL.md +625 -0
- package/.claude/skills/ccw-chain/phases/workflow-execute/phases/06-review.md +215 -0
- package/.claude/skills/ccw-chain/phases/workflow-lite-plan.md +616 -0
- package/.claude/skills/ccw-chain/phases/workflow-multi-cli-plan.md +424 -0
- package/.claude/skills/ccw-chain/phases/workflow-plan/SKILL.md +466 -0
- package/.claude/skills/ccw-chain/phases/workflow-plan/phases/01-session-discovery.md +99 -0
- package/.claude/skills/ccw-chain/phases/workflow-plan/phases/02-context-gathering.md +338 -0
- package/.claude/skills/ccw-chain/phases/workflow-plan/phases/03-conflict-resolution.md +422 -0
- package/.claude/skills/ccw-chain/phases/workflow-plan/phases/04-task-generation.md +440 -0
- package/.claude/skills/ccw-chain/phases/workflow-plan/phases/05-plan-verify.md +395 -0
- package/.claude/skills/ccw-chain/phases/workflow-plan/phases/06-replan.md +594 -0
- package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/SKILL.md +527 -0
- package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/01-session-discovery.md +57 -0
- package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/02-context-gathering.md +407 -0
- package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/03-test-coverage-analysis.md +172 -0
- package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/04-conflict-resolution.md +426 -0
- package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/05-tdd-task-generation.md +473 -0
- package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/06-tdd-structure-validation.md +189 -0
- package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/07-tdd-verify.md +635 -0
- package/.claude/skills/ccw-chain/phases/workflow-test-fix/SKILL.md +482 -0
- package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/01-session-start.md +60 -0
- package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/02-test-context-gather.md +493 -0
- package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/03-test-concept-enhanced.md +150 -0
- package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/04-test-task-generate.md +346 -0
- package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/05-test-cycle-execute.md +538 -0
- package/.claude/skills/ccw-chain/specs/auto-mode.md +47 -0
- package/.claude/skills/ccw-chain/specs/intent-patterns.md +60 -0
- package/.claude/skills/chain-loader/SKILL.md +78 -0
- package/.claude/skills/chain-loader/phases/01-analyze-skill.md +53 -0
- package/.claude/skills/chain-loader/phases/02-design-graph.md +73 -0
- package/.claude/skills/chain-loader/phases/03-generate-validate.md +75 -0
- package/.claude/skills/chain-loader/specs/chain-schema.md +99 -0
- package/.claude/skills/chain-loader/specs/design-patterns.md +99 -0
- package/.claude/skills/chain-loader/templates/chain-json.md +63 -0
- package/.claude/skills/review-cycle/phases/review-module.md +764 -764
- package/.claude/skills/review-cycle/phases/review-session.md +775 -775
- package/.claude/skills/workflow-multi-cli-plan/SKILL.md +2 -2
- package/.claude/skills/workflow-plan/phases/03-conflict-resolution.md +422 -422
- package/.claude/skills/workflow-plan/phases/05-plan-verify.md +395 -395
- package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +407 -407
- package/.claude/skills/workflow-tdd-plan/phases/04-conflict-resolution.md +426 -426
- package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +493 -493
- package/.codex/skills/brainstorm/SKILL.md +3 -3
- package/.codex/skills/clean/SKILL.md +3 -3
- package/.codex/skills/issue-discover/SKILL.md +13 -13
- package/.codex/skills/issue-discover/phases/02-discover.md +4 -4
- package/.codex/skills/issue-discover/phases/03-discover-by-prompt.md +3 -3
- package/.codex/skills/parallel-dev-cycle/SKILL.md +4 -4
- package/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md +6 -6
- package/.codex/skills/parallel-dev-cycle/phases/03-result-aggregation.md +10 -10
- package/.codex/skills/review-cycle/SKILL.md +10 -10
- package/.codex/skills/review-cycle/phases/02-parallel-review.md +6 -6
- package/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md +4 -4
- package/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md +4 -4
- package/.codex/skills/review-cycle/phases/08-fix-execution.md +2 -2
- package/.codex/skills/roadmap-with-file/SKILL.md +14 -14
- package/.codex/skills/spec-generator/README.md +1 -1
- package/.codex/skills/spec-generator/SKILL.md +184 -88
- package/.codex/skills/spec-generator/phases/01-5-requirement-clarification.md +4 -7
- package/.codex/skills/spec-generator/phases/01-discovery.md +30 -11
- package/.codex/skills/spec-generator/phases/02-product-brief.md +2 -5
- package/.codex/skills/spec-generator/phases/03-requirements.md +4 -6
- package/.codex/skills/spec-generator/phases/04-architecture.md +4 -6
- package/.codex/skills/spec-generator/phases/05-epics-stories.md +4 -6
- package/.codex/skills/spec-generator/phases/06-5-auto-fix.md +4 -5
- package/.codex/skills/spec-generator/phases/06-readiness-check.md +8 -8
- package/.codex/skills/spec-generator/phases/07-issue-export.md +2 -2
- package/.codex/skills/spec-setup/SKILL.md +4 -4
- package/.codex/skills/workflow-plan/SKILL.md +6 -6
- package/.codex/skills/workflow-tdd-plan/SKILL.md +5 -5
- package/.codex/skills/workflow-test-fix-cycle/SKILL.md +19 -19
- package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +5 -5
- package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +5 -5
- package/README.md +14 -0
- package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/litellm-api-routes.js +0 -23
- package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
- package/ccw/dist/tools/chain-loader.d.ts +10 -0
- package/ccw/dist/tools/chain-loader.d.ts.map +1 -0
- package/ccw/dist/tools/chain-loader.js +642 -0
- package/ccw/dist/tools/chain-loader.js.map +1 -0
- package/ccw/dist/tools/index.d.ts.map +1 -1
- package/ccw/dist/tools/index.js +2 -0
- package/ccw/dist/tools/index.js.map +1 -1
- package/ccw/dist/tools/json-builder.js +20 -0
- package/ccw/dist/tools/json-builder.js.map +1 -1
- package/ccw/dist/types/chain-types.d.ts +72 -0
- package/ccw/dist/types/chain-types.d.ts.map +1 -0
- package/ccw/dist/types/chain-types.js +5 -0
- package/ccw/dist/types/chain-types.js.map +1 -0
- package/ccw/frontend/dist/assets/{AlertDialog-BjP1ydDR.js → AlertDialog-exlTDW81.js} +3 -3
- package/ccw/frontend/dist/assets/{AlertDialog-BjP1ydDR.js.map → AlertDialog-exlTDW81.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-CAX3xqMf.js → AnalysisPage-cgV9LfAI.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-CAX3xqMf.js.map → AnalysisPage-cgV9LfAI.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-CtWlmztq.js → ApiSettingsPage-Dk5jJdWt.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-CtWlmztq.js.map → ApiSettingsPage-Dk5jJdWt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-hR4a-eLX.js → CliModeToggle-Be9xsPiv.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-hR4a-eLX.js.map → CliModeToggle-Be9xsPiv.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-DzNPkFN9.js → CliSessionSharePage-Bh9jBtPI.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-DzNPkFN9.js.map → CliSessionSharePage-Bh9jBtPI.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-BPEGN4TT.js → CliViewerPage-BrE-oyEq.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-BPEGN4TT.js.map → CliViewerPage-BrE-oyEq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-Cf0r2RHY.js → CodexLensPage-Cd3nrC93.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-Cf0r2RHY.js.map → CodexLensPage-Cd3nrC93.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-DEm1rJ4h.js → Collapsible-DXFl3VKF.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-DEm1rJ4h.js.map → Collapsible-DXFl3VKF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-BpeWw8HO.js → CommandsManagerPage-IV8zpjgX.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-BpeWw8HO.js.map → CommandsManagerPage-IV8zpjgX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-BEsmh2vF.js → DeepWikiPage-CpDxtmRX.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-BEsmh2vF.js.map → DeepWikiPage-CpDxtmRX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-B30SFdtU.js → EndpointsPage-BchjWe7s.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-B30SFdtU.js.map → EndpointsPage-BchjWe7s.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-BVvMpg1O.js → ExplorerPage-CbWvaJ0y.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-BVvMpg1O.js.map → ExplorerPage-CbWvaJ0y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CL73dHbh.js → FixSessionPage-YMjVRiCk.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CL73dHbh.js.map → FixSessionPage-YMjVRiCk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-BL-28lMZ.js → FloatingFileBrowser-JW2ehYY_.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-BL-28lMZ.js.map → FloatingFileBrowser-JW2ehYY_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-BzZDciHZ.js → FloatingPanel-BtqzqDVq.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-BzZDciHZ.js.map → FloatingPanel-BtqzqDVq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-CDp6-d8P.js → GraphExplorerPage-BsJL_W4d.js} +3 -3
- package/ccw/frontend/dist/assets/{GraphExplorerPage-CDp6-d8P.js.map → GraphExplorerPage-BsJL_W4d.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-fZY_7O9n.js → HistoryPage-BuWpQ7k5.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-fZY_7O9n.js.map → HistoryPage-BuWpQ7k5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-4LJeC9bq.js → HookManagerPage-D0BtMIWy.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-4LJeC9bq.js.map → HookManagerPage-D0BtMIWy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage-Bpigrbhw.js → InstallationsPage-C7dwsAKG.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage-Bpigrbhw.js.map → InstallationsPage-C7dwsAKG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-BP0zJc1R.js → IssueHubPage-D0nCNaeB.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-BP0zJc1R.js.map → IssueHubPage-D0nCNaeB.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSt2oVKQ.js → LiteTasksPage-B5c2Kb9r.js} +3 -3
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSt2oVKQ.js.map → LiteTasksPage-B5c2Kb9r.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-B-xaMA0w.js → McpManagerPage-C-S5CehM.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-B-xaMA0w.js.map → McpManagerPage-C-S5CehM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-CJqo_7DY.js → MemoryPage-P_B0JVUQ.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-CJqo_7DY.js.map → MemoryPage-P_B0JVUQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-ibZeQA-Y.js → NotFoundPage-S4Jn9LUE.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-ibZeQA-Y.js.map → NotFoundPage-S4Jn9LUE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-DgJ4ctPQ.js → OrchestratorPage-C2Zlr7AC.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-DgJ4ctPQ.js.map → OrchestratorPage-C2Zlr7AC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-Cit0Yq0D.js → ProjectOverviewPage-CMVfz8s5.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-Cit0Yq0D.js.map → ProjectOverviewPage-CMVfz8s5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-Ce1HDIK0.js → PromptHistoryPage-YEMjFARX.js} +3 -3
- package/ccw/frontend/dist/assets/{PromptHistoryPage-Ce1HDIK0.js.map → PromptHistoryPage-YEMjFARX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-J1KikNrk.js → ReviewSessionPage-DnTm55nG.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-J1KikNrk.js.map → ReviewSessionPage-DnTm55nG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-CdBjTmth.js → RulesManagerPage-CUwebtO2.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-CdBjTmth.js.map → RulesManagerPage-CUwebtO2.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-B9ZK7LvX.js → SessionDetailPage-0qyH1Z5P.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-B9ZK7LvX.js.map → SessionDetailPage-0qyH1Z5P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-CW_nS5UR.js → SessionsPage-BpgP4087.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-CW_nS5UR.js.map → SessionsPage-BpgP4087.js.map} +1 -1
- package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js +150 -0
- package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js.map +1 -0
- package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js +7 -0
- package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js.map +1 -0
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-DJpi9XQL.js → SpecsSettingsPage-DT-yTVkD.js} +4 -4
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-DJpi9XQL.js.map → SpecsSettingsPage-DT-yTVkD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-Ac6Ov7uy.js → Switch-CYSPdqWk.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-Ac6Ov7uy.js.map → Switch-CYSPdqWk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-DZAAspqR.js → TabsNavigation-CPh6Zor1.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-DZAAspqR.js.map → TabsNavigation-CPh6Zor1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-BJkwfhIZ.js → TaskDrawer-Ds-8830B.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-BJkwfhIZ.js.map → TaskDrawer-Ds-8830B.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-BJgjxBgb.js → TeamPage-CJODUxBk.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-BJgjxBgb.js.map → TeamPage-CJODUxBk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-D1WekoOy.js → TerminalDashboardPage-Cn3fGUuO.js} +3 -3
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-D1WekoOy.js.map → TerminalDashboardPage-Cn3fGUuO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-DxemgIhF.js → archive-CjwVpw6k.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-DxemgIhF.js.map → archive-CjwVpw6k.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-CjS83f1V.js → archive-restore-2vZa9Ic3.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-CjS83f1V.js.map → archive-restore-2vZa9Ic3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-B5PUcn8I.js → arrow-right-CUU5XDgT.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-B5PUcn8I.js.map → arrow-right-CUU5XDgT.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-DCc9aPbb.js → bookmark-plus-Cc3nKRZ5.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-DCc9aPbb.js.map → bookmark-plus-Cc3nKRZ5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-DOwFtzak.js → bot-BwpSRDUa.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-DOwFtzak.js.map → bot-BwpSRDUa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-96qH3aFh.js → braces-DBzUW1XC.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-96qH3aFh.js.map → braces-DBzUW1XC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-CCxSuil1.js → circle-stop-CGNNsjvE.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-CCxSuil1.js.map → circle-stop-CGNNsjvE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-CZNSJFdq.js → cpu-D27G86Ul.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-CZNSJFdq.js.map → cpu-D27G86Ul.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-h8xtvw2_.js → ellipsis-vertical-C1Ij47Yz.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-h8xtvw2_.js.map → ellipsis-vertical-C1Ij47Yz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-D3NY0bm6.js → eye-C6MOB7Au.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-D3NY0bm6.js.map → eye-C6MOB7Au.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-Cy2vkc8p.js → eye-off-BxfBlZ26.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-Cy2vkc8p.js.map → eye-off-BxfBlZ26.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-Bzq3U1Mx.js → file-json-NI237wA-.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-Bzq3U1Mx.js.map → file-json-NI237wA-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DwuwPDPi.js → file-text-Byn2_2v6.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DwuwPDPi.js.map → file-text-Byn2_2v6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-q9g-bknU.js → filter-D-7PhZjx.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-q9g-bknU.js.map → filter-D-7PhZjx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-CL6vb42J.js → folder-BoAsK_FL.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-CL6vb42J.js.map → folder-BoAsK_FL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-BkrcQBly.js → gauge-DCSxJIS4.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-BkrcQBly.js.map → gauge-DCSxJIS4.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-BQbwyNeV.js → globe-CHS3prza.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-BQbwyNeV.js.map → globe-CHS3prza.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-x5_7DrN7.js → grid-3x3-D7K35U7S.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-x5_7DrN7.js.map → grid-3x3-D7K35U7S.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-DTyWXwzf.js → hard-drive-eq9xE07G.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-DTyWXwzf.js.map → hard-drive-eq9xE07G.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-80O0kJO7.js → hash-C1DMpBua.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-80O0kJO7.js.map → hash-C1DMpBua.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-DDlN2Bwa.js → history-Di5SBCY-.js} +2 -2
- package/ccw/frontend/dist/assets/{history-DDlN2Bwa.js.map → history-Di5SBCY-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-mbeo62f8.js → index--_R7COnA.js} +2 -2
- package/ccw/frontend/dist/assets/{index-mbeo62f8.js.map → index--_R7COnA.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-rLgoBCfV.js → index-BUol9HDD.js} +3 -3
- package/ccw/frontend/dist/assets/{index-rLgoBCfV.js.map → index-BUol9HDD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Bs80iCX0.js → index-CT9oykfw.js} +2 -2
- package/ccw/frontend/dist/assets/{index-Bs80iCX0.js.map → index-CT9oykfw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B9A3Hnrk.js → index-Ddwvf87H.js} +2 -2
- package/ccw/frontend/dist/assets/{index-B9A3Hnrk.js.map → index-Ddwvf87H.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-C1niOWJx.js → layout-grid-LiX0qZbN.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-C1niOWJx.js.map → layout-grid-LiX0qZbN.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-BTmI7SUg.js → lightbulb-CL3DVEwb.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-BTmI7SUg.js.map → lightbulb-CL3DVEwb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-CB9HKeuZ.js → link-2-CC5cFeq6.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-CB9HKeuZ.js.map → link-2-CC5cFeq6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-koEYiemK.js → link-ngFQ9bs0.js} +2 -2
- package/ccw/frontend/dist/assets/{link-koEYiemK.js.map → link-ngFQ9bs0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-v2_GaLdC.js → list-BEU6I0KK.js} +2 -2
- package/ccw/frontend/dist/assets/{list-v2_GaLdC.js.map → list-BEU6I0KK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-BQNfAqG_.js → map-pin-BWZdLA6y.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-BQNfAqG_.js.map → map-pin-BWZdLA6y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-Dzq5LGg9.js → messages-square-K6_Chm7n.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-Dzq5LGg9.js.map → messages-square-K6_Chm7n.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-CtkoJXcz.js → minimize-2-CWkphauf.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-CtkoJXcz.js.map → minimize-2-CWkphauf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-CH3smL37.js → package-DrNgkamn.js} +2 -2
- package/ccw/frontend/dist/assets/{package-CH3smL37.js.map → package-DrNgkamn.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-CZ0aL_yF.js → plug-CMo3sw5_.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-CZ0aL_yF.js.map → plug-CMo3sw5_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-F2A_J4l6.js → power-DppNTW5e.js} +2 -2
- package/ccw/frontend/dist/assets/{power-F2A_J4l6.js.map → power-DppNTW5e.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-Byxot0YU.js → save-CD8aPMbZ.js} +2 -2
- package/ccw/frontend/dist/assets/{save-Byxot0YU.js.map → save-CD8aPMbZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-JjqhUkpw.js → send-B4z90fQD.js} +2 -2
- package/ccw/frontend/dist/assets/{send-JjqhUkpw.js.map → send-B4z90fQD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{settings-2--SuN9rAt.js → settings-2-CAKRU_QC.js} +2 -2
- package/ccw/frontend/dist/assets/{settings-2--SuN9rAt.js.map → settings-2-CAKRU_QC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-BbngGB2h.js → square-check-big-KhI3HrzX.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-BbngGB2h.js.map → square-check-big-KhI3HrzX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-CgrHgZSl.js → square-pen-BtdGIpuq.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-CgrHgZSl.js.map → square-pen-BtdGIpuq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-BU3TQr7Z.js → star-ZoBUkXoD.js} +2 -2
- package/ccw/frontend/dist/assets/{star-BU3TQr7Z.js.map → star-ZoBUkXoD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-CKs7nnn3.js → style-CltxQP-P.js} +2 -2
- package/ccw/frontend/dist/assets/{style-CKs7nnn3.js.map → style-CltxQP-P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-DW5tsDW6.js → target-C32OUSGf.js} +2 -2
- package/ccw/frontend/dist/assets/{target-DW5tsDW6.js.map → target-C32OUSGf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-BHm7w3ON.js → test-tube-0IxoyAVZ.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-BHm7w3ON.js.map → test-tube-0IxoyAVZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-DYR7PWwt.js → upload-4eKCkyBn.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-DYR7PWwt.js.map → upload-4eKCkyBn.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-D0TVgQD_.js → useApiSettings-zLTUWqhi.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-D0TVgQD_.js.map → useApiSettings-zLTUWqhi.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-DfY8mAP8.js → useCli-BtN2vpOX.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-DfY8mAP8.js.map → useCli-BtN2vpOX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-CGusDp0F.js → useCommands-_spj49qL.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-CGusDp0F.js.map → useCommands-_spj49qL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-CIwh0fF1.js → useDebounce-Bm9KFZvd.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-CIwh0fF1.js.map → useDebounce-Bm9KFZvd.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-FMyFv39K.js → useFileExplorer-DOmpm6v9.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-FMyFv39K.js.map → useFileExplorer-DOmpm6v9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-B2qhsoTb.js → useLocale-D2rj4rea.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-B2qhsoTb.js.map → useLocale-D2rj4rea.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-cxKXMBm3.js → useSkills-OskEpomF.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-cxKXMBm3.js.map → useSkills-OskEpomF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-B-xUT_z-.js → useSystemSettings-BjMgsNSF.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-B-xUT_z-.js.map → useSystemSettings-BjMgsNSF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-DZV_3lPr.js → wand-sparkles-CLhyYWa7.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-DZV_3lPr.js.map → wand-sparkles-CLhyYWa7.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/ccw/scripts/prepublish-clean.mjs +0 -1
- package/package.json +1 -3
- package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js +0 -150
- package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +0 -1
- package/ccw/frontend/dist/assets/SkillsManagerPage-CTnWrrwp.js +0 -7
- package/ccw/frontend/dist/assets/SkillsManagerPage-CTnWrrwp.js.map +0 -1
- package/ccw-litellm/README.md +0 -180
- package/ccw-litellm/pyproject.toml +0 -35
- package/ccw-litellm/src/ccw_litellm/__init__.py +0 -47
- package/ccw-litellm/src/ccw_litellm/cli.py +0 -108
- package/ccw-litellm/src/ccw_litellm/clients/__init__.py +0 -12
- package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +0 -270
- package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +0 -198
- package/ccw-litellm/src/ccw_litellm/config/__init__.py +0 -22
- package/ccw-litellm/src/ccw_litellm/config/loader.py +0 -343
- package/ccw-litellm/src/ccw_litellm/config/models.py +0 -162
- package/ccw-litellm/src/ccw_litellm/interfaces/__init__.py +0 -14
- package/ccw-litellm/src/ccw_litellm/interfaces/embedder.py +0 -52
- package/ccw-litellm/src/ccw_litellm/interfaces/llm.py +0 -45
package/ccw/frontend/dist/assets/{useApiSettings-D0TVgQD_.js.map → useApiSettings-zLTUWqhi.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useApiSettings-D0TVgQD_.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":"sWAkDO,MAAMA,EAAkB,CAC7B,IAAK,CAAC,aAAa,EACnB,UAAW,IAAM,CAAC,GAAGA,EAAgB,IAAK,WAAW,EACrD,SAAWC,GAAe,CAAC,GAAGD,EAAgB,UAAA,EAAaC,CAAE,EAC7D,UAAW,IAAM,CAAC,GAAGD,EAAgB,IAAK,WAAW,EACrD,SAAWC,GAAe,CAAC,GAAGD,EAAgB,UAAA,EAAaC,CAAE,EAC7D,MAAO,IAAM,CAAC,GAAGD,EAAgB,IAAK,OAAO,EAC7C,WAAY,IAAM,CAAC,GAAGA,EAAgB,IAAK,YAAY,EACvD,UAAYC,GAAe,CAAC,GAAGD,EAAgB,WAAA,EAAcC,CAAE,EAC/D,YAAa,IAAM,CAAC,GAAGD,EAAgB,IAAK,aAAa,EACzD,WAAaC,GAAe,CAAC,GAAGD,EAAgB,YAAA,EAAeC,CAAE,CACnE,EAEMC,EAAa,IAAS,IAqBrB,SAASC,EAAaC,EAA+B,GAAwB,OAClF,KAAM,CAAE,UAAAC,EAAYH,EAAY,QAAAI,EAAU,IAASF,EAC7CG,EAAcC,EAAA,EAEdC,EAAQC,EAAS,CACrB,SAAUV,EAAgB,UAAA,EAC1B,QAASW,EACT,UAAAN,EACA,QAAAC,EACA,MAAO,CAAA,CACR,EAEKM,IAAYC,EAAAJ,EAAM,OAAN,YAAAI,EAAY,YAAa,CAAA,EAErCC,EAAU,SAAY,CAC1B,MAAML,EAAM,QAAA,CACd,EAEMM,EAAa,SAAY,CAC7B,MAAMR,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,UAAA,EAAa,CAC/E,EAEA,MAAO,CACL,UAAAY,EACA,WAAYA,EAAU,OACtB,UAAWH,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAK,EACA,WAAAC,CAAA,CAEJ,CAEO,SAASC,GAAoB,CAClC,MAAMT,EAAcC,EAAA,EACdS,EAAgBC,EAAA,EAChB,CAAE,QAAAC,EAAS,KAAAC,EAAM,MAAOC,CAAA,EAAeC,EAAA,EAEvCC,EAAWC,EAAY,CAC3B,WAAaC,GACXC,EAAeD,CAAQ,EACzB,SAAU,IAAM,CACdL,EACEH,EAAc,CAAE,GAAI,kBAAmB,EACvCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,UAAW,IAAM,CACfV,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,UAAA,EAAa,EACvEmB,EACEF,EAAc,CAAE,GAAI,iBAAkB,EACtCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,QAAUU,GAAQ,CAChB,MAAMC,EAAYC,EAAqBF,EAAK,gBAAgB,EACtDG,EAAUb,EAAc,CAAE,GAAIW,EAAU,WAAY,EACpDG,EAAQd,EAAc,CAAE,GAAI,eAAgB,EAClDI,EAAWU,EAAOD,CAAO,CAC3B,CAAA,CACD,EAED,MAAO,CACL,eAAgBP,EAAS,YACzB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASS,GAAoB,CAClC,MAAMzB,EAAcC,EAAA,EACdS,EAAgBC,EAAA,EAChB,CAAE,QAAAC,EAAS,KAAAC,EAAM,MAAOC,CAAA,EAAeC,EAAA,EAEvCC,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,WAAAS,EAAY,QAAAC,KACzBC,EAAeF,EAAYC,CAAO,EACpC,SAAU,IAAM,CACdd,EACEH,EAAc,CAAE,GAAI,oBAAqB,EACzCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,UAAW,IAAM,CACfV,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,UAAA,EAAa,EACvEmB,EACEF,EAAc,CAAE,GAAI,iBAAkB,EACtCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,QAAUU,GAAQ,CAChB,MAAMC,EAAYC,EAAqBF,EAAK,gBAAgB,EACtDG,EAAUb,EAAc,CAAE,GAAIW,EAAU,WAAY,EACpDG,EAAQd,EAAc,CAAE,GAAI,eAAgB,EAClDI,EAAWU,EAAOD,CAAO,CAC3B,CAAA,CACD,EAED,MAAO,CACL,eAAgB,CAACG,EAAoBC,IACnCX,EAAS,YAAY,CAAE,WAAAU,EAAY,QAAAC,EAAS,EAC9C,WAAYX,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASa,GAAoB,CAClC,MAAM7B,EAAcC,EAAA,EACdS,EAAgBC,EAAA,EAChB,CAAE,QAAAC,EAAS,KAAAC,EAAM,MAAOC,CAAA,EAAeC,EAAA,EAEvCC,EAAWC,EAAY,CAC3B,WAAaS,GAAuBI,EAAeJ,CAAU,EAC7D,SAAU,IAAM,CACdb,EACEH,EAAc,CAAE,GAAI,kBAAmB,EACvCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,UAAW,IAAM,CACfV,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,UAAA,EAAa,EACvEmB,EACEF,EAAc,CAAE,GAAI,iBAAkB,EACtCA,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAA,CAElE,EACA,QAAUU,GAAQ,CAChB,MAAMC,EAAYC,EAAqBF,EAAK,gBAAgB,EACtDG,EAAUb,EAAc,CAAE,GAAIW,EAAU,WAAY,EACpDG,EAAQd,EAAc,CAAE,GAAI,eAAgB,EAClDI,EAAWU,EAAOD,CAAO,CAC3B,CAAA,CACD,EAED,MAAO,CACL,eAAgBP,EAAS,YACzB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASe,IAAkB,CAChC,MAAMf,EAAWC,EAAY,CAC3B,WAAaS,GAAuBM,EAAaN,CAAU,CAAA,CAC5D,EAED,MAAO,CACL,aAAcV,EAAS,YACvB,UAAWA,EAAS,UACpB,MAAOA,EAAS,KAAA,CAEpB,CAyBO,SAASiB,IAAgC,CAC9C,MAAMjC,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAaS,GAAuBQ,EAA2BR,CAAU,EACzE,UAAW,CAACS,EAAGT,IAAe,CAC5B1B,EAAY,kBAAkB,CAAE,SAAU,CAAC,GAAGP,EAAgB,SAASiC,CAAU,EAAG,QAAQ,EAAG,CACjG,CAAA,CACD,EAED,MAAO,CACL,mBAAoBV,EAAS,YAC7B,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAsBO,SAASoB,GAAavC,EAA+B,GAAwB,OAClF,KAAM,CAAE,UAAAC,EAAYH,EAAY,QAAAI,EAAU,IAASF,EAC7CG,EAAcC,EAAA,EAEdC,EAAQC,EAAS,CACrB,SAAUV,EAAgB,UAAA,EAC1B,QAAS4C,EACT,UAAAvC,EACA,QAAAC,EACA,MAAO,CAAA,CACR,EAEKuC,IAAYhC,EAAAJ,EAAM,OAAN,YAAAI,EAAY,YAAa,CAAA,EACrCiC,EAAkBD,EAAU,OAAQE,GAAMA,EAAE,cAAc,OAAO,EAEjEjC,EAAU,SAAY,CAC1B,MAAML,EAAM,QAAA,CACd,EAEMM,EAAa,SAAY,CAC7B,MAAMR,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,UAAA,EAAa,CAC/E,EAEA,MAAO,CACL,UAAA6C,EACA,WAAYA,EAAU,OACtB,YAAaC,EAAgB,OAC7B,UAAWrC,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAK,EACA,WAAAC,CAAA,CAEJ,CAEO,SAASiC,IAAoB,CAClC,MAAMzC,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAayB,GACXC,EAAeD,CAAQ,EACzB,UAAW,IAAM,CACf1C,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,UAAA,EAAa,CACzE,CAAA,CACD,EAED,MAAO,CACL,eAAgBuB,EAAS,YACzB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAAS4B,IAAoB,CAClC,MAAM5C,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,WAAA4B,EAAY,QAAAlB,KACzBmB,EAAeD,EAAYlB,CAAO,EACpC,UAAW,IAAM,CACf3B,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,UAAA,EAAa,CACzE,CAAA,CACD,EAED,MAAO,CACL,eAAgB,CAACoD,EAAoBlB,IACnCX,EAAS,YAAY,CAAE,WAAA6B,EAAY,QAAAlB,EAAS,EAC9C,WAAYX,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAAS+B,IAAoB,CAClC,MAAM/C,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAa4B,GAAuBG,EAAeH,CAAU,EAC7D,UAAW,IAAM,CACf7C,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,UAAA,EAAa,CACzE,CAAA,CACD,EAED,MAAO,CACL,eAAgBuB,EAAS,YACzB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAmBO,SAASiC,GAAcpD,EAAgC,GAAyB,CACrF,KAAM,CAAE,UAAAC,EAAY,IAAO,QAAAC,EAAU,IAASF,EAExCK,EAAQC,EAAS,CACrB,SAAUV,EAAgB,MAAA,EAC1B,QAASyD,EACT,UAAApD,EACA,QAAAC,EACA,MAAO,CAAA,CACR,EAEKQ,EAAU,SAAY,CAC1B,MAAML,EAAM,QAAA,CACd,EAEA,MAAO,CACL,MAAOA,EAAM,MAAQ,KACrB,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAK,CAAA,CAEJ,CAEO,SAAS4C,IAAgB,CAC9B,MAAMnD,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAY,IAAMmC,EAAA,EAClB,UAAW,IAAM,CACfpD,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,MAAA,EAAS,CACrE,CAAA,CACD,EAED,MAAO,CACL,WAAYuB,EAAS,YACrB,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASqC,IAAyB,CACvC,MAAMrD,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAaqC,GACXC,EAAoBD,CAAQ,EAC9B,UAAW,IAAM,CACftD,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,MAAA,EAAS,CACrE,CAAA,CACD,EAED,MAAO,CACL,oBAAqBuB,EAAS,YAC9B,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAsBO,SAASwC,GAAc3D,EAAgC,GAAyB,OACrF,KAAM,CAAE,UAAAC,EAAYH,EAAY,QAAAI,EAAU,IAASF,EAC7CG,EAAcC,EAAA,EAEdC,EAAQC,EAAS,CACrB,SAAUV,EAAgB,WAAA,EAC1B,QAASgE,EACT,UAAA3D,EACA,QAAAC,EACA,MAAO,CAAA,CACR,EAEK2D,IAAQpD,EAAAJ,EAAM,OAAN,YAAAI,EAAY,QAAS,CAAA,EAC7BqD,EAAeD,EAAM,OAAQE,GAAMA,EAAE,OAAO,EAE5CrD,EAAU,SAAY,CAC1B,MAAML,EAAM,QAAA,CACd,EAEMM,EAAa,SAAY,CAC7B,MAAMR,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,WAAA,EAAc,CAChF,EAEA,MAAO,CACL,MAAAiE,EACA,WAAYA,EAAM,OAClB,aAAcC,EAAa,OAC3B,UAAWzD,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAK,EACA,WAAAC,CAAA,CAEJ,CAYO,SAASqD,IAAqB,CACnC,MAAM7D,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAa6C,GAAsCC,EAAgBD,CAAI,EACvE,UAAW,IAAM,CACf9D,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,WAAA,EAAc,CAC1E,CAAA,CACD,EAED,MAAO,CACL,gBAAiBuB,EAAS,YAC1B,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASgD,IAAqB,CACnC,MAAMhE,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,OAAAgD,EAAQ,QAAAtC,KACrBuC,EAAgBD,EAAQtC,CAAO,EACjC,UAAW,CAACQ,EAAGgC,IAAc,CAC3BnE,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,WAAA,EAAc,EACxEO,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,UAAU0E,EAAU,MAAM,EAAG,CACzF,CAAA,CACD,EAED,MAAO,CACL,gBAAiB,CAACF,EAAgBtC,IAChCX,EAAS,YAAY,CAAE,OAAAiD,EAAQ,QAAAtC,EAAS,EAC1C,WAAYX,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASoD,IAAqB,CACnC,MAAMpE,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAagD,GAAmBI,EAAgBJ,CAAM,EACtD,UAAW,IAAM,CACfjE,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,WAAA,EAAc,CAC1E,CAAA,CACD,EAED,MAAO,CACL,gBAAiBuB,EAAS,YAC1B,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASsD,GAA0BC,EAA0B,CAClE,OAAOpE,EAAS,CACd,SAAU,CAAC,GAAGV,EAAgB,WAAA,EAAc,YAAa8E,CAAS,EAClE,QAAS,IAAMC,EAA0BD,CAAS,EAClD,QAAS,GACT,UAAW5E,CAAA,CACZ,CACH,CAEO,SAAS8E,IAA2B,CACzC,MAAMzD,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,UAAAsD,EAAW,YAAAG,KACxBC,EAAsBJ,EAAWG,CAAW,CAAA,CAC/C,EAED,MAAO,CACL,eAAgB,CAACH,EAA0BG,IACzC1D,EAAS,YAAY,CAAE,UAAAuD,EAAW,YAAAG,EAAa,EACjD,cAAe1D,EAAS,UACxB,MAAOA,EAAS,MAChB,KAAMA,EAAS,IAAA,CAEnB,CAcO,SAAS4D,IAAmB,CACjC,OAAO3D,EAAY,CACjB,WAAY,IAAM4D,EAAA,CAAc,CACjC,CACH,CA8BO,SAASC,GAAejF,EAAiC,GAA0B,OACxF,KAAM,CAAE,UAAAC,EAAYH,EAAY,QAAAI,EAAU,IAASF,EAC7CG,EAAcC,EAAA,EAEdC,EAAQC,EAAS,CACrB,SAAUV,EAAgB,YAAA,EAC1B,QAASsF,EACT,UAAAjF,EACA,QAAAC,EACA,MAAO,CAAA,CACR,EAEKiF,IAAc1E,EAAAJ,EAAM,OAAN,YAAAI,EAAY,YAAa,CAAA,EACvC2E,EAAqBD,EAAY,OAAQE,GAAMA,EAAE,OAAO,EAGxDC,EAAiBH,EAAY,OAA+B,CAACI,EAAKF,IAAM,CAC5E,MAAMhE,EAAWgE,EAAE,UAAY,SAC/B,OAAAE,EAAIlE,CAAQ,GAAKkE,EAAIlE,CAAQ,GAAK,GAAK,EAChCkE,CACT,EAAG,CAAA,CAAE,EAEC7E,EAAU,SAAY,CAC1B,MAAML,EAAM,QAAA,CACd,EAEMM,EAAa,SAAY,CAC7B,MAAMR,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,YAAA,EAAe,CACjF,EAEA,MAAO,CACL,YAAAuF,EACA,WAAYA,EAAY,OACxB,aAAcC,EAAmB,OACjC,eAAAE,EACA,UAAWjF,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAK,EACA,WAAAC,CAAA,CAEJ,CAEO,SAAS6E,IAAuB,CACrC,MAAMrF,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAaqE,GAAoCC,EAAkBD,CAAO,EAC1E,UAAW,IAAM,CACftF,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,YAAA,EAAe,CAC3E,CAAA,CACD,EAED,MAAO,CACL,kBAAmBuB,EAAS,YAC5B,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAASwE,IAAuB,CACrC,MAAMxF,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,WAAA4B,EAAY,QAAAyC,KACzBG,EAAkB5C,EAAYyC,CAAO,EACvC,UAAW,IAAM,CACftF,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,YAAA,EAAe,CAC3E,CAAA,CACD,EAED,MAAO,CACL,kBAAmB,CAACoD,EAAoByC,IACtCtE,EAAS,YAAY,CAAE,WAAA6B,EAAY,QAAAyC,EAAS,EAC9C,WAAYtE,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAAS0E,IAAuB,CACrC,MAAM1F,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAa4B,GAAuB8C,EAAkB9C,CAAU,EAChE,UAAW,IAAM,CACf7C,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,YAAA,EAAe,CAC3E,CAAA,CACD,EAED,MAAO,CACL,kBAAmBuB,EAAS,YAC5B,WAAYA,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB,CAEO,SAAS4E,IAAuB,CACrC,MAAM5F,EAAcC,EAAA,EAEde,EAAWC,EAAY,CAC3B,WAAY,CAAC,CAAE,WAAA4B,EAAY,QAAA9C,KACzB8F,EAAyBhD,EAAY9C,CAAO,EAC9C,UAAW,IAAM,CACfC,EAAY,kBAAkB,CAAE,SAAUP,EAAgB,YAAA,EAAe,CAC3E,CAAA,CACD,EAED,MAAO,CACL,kBAAmB,CAACoD,EAAoB9C,IACtCiB,EAAS,YAAY,CAAE,WAAA6B,EAAY,QAAA9C,EAAS,EAC9C,WAAYiB,EAAS,UACrB,MAAOA,EAAS,KAAA,CAEpB"}
|
|
1
|
+
{"version":3,"file":"useApiSettings-zLTUWqhi.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,
|
|
2
|
-
//# sourceMappingURL=useCli-
|
|
1
|
+
import{aF as c,ab as C,aH as g,al as E,a9 as h,aa as K,aC as f,dA as F,dB as b,dC as P,dD as S,dE as w,dF as L,dG as M,dH as H,dI as R,dy as _,dJ as A,dK as I,dL as U,dM as j,dN as z,dO as N}from"./index-BUol9HDD.js";import{a as T}from"./useLocale-D2rj4rea.js";import{s as D}from"./errorSanitizer-IY9pf5g4.js";const l={all:["cliEndpoints"],lists:()=>[...l.all,"list"]},k=120*1e3;function W(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=>S(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=>w(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=>L(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=>M(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 B={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:B.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})=>H(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:()=>N(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,W as u};
|
|
2
|
+
//# sourceMappingURL=useCli-BtN2vpOX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCli-DfY8mAP8.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
|
+
{"version":3,"file":"useCli-BtN2vpOX.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,
|
|
2
|
-
//# sourceMappingURL=useCommands-
|
|
1
|
+
import{aF as q,a9 as v,aa as F,ab as j,aC as p,al as A,aH as L,bV as u,c0 as E,c1 as k,c2 as z}from"./index-BUol9HDD.js";import{s as M}from"./errorSanitizer-IY9pf5g4.js";const G=600*1e3;function D(){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 H(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={},w=new Set,b=n.filter(e=>e.enabled!==!1).length,K=n.length-b;for(const e of n){const s=e.group||"other";w.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(w).sort(),enabledCount:b,disabledCount:K,projectCount:a,userCount:t,totalCount:i.length,isLoading:c.isLoading,isFetching:c.isFetching,error:c.error,refetch:P,invalidate:Q}}export{D as a,H as u};
|
|
2
|
+
//# sourceMappingURL=useCommands-_spj49qL.js.map
|
package/ccw/frontend/dist/assets/{useCommands-CGusDp0F.js.map → useCommands-_spj49qL.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCommands-CGusDp0F.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-_spj49qL.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-
|
|
2
|
-
//# sourceMappingURL=useDebounce-
|
|
1
|
+
import{r as o}from"./index-BUol9HDD.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-Bm9KFZvd.js.map
|
package/ccw/frontend/dist/assets/{useDebounce-CIwh0fF1.js.map → useDebounce-Bm9KFZvd.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebounce-
|
|
1
|
+
{"version":3,"file":"useDebounce-Bm9KFZvd.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"}
|
package/ccw/frontend/dist/assets/{useFileExplorer-FMyFv39K.js → useFileExplorer-DOmpm6v9.js}
RENAMED
|
@@ -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,
|
|
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,f4 as R,f5 as he,f6 as fe,f7 as ye}from"./index-BUol9HDD.js";import{F as $}from"./folder-BoAsK_FL.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-
|
|
7
|
+
//# sourceMappingURL=useFileExplorer-DOmpm6v9.js.map
|