claude-code-workflow 7.2.5 → 7.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/.claude/commands/workflow/analyze-with-file.md +11 -10
  2. package/.claude/skills/ccw-help/command.json +3 -3
  3. package/.claude/skills/ccw-help/index/all-commands.json +3 -3
  4. package/.claude/skills/ccw-help/index/by-category.json +3 -3
  5. package/.claude/skills/ccw-help/index/by-use-case.json +3 -3
  6. package/.claude/skills/skill-iter-tune/SKILL.md +382 -0
  7. package/.claude/skills/skill-iter-tune/phases/01-setup.md +144 -0
  8. package/.claude/skills/skill-iter-tune/phases/02-execute.md +292 -0
  9. package/.claude/skills/skill-iter-tune/phases/03-evaluate.md +312 -0
  10. package/.claude/skills/skill-iter-tune/phases/04-improve.md +186 -0
  11. package/.claude/skills/skill-iter-tune/phases/05-report.md +166 -0
  12. package/.claude/skills/skill-iter-tune/specs/evaluation-criteria.md +63 -0
  13. package/.claude/skills/skill-iter-tune/templates/eval-prompt.md +134 -0
  14. package/.claude/skills/skill-iter-tune/templates/execute-prompt.md +97 -0
  15. package/.claude/skills/team-roadmap-dev/SKILL.md +1 -1
  16. package/.claude/skills/team-roadmap-dev/roles/coordinator/role.md +1 -1
  17. package/.claude/skills/team-roadmap-dev/specs/team-config.json +1 -1
  18. package/ccw/dist/commands/install.d.ts.map +1 -1
  19. package/ccw/dist/commands/install.js +11 -9
  20. package/ccw/dist/commands/install.js.map +1 -1
  21. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -1
  22. package/ccw/dist/core/routes/codexlens/config-handlers.js +4 -0
  23. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -1
  24. package/ccw/dist/mcp-server/index.js +85 -8
  25. package/ccw/dist/mcp-server/index.js.map +1 -1
  26. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -1
  27. package/ccw/dist/tools/cli-executor-core.js +0 -25
  28. package/ccw/dist/tools/cli-executor-core.js.map +1 -1
  29. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -1
  30. package/ccw/dist/tools/cli-executor-state.js +0 -31
  31. package/ccw/dist/tools/cli-executor-state.js.map +1 -1
  32. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  33. package/ccw/dist/tools/cli-history-store.js +1 -30
  34. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  35. package/ccw/dist/tools/smart-search.d.ts +72 -1
  36. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  37. package/ccw/dist/tools/smart-search.js +726 -117
  38. package/ccw/dist/tools/smart-search.js.map +1 -1
  39. package/ccw/frontend/dist/assets/{AlertDialog-CFGtc76Y.js → AlertDialog-CSZq4WHZ.js} +2 -2
  40. package/ccw/frontend/dist/assets/{AlertDialog-CFGtc76Y.js.map → AlertDialog-CSZq4WHZ.js.map} +1 -1
  41. package/ccw/frontend/dist/assets/{AnalysisPage-Duxia_dG.js → AnalysisPage-DVDvLHqI.js} +2 -2
  42. package/ccw/frontend/dist/assets/{AnalysisPage-Duxia_dG.js.map → AnalysisPage-DVDvLHqI.js.map} +1 -1
  43. package/ccw/frontend/dist/assets/{ApiSettingsPage-CU9hesAE.js → ApiSettingsPage-D69j8mI6.js} +2 -2
  44. package/ccw/frontend/dist/assets/{ApiSettingsPage-CU9hesAE.js.map → ApiSettingsPage-D69j8mI6.js.map} +1 -1
  45. package/ccw/frontend/dist/assets/{CliModeToggle-DcdOFSvM.js → CliModeToggle-fF9xHeGR.js} +2 -2
  46. package/ccw/frontend/dist/assets/{CliModeToggle-DcdOFSvM.js.map → CliModeToggle-fF9xHeGR.js.map} +1 -1
  47. package/ccw/frontend/dist/assets/{CliSessionSharePage-oKN-GRIT.js → CliSessionSharePage-Ce8tOQNx.js} +2 -2
  48. package/ccw/frontend/dist/assets/{CliSessionSharePage-oKN-GRIT.js.map → CliSessionSharePage-Ce8tOQNx.js.map} +1 -1
  49. package/ccw/frontend/dist/assets/{CliViewerPage-_wUoHaY-.js → CliViewerPage-Bsp1zmfD.js} +2 -2
  50. package/ccw/frontend/dist/assets/{CliViewerPage-_wUoHaY-.js.map → CliViewerPage-Bsp1zmfD.js.map} +1 -1
  51. package/ccw/frontend/dist/assets/{CodexLensManagerPage-ClPNashJ.js → CodexLensManagerPage-DUMzbrr9.js} +9 -9
  52. package/ccw/frontend/dist/assets/CodexLensManagerPage-DUMzbrr9.js.map +1 -0
  53. package/ccw/frontend/dist/assets/{Collapsible-Dladh9Eu.js → Collapsible-I5pixbHb.js} +2 -2
  54. package/ccw/frontend/dist/assets/{Collapsible-Dladh9Eu.js.map → Collapsible-I5pixbHb.js.map} +1 -1
  55. package/ccw/frontend/dist/assets/{CommandsManagerPage-B6DBb_Ew.js → CommandsManagerPage-BH2xukdx.js} +2 -2
  56. package/ccw/frontend/dist/assets/{CommandsManagerPage-B6DBb_Ew.js.map → CommandsManagerPage-BH2xukdx.js.map} +1 -1
  57. package/ccw/frontend/dist/assets/{DeepWikiPage-CDA3xm3R.js → DeepWikiPage-D41ccWzY.js} +2 -2
  58. package/ccw/frontend/dist/assets/{DeepWikiPage-CDA3xm3R.js.map → DeepWikiPage-D41ccWzY.js.map} +1 -1
  59. package/ccw/frontend/dist/assets/{EndpointsPage-Bu7iU0Wy.js → EndpointsPage-5a8jfEWN.js} +2 -2
  60. package/ccw/frontend/dist/assets/{EndpointsPage-Bu7iU0Wy.js.map → EndpointsPage-5a8jfEWN.js.map} +1 -1
  61. package/ccw/frontend/dist/assets/{ExplorerPage-xim2cboZ.js → ExplorerPage-YCqIOu1v.js} +2 -2
  62. package/ccw/frontend/dist/assets/{ExplorerPage-xim2cboZ.js.map → ExplorerPage-YCqIOu1v.js.map} +1 -1
  63. package/ccw/frontend/dist/assets/{FixSessionPage-BTFYoFQF.js → FixSessionPage-wK1s4kbo.js} +2 -2
  64. package/ccw/frontend/dist/assets/{FixSessionPage-BTFYoFQF.js.map → FixSessionPage-wK1s4kbo.js.map} +1 -1
  65. package/ccw/frontend/dist/assets/{FloatingFileBrowser-B30ANzTJ.js → FloatingFileBrowser-B1U6uk_5.js} +2 -2
  66. package/ccw/frontend/dist/assets/{FloatingFileBrowser-B30ANzTJ.js.map → FloatingFileBrowser-B1U6uk_5.js.map} +1 -1
  67. package/ccw/frontend/dist/assets/{FloatingPanel-Ds84B7Ob.js → FloatingPanel-D51p5jNy.js} +2 -2
  68. package/ccw/frontend/dist/assets/{FloatingPanel-Ds84B7Ob.js.map → FloatingPanel-D51p5jNy.js.map} +1 -1
  69. package/ccw/frontend/dist/assets/{GraphExplorerPage-DJ4YnFOQ.js → GraphExplorerPage-DpIWrpWH.js} +2 -2
  70. package/ccw/frontend/dist/assets/{GraphExplorerPage-DJ4YnFOQ.js.map → GraphExplorerPage-DpIWrpWH.js.map} +1 -1
  71. package/ccw/frontend/dist/assets/{HistoryPage-rzLVsw11.js → HistoryPage-C09lyJGN.js} +2 -2
  72. package/ccw/frontend/dist/assets/{HistoryPage-rzLVsw11.js.map → HistoryPage-C09lyJGN.js.map} +1 -1
  73. package/ccw/frontend/dist/assets/{HookManagerPage-DizO_dCP.js → HookManagerPage-CFBe8F_G.js} +2 -2
  74. package/ccw/frontend/dist/assets/{HookManagerPage-DizO_dCP.js.map → HookManagerPage-CFBe8F_G.js.map} +1 -1
  75. package/ccw/frontend/dist/assets/{InstallationsPage-BFamuE4y.js → InstallationsPage-qt7NxnsB.js} +2 -2
  76. package/ccw/frontend/dist/assets/{InstallationsPage-BFamuE4y.js.map → InstallationsPage-qt7NxnsB.js.map} +1 -1
  77. package/ccw/frontend/dist/assets/{IssueHubPage-DHwQWuUc.js → IssueHubPage-CHol1-Ap.js} +2 -2
  78. package/ccw/frontend/dist/assets/{IssueHubPage-DHwQWuUc.js.map → IssueHubPage-CHol1-Ap.js.map} +1 -1
  79. package/ccw/frontend/dist/assets/{LiteTasksPage-DMDkG7pi.js → LiteTasksPage-jH00SLnZ.js} +2 -2
  80. package/ccw/frontend/dist/assets/{LiteTasksPage-DMDkG7pi.js.map → LiteTasksPage-jH00SLnZ.js.map} +1 -1
  81. package/ccw/frontend/dist/assets/{McpManagerPage-CS2v_1OG.js → McpManagerPage-BS-HgeQJ.js} +11 -11
  82. package/ccw/frontend/dist/assets/McpManagerPage-BS-HgeQJ.js.map +1 -0
  83. package/ccw/frontend/dist/assets/{MemoryPage-DhYPE-VC.js → MemoryPage-1UahrmRX.js} +2 -2
  84. package/ccw/frontend/dist/assets/{MemoryPage-DhYPE-VC.js.map → MemoryPage-1UahrmRX.js.map} +1 -1
  85. package/ccw/frontend/dist/assets/{NotFoundPage-BLmC7-ot.js → NotFoundPage-5FVm_IkS.js} +2 -2
  86. package/ccw/frontend/dist/assets/{NotFoundPage-BLmC7-ot.js.map → NotFoundPage-5FVm_IkS.js.map} +1 -1
  87. package/ccw/frontend/dist/assets/{OrchestratorPage-1jzSUFZW.js → OrchestratorPage-ThBG24Gg.js} +2 -2
  88. package/ccw/frontend/dist/assets/{OrchestratorPage-1jzSUFZW.js.map → OrchestratorPage-ThBG24Gg.js.map} +1 -1
  89. package/ccw/frontend/dist/assets/{ProjectOverviewPage-gWuAj-Cn.js → ProjectOverviewPage-CrmW0IxI.js} +2 -2
  90. package/ccw/frontend/dist/assets/{ProjectOverviewPage-gWuAj-Cn.js.map → ProjectOverviewPage-CrmW0IxI.js.map} +1 -1
  91. package/ccw/frontend/dist/assets/{PromptHistoryPage-q7ySVNHM.js → PromptHistoryPage-1cCGwS3s.js} +2 -2
  92. package/ccw/frontend/dist/assets/{PromptHistoryPage-q7ySVNHM.js.map → PromptHistoryPage-1cCGwS3s.js.map} +1 -1
  93. package/ccw/frontend/dist/assets/{ReviewSessionPage-DX1uT_nH.js → ReviewSessionPage-DxiEc9HK.js} +2 -2
  94. package/ccw/frontend/dist/assets/{ReviewSessionPage-DX1uT_nH.js.map → ReviewSessionPage-DxiEc9HK.js.map} +1 -1
  95. package/ccw/frontend/dist/assets/{RulesManagerPage-Bg6T5W-W.js → RulesManagerPage-BpplliZF.js} +2 -2
  96. package/ccw/frontend/dist/assets/{RulesManagerPage-Bg6T5W-W.js.map → RulesManagerPage-BpplliZF.js.map} +1 -1
  97. package/ccw/frontend/dist/assets/{SessionDetailPage-C_ig6JSh.js → SessionDetailPage-crDIiysh.js} +2 -2
  98. package/ccw/frontend/dist/assets/{SessionDetailPage-C_ig6JSh.js.map → SessionDetailPage-crDIiysh.js.map} +1 -1
  99. package/ccw/frontend/dist/assets/{SessionsPage-BENFqFDn.js → SessionsPage-DThweYY8.js} +2 -2
  100. package/ccw/frontend/dist/assets/{SessionsPage-BENFqFDn.js.map → SessionsPage-DThweYY8.js.map} +1 -1
  101. package/ccw/frontend/dist/assets/{SettingsPage-2c-oTxfz.js → SettingsPage-OCdOz5-z.js} +4 -4
  102. package/ccw/frontend/dist/assets/{SettingsPage-2c-oTxfz.js.map → SettingsPage-OCdOz5-z.js.map} +1 -1
  103. package/ccw/frontend/dist/assets/{SkillsManagerPage-GLo6DXnt.js → SkillsManagerPage-BJd3bK1G.js} +2 -2
  104. package/ccw/frontend/dist/assets/{SkillsManagerPage-GLo6DXnt.js.map → SkillsManagerPage-BJd3bK1G.js.map} +1 -1
  105. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CRqMV90p.js → SpecsSettingsPage-BAWL2cpO.js} +2 -2
  106. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CRqMV90p.js.map → SpecsSettingsPage-BAWL2cpO.js.map} +1 -1
  107. package/ccw/frontend/dist/assets/{Switch-vlMavMRD.js → Switch-w0I3JCcC.js} +2 -2
  108. package/ccw/frontend/dist/assets/{Switch-vlMavMRD.js.map → Switch-w0I3JCcC.js.map} +1 -1
  109. package/ccw/frontend/dist/assets/{TabsNavigation-CLKz7pWP.js → TabsNavigation-jhUge9YV.js} +2 -2
  110. package/ccw/frontend/dist/assets/{TabsNavigation-CLKz7pWP.js.map → TabsNavigation-jhUge9YV.js.map} +1 -1
  111. package/ccw/frontend/dist/assets/{TaskDrawer-BAFvNqF8.js → TaskDrawer-APWpZulm.js} +2 -2
  112. package/ccw/frontend/dist/assets/{TaskDrawer-BAFvNqF8.js.map → TaskDrawer-APWpZulm.js.map} +1 -1
  113. package/ccw/frontend/dist/assets/{TeamPage-C2IsDkAv.js → TeamPage-8OnLsAfJ.js} +2 -2
  114. package/ccw/frontend/dist/assets/{TeamPage-C2IsDkAv.js.map → TeamPage-8OnLsAfJ.js.map} +1 -1
  115. package/ccw/frontend/dist/assets/{TerminalDashboardPage-mgS-iKDm.js → TerminalDashboardPage-Be1hcN4p.js} +2 -2
  116. package/ccw/frontend/dist/assets/{TerminalDashboardPage-mgS-iKDm.js.map → TerminalDashboardPage-Be1hcN4p.js.map} +1 -1
  117. package/ccw/frontend/dist/assets/{archive-CxxK_YIp.js → archive-Bo1tC9yo.js} +2 -2
  118. package/ccw/frontend/dist/assets/{archive-CxxK_YIp.js.map → archive-Bo1tC9yo.js.map} +1 -1
  119. package/ccw/frontend/dist/assets/{archive-restore-DZsrBaeG.js → archive-restore-DYx41yLJ.js} +2 -2
  120. package/ccw/frontend/dist/assets/{archive-restore-DZsrBaeG.js.map → archive-restore-DYx41yLJ.js.map} +1 -1
  121. package/ccw/frontend/dist/assets/{arrow-right-BotRHOhr.js → arrow-right-C6pOqWF1.js} +2 -2
  122. package/ccw/frontend/dist/assets/{arrow-right-BotRHOhr.js.map → arrow-right-C6pOqWF1.js.map} +1 -1
  123. package/ccw/frontend/dist/assets/{bookmark-plus-C0MWZ3S9.js → bookmark-plus-4Qpa6hMJ.js} +2 -2
  124. package/ccw/frontend/dist/assets/{bookmark-plus-C0MWZ3S9.js.map → bookmark-plus-4Qpa6hMJ.js.map} +1 -1
  125. package/ccw/frontend/dist/assets/{bot-BcHFJXqD.js → bot-HXJTmx8r.js} +2 -2
  126. package/ccw/frontend/dist/assets/{bot-BcHFJXqD.js.map → bot-HXJTmx8r.js.map} +1 -1
  127. package/ccw/frontend/dist/assets/{braces-D_p0IZhP.js → braces-Dj2IdY7I.js} +2 -2
  128. package/ccw/frontend/dist/assets/{braces-D_p0IZhP.js.map → braces-Dj2IdY7I.js.map} +1 -1
  129. package/ccw/frontend/dist/assets/{circle-stop-Bt634NUt.js → circle-stop-M29TJKHc.js} +2 -2
  130. package/ccw/frontend/dist/assets/{circle-stop-Bt634NUt.js.map → circle-stop-M29TJKHc.js.map} +1 -1
  131. package/ccw/frontend/dist/assets/{cpu-DjeGKtvT.js → cpu-DX15mzMT.js} +2 -2
  132. package/ccw/frontend/dist/assets/{cpu-DjeGKtvT.js.map → cpu-DX15mzMT.js.map} +1 -1
  133. package/ccw/frontend/dist/assets/{ellipsis-vertical-BmNPuatq.js → ellipsis-vertical-Fs6bysWx.js} +2 -2
  134. package/ccw/frontend/dist/assets/{ellipsis-vertical-BmNPuatq.js.map → ellipsis-vertical-Fs6bysWx.js.map} +1 -1
  135. package/ccw/frontend/dist/assets/{eye-B0-xkP67.js → eye-D6BRlJ1r.js} +2 -2
  136. package/ccw/frontend/dist/assets/{eye-B0-xkP67.js.map → eye-D6BRlJ1r.js.map} +1 -1
  137. package/ccw/frontend/dist/assets/{eye-off-Bz0Fkli3.js → eye-off-DjbIj5iN.js} +2 -2
  138. package/ccw/frontend/dist/assets/{eye-off-Bz0Fkli3.js.map → eye-off-DjbIj5iN.js.map} +1 -1
  139. package/ccw/frontend/dist/assets/{file-json-PUAS4vBm.js → file-json-kg4Lid-H.js} +2 -2
  140. package/ccw/frontend/dist/assets/{file-json-PUAS4vBm.js.map → file-json-kg4Lid-H.js.map} +1 -1
  141. package/ccw/frontend/dist/assets/{file-text-BMeW5-Sb.js → file-text-BMy5pXNV.js} +2 -2
  142. package/ccw/frontend/dist/assets/{file-text-BMeW5-Sb.js.map → file-text-BMy5pXNV.js.map} +1 -1
  143. package/ccw/frontend/dist/assets/{filter-B4wgMvwi.js → filter-BTN-lUUb.js} +2 -2
  144. package/ccw/frontend/dist/assets/{filter-B4wgMvwi.js.map → filter-BTN-lUUb.js.map} +1 -1
  145. package/ccw/frontend/dist/assets/{folder-BSHjjjND.js → folder-ChYtty7V.js} +2 -2
  146. package/ccw/frontend/dist/assets/{folder-BSHjjjND.js.map → folder-ChYtty7V.js.map} +1 -1
  147. package/ccw/frontend/dist/assets/{gauge-7VRNEl22.js → gauge-C0VJbjRb.js} +2 -2
  148. package/ccw/frontend/dist/assets/{gauge-7VRNEl22.js.map → gauge-C0VJbjRb.js.map} +1 -1
  149. package/ccw/frontend/dist/assets/{globe-PvVHBjbW.js → globe-DbNfDXnv.js} +2 -2
  150. package/ccw/frontend/dist/assets/{globe-PvVHBjbW.js.map → globe-DbNfDXnv.js.map} +1 -1
  151. package/ccw/frontend/dist/assets/{grid-3x3-CsmmDlhN.js → grid-3x3-xWcpBNxo.js} +2 -2
  152. package/ccw/frontend/dist/assets/{grid-3x3-CsmmDlhN.js.map → grid-3x3-xWcpBNxo.js.map} +1 -1
  153. package/ccw/frontend/dist/assets/{hard-drive-D88EZgTY.js → hard-drive-BTACzgUO.js} +2 -2
  154. package/ccw/frontend/dist/assets/{hard-drive-D88EZgTY.js.map → hard-drive-BTACzgUO.js.map} +1 -1
  155. package/ccw/frontend/dist/assets/{hash-CZpNRWqt.js → hash-B0dYlmyB.js} +2 -2
  156. package/ccw/frontend/dist/assets/{hash-CZpNRWqt.js.map → hash-B0dYlmyB.js.map} +1 -1
  157. package/ccw/frontend/dist/assets/{history-DxN1mopa.js → history-CRRLu6ck.js} +2 -2
  158. package/ccw/frontend/dist/assets/{history-DxN1mopa.js.map → history-CRRLu6ck.js.map} +1 -1
  159. package/ccw/frontend/dist/assets/{index-BzGEkwIf.js → index-BJIIo0B3.js} +2 -2
  160. package/ccw/frontend/dist/assets/{index-BzGEkwIf.js.map → index-BJIIo0B3.js.map} +1 -1
  161. package/ccw/frontend/dist/assets/{index-DlcRFzFq.js → index-BP-D3Wv6.js} +2 -2
  162. package/ccw/frontend/dist/assets/{index-DlcRFzFq.js.map → index-BP-D3Wv6.js.map} +1 -1
  163. package/ccw/frontend/dist/assets/{index-BUiq2PUK.js → index-B_QzEioU.js} +2 -2
  164. package/ccw/frontend/dist/assets/{index-BUiq2PUK.js.map → index-B_QzEioU.js.map} +1 -1
  165. package/ccw/frontend/dist/assets/{index-C04xeBGC.js → index-BpoRYgiq.js} +3 -3
  166. package/ccw/frontend/dist/assets/{index-C04xeBGC.js.map → index-BpoRYgiq.js.map} +1 -1
  167. package/ccw/frontend/dist/assets/{index-CIoWWkDn.js → index-CeESlrZb.js} +8 -8
  168. package/ccw/frontend/dist/assets/{index-CIoWWkDn.js.map → index-CeESlrZb.js.map} +1 -1
  169. package/ccw/frontend/dist/assets/{index-bSgtHHOF.js → index-DzTbMyaS.js} +4 -4
  170. package/ccw/frontend/dist/assets/{index-bSgtHHOF.js.map → index-DzTbMyaS.js.map} +1 -1
  171. package/ccw/frontend/dist/assets/{layout-grid-BZqfuNG0.js → layout-grid-ZN26YcTM.js} +2 -2
  172. package/ccw/frontend/dist/assets/{layout-grid-BZqfuNG0.js.map → layout-grid-ZN26YcTM.js.map} +1 -1
  173. package/ccw/frontend/dist/assets/{lightbulb-DqJ4OHRL.js → lightbulb-BHrwx9j6.js} +2 -2
  174. package/ccw/frontend/dist/assets/{lightbulb-DqJ4OHRL.js.map → lightbulb-BHrwx9j6.js.map} +1 -1
  175. package/ccw/frontend/dist/assets/{link-2-Bq7fLkC9.js → link-2-zZRu2j4G.js} +2 -2
  176. package/ccw/frontend/dist/assets/{link-2-Bq7fLkC9.js.map → link-2-zZRu2j4G.js.map} +1 -1
  177. package/ccw/frontend/dist/assets/{link-dSLYjCIG.js → link-8lz-HgnZ.js} +2 -2
  178. package/ccw/frontend/dist/assets/{link-dSLYjCIG.js.map → link-8lz-HgnZ.js.map} +1 -1
  179. package/ccw/frontend/dist/assets/{list-Bm_CnR56.js → list-DlablIjt.js} +2 -2
  180. package/ccw/frontend/dist/assets/{list-Bm_CnR56.js.map → list-DlablIjt.js.map} +1 -1
  181. package/ccw/frontend/dist/assets/{map-pin-B5TELa0z.js → map-pin-JAsCUplr.js} +2 -2
  182. package/ccw/frontend/dist/assets/{map-pin-B5TELa0z.js.map → map-pin-JAsCUplr.js.map} +1 -1
  183. package/ccw/frontend/dist/assets/{messages-square-B9sWItdK.js → messages-square-D0iSFb2Y.js} +2 -2
  184. package/ccw/frontend/dist/assets/{messages-square-B9sWItdK.js.map → messages-square-D0iSFb2Y.js.map} +1 -1
  185. package/ccw/frontend/dist/assets/{minimize-2-Z1MYs_Tp.js → minimize-2-BJmkU9CE.js} +2 -2
  186. package/ccw/frontend/dist/assets/{minimize-2-Z1MYs_Tp.js.map → minimize-2-BJmkU9CE.js.map} +1 -1
  187. package/ccw/frontend/dist/assets/{package-EEv4N_Qk.js → package-DYrbBCxk.js} +2 -2
  188. package/ccw/frontend/dist/assets/{package-EEv4N_Qk.js.map → package-DYrbBCxk.js.map} +1 -1
  189. package/ccw/frontend/dist/assets/{plug-CEkvvYXh.js → plug-VG7-23M-.js} +2 -2
  190. package/ccw/frontend/dist/assets/{plug-CEkvvYXh.js.map → plug-VG7-23M-.js.map} +1 -1
  191. package/ccw/frontend/dist/assets/{power-B6Rod0u_.js → power-zPFYNx7u.js} +2 -2
  192. package/ccw/frontend/dist/assets/{power-B6Rod0u_.js.map → power-zPFYNx7u.js.map} +1 -1
  193. package/ccw/frontend/dist/assets/{save-DULWrB2g.js → save-D4XQY9i9.js} +2 -2
  194. package/ccw/frontend/dist/assets/{save-DULWrB2g.js.map → save-D4XQY9i9.js.map} +1 -1
  195. package/ccw/frontend/dist/assets/{send-C4z974WG.js → send-ClSnDjj-.js} +2 -2
  196. package/ccw/frontend/dist/assets/{send-C4z974WG.js.map → send-ClSnDjj-.js.map} +1 -1
  197. package/ccw/frontend/dist/assets/{square-check-big-CqEEw-V0.js → square-check-big-Bffh_MFc.js} +2 -2
  198. package/ccw/frontend/dist/assets/{square-check-big-CqEEw-V0.js.map → square-check-big-Bffh_MFc.js.map} +1 -1
  199. package/ccw/frontend/dist/assets/{square-pen-D-4BrMtQ.js → square-pen-DsOvAvME.js} +2 -2
  200. package/ccw/frontend/dist/assets/{square-pen-D-4BrMtQ.js.map → square-pen-DsOvAvME.js.map} +1 -1
  201. package/ccw/frontend/dist/assets/{star-CDVVM69o.js → star-TLJjvoy2.js} +2 -2
  202. package/ccw/frontend/dist/assets/{star-CDVVM69o.js.map → star-TLJjvoy2.js.map} +1 -1
  203. package/ccw/frontend/dist/assets/{style-CumJ7XC8.js → style-BXKXgpOY.js} +2 -2
  204. package/ccw/frontend/dist/assets/{style-CumJ7XC8.js.map → style-BXKXgpOY.js.map} +1 -1
  205. package/ccw/frontend/dist/assets/{target-Dr9SuV1Y.js → target-FDuAB6SF.js} +2 -2
  206. package/ccw/frontend/dist/assets/{target-Dr9SuV1Y.js.map → target-FDuAB6SF.js.map} +1 -1
  207. package/ccw/frontend/dist/assets/{test-tube-DzDRKk8F.js → test-tube-B9vj-Im8.js} +2 -2
  208. package/ccw/frontend/dist/assets/{test-tube-DzDRKk8F.js.map → test-tube-B9vj-Im8.js.map} +1 -1
  209. package/ccw/frontend/dist/assets/{upload-CihSmIM7.js → upload-CHgTrVN5.js} +2 -2
  210. package/ccw/frontend/dist/assets/{upload-CihSmIM7.js.map → upload-CHgTrVN5.js.map} +1 -1
  211. package/ccw/frontend/dist/assets/{useApiSettings-CevxWX2z.js → useApiSettings-XsHrqf-L.js} +2 -2
  212. package/ccw/frontend/dist/assets/{useApiSettings-CevxWX2z.js.map → useApiSettings-XsHrqf-L.js.map} +1 -1
  213. package/ccw/frontend/dist/assets/{useCli-jVaF89uU.js → useCli-DOlWtux5.js} +2 -2
  214. package/ccw/frontend/dist/assets/{useCli-jVaF89uU.js.map → useCli-DOlWtux5.js.map} +1 -1
  215. package/ccw/frontend/dist/assets/{useCommands-D4uGmNpF.js → useCommands-DazCajiX.js} +2 -2
  216. package/ccw/frontend/dist/assets/{useCommands-D4uGmNpF.js.map → useCommands-DazCajiX.js.map} +1 -1
  217. package/ccw/frontend/dist/assets/{useDebounce-BEYmuZYP.js → useDebounce-Cah-bua6.js} +2 -2
  218. package/ccw/frontend/dist/assets/{useDebounce-BEYmuZYP.js.map → useDebounce-Cah-bua6.js.map} +1 -1
  219. package/ccw/frontend/dist/assets/{useFileExplorer-DEv0DVy7.js → useFileExplorer-B9SCPhhl.js} +2 -2
  220. package/ccw/frontend/dist/assets/{useFileExplorer-DEv0DVy7.js.map → useFileExplorer-B9SCPhhl.js.map} +1 -1
  221. package/ccw/frontend/dist/assets/{useLocale-BRJreqvl.js → useLocale-CmG6pxZe.js} +2 -2
  222. package/ccw/frontend/dist/assets/{useLocale-BRJreqvl.js.map → useLocale-CmG6pxZe.js.map} +1 -1
  223. package/ccw/frontend/dist/assets/{useSkills-lnfeXe9l.js → useSkills-DvEJ0JOv.js} +3 -3
  224. package/ccw/frontend/dist/assets/{useSkills-lnfeXe9l.js.map → useSkills-DvEJ0JOv.js.map} +1 -1
  225. package/ccw/frontend/dist/assets/{useSystemSettings-PlxVdbXI.js → useSystemSettings-BDpwSa04.js} +2 -2
  226. package/ccw/frontend/dist/assets/{useSystemSettings-PlxVdbXI.js.map → useSystemSettings-BDpwSa04.js.map} +1 -1
  227. package/ccw/frontend/dist/assets/{wand-sparkles-BbqUxeEg.js → wand-sparkles-T2KGCRiy.js} +2 -2
  228. package/ccw/frontend/dist/assets/{wand-sparkles-BbqUxeEg.js.map → wand-sparkles-T2KGCRiy.js.map} +1 -1
  229. package/ccw/frontend/dist/index.html +1 -1
  230. package/codex-lens/src/codexlens/cli/commands.py +12 -1
  231. package/codex-lens/src/codexlens/config.py +12 -0
  232. package/codex-lens/src/codexlens/env_config.py +1 -0
  233. package/package.json +1 -1
  234. package/ccw/frontend/dist/assets/CodexLensManagerPage-ClPNashJ.js.map +0 -1
  235. package/ccw/frontend/dist/assets/McpManagerPage-CS2v_1OG.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useApiSettings-CevxWX2z.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 checkCcwLitellmStatus,\n installCcwLitellm,\n uninstallCcwLitellm,\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 ccwLitellm: () => [...apiSettingsKeys.all, 'ccwLitellm'] 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// CCW-LiteLLM Package Hooks\n// ========================================\n\nexport interface UseCcwLitellmStatusOptions {\n staleTime?: number;\n enabled?: boolean;\n refresh?: boolean;\n}\n\nexport function useCcwLitellmStatus(options: UseCcwLitellmStatusOptions = {}) {\n const { staleTime = 5 * 60 * 1000, enabled = true, refresh = false } = options;\n\n return useQuery({\n queryKey: [...apiSettingsKeys.ccwLitellm(), 'status', refresh],\n queryFn: () => checkCcwLitellmStatus(refresh),\n staleTime,\n enabled,\n });\n}\n\nexport function useInstallCcwLitellm() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: () => installCcwLitellm(),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.ccwLitellm() });\n },\n });\n\n return {\n install: mutation.mutateAsync,\n isInstalling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUninstallCcwLitellm() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: () => uninstallCcwLitellm(),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.ccwLitellm() });\n },\n });\n\n return {\n uninstall: mutation.mutateAsync,\n isUninstalling: mutation.isPending,\n error: mutation.error,\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","useCcwLitellmStatus","refresh","checkCcwLitellmStatus","useInstallCcwLitellm","installCcwLitellm","useUninstallCcwLitellm","uninstallCcwLitellm","useCliSettings","fetchCliSettings","cliSettings","enabledCliSettings","s","providerCounts","acc","useCreateCliSettings","request","createCliSettings","useUpdateCliSettings","updateCliSettings","useDeleteCliSettings","deleteCliSettings","useToggleCliSettings","toggleCliSettingsEnabled"],"mappings":"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"}
1
+ {"version":3,"file":"useApiSettings-XsHrqf-L.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 checkCcwLitellmStatus,\n installCcwLitellm,\n uninstallCcwLitellm,\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 ccwLitellm: () => [...apiSettingsKeys.all, 'ccwLitellm'] 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// CCW-LiteLLM Package Hooks\n// ========================================\n\nexport interface UseCcwLitellmStatusOptions {\n staleTime?: number;\n enabled?: boolean;\n refresh?: boolean;\n}\n\nexport function useCcwLitellmStatus(options: UseCcwLitellmStatusOptions = {}) {\n const { staleTime = 5 * 60 * 1000, enabled = true, refresh = false } = options;\n\n return useQuery({\n queryKey: [...apiSettingsKeys.ccwLitellm(), 'status', refresh],\n queryFn: () => checkCcwLitellmStatus(refresh),\n staleTime,\n enabled,\n });\n}\n\nexport function useInstallCcwLitellm() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: () => installCcwLitellm(),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.ccwLitellm() });\n },\n });\n\n return {\n install: mutation.mutateAsync,\n isInstalling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUninstallCcwLitellm() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: () => uninstallCcwLitellm(),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: apiSettingsKeys.ccwLitellm() });\n },\n });\n\n return {\n uninstall: mutation.mutateAsync,\n isUninstalling: mutation.isPending,\n error: mutation.error,\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","useCcwLitellmStatus","refresh","checkCcwLitellmStatus","useInstallCcwLitellm","installCcwLitellm","useUninstallCcwLitellm","uninstallCcwLitellm","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 u,ab as C,aH as m,al as K,a9 as E,aa as T,aC as F,dw as b,dx as P,dy as w,dz as S,dA as H,dB as M,dC as R,dD as _,dE as A,du as I,dF as U,dG as L,dH as j,dI as z,dJ as B,dK as G}from"./index-bSgtHHOF.js";import{a as k}from"./useLocale-BRJreqvl.js";import{s as D}from"./errorSanitizer-IY9pf5g4.js";const o={all:["cliEndpoints"],lists:()=>[...o.all,"list"]},h=120*1e3;function O(t={}){var v;const{staleTime:r=h,enabled:s=!0}=t,n=u(),e=C({queryKey:o.lists(),queryFn:j,staleTime:r,enabled:s,retry:2}),i=((v=e.data)==null?void 0:v.endpoints)??[],a=i.filter(q=>q.enabled),l=i.filter(q=>q.type==="litellm"),c=i.filter(q=>q.type==="custom"),d=i.filter(q=>q.type==="wrapper"),f=async()=>{await e.refetch()},Q=async()=>{await n.invalidateQueries({queryKey:o.all})};return{endpoints:i,litellmEndpoints:l,customEndpoints:c,wrapperEndpoints:d,totalCount:i.length,enabledCount:a.length,isLoading:e.isLoading,isFetching:e.isFetching,error:e.error,refetch:f,invalidate:Q}}function V(){const t=u(),r=m({mutationFn:({endpointId:s,enabled:n})=>b(s,n),onMutate:async({endpointId:s,enabled:n})=>{await t.cancelQueries({queryKey:o.all});const e=t.getQueryData(o.lists());return t.setQueryData(o.lists(),i=>i&&{endpoints:i.endpoints.map(a=>a.id===s?{...a,enabled:n}:a)}),{previousEndpoints:e}},onError:(s,n,e)=>{e!=null&&e.previousEndpoints&&t.setQueryData(o.lists(),e.previousEndpoints)},onSettled:()=>{t.invalidateQueries({queryKey:o.all})}});return{toggleEndpoint:(s,n)=>r.mutateAsync({endpointId:s,enabled:n}),isToggling:r.isPending,error:r.error}}function X(){const t=u(),r=m({mutationFn:s=>P(s),onSuccess:s=>{t.setQueryData(o.lists(),n=>n?{endpoints:[s,...n.endpoints]}:{endpoints:[s]})},onSettled:()=>{t.invalidateQueries({queryKey:o.all})}});return{createEndpoint:r.mutateAsync,isCreating:r.isPending,error:r.error}}function Y(){const t=u(),r=m({mutationFn:({endpointId:s,updates:n})=>w(s,n),onMutate:async({endpointId:s,updates:n})=>{await t.cancelQueries({queryKey:o.all});const e=t.getQueryData(o.lists());return t.setQueryData(o.lists(),i=>i&&{endpoints:i.endpoints.map(a=>a.id===s?{...a,...n}:a)}),{previous:e}},onError:(s,n,e)=>{e!=null&&e.previous&&t.setQueryData(o.lists(),e.previous)},onSettled:()=>{t.invalidateQueries({queryKey:o.all})}});return{updateEndpoint:(s,n)=>r.mutateAsync({endpointId:s,updates:n}),isUpdating:r.isPending,error:r.error}}function Z(){const t=u(),r=m({mutationFn:s=>S(s),onMutate:async s=>{await t.cancelQueries({queryKey:o.all});const n=t.getQueryData(o.lists());return t.setQueryData(o.lists(),e=>e&&{endpoints:e.endpoints.filter(i=>i.id!==s)}),{previous:n}},onError:(s,n,e)=>{e!=null&&e.previous&&t.setQueryData(o.lists(),e.previous)},onSettled:()=>{t.invalidateQueries({queryKey:o.all})}});return{deleteEndpoint:r.mutateAsync,isDeleting:r.isPending,error:r.error}}const p={all:["cliInstallations"],lists:()=>[...p.all,"list"]};function $(t={}){var d;const{staleTime:r=h,enabled:s=!0}=t,n=u(),e=C({queryKey:p.lists(),queryFn:z,staleTime:r,enabled:s,retry:2}),i=((d=e.data)==null?void 0:d.tools)??[],a=i.filter(f=>f.installed),l=async()=>{await e.refetch()},c=async()=>{await n.invalidateQueries({queryKey:p.all})};return{installations:i,installedTools:a,totalCount:i.length,installedCount:a.length,isLoading:e.isLoading,isFetching:e.isFetching,error:e.error,refetch:l,invalidate:c}}function x(){const t=u(),r=k(),{success:s,info:n,error:e}=K(),i=m({mutationFn:a=>H(a),onMutate:()=>{n(r({id:"status.inProgress"}),r({id:"common.feedback.cliToolInstall.success"}))},onSuccess:()=>{t.invalidateQueries({queryKey:p.all}),s(r({id:"common.success"}),r({id:"common.feedback.cliToolInstall.success"}))},onError:a=>{const l=D(a,"cliToolInstall"),c=r({id:l.messageKey}),d=r({id:"common.error"});e(d,c)},onSettled:()=>{t.invalidateQueries({queryKey:p.all})}});return{installTool:i.mutateAsync,isInstalling:i.isPending,error:i.error}}function ee(){const t=u(),r=k(),{success:s,info:n,error:e}=K(),i=m({mutationFn:a=>M(a),onMutate:()=>{n(r({id:"status.inProgress"}),r({id:"common.feedback.cliToolUninstall.success"}))},onSuccess:()=>{t.invalidateQueries({queryKey:p.all}),s(r({id:"common.success"}),r({id:"common.feedback.cliToolUninstall.success"}))},onError:a=>{const l=D(a,"cliToolUninstall"),c=r({id:l.messageKey}),d=r({id:"common.error"});e(d,c)},onSettled:()=>{t.invalidateQueries({queryKey:p.all})}});return{uninstallTool:i.mutateAsync,isUninstalling:i.isPending,error:i.error}}function se(){const t=u(),r=k(),{success:s,info:n,error:e}=K(),i=m({mutationFn:a=>R(a),onMutate:()=>{n(r({id:"status.inProgress"}),r({id:"common.feedback.cliToolUpgrade.success"}))},onSuccess:()=>{t.invalidateQueries({queryKey:p.all}),s(r({id:"common.success"}),r({id:"common.feedback.cliToolUpgrade.success"}))},onError:a=>{const l=D(a,"cliToolUpgrade"),c=r({id:l.messageKey}),d=r({id:"common.error"});e(d,c)},onSettled:()=>{t.invalidateQueries({queryKey:p.all})}});return{upgradeTool:i.mutateAsync,isUpgrading:i.isPending,error:i.error}}const g={all:["hooks"],lists:()=>[...g.all,"list"]};function te(t={}){var Q;const{staleTime:r=h,enabled:s=!0}=t,n=u(),e=E(T),i=s&&!!e,a=C({queryKey:F.rulesList(e),queryFn:()=>B(e),staleTime:r,enabled:i,retry:2}),l=((Q=a.data)==null?void 0:Q.hooks)??[],c=l.filter(v=>v.enabled),d=async()=>{await a.refetch()},f=async()=>{await n.invalidateQueries({queryKey:g.all})};return{hooks:l,enabledHooks:c,totalCount:l.length,enabledCount:c.length,isLoading:a.isLoading,isFetching:a.isFetching,error:a.error,refetch:d,invalidate:f}}function ne(){const t=u(),r=m({mutationFn:({hookName:s,enabled:n})=>_(s,n),onMutate:async({hookName:s,enabled:n})=>{await t.cancelQueries({queryKey:g.all});const e=t.getQueryData(g.lists());return t.setQueryData(g.lists(),i=>i&&{hooks:i.hooks.map(a=>a.name===s?{...a,enabled:n}:a)}),{previousHooks:e}},onError:(s,n,e)=>{e!=null&&e.previousHooks&&t.setQueryData(g.lists(),e.previousHooks)},onSettled:()=>{t.invalidateQueries({queryKey:g.all})}});return{toggleHook:(s,n)=>r.mutateAsync({hookName:s,enabled:n}),isToggling:r.isPending,error:r.error}}function re(){const t=u(),r=E(T),s=m({mutationFn:n=>{const e=n.scope||"project",i=n.index??0;return A({projectPath:r||void 0,scope:e,event:n.trigger,hookIndex:i})},onMutate:async n=>{await t.cancelQueries({queryKey:g.all});const e=t.getQueryData(g.lists());return t.setQueryData(g.lists(),i=>i&&{hooks:i.hooks.filter(a=>a.name!==n.name)}),{previousHooks:e}},onError:(n,e,i)=>{i!=null&&i.previousHooks&&t.setQueryData(g.lists(),i.previousHooks)},onSettled:()=>{t.invalidateQueries({queryKey:g.all})}});return{deleteHook:s.mutateAsync,isDeleting:s.isPending,error:s.error}}const y={all:["rules"],lists:()=>[...y.all,"list"]};function ie(t={}){var f;const{staleTime:r=h,enabled:s=!0}=t,n=u(),e=E(T),i=C({queryKey:F.rulesList(e),queryFn:()=>G(e),staleTime:r,enabled:s,retry:2}),a=((f=i.data)==null?void 0:f.rules)??[],l=a.filter(Q=>Q.enabled),c=async()=>{await i.refetch()},d=async()=>{await n.invalidateQueries({queryKey:y.all})};return{rules:a,enabledRules:l,totalCount:a.length,enabledCount:l.length,isLoading:i.isLoading,isFetching:i.isFetching,error:i.error,refetch:c,invalidate:d}}function ae(){const t=u(),r=m({mutationFn:({ruleId:s,enabled:n})=>L(s,n),onMutate:async({ruleId:s,enabled:n})=>{await t.cancelQueries({queryKey:y.all});const e=t.getQueryData(y.lists());return t.setQueryData(y.lists(),i=>i&&{rules:i.rules.map(a=>a.id===s?{...a,enabled:n}:a)}),{previousRules:e}},onError:(s,n,e)=>{e!=null&&e.previousRules&&t.setQueryData(y.lists(),e.previousRules)},onSettled:()=>{t.invalidateQueries({queryKey:y.all})}});return{toggleRule:(s,n)=>r.mutateAsync({ruleId:s,enabled:n}),isToggling:r.isPending,error:r.error}}function oe(){const t=u(),r=m({mutationFn:s=>I(s),onSuccess:s=>{t.setQueryData(y.lists(),n=>n?{rules:[s,...n.rules]}:{rules:[s]})},onSettled:()=>{t.invalidateQueries({queryKey:y.all})}});return{createRule:r.mutateAsync,isCreating:r.isPending,error:r.error}}function le(){const t=u(),r=m({mutationFn:({ruleId:s,location:n})=>U(s,n),onMutate:async({ruleId:s})=>{await t.cancelQueries({queryKey:y.all});const n=t.getQueryData(y.lists());return t.setQueryData(y.lists(),e=>e&&{rules:e.rules.filter(i=>i.id!==s)}),{previousRules:n}},onError:(s,n,e)=>{e!=null&&e.previousRules&&t.setQueryData(y.lists(),e.previousRules)},onSettled:()=>{t.invalidateQueries({queryKey:y.all})}});return{deleteRule:(s,n)=>r.mutateAsync({ruleId:s,location:n}),isDeleting:r.isPending,error:r.error}}export{V as a,X as b,Y as c,Z as d,$ as e,x as f,ee as g,se as h,te as i,ne as j,re as k,ie as l,oe as m,le as n,ae as o,y as r,O as u};
2
- //# sourceMappingURL=useCli-jVaF89uU.js.map
1
+ import{aF as u,ab as C,aH as m,al as K,a9 as E,aa as T,aC as F,dw as b,dx as P,dy as w,dz as S,dA as H,dB as M,dC as R,dD as _,dE as A,du as I,dF as U,dG as L,dH as j,dI as z,dJ as B,dK as G}from"./index-DzTbMyaS.js";import{a as k}from"./useLocale-CmG6pxZe.js";import{s as D}from"./errorSanitizer-IY9pf5g4.js";const o={all:["cliEndpoints"],lists:()=>[...o.all,"list"]},h=120*1e3;function O(t={}){var v;const{staleTime:r=h,enabled:s=!0}=t,n=u(),e=C({queryKey:o.lists(),queryFn:j,staleTime:r,enabled:s,retry:2}),i=((v=e.data)==null?void 0:v.endpoints)??[],a=i.filter(q=>q.enabled),l=i.filter(q=>q.type==="litellm"),c=i.filter(q=>q.type==="custom"),d=i.filter(q=>q.type==="wrapper"),f=async()=>{await e.refetch()},Q=async()=>{await n.invalidateQueries({queryKey:o.all})};return{endpoints:i,litellmEndpoints:l,customEndpoints:c,wrapperEndpoints:d,totalCount:i.length,enabledCount:a.length,isLoading:e.isLoading,isFetching:e.isFetching,error:e.error,refetch:f,invalidate:Q}}function V(){const t=u(),r=m({mutationFn:({endpointId:s,enabled:n})=>b(s,n),onMutate:async({endpointId:s,enabled:n})=>{await t.cancelQueries({queryKey:o.all});const e=t.getQueryData(o.lists());return t.setQueryData(o.lists(),i=>i&&{endpoints:i.endpoints.map(a=>a.id===s?{...a,enabled:n}:a)}),{previousEndpoints:e}},onError:(s,n,e)=>{e!=null&&e.previousEndpoints&&t.setQueryData(o.lists(),e.previousEndpoints)},onSettled:()=>{t.invalidateQueries({queryKey:o.all})}});return{toggleEndpoint:(s,n)=>r.mutateAsync({endpointId:s,enabled:n}),isToggling:r.isPending,error:r.error}}function X(){const t=u(),r=m({mutationFn:s=>P(s),onSuccess:s=>{t.setQueryData(o.lists(),n=>n?{endpoints:[s,...n.endpoints]}:{endpoints:[s]})},onSettled:()=>{t.invalidateQueries({queryKey:o.all})}});return{createEndpoint:r.mutateAsync,isCreating:r.isPending,error:r.error}}function Y(){const t=u(),r=m({mutationFn:({endpointId:s,updates:n})=>w(s,n),onMutate:async({endpointId:s,updates:n})=>{await t.cancelQueries({queryKey:o.all});const e=t.getQueryData(o.lists());return t.setQueryData(o.lists(),i=>i&&{endpoints:i.endpoints.map(a=>a.id===s?{...a,...n}:a)}),{previous:e}},onError:(s,n,e)=>{e!=null&&e.previous&&t.setQueryData(o.lists(),e.previous)},onSettled:()=>{t.invalidateQueries({queryKey:o.all})}});return{updateEndpoint:(s,n)=>r.mutateAsync({endpointId:s,updates:n}),isUpdating:r.isPending,error:r.error}}function Z(){const t=u(),r=m({mutationFn:s=>S(s),onMutate:async s=>{await t.cancelQueries({queryKey:o.all});const n=t.getQueryData(o.lists());return t.setQueryData(o.lists(),e=>e&&{endpoints:e.endpoints.filter(i=>i.id!==s)}),{previous:n}},onError:(s,n,e)=>{e!=null&&e.previous&&t.setQueryData(o.lists(),e.previous)},onSettled:()=>{t.invalidateQueries({queryKey:o.all})}});return{deleteEndpoint:r.mutateAsync,isDeleting:r.isPending,error:r.error}}const p={all:["cliInstallations"],lists:()=>[...p.all,"list"]};function $(t={}){var d;const{staleTime:r=h,enabled:s=!0}=t,n=u(),e=C({queryKey:p.lists(),queryFn:z,staleTime:r,enabled:s,retry:2}),i=((d=e.data)==null?void 0:d.tools)??[],a=i.filter(f=>f.installed),l=async()=>{await e.refetch()},c=async()=>{await n.invalidateQueries({queryKey:p.all})};return{installations:i,installedTools:a,totalCount:i.length,installedCount:a.length,isLoading:e.isLoading,isFetching:e.isFetching,error:e.error,refetch:l,invalidate:c}}function x(){const t=u(),r=k(),{success:s,info:n,error:e}=K(),i=m({mutationFn:a=>H(a),onMutate:()=>{n(r({id:"status.inProgress"}),r({id:"common.feedback.cliToolInstall.success"}))},onSuccess:()=>{t.invalidateQueries({queryKey:p.all}),s(r({id:"common.success"}),r({id:"common.feedback.cliToolInstall.success"}))},onError:a=>{const l=D(a,"cliToolInstall"),c=r({id:l.messageKey}),d=r({id:"common.error"});e(d,c)},onSettled:()=>{t.invalidateQueries({queryKey:p.all})}});return{installTool:i.mutateAsync,isInstalling:i.isPending,error:i.error}}function ee(){const t=u(),r=k(),{success:s,info:n,error:e}=K(),i=m({mutationFn:a=>M(a),onMutate:()=>{n(r({id:"status.inProgress"}),r({id:"common.feedback.cliToolUninstall.success"}))},onSuccess:()=>{t.invalidateQueries({queryKey:p.all}),s(r({id:"common.success"}),r({id:"common.feedback.cliToolUninstall.success"}))},onError:a=>{const l=D(a,"cliToolUninstall"),c=r({id:l.messageKey}),d=r({id:"common.error"});e(d,c)},onSettled:()=>{t.invalidateQueries({queryKey:p.all})}});return{uninstallTool:i.mutateAsync,isUninstalling:i.isPending,error:i.error}}function se(){const t=u(),r=k(),{success:s,info:n,error:e}=K(),i=m({mutationFn:a=>R(a),onMutate:()=>{n(r({id:"status.inProgress"}),r({id:"common.feedback.cliToolUpgrade.success"}))},onSuccess:()=>{t.invalidateQueries({queryKey:p.all}),s(r({id:"common.success"}),r({id:"common.feedback.cliToolUpgrade.success"}))},onError:a=>{const l=D(a,"cliToolUpgrade"),c=r({id:l.messageKey}),d=r({id:"common.error"});e(d,c)},onSettled:()=>{t.invalidateQueries({queryKey:p.all})}});return{upgradeTool:i.mutateAsync,isUpgrading:i.isPending,error:i.error}}const g={all:["hooks"],lists:()=>[...g.all,"list"]};function te(t={}){var Q;const{staleTime:r=h,enabled:s=!0}=t,n=u(),e=E(T),i=s&&!!e,a=C({queryKey:F.rulesList(e),queryFn:()=>B(e),staleTime:r,enabled:i,retry:2}),l=((Q=a.data)==null?void 0:Q.hooks)??[],c=l.filter(v=>v.enabled),d=async()=>{await a.refetch()},f=async()=>{await n.invalidateQueries({queryKey:g.all})};return{hooks:l,enabledHooks:c,totalCount:l.length,enabledCount:c.length,isLoading:a.isLoading,isFetching:a.isFetching,error:a.error,refetch:d,invalidate:f}}function ne(){const t=u(),r=m({mutationFn:({hookName:s,enabled:n})=>_(s,n),onMutate:async({hookName:s,enabled:n})=>{await t.cancelQueries({queryKey:g.all});const e=t.getQueryData(g.lists());return t.setQueryData(g.lists(),i=>i&&{hooks:i.hooks.map(a=>a.name===s?{...a,enabled:n}:a)}),{previousHooks:e}},onError:(s,n,e)=>{e!=null&&e.previousHooks&&t.setQueryData(g.lists(),e.previousHooks)},onSettled:()=>{t.invalidateQueries({queryKey:g.all})}});return{toggleHook:(s,n)=>r.mutateAsync({hookName:s,enabled:n}),isToggling:r.isPending,error:r.error}}function re(){const t=u(),r=E(T),s=m({mutationFn:n=>{const e=n.scope||"project",i=n.index??0;return A({projectPath:r||void 0,scope:e,event:n.trigger,hookIndex:i})},onMutate:async n=>{await t.cancelQueries({queryKey:g.all});const e=t.getQueryData(g.lists());return t.setQueryData(g.lists(),i=>i&&{hooks:i.hooks.filter(a=>a.name!==n.name)}),{previousHooks:e}},onError:(n,e,i)=>{i!=null&&i.previousHooks&&t.setQueryData(g.lists(),i.previousHooks)},onSettled:()=>{t.invalidateQueries({queryKey:g.all})}});return{deleteHook:s.mutateAsync,isDeleting:s.isPending,error:s.error}}const y={all:["rules"],lists:()=>[...y.all,"list"]};function ie(t={}){var f;const{staleTime:r=h,enabled:s=!0}=t,n=u(),e=E(T),i=C({queryKey:F.rulesList(e),queryFn:()=>G(e),staleTime:r,enabled:s,retry:2}),a=((f=i.data)==null?void 0:f.rules)??[],l=a.filter(Q=>Q.enabled),c=async()=>{await i.refetch()},d=async()=>{await n.invalidateQueries({queryKey:y.all})};return{rules:a,enabledRules:l,totalCount:a.length,enabledCount:l.length,isLoading:i.isLoading,isFetching:i.isFetching,error:i.error,refetch:c,invalidate:d}}function ae(){const t=u(),r=m({mutationFn:({ruleId:s,enabled:n})=>L(s,n),onMutate:async({ruleId:s,enabled:n})=>{await t.cancelQueries({queryKey:y.all});const e=t.getQueryData(y.lists());return t.setQueryData(y.lists(),i=>i&&{rules:i.rules.map(a=>a.id===s?{...a,enabled:n}:a)}),{previousRules:e}},onError:(s,n,e)=>{e!=null&&e.previousRules&&t.setQueryData(y.lists(),e.previousRules)},onSettled:()=>{t.invalidateQueries({queryKey:y.all})}});return{toggleRule:(s,n)=>r.mutateAsync({ruleId:s,enabled:n}),isToggling:r.isPending,error:r.error}}function oe(){const t=u(),r=m({mutationFn:s=>I(s),onSuccess:s=>{t.setQueryData(y.lists(),n=>n?{rules:[s,...n.rules]}:{rules:[s]})},onSettled:()=>{t.invalidateQueries({queryKey:y.all})}});return{createRule:r.mutateAsync,isCreating:r.isPending,error:r.error}}function le(){const t=u(),r=m({mutationFn:({ruleId:s,location:n})=>U(s,n),onMutate:async({ruleId:s})=>{await t.cancelQueries({queryKey:y.all});const n=t.getQueryData(y.lists());return t.setQueryData(y.lists(),e=>e&&{rules:e.rules.filter(i=>i.id!==s)}),{previousRules:n}},onError:(s,n,e)=>{e!=null&&e.previousRules&&t.setQueryData(y.lists(),e.previousRules)},onSettled:()=>{t.invalidateQueries({queryKey:y.all})}});return{deleteRule:(s,n)=>r.mutateAsync({ruleId:s,location:n}),isDeleting:r.isPending,error:r.error}}export{V as a,X as b,Y as c,Z as d,$ as e,x as f,ee as g,se as h,te as i,ne as j,re as k,ie as l,oe as m,le as n,ae as o,y as r,O as u};
2
+ //# sourceMappingURL=useCli-DOlWtux5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCli-jVaF89uU.js","sources":["../../src/hooks/useCli.ts"],"sourcesContent":["// ========================================\n// useCliEndpoints Hook\n// ========================================\n// TanStack Query hooks for CLI endpoint 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 fetchCliEndpoints,\n toggleCliEndpoint,\n createCliEndpoint,\n updateCliEndpoint,\n deleteCliEndpoint,\n type CliEndpoint,\n type CliEndpointsResponse,\n} from '../lib/api';\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\n\n// Query key factory\nexport const cliEndpointsKeys = {\n all: ['cliEndpoints'] as const,\n lists: () => [...cliEndpointsKeys.all, 'list'] as const,\n};\n\nconst STALE_TIME = 2 * 60 * 1000;\n\nexport interface UseCliEndpointsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseCliEndpointsReturn {\n endpoints: CliEndpoint[];\n litellmEndpoints: CliEndpoint[];\n customEndpoints: CliEndpoint[];\n wrapperEndpoints: CliEndpoint[];\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 useCliEndpoints(options: UseCliEndpointsOptions = {}): UseCliEndpointsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: cliEndpointsKeys.lists(),\n queryFn: fetchCliEndpoints,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const endpoints = query.data?.endpoints ?? [];\n const enabledEndpoints = endpoints.filter((e) => e.enabled);\n\n const litellmEndpoints = endpoints.filter((e) => e.type === 'litellm');\n const customEndpoints = endpoints.filter((e) => e.type === 'custom');\n const wrapperEndpoints = endpoints.filter((e) => e.type === 'wrapper');\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n };\n\n return {\n endpoints,\n litellmEndpoints,\n customEndpoints,\n wrapperEndpoints,\n totalCount: endpoints.length,\n enabledCount: enabledEndpoints.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useToggleCliEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, enabled }: { endpointId: string; enabled: boolean }) =>\n toggleCliEndpoint(endpointId, enabled),\n onMutate: async ({ endpointId, enabled }) => {\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\n const previousEndpoints = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\n\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\n if (!old) return old;\n return {\n endpoints: old.endpoints.map((e) => (e.id === endpointId ? { ...e, enabled } : e)),\n };\n });\n\n return { previousEndpoints };\n },\n onError: (_error, _vars, context) => {\n if (context?.previousEndpoints) {\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previousEndpoints);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n },\n });\n\n return {\n toggleEndpoint: (endpointId: string, enabled: boolean) => mutation.mutateAsync({ endpointId, enabled }),\n isToggling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useCreateCliEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpoint: Omit<CliEndpoint, 'id'>) => createCliEndpoint(endpoint),\n onSuccess: (created) => {\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\n if (!old) return { endpoints: [created] };\n return { endpoints: [created, ...old.endpoints] };\n });\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n },\n });\n\n return {\n createEndpoint: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateCliEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, updates }: { endpointId: string; updates: Partial<CliEndpoint> }) =>\n updateCliEndpoint(endpointId, updates),\n onMutate: async ({ endpointId, updates }) => {\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\n const previous = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\n\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\n if (!old) return old;\n return {\n endpoints: old.endpoints.map((e) => (e.id === endpointId ? { ...e, ...updates } : e)),\n };\n });\n\n return { previous };\n },\n onError: (_err, _vars, context) => {\n if (context?.previous) {\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previous);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n },\n });\n\n return {\n updateEndpoint: (endpointId: string, updates: Partial<CliEndpoint>) =>\n mutation.mutateAsync({ endpointId, updates }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteCliEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpointId: string) => deleteCliEndpoint(endpointId),\n onMutate: async (endpointId) => {\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\n const previous = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\n\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\n if (!old) return old;\n return {\n endpoints: old.endpoints.filter((e) => e.id !== endpointId),\n };\n });\n\n return { previous };\n },\n onError: (_err, _endpointId, context) => {\n if (context?.previous) {\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previous);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n },\n });\n\n return {\n deleteEndpoint: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// useCliInstallations Hook\n// ========================================\n\nimport {\n fetchCliInstallations,\n installCliTool,\n uninstallCliTool,\n upgradeCliTool,\n type CliInstallation,\n} from '../lib/api';\n\nexport const cliInstallationsKeys = {\n all: ['cliInstallations'] as const,\n lists: () => [...cliInstallationsKeys.all, 'list'] as const,\n};\n\nexport interface UseCliInstallationsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseCliInstallationsReturn {\n installations: CliInstallation[];\n installedTools: CliInstallation[];\n totalCount: number;\n installedCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useCliInstallations(options: UseCliInstallationsOptions = {}): UseCliInstallationsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: cliInstallationsKeys.lists(),\n queryFn: fetchCliInstallations,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const installations = query.data?.tools ?? [];\n const installedTools = installations.filter((t) => t.installed);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n };\n\n return {\n installations,\n installedTools,\n totalCount: installations.length,\n installedCount: installedTools.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useInstallCliTool() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (toolName: string) => installCliTool(toolName),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.inProgress' }),\n formatMessage({ id: 'common.feedback.cliToolInstall.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.cliToolInstall.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'cliToolInstall');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n },\n });\n\n return {\n installTool: mutation.mutateAsync,\n isInstalling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUninstallCliTool() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (toolName: string) => uninstallCliTool(toolName),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.inProgress' }),\n formatMessage({ id: 'common.feedback.cliToolUninstall.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.cliToolUninstall.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'cliToolUninstall');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n },\n });\n\n return {\n uninstallTool: mutation.mutateAsync,\n isUninstalling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpgradeCliTool() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (toolName: string) => upgradeCliTool(toolName),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.inProgress' }),\n formatMessage({ id: 'common.feedback.cliToolUpgrade.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.cliToolUpgrade.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'cliToolUpgrade');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n },\n });\n\n return {\n upgradeTool: mutation.mutateAsync,\n isUpgrading: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// useHooks Hook\n// ========================================\n\nimport {\n fetchHooks,\n toggleHook,\n deleteHook,\n type Hook,\n type HooksResponse,\n} from '../lib/api';\n\nexport const hooksKeys = {\n all: ['hooks'] as const,\n lists: () => [...hooksKeys.all, 'list'] as const,\n};\n\nexport interface UseHooksOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseHooksReturn {\n hooks: Hook[];\n enabledHooks: Hook[];\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 useHooks(options: UseHooksOptions = {}): UseHooksReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n const projectPath = useWorkflowStore(selectProjectPath);\n\n const queryEnabled = enabled && !!projectPath;\n\n const query = useQuery({\n queryKey: workspaceQueryKeys.rulesList(projectPath),\n queryFn: () => fetchHooks(projectPath),\n staleTime,\n enabled: queryEnabled,\n retry: 2,\n });\n\n const hooks = query.data?.hooks ?? [];\n const enabledHooks = hooks.filter((h) => h.enabled);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: hooksKeys.all });\n };\n\n return {\n hooks,\n enabledHooks,\n totalCount: hooks.length,\n enabledCount: enabledHooks.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useToggleHook() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ hookName, enabled }: { hookName: string; enabled: boolean }) =>\n toggleHook(hookName, enabled),\n onMutate: async ({ hookName, enabled }) => {\n await queryClient.cancelQueries({ queryKey: hooksKeys.all });\n const previousHooks = queryClient.getQueryData<HooksResponse>(hooksKeys.lists());\n\n queryClient.setQueryData<HooksResponse>(hooksKeys.lists(), (old) => {\n if (!old) return old;\n return {\n hooks: old.hooks.map((h) => (h.name === hookName ? { ...h, enabled } : h)),\n };\n });\n\n return { previousHooks };\n },\n onError: (_error, _vars, context) => {\n if (context?.previousHooks) {\n queryClient.setQueryData(hooksKeys.lists(), context.previousHooks);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: hooksKeys.all });\n },\n });\n\n return {\n toggleHook: (hookName: string, enabled: boolean) => mutation.mutateAsync({ hookName, enabled }),\n isToggling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteHook() {\n const queryClient = useQueryClient();\n const projectPath = useWorkflowStore(selectProjectPath);\n\n const mutation = useMutation({\n mutationFn: (hook: { name: string; scope?: 'global' | 'project'; trigger: string; index?: number }) => {\n const scope = hook.scope || 'project';\n const hookIndex = hook.index ?? 0;\n return deleteHook({\n projectPath: projectPath || undefined,\n scope,\n event: hook.trigger,\n hookIndex,\n });\n },\n onMutate: async (hook) => {\n await queryClient.cancelQueries({ queryKey: hooksKeys.all });\n const previousHooks = queryClient.getQueryData<HooksResponse>(hooksKeys.lists());\n\n queryClient.setQueryData<HooksResponse>(hooksKeys.lists(), (old) => {\n if (!old) return old;\n return {\n hooks: old.hooks.filter((h) => h.name !== hook.name),\n };\n });\n\n return { previousHooks };\n },\n onError: (_error, _hook, context) => {\n if (context?.previousHooks) {\n queryClient.setQueryData(hooksKeys.lists(), context.previousHooks);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: hooksKeys.all });\n },\n });\n\n return {\n deleteHook: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// useRules Hook\n// ========================================\n\nimport {\n fetchRules,\n toggleRule,\n createRule as createRuleApi,\n deleteRule as deleteRuleApi,\n type Rule,\n type RulesResponse,\n type RuleCreateInput,\n} from '../lib/api';\n\nexport const rulesKeys = {\n all: ['rules'] as const,\n lists: () => [...rulesKeys.all, 'list'] as const,\n};\n\nexport interface UseRulesOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseRulesReturn {\n rules: Rule[];\n enabledRules: Rule[];\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 useRules(options: UseRulesOptions = {}): UseRulesReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n const projectPath = useWorkflowStore(selectProjectPath);\n\n const query = useQuery({\n queryKey: workspaceQueryKeys.rulesList(projectPath),\n queryFn: () => fetchRules(projectPath),\n staleTime,\n enabled: enabled, // Remove projectPath requirement\n retry: 2,\n });\n\n const rules = query.data?.rules ?? [];\n const enabledRules = rules.filter((r) => r.enabled);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: rulesKeys.all });\n };\n\n return {\n rules,\n enabledRules,\n totalCount: rules.length,\n enabledCount: enabledRules.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useToggleRule() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ ruleId, enabled }: { ruleId: string; enabled: boolean }) =>\n toggleRule(ruleId, enabled),\n onMutate: async ({ ruleId, enabled }) => {\n await queryClient.cancelQueries({ queryKey: rulesKeys.all });\n const previousRules = queryClient.getQueryData<RulesResponse>(rulesKeys.lists());\n\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\n if (!old) return old;\n return {\n rules: old.rules.map((r) => (r.id === ruleId ? { ...r, enabled } : r)),\n };\n });\n\n return { previousRules };\n },\n onError: (_error, _vars, context) => {\n if (context?.previousRules) {\n queryClient.setQueryData(rulesKeys.lists(), context.previousRules);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\n },\n });\n\n return {\n toggleRule: (ruleId: string, enabled: boolean) => mutation.mutateAsync({ ruleId, enabled }),\n isToggling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useCreateRule() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (input: RuleCreateInput) => createRuleApi(input),\n onSuccess: (newRule) => {\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\n if (!old) return { rules: [newRule] };\n return {\n rules: [newRule, ...old.rules],\n };\n });\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\n },\n });\n\n return {\n createRule: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteRule() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ ruleId, location }: { ruleId: string; location?: string }) =>\n deleteRuleApi(ruleId, location),\n onMutate: async ({ ruleId }) => {\n await queryClient.cancelQueries({ queryKey: rulesKeys.all });\n const previousRules = queryClient.getQueryData<RulesResponse>(rulesKeys.lists());\n\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\n if (!old) return old;\n return {\n rules: old.rules.filter((r) => r.id !== ruleId),\n };\n });\n\n return { previousRules };\n },\n onError: (_error, _vars, context) => {\n if (context?.previousRules) {\n queryClient.setQueryData(rulesKeys.lists(), context.previousRules);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\n },\n });\n\n return {\n deleteRule: (ruleId: string, location?: string) => mutation.mutateAsync({ ruleId, location }),\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\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","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-DOlWtux5.js","sources":["../../src/hooks/useCli.ts"],"sourcesContent":["// ========================================\n// useCliEndpoints Hook\n// ========================================\n// TanStack Query hooks for CLI endpoint 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 fetchCliEndpoints,\n toggleCliEndpoint,\n createCliEndpoint,\n updateCliEndpoint,\n deleteCliEndpoint,\n type CliEndpoint,\n type CliEndpointsResponse,\n} from '../lib/api';\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\n\n// Query key factory\nexport const cliEndpointsKeys = {\n all: ['cliEndpoints'] as const,\n lists: () => [...cliEndpointsKeys.all, 'list'] as const,\n};\n\nconst STALE_TIME = 2 * 60 * 1000;\n\nexport interface UseCliEndpointsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseCliEndpointsReturn {\n endpoints: CliEndpoint[];\n litellmEndpoints: CliEndpoint[];\n customEndpoints: CliEndpoint[];\n wrapperEndpoints: CliEndpoint[];\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 useCliEndpoints(options: UseCliEndpointsOptions = {}): UseCliEndpointsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: cliEndpointsKeys.lists(),\n queryFn: fetchCliEndpoints,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const endpoints = query.data?.endpoints ?? [];\n const enabledEndpoints = endpoints.filter((e) => e.enabled);\n\n const litellmEndpoints = endpoints.filter((e) => e.type === 'litellm');\n const customEndpoints = endpoints.filter((e) => e.type === 'custom');\n const wrapperEndpoints = endpoints.filter((e) => e.type === 'wrapper');\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n };\n\n return {\n endpoints,\n litellmEndpoints,\n customEndpoints,\n wrapperEndpoints,\n totalCount: endpoints.length,\n enabledCount: enabledEndpoints.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useToggleCliEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, enabled }: { endpointId: string; enabled: boolean }) =>\n toggleCliEndpoint(endpointId, enabled),\n onMutate: async ({ endpointId, enabled }) => {\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\n const previousEndpoints = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\n\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\n if (!old) return old;\n return {\n endpoints: old.endpoints.map((e) => (e.id === endpointId ? { ...e, enabled } : e)),\n };\n });\n\n return { previousEndpoints };\n },\n onError: (_error, _vars, context) => {\n if (context?.previousEndpoints) {\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previousEndpoints);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n },\n });\n\n return {\n toggleEndpoint: (endpointId: string, enabled: boolean) => mutation.mutateAsync({ endpointId, enabled }),\n isToggling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useCreateCliEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpoint: Omit<CliEndpoint, 'id'>) => createCliEndpoint(endpoint),\n onSuccess: (created) => {\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\n if (!old) return { endpoints: [created] };\n return { endpoints: [created, ...old.endpoints] };\n });\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n },\n });\n\n return {\n createEndpoint: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpdateCliEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ endpointId, updates }: { endpointId: string; updates: Partial<CliEndpoint> }) =>\n updateCliEndpoint(endpointId, updates),\n onMutate: async ({ endpointId, updates }) => {\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\n const previous = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\n\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\n if (!old) return old;\n return {\n endpoints: old.endpoints.map((e) => (e.id === endpointId ? { ...e, ...updates } : e)),\n };\n });\n\n return { previous };\n },\n onError: (_err, _vars, context) => {\n if (context?.previous) {\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previous);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n },\n });\n\n return {\n updateEndpoint: (endpointId: string, updates: Partial<CliEndpoint>) =>\n mutation.mutateAsync({ endpointId, updates }),\n isUpdating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteCliEndpoint() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (endpointId: string) => deleteCliEndpoint(endpointId),\n onMutate: async (endpointId) => {\n await queryClient.cancelQueries({ queryKey: cliEndpointsKeys.all });\n const previous = queryClient.getQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists());\n\n queryClient.setQueryData<CliEndpointsResponse>(cliEndpointsKeys.lists(), (old) => {\n if (!old) return old;\n return {\n endpoints: old.endpoints.filter((e) => e.id !== endpointId),\n };\n });\n\n return { previous };\n },\n onError: (_err, _endpointId, context) => {\n if (context?.previous) {\n queryClient.setQueryData(cliEndpointsKeys.lists(), context.previous);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliEndpointsKeys.all });\n },\n });\n\n return {\n deleteEndpoint: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// useCliInstallations Hook\n// ========================================\n\nimport {\n fetchCliInstallations,\n installCliTool,\n uninstallCliTool,\n upgradeCliTool,\n type CliInstallation,\n} from '../lib/api';\n\nexport const cliInstallationsKeys = {\n all: ['cliInstallations'] as const,\n lists: () => [...cliInstallationsKeys.all, 'list'] as const,\n};\n\nexport interface UseCliInstallationsOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseCliInstallationsReturn {\n installations: CliInstallation[];\n installedTools: CliInstallation[];\n totalCount: number;\n installedCount: number;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n invalidate: () => Promise<void>;\n}\n\nexport function useCliInstallations(options: UseCliInstallationsOptions = {}): UseCliInstallationsReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey: cliInstallationsKeys.lists(),\n queryFn: fetchCliInstallations,\n staleTime,\n enabled,\n retry: 2,\n });\n\n const installations = query.data?.tools ?? [];\n const installedTools = installations.filter((t) => t.installed);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n };\n\n return {\n installations,\n installedTools,\n totalCount: installations.length,\n installedCount: installedTools.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useInstallCliTool() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (toolName: string) => installCliTool(toolName),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.inProgress' }),\n formatMessage({ id: 'common.feedback.cliToolInstall.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.cliToolInstall.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'cliToolInstall');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n },\n });\n\n return {\n installTool: mutation.mutateAsync,\n isInstalling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUninstallCliTool() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (toolName: string) => uninstallCliTool(toolName),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.inProgress' }),\n formatMessage({ id: 'common.feedback.cliToolUninstall.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.cliToolUninstall.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'cliToolUninstall');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n },\n });\n\n return {\n uninstallTool: mutation.mutateAsync,\n isUninstalling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useUpgradeCliTool() {\n const queryClient = useQueryClient();\n const formatMessage = useFormatMessage();\n const { success, info, error: errorToast } = useNotifications();\n\n const mutation = useMutation({\n mutationFn: (toolName: string) => upgradeCliTool(toolName),\n onMutate: () => {\n info(\n formatMessage({ id: 'status.inProgress' }),\n formatMessage({ id: 'common.feedback.cliToolUpgrade.success' })\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n success(\n formatMessage({ id: 'common.success' }),\n formatMessage({ id: 'common.feedback.cliToolUpgrade.success' })\n );\n },\n onError: (err) => {\n const sanitized = sanitizeErrorMessage(err, 'cliToolUpgrade');\n const message = formatMessage({ id: sanitized.messageKey });\n const title = formatMessage({ id: 'common.error' });\n errorToast(title, message);\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: cliInstallationsKeys.all });\n },\n });\n\n return {\n upgradeTool: mutation.mutateAsync,\n isUpgrading: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// useHooks Hook\n// ========================================\n\nimport {\n fetchHooks,\n toggleHook,\n deleteHook,\n type Hook,\n type HooksResponse,\n} from '../lib/api';\n\nexport const hooksKeys = {\n all: ['hooks'] as const,\n lists: () => [...hooksKeys.all, 'list'] as const,\n};\n\nexport interface UseHooksOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseHooksReturn {\n hooks: Hook[];\n enabledHooks: Hook[];\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 useHooks(options: UseHooksOptions = {}): UseHooksReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n const projectPath = useWorkflowStore(selectProjectPath);\n\n const queryEnabled = enabled && !!projectPath;\n\n const query = useQuery({\n queryKey: workspaceQueryKeys.rulesList(projectPath),\n queryFn: () => fetchHooks(projectPath),\n staleTime,\n enabled: queryEnabled,\n retry: 2,\n });\n\n const hooks = query.data?.hooks ?? [];\n const enabledHooks = hooks.filter((h) => h.enabled);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: hooksKeys.all });\n };\n\n return {\n hooks,\n enabledHooks,\n totalCount: hooks.length,\n enabledCount: enabledHooks.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useToggleHook() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ hookName, enabled }: { hookName: string; enabled: boolean }) =>\n toggleHook(hookName, enabled),\n onMutate: async ({ hookName, enabled }) => {\n await queryClient.cancelQueries({ queryKey: hooksKeys.all });\n const previousHooks = queryClient.getQueryData<HooksResponse>(hooksKeys.lists());\n\n queryClient.setQueryData<HooksResponse>(hooksKeys.lists(), (old) => {\n if (!old) return old;\n return {\n hooks: old.hooks.map((h) => (h.name === hookName ? { ...h, enabled } : h)),\n };\n });\n\n return { previousHooks };\n },\n onError: (_error, _vars, context) => {\n if (context?.previousHooks) {\n queryClient.setQueryData(hooksKeys.lists(), context.previousHooks);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: hooksKeys.all });\n },\n });\n\n return {\n toggleHook: (hookName: string, enabled: boolean) => mutation.mutateAsync({ hookName, enabled }),\n isToggling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteHook() {\n const queryClient = useQueryClient();\n const projectPath = useWorkflowStore(selectProjectPath);\n\n const mutation = useMutation({\n mutationFn: (hook: { name: string; scope?: 'global' | 'project'; trigger: string; index?: number }) => {\n const scope = hook.scope || 'project';\n const hookIndex = hook.index ?? 0;\n return deleteHook({\n projectPath: projectPath || undefined,\n scope,\n event: hook.trigger,\n hookIndex,\n });\n },\n onMutate: async (hook) => {\n await queryClient.cancelQueries({ queryKey: hooksKeys.all });\n const previousHooks = queryClient.getQueryData<HooksResponse>(hooksKeys.lists());\n\n queryClient.setQueryData<HooksResponse>(hooksKeys.lists(), (old) => {\n if (!old) return old;\n return {\n hooks: old.hooks.filter((h) => h.name !== hook.name),\n };\n });\n\n return { previousHooks };\n },\n onError: (_error, _hook, context) => {\n if (context?.previousHooks) {\n queryClient.setQueryData(hooksKeys.lists(), context.previousHooks);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: hooksKeys.all });\n },\n });\n\n return {\n deleteHook: mutation.mutateAsync,\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\n\n// ========================================\n// useRules Hook\n// ========================================\n\nimport {\n fetchRules,\n toggleRule,\n createRule as createRuleApi,\n deleteRule as deleteRuleApi,\n type Rule,\n type RulesResponse,\n type RuleCreateInput,\n} from '../lib/api';\n\nexport const rulesKeys = {\n all: ['rules'] as const,\n lists: () => [...rulesKeys.all, 'list'] as const,\n};\n\nexport interface UseRulesOptions {\n staleTime?: number;\n enabled?: boolean;\n}\n\nexport interface UseRulesReturn {\n rules: Rule[];\n enabledRules: Rule[];\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 useRules(options: UseRulesOptions = {}): UseRulesReturn {\n const { staleTime = STALE_TIME, enabled = true } = options;\n const queryClient = useQueryClient();\n const projectPath = useWorkflowStore(selectProjectPath);\n\n const query = useQuery({\n queryKey: workspaceQueryKeys.rulesList(projectPath),\n queryFn: () => fetchRules(projectPath),\n staleTime,\n enabled: enabled, // Remove projectPath requirement\n retry: 2,\n });\n\n const rules = query.data?.rules ?? [];\n const enabledRules = rules.filter((r) => r.enabled);\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: rulesKeys.all });\n };\n\n return {\n rules,\n enabledRules,\n totalCount: rules.length,\n enabledCount: enabledRules.length,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n invalidate,\n };\n}\n\nexport function useToggleRule() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ ruleId, enabled }: { ruleId: string; enabled: boolean }) =>\n toggleRule(ruleId, enabled),\n onMutate: async ({ ruleId, enabled }) => {\n await queryClient.cancelQueries({ queryKey: rulesKeys.all });\n const previousRules = queryClient.getQueryData<RulesResponse>(rulesKeys.lists());\n\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\n if (!old) return old;\n return {\n rules: old.rules.map((r) => (r.id === ruleId ? { ...r, enabled } : r)),\n };\n });\n\n return { previousRules };\n },\n onError: (_error, _vars, context) => {\n if (context?.previousRules) {\n queryClient.setQueryData(rulesKeys.lists(), context.previousRules);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\n },\n });\n\n return {\n toggleRule: (ruleId: string, enabled: boolean) => mutation.mutateAsync({ ruleId, enabled }),\n isToggling: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useCreateRule() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: (input: RuleCreateInput) => createRuleApi(input),\n onSuccess: (newRule) => {\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\n if (!old) return { rules: [newRule] };\n return {\n rules: [newRule, ...old.rules],\n };\n });\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\n },\n });\n\n return {\n createRule: mutation.mutateAsync,\n isCreating: mutation.isPending,\n error: mutation.error,\n };\n}\n\nexport function useDeleteRule() {\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationFn: ({ ruleId, location }: { ruleId: string; location?: string }) =>\n deleteRuleApi(ruleId, location),\n onMutate: async ({ ruleId }) => {\n await queryClient.cancelQueries({ queryKey: rulesKeys.all });\n const previousRules = queryClient.getQueryData<RulesResponse>(rulesKeys.lists());\n\n queryClient.setQueryData<RulesResponse>(rulesKeys.lists(), (old) => {\n if (!old) return old;\n return {\n rules: old.rules.filter((r) => r.id !== ruleId),\n };\n });\n\n return { previousRules };\n },\n onError: (_error, _vars, context) => {\n if (context?.previousRules) {\n queryClient.setQueryData(rulesKeys.lists(), context.previousRules);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: rulesKeys.all });\n },\n });\n\n return {\n deleteRule: (ruleId: string, location?: string) => mutation.mutateAsync({ ruleId, location }),\n isDeleting: mutation.isPending,\n error: mutation.error,\n };\n}\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","previousHooks","useDeleteHook","hook","scope","hookIndex","deleteHook","_hook","rulesKeys","useRules","fetchRules","rules","enabledRules","r","useToggleRule","ruleId","toggleRule","previousRules","useCreateRule","input","createRuleApi","newRule","useDeleteRule","location","deleteRuleApi"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{aF as q,a9 as v,aa as F,ab as j,aC as p,al as A,aH as L,bU as u,b$ as E,c0 as k,c1 as z}from"./index-bSgtHHOF.js";import{s as M}from"./errorSanitizer-IY9pf5g4.js";const G=600*1e3;function B(){const l=q(),o=v(F),{addToast:f,removeToast:m,success:y,error:g}=A(),c=L({mutationFn:({name:a,enabled:t,location:n})=>E(a,t,n,o),onMutate:()=>({loadingId:f("info",u("common.loading"),void 0,{duration:0})}),onSuccess:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r),y(u("feedback.commandToggle.success")),l.invalidateQueries({queryKey:p.commands(o)})},onError:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r);const d=M(a,"commandToggle");g(u("common.error"),u(d.messageKey))}}),i=L({mutationFn:({groupName:a,enable:t,location:n})=>k(a,t,n,o),onMutate:()=>({loadingId:f("info",u("common.loading"),void 0,{duration:0})}),onSuccess:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r),y(u("feedback.commandToggle.success")),l.invalidateQueries({queryKey:p.commands(o)})},onError:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r);const d=M(a,"commandToggle");g(u("common.error"),u(d.messageKey))}});return{toggleCommand:(a,t,n)=>c.mutateAsync({name:a,enabled:t,location:n}),toggleGroup:(a,t,n)=>i.mutateAsync({groupName:a,enable:t,location:n}),isToggling:c.isPending||i.isPending}}function D(l={}){var _;const{filter:o,staleTime:f=G,enabled:m=!0}=l,y=q(),g=v(F),c=j({queryKey:p.commandsList(g),queryFn:()=>z(g),staleTime:f,enabled:m,retry:2}),i=((_=c.data)==null?void 0:_.commands)??[],a=i.filter(e=>e.location==="project").length,t=i.filter(e=>e.location==="user").length,n=(()=>{let e=i;if(o!=null&&o.search){const s=o.search.toLowerCase();e=e.filter(h=>{var T;return h.name.toLowerCase().includes(s)||h.description.toLowerCase().includes(s)||((T=h.aliases)==null?void 0:T.some(S=>S.toLowerCase().includes(s)))})}return o!=null&&o.category&&(e=e.filter(s=>s.category===o.category)),o!=null&&o.source&&(e=e.filter(s=>s.source===o.source)),o!=null&&o.group&&(e=e.filter(s=>s.group===o.group)),o!=null&&o.location&&(e=e.filter(s=>s.location===o.location)),e})(),r=(o==null?void 0:o.showDisabled)===!1?n.filter(e=>e.enabled!==!1):n,d={},I=new Set;for(const e of i){const s=e.category||"Uncategorized";I.add(s),d[s]||(d[s]=[]),d[s].push(e)}const C={},b=new Set,w=n.filter(e=>e.enabled!==!1).length,K=n.length-w;for(const e of n){const s=e.group||"other";b.add(s),C[s]||(C[s]=[]),C[s].push(e)}const P=async()=>{await c.refetch()},Q=async()=>{await y.invalidateQueries({queryKey:p.commands(g)})};return{commands:r,categories:Array.from(I).sort(),commandsByCategory:d,groupedCommands:C,groups:Array.from(b).sort(),enabledCount:w,disabledCount:K,projectCount:a,userCount:t,totalCount:i.length,isLoading:c.isLoading,isFetching:c.isFetching,error:c.error,refetch:P,invalidate:Q}}export{B as a,D as u};
2
- //# sourceMappingURL=useCommands-D4uGmNpF.js.map
1
+ import{aF as q,a9 as v,aa as F,ab as j,aC as p,al as A,aH as L,bU as u,b$ as E,c0 as k,c1 as z}from"./index-DzTbMyaS.js";import{s as M}from"./errorSanitizer-IY9pf5g4.js";const G=600*1e3;function B(){const l=q(),o=v(F),{addToast:f,removeToast:m,success:y,error:g}=A(),c=L({mutationFn:({name:a,enabled:t,location:n})=>E(a,t,n,o),onMutate:()=>({loadingId:f("info",u("common.loading"),void 0,{duration:0})}),onSuccess:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r),y(u("feedback.commandToggle.success")),l.invalidateQueries({queryKey:p.commands(o)})},onError:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r);const d=M(a,"commandToggle");g(u("common.error"),u(d.messageKey))}}),i=L({mutationFn:({groupName:a,enable:t,location:n})=>k(a,t,n,o),onMutate:()=>({loadingId:f("info",u("common.loading"),void 0,{duration:0})}),onSuccess:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r),y(u("feedback.commandToggle.success")),l.invalidateQueries({queryKey:p.commands(o)})},onError:(a,t,n)=>{const{loadingId:r}=n??{loadingId:""};r&&m(r);const d=M(a,"commandToggle");g(u("common.error"),u(d.messageKey))}});return{toggleCommand:(a,t,n)=>c.mutateAsync({name:a,enabled:t,location:n}),toggleGroup:(a,t,n)=>i.mutateAsync({groupName:a,enable:t,location:n}),isToggling:c.isPending||i.isPending}}function D(l={}){var _;const{filter:o,staleTime:f=G,enabled:m=!0}=l,y=q(),g=v(F),c=j({queryKey:p.commandsList(g),queryFn:()=>z(g),staleTime:f,enabled:m,retry:2}),i=((_=c.data)==null?void 0:_.commands)??[],a=i.filter(e=>e.location==="project").length,t=i.filter(e=>e.location==="user").length,n=(()=>{let e=i;if(o!=null&&o.search){const s=o.search.toLowerCase();e=e.filter(h=>{var T;return h.name.toLowerCase().includes(s)||h.description.toLowerCase().includes(s)||((T=h.aliases)==null?void 0:T.some(S=>S.toLowerCase().includes(s)))})}return o!=null&&o.category&&(e=e.filter(s=>s.category===o.category)),o!=null&&o.source&&(e=e.filter(s=>s.source===o.source)),o!=null&&o.group&&(e=e.filter(s=>s.group===o.group)),o!=null&&o.location&&(e=e.filter(s=>s.location===o.location)),e})(),r=(o==null?void 0:o.showDisabled)===!1?n.filter(e=>e.enabled!==!1):n,d={},I=new Set;for(const e of i){const s=e.category||"Uncategorized";I.add(s),d[s]||(d[s]=[]),d[s].push(e)}const C={},b=new Set,w=n.filter(e=>e.enabled!==!1).length,K=n.length-w;for(const e of n){const s=e.group||"other";b.add(s),C[s]||(C[s]=[]),C[s].push(e)}const P=async()=>{await c.refetch()},Q=async()=>{await y.invalidateQueries({queryKey:p.commands(g)})};return{commands:r,categories:Array.from(I).sort(),commandsByCategory:d,groupedCommands:C,groups:Array.from(b).sort(),enabledCount:w,disabledCount:K,projectCount:a,userCount:t,totalCount:i.length,isLoading:c.isLoading,isFetching:c.isFetching,error:c.error,refetch:P,invalidate:Q}}export{B as a,D as u};
2
+ //# sourceMappingURL=useCommands-DazCajiX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCommands-D4uGmNpF.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-DazCajiX.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-bSgtHHOF.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-BEYmuZYP.js.map
1
+ import{r as o}from"./index-DzTbMyaS.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-Cah-bua6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDebounce-BEYmuZYP.js","sources":["../../src/hooks/useDebounce.ts"],"sourcesContent":["// ========================================\r\n// useDebounce Hook\r\n// ========================================\r\n// Debounces a value to delay expensive computations or API calls.\r\n\r\nimport { useState, useEffect } from 'react';\r\n\r\n/**\r\n * Debounces a value.\r\n *\r\n * @param value The value to debounce.\r\n * @param delay The debounce delay in milliseconds.\r\n * @returns The debounced value.\r\n */\r\nexport function useDebounce<T>(value: T, delay: number): T {\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\r\n\r\n useEffect(() => {\r\n const handler = setTimeout(() => {\r\n setDebouncedValue(value);\r\n }, delay);\r\n\r\n return () => {\r\n clearTimeout(handler);\r\n };\r\n }, [value, delay]);\r\n\r\n return debouncedValue;\r\n}\r\n"],"names":["useDebounce","value","delay","debouncedValue","setDebouncedValue","useState","useEffect","handler"],"mappings":"wCAcO,SAASA,EAAeC,EAAUC,EAAkB,CACzD,KAAM,CAACC,EAAgBC,CAAiB,EAAIC,EAAAA,SAAYJ,CAAK,EAE7DK,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAU,WAAW,IAAM,CAC/BH,EAAkBH,CAAK,CACzB,EAAGC,CAAK,EAER,MAAO,IAAM,CACX,aAAaK,CAAO,CACtB,CACF,EAAG,CAACN,EAAOC,CAAK,CAAC,EAEVC,CACT"}
1
+ {"version":3,"file":"useDebounce-Cah-bua6.js","sources":["../../src/hooks/useDebounce.ts"],"sourcesContent":["// ========================================\r\n// useDebounce Hook\r\n// ========================================\r\n// Debounces a value to delay expensive computations or API calls.\r\n\r\nimport { useState, useEffect } from 'react';\r\n\r\n/**\r\n * Debounces a value.\r\n *\r\n * @param value The value to debounce.\r\n * @param delay The debounce delay in milliseconds.\r\n * @returns The debounced value.\r\n */\r\nexport function useDebounce<T>(value: T, delay: number): T {\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\r\n\r\n useEffect(() => {\r\n const handler = setTimeout(() => {\r\n setDebouncedValue(value);\r\n }, delay);\r\n\r\n return () => {\r\n clearTimeout(handler);\r\n };\r\n }, [value, delay]);\r\n\r\n return debouncedValue;\r\n}\r\n"],"names":["useDebounce","value","delay","debouncedValue","setDebouncedValue","useState","useEffect","handler"],"mappings":"wCAcO,SAASA,EAAeC,EAAUC,EAAkB,CACzD,KAAM,CAACC,EAAgBC,CAAiB,EAAIC,EAAAA,SAAYJ,CAAK,EAE7DK,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAU,WAAW,IAAM,CAC/BH,EAAkBH,CAAK,CACzB,EAAGC,CAAK,EAER,MAAO,IAAM,CACX,aAAaK,CAAO,CACtB,CACF,EAAG,CAACN,EAAOC,CAAK,CAAC,EAEVC,CACT"}
@@ -1,7 +1,7 @@
1
- import{j as t,c as h,ao as le,F as k,af as D,aU as ce,u as oe,r as l,N as de,m as Q,e as xe,bq as ue,am as me,aF as pe,ab as K,fy as B,fz as he,fA as fe,fB as ye}from"./index-bSgtHHOF.js";import{F as $}from"./folder-BSHjjjND.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||"")?D:i.includes(s||"")?D:k}function je(e){if(!e)return"";const s=["B","KB","MB","GB"];let a=e,i=0;for(;a>=1024&&i<s.length-1;)a/=1024,i++;return`${a.toFixed(1)}${s[i]}`}function _({node:e,level:s,expandedPaths:a,selectedPath:i,maxDepth:c=0,showIcons:f=!0,showSizes:n=!1,onNodeClick:y,onNodeDoubleClick:d,onToggle:g}){const u=e.type==="directory",p=a.has(e.path),N=i===e.path,F=u&&e.children&&e.children.length>0,S=p&&F,b=c>0&&s>=c;let j=k;u?j=p?ce:$:f&&(j=ge(e.name));const T=m=>{m.stopPropagation(),y==null||y(e),u&&F&&(g==null||g(e.path))},E=m=>{m.stopPropagation(),d==null||d(e)},L=m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),T(m))};return t.jsxs("div",{className:h("tree-node",u&&"tree-directory",N&&"selected"),role:"treeitem","aria-expanded":u?p:void 0,"aria-selected":N,children:[t.jsxs("div",{className:h("flex items-center gap-1 px-2 py-1 rounded-sm cursor-pointer transition-colors","hover:bg-hover hover:text-foreground",N&&"bg-primary/10 text-primary","text-foreground text-sm"),style:{paddingLeft:`${s*16+8}px`},onClick:T,onDoubleClick:E,onKeyDown:L,tabIndex:0,title:e.path,children:[u&&t.jsx(le,{className:h("h-4 w-4 flex-shrink-0 text-muted-foreground transition-transform",p&&"rotate-90")}),f&&t.jsx(j,{className:h("h-4 w-4 flex-shrink-0",u?p?"text-blue-500":"text-blue-400":"text-muted-foreground")}),t.jsx("span",{className:"flex-1 truncate",children:e.name}),e.hasClaudeMd&&t.jsx("span",{className:"ml-1 px-1.5 py-0.5 text-[10px] font-semibold rounded bg-purple-500/20 text-purple-500",title:"Contains CLAUDE.md context",children:"MD"}),n&&!u&&e.size&&t.jsx("span",{className:"text-xs text-muted-foreground ml-auto",children:je(e.size)})]}),S&&!b&&e.children&&t.jsx("div",{className:"tree-children",role:"group",children:e.children.map(m=>t.jsx(_,{node:m,level:s+1,expandedPaths:a,selectedPath:i,maxDepth:c,showIcons:f,showSizes:n,onNodeClick:y,onNodeDoubleClick:d,onToggle:g},m.path))})]})}function Te({nodes:e,expandedPaths:s,selectedPath:a,onNodeClick:i,onNodeDoubleClick:c,onToggle:f,maxDepth:n=0,depth:y=0,showIcons:d=!0,showSizes:g=!1,className:u}){return e.length===0?t.jsxs("div",{className:"flex flex-col items-center justify-center py-8 px-4 text-center",children:[t.jsx($,{className:"h-12 w-12 text-muted-foreground mb-3"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:"No files found"})]}):t.jsx("div",{className:h("tree-view",u),role:"tree","aria-label":"File tree",children:e.map(p=>t.jsx(_,{node:p,level:y,expandedPaths:s,selectedPath:a,maxDepth:n,showIcons:d,showSizes:g,onNodeClick:i,onNodeDoubleClick:c,onToggle:f},p.path))})}function we(e){return e?{typescript:"TypeScript",tsx:"TypeScript JSX",javascript:"JavaScript",jsx:"React JSX",python:"Python",ruby:"Ruby",go:"Go",rust:"Rust",java:"Java",csharp:"C#",php:"PHP",scala:"Scala",kotlin:"Kotlin",markdown:"Markdown",json:"JSON",yaml:"YAML",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",less:"Less",sql:"SQL",bash:"Bash",text:"Plain Text"}[e]||e.charAt(0).toUpperCase()+e.slice(1):"Plain Text"}function I(e){const s=e.split(".");return s.length>1?s[s.length-1]:""}function be(e){const s=["png","jpg","jpeg","gif","bmp","ico","webp","svg","pdf","doc","docx","xls","xlsx","ppt","pptx","zip","tar","gz","rar","7z","mp3","mp4","avi","mov","wav","ttf","otf","woff","woff2","eot","exe","dll","so","dylib","class","jar","war","pdb","obj","o"],a=I(e).toLowerCase();return s.includes(a)}function z(e){if(!e)return"";const s=["B","KB","MB","GB"];let a=e,i=0;for(;a>=1024&&i<s.length-1;)a/=1024,i++;return`${a.toFixed(1)} ${s[i]}`}function ve(e,s=1e3){const a=e.split(`
1
+ import{j as t,c as h,ao as le,F as k,af as D,aU as ce,u as oe,r as l,N as de,m as Q,e as xe,bq as ue,am as me,aF as pe,ab as K,fy as B,fz as he,fA as fe,fB as ye}from"./index-DzTbMyaS.js";import{F as $}from"./folder-ChYtty7V.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||"")?D:i.includes(s||"")?D: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(Q,{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(Q,{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,R=600*1e3;function Le(e={}){var P,A;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:()=>B(r),staleTime:R})},[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:()=>B(r),staleTime:R})}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:((A=v.error)==null?void 0:A.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=R}=s,c=K({queryKey:x.content(e??""),queryFn:()=>B(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-DEv0DVy7.js.map
7
+ //# sourceMappingURL=useFileExplorer-B9SCPhhl.js.map