@samanhappy/mcphub 1.1.15 → 1.2.0

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 (120) hide show
  1. package/README.fr.md +1 -0
  2. package/README.md +1 -0
  3. package/README.zh.md +1 -0
  4. package/dist/clients/openapi.js +3 -2
  5. package/dist/clients/openapi.js.map +1 -1
  6. package/dist/controllers/credentialBindingController.js +1 -1
  7. package/dist/controllers/credentialBindingController.js.map +1 -1
  8. package/dist/controllers/healthController.js +23 -1
  9. package/dist/controllers/healthController.js.map +1 -1
  10. package/dist/controllers/metricsController.js +9 -1
  11. package/dist/controllers/metricsController.js.map +1 -1
  12. package/dist/controllers/oauthDynamicRegistrationController.js +5 -5
  13. package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -1
  14. package/dist/db/connection.js +6 -2
  15. package/dist/db/connection.js.map +1 -1
  16. package/dist/db/entities/OAuthState.js +43 -0
  17. package/dist/db/entities/OAuthState.js.map +1 -0
  18. package/dist/db/entities/index.js +3 -1
  19. package/dist/db/entities/index.js.map +1 -1
  20. package/dist/db/replicaSchema.js +40 -0
  21. package/dist/db/replicaSchema.js.map +1 -0
  22. package/dist/db/setup.js +25 -0
  23. package/dist/db/setup.js.map +1 -0
  24. package/dist/db/transactionContext.js +21 -0
  25. package/dist/db/transactionContext.js.map +1 -0
  26. package/dist/index.js +2 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/middlewares/replicaConfig.js +134 -0
  29. package/dist/middlewares/replicaConfig.js.map +1 -0
  30. package/dist/middlewares/userContext.js +1 -1
  31. package/dist/middlewares/userContext.js.map +1 -1
  32. package/dist/models/OAuth.js +57 -7
  33. package/dist/models/OAuth.js.map +1 -1
  34. package/dist/routes/index.js +14 -1
  35. package/dist/routes/index.js.map +1 -1
  36. package/dist/server.js +13 -4
  37. package/dist/server.js.map +1 -1
  38. package/dist/services/credentialBindingService.js +5 -1
  39. package/dist/services/credentialBindingService.js.map +1 -1
  40. package/dist/services/mcpOAuthProvider.js +91 -5
  41. package/dist/services/mcpOAuthProvider.js.map +1 -1
  42. package/dist/services/mcpService.js +110 -7
  43. package/dist/services/mcpService.js.map +1 -1
  44. package/dist/services/metricsService.js +4 -0
  45. package/dist/services/metricsService.js.map +1 -1
  46. package/dist/services/oauthClientRegistration.js +21 -1
  47. package/dist/services/oauthClientRegistration.js.map +1 -1
  48. package/dist/services/oauthServerService.js +5 -6
  49. package/dist/services/oauthServerService.js.map +1 -1
  50. package/dist/services/oauthSettingsStore.js +21 -0
  51. package/dist/services/oauthSettingsStore.js.map +1 -1
  52. package/dist/services/personalOAuthService.js +40 -2
  53. package/dist/services/personalOAuthService.js.map +1 -1
  54. package/dist/services/replicaLock.js +30 -0
  55. package/dist/services/replicaLock.js.map +1 -0
  56. package/dist/services/replicaService.js +111 -0
  57. package/dist/services/replicaService.js.map +1 -0
  58. package/dist/services/sseService.js +3 -2
  59. package/dist/services/sseService.js.map +1 -1
  60. package/dist/utils/logger.js +7 -0
  61. package/dist/utils/logger.js.map +1 -1
  62. package/dist/utils/migration.js +3 -0
  63. package/dist/utils/migration.js.map +1 -1
  64. package/dist/utils/replicaLogContext.js +3 -0
  65. package/dist/utils/replicaLogContext.js.map +1 -0
  66. package/dist/utils/replicaMode.js +17 -0
  67. package/dist/utils/replicaMode.js.map +1 -0
  68. package/dist/utils/serverConfigPersistence.js +4 -0
  69. package/dist/utils/serverConfigPersistence.js.map +1 -1
  70. package/dist/utils/settingsSync.js +1 -0
  71. package/dist/utils/settingsSync.js.map +1 -1
  72. package/frontend/dist/assets/{ActivityPage-Bi-TjKez.js → ActivityPage-CSXEpl6y.js} +2 -2
  73. package/frontend/dist/assets/{ActivityPage-Bi-TjKez.js.map → ActivityPage-CSXEpl6y.js.map} +1 -1
  74. package/frontend/dist/assets/{CredentialsPage-C4Ucer3d.js → CredentialsPage-CPxOHQUZ.js} +2 -2
  75. package/frontend/dist/assets/{CredentialsPage-C4Ucer3d.js.map → CredentialsPage-CPxOHQUZ.js.map} +1 -1
  76. package/frontend/dist/assets/{Dashboard-C_2KkuoD.js → Dashboard-Da-YT_l_.js} +2 -2
  77. package/frontend/dist/assets/{Dashboard-C_2KkuoD.js.map → Dashboard-Da-YT_l_.js.map} +1 -1
  78. package/frontend/dist/assets/{EndpointCopy-DITVC2YQ.js → EndpointCopy-CZOjiFAH.js} +2 -2
  79. package/frontend/dist/assets/{EndpointCopy-DITVC2YQ.js.map → EndpointCopy-CZOjiFAH.js.map} +1 -1
  80. package/frontend/dist/assets/{GroupsPage-sE6YJyuK.js → GroupsPage-CSA5G9_H.js} +2 -2
  81. package/frontend/dist/assets/{GroupsPage-sE6YJyuK.js.map → GroupsPage-CSA5G9_H.js.map} +1 -1
  82. package/frontend/dist/assets/{LoginPage-CFsd_nY-.js → LoginPage-7RswUPtG.js} +2 -2
  83. package/frontend/dist/assets/{LoginPage-CFsd_nY-.js.map → LoginPage-7RswUPtG.js.map} +1 -1
  84. package/frontend/dist/assets/{LogsPage-BxZuGDuc.js → LogsPage-Dbef_68F.js} +2 -2
  85. package/frontend/dist/assets/{LogsPage-BxZuGDuc.js.map → LogsPage-Dbef_68F.js.map} +1 -1
  86. package/frontend/dist/assets/{MarketPage-CDBs4vMb.js → MarketPage-rSBdHZxo.js} +2 -2
  87. package/frontend/dist/assets/{MarketPage-CDBs4vMb.js.map → MarketPage-rSBdHZxo.js.map} +1 -1
  88. package/frontend/dist/assets/{OAuthConsentPage-BN_ucViM.js → OAuthConsentPage-BH9O7bk3.js} +2 -2
  89. package/frontend/dist/assets/{OAuthConsentPage-BN_ucViM.js.map → OAuthConsentPage-BH9O7bk3.js.map} +1 -1
  90. package/frontend/dist/assets/{PromptsPage-Bl3ySXGK.js → PromptsPage-B558MhVU.js} +2 -2
  91. package/frontend/dist/assets/{PromptsPage-Bl3ySXGK.js.map → PromptsPage-B558MhVU.js.map} +1 -1
  92. package/frontend/dist/assets/{ResourcesPage-BOzQkQ92.js → ResourcesPage-DQpy8B9L.js} +2 -2
  93. package/frontend/dist/assets/{ResourcesPage-BOzQkQ92.js.map → ResourcesPage-DQpy8B9L.js.map} +1 -1
  94. package/frontend/dist/assets/{ServersPage-DHYwQ5AM.js → ServersPage-DBcC8pG2.js} +4 -4
  95. package/frontend/dist/assets/ServersPage-DBcC8pG2.js.map +1 -0
  96. package/frontend/dist/assets/{SettingsPage-CSJ35jlM.js → SettingsPage-BcpeHFR3.js} +2 -2
  97. package/frontend/dist/assets/{SettingsPage-CSJ35jlM.js.map → SettingsPage-BcpeHFR3.js.map} +1 -1
  98. package/frontend/dist/assets/{StatusDot-NSjojGCy.js → StatusDot-CLxRrJ5l.js} +2 -2
  99. package/frontend/dist/assets/{StatusDot-NSjojGCy.js.map → StatusDot-CLxRrJ5l.js.map} +1 -1
  100. package/frontend/dist/assets/{ToggleGroup-BIZWpNzm.js → ToggleGroup-DuWJZU41.js} +2 -2
  101. package/frontend/dist/assets/{ToggleGroup-BIZWpNzm.js.map → ToggleGroup-DuWJZU41.js.map} +1 -1
  102. package/frontend/dist/assets/{UsersPage-DC51v2b8.js → UsersPage-B158Bofs.js} +2 -2
  103. package/frontend/dist/assets/{UsersPage-DC51v2b8.js.map → UsersPage-B158Bofs.js.map} +1 -1
  104. package/frontend/dist/assets/{clipboard-ik5YV95M.js → clipboard-BLr_gbf8.js} +2 -2
  105. package/frontend/dist/assets/{clipboard-ik5YV95M.js.map → clipboard-BLr_gbf8.js.map} +1 -1
  106. package/frontend/dist/assets/{costRevision-Bxov9_vH.js → costRevision-Dzec2k_b.js} +2 -2
  107. package/frontend/dist/assets/{costRevision-Bxov9_vH.js.map → costRevision-Dzec2k_b.js.map} +1 -1
  108. package/frontend/dist/assets/index-CGRjM_NC.js +3 -0
  109. package/frontend/dist/assets/index-CGRjM_NC.js.map +1 -0
  110. package/frontend/dist/assets/{resourceService-DMzCAZ0B.js → resourceService-BNH7uNar.js} +2 -2
  111. package/frontend/dist/assets/{resourceService-DMzCAZ0B.js.map → resourceService-BNH7uNar.js.map} +1 -1
  112. package/frontend/dist/assets/{useCostData-CcFSYViI.js → useCostData-B2d2eLCD.js} +2 -2
  113. package/frontend/dist/assets/{useCostData-CcFSYViI.js.map → useCostData-B2d2eLCD.js.map} +1 -1
  114. package/frontend/dist/assets/{variableDetection-CbYSa1ka.js → variableDetection-DRdE941j.js} +14 -14
  115. package/frontend/dist/assets/{variableDetection-CbYSa1ka.js.map → variableDetection-DRdE941j.js.map} +1 -1
  116. package/frontend/dist/index.html +1 -1
  117. package/package.json +3 -1
  118. package/frontend/dist/assets/ServersPage-DHYwQ5AM.js.map +0 -1
  119. package/frontend/dist/assets/index-6AyPtx0A.js +0 -3
  120. package/frontend/dist/assets/index-6AyPtx0A.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{i as c,l as t,j as n}from"./index-6AyPtx0A.js";import"./framework-vendor-D0S_ys6r.js";import"./i18n-vendor-COTriSc6.js";import"./icons-vendor-DZjjGrOu.js";const d=async(r,o,s)=>{try{const e=await t(`/servers/${encodeURIComponent(r)}/resources/${encodeURIComponent(o)}/toggle`,{enabled:s},{headers:{Authorization:`Bearer ${localStorage.getItem("mcphub_token")}`}});return{success:e.success,error:e.success?void 0:e.message}}catch(e){return console.error("Error toggling resource",{serverName:r,resourceUri:o,enabled:s,error:e}),{success:!1,error:e instanceof Error?e.message:"Unknown error occurred"}}},g=async(r,o,s)=>{try{const e=await n(`/servers/${encodeURIComponent(r)}/resources/${encodeURIComponent(o)}/description`,{description:s},{headers:{Authorization:`Bearer ${localStorage.getItem("mcphub_token")}`}});return{success:e.success,error:e.success?void 0:e.message}}catch(e){return console.error("Error updating resource description",{serverName:r,resourceUri:o,error:e}),{success:!1,error:e instanceof Error?e.message:"Unknown error occurred"}}},m=async(r,o)=>{var s;try{const e=await c(`/servers/${encodeURIComponent(r)}/resources/${encodeURIComponent(o)}/description`,{headers:{Authorization:`Bearer ${localStorage.getItem("mcphub_token")}`}});return{success:e.success,error:e.success?void 0:e.message,description:(s=e.data)==null?void 0:s.description}}catch(e){return console.error("Error resetting resource description",{serverName:r,resourceUri:o,error:e}),{success:!1,error:e instanceof Error?e.message:"Unknown error occurred"}}};export{m as resetResourceDescription,d as toggleResource,g as updateResourceDescription};
2
- //# sourceMappingURL=resourceService-DMzCAZ0B.js.map
1
+ import{i as c,l as t,j as n}from"./index-CGRjM_NC.js";import"./framework-vendor-D0S_ys6r.js";import"./i18n-vendor-COTriSc6.js";import"./icons-vendor-DZjjGrOu.js";const d=async(r,o,s)=>{try{const e=await t(`/servers/${encodeURIComponent(r)}/resources/${encodeURIComponent(o)}/toggle`,{enabled:s},{headers:{Authorization:`Bearer ${localStorage.getItem("mcphub_token")}`}});return{success:e.success,error:e.success?void 0:e.message}}catch(e){return console.error("Error toggling resource",{serverName:r,resourceUri:o,enabled:s,error:e}),{success:!1,error:e instanceof Error?e.message:"Unknown error occurred"}}},g=async(r,o,s)=>{try{const e=await n(`/servers/${encodeURIComponent(r)}/resources/${encodeURIComponent(o)}/description`,{description:s},{headers:{Authorization:`Bearer ${localStorage.getItem("mcphub_token")}`}});return{success:e.success,error:e.success?void 0:e.message}}catch(e){return console.error("Error updating resource description",{serverName:r,resourceUri:o,error:e}),{success:!1,error:e instanceof Error?e.message:"Unknown error occurred"}}},m=async(r,o)=>{var s;try{const e=await c(`/servers/${encodeURIComponent(r)}/resources/${encodeURIComponent(o)}/description`,{headers:{Authorization:`Bearer ${localStorage.getItem("mcphub_token")}`}});return{success:e.success,error:e.success?void 0:e.message,description:(s=e.data)==null?void 0:s.description}}catch(e){return console.error("Error resetting resource description",{serverName:r,resourceUri:o,error:e}),{success:!1,error:e instanceof Error?e.message:"Unknown error occurred"}}};export{m as resetResourceDescription,d as toggleResource,g as updateResourceDescription};
2
+ //# sourceMappingURL=resourceService-BNH7uNar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resourceService-DMzCAZ0B.js","sources":["../../src/services/resourceService.ts"],"sourcesContent":["import { apiDelete, apiPost, apiPut } from '../utils/fetchInterceptor';\n\n/**\n * Toggle a resource's enabled state for a specific server\n */\nexport const toggleResource = async (\n serverName: string,\n resourceUri: string,\n enabled: boolean,\n): Promise<{ success: boolean; error?: string }> => {\n try {\n const response = await apiPost<any>(\n `/servers/${encodeURIComponent(serverName)}/resources/${encodeURIComponent(resourceUri)}/toggle`,\n { enabled },\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('mcphub_token')}`,\n },\n },\n );\n\n return {\n success: response.success,\n error: response.success ? undefined : response.message,\n };\n } catch (error) {\n console.error('Error toggling resource', { serverName, resourceUri, enabled, error });\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n};\n\n/**\n * Update a resource's description for a specific server\n */\nexport const updateResourceDescription = async (\n serverName: string,\n resourceUri: string,\n description: string,\n): Promise<{ success: boolean; error?: string }> => {\n try {\n const response = await apiPut<any>(\n `/servers/${encodeURIComponent(serverName)}/resources/${encodeURIComponent(resourceUri)}/description`,\n { description },\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('mcphub_token')}`,\n },\n },\n );\n\n return {\n success: response.success,\n error: response.success ? undefined : response.message,\n };\n } catch (error) {\n console.error('Error updating resource description', { serverName, resourceUri, error });\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n};\n\nexport const resetResourceDescription = async (\n serverName: string,\n resourceUri: string,\n): Promise<{ success: boolean; error?: string; description?: string }> => {\n try {\n const response = await apiDelete<any>(\n `/servers/${encodeURIComponent(serverName)}/resources/${encodeURIComponent(resourceUri)}/description`,\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('mcphub_token')}`,\n },\n },\n );\n\n return {\n success: response.success,\n error: response.success ? undefined : response.message,\n description: response.data?.description,\n };\n } catch (error) {\n console.error('Error resetting resource description', { serverName, resourceUri, error });\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n};\n"],"names":["toggleResource","serverName","resourceUri","enabled","response","apiPost","error","updateResourceDescription","description","apiPut","resetResourceDescription","apiDelete","_a"],"mappings":"kKAKO,MAAMA,EAAiB,MAC5BC,EACAC,EACAC,IACkD,CAClD,GAAI,CACF,MAAMC,EAAW,MAAMC,EACrB,YAAY,mBAAmBJ,CAAU,CAAC,cAAc,mBAAmBC,CAAW,CAAC,UACvF,CAAE,QAAAC,CAAA,EACF,CACE,QAAS,CACP,cAAe,UAAU,aAAa,QAAQ,cAAc,CAAC,EAAA,CAC/D,CACF,EAGF,MAAO,CACL,QAASC,EAAS,QAClB,MAAOA,EAAS,QAAU,OAAYA,EAAS,OAAA,CAEnD,OAASE,EAAO,CACd,eAAQ,MAAM,0BAA2B,CAAE,WAAAL,EAAY,YAAAC,EAAa,QAAAC,EAAS,MAAAG,EAAO,EAC7E,CACL,QAAS,GACT,MAAOA,aAAiB,MAAQA,EAAM,QAAU,wBAAA,CAEpD,CACF,EAKaC,EAA4B,MACvCN,EACAC,EACAM,IACkD,CAClD,GAAI,CACF,MAAMJ,EAAW,MAAMK,EACrB,YAAY,mBAAmBR,CAAU,CAAC,cAAc,mBAAmBC,CAAW,CAAC,eACvF,CAAE,YAAAM,CAAA,EACF,CACE,QAAS,CACP,cAAe,UAAU,aAAa,QAAQ,cAAc,CAAC,EAAA,CAC/D,CACF,EAGF,MAAO,CACL,QAASJ,EAAS,QAClB,MAAOA,EAAS,QAAU,OAAYA,EAAS,OAAA,CAEnD,OAASE,EAAO,CACd,eAAQ,MAAM,sCAAuC,CAAE,WAAAL,EAAY,YAAAC,EAAa,MAAAI,EAAO,EAChF,CACL,QAAS,GACT,MAAOA,aAAiB,MAAQA,EAAM,QAAU,wBAAA,CAEpD,CACF,EAEaI,EAA2B,MACtCT,EACAC,IACwE,OACxE,GAAI,CACF,MAAME,EAAW,MAAMO,EACrB,YAAY,mBAAmBV,CAAU,CAAC,cAAc,mBAAmBC,CAAW,CAAC,eACvF,CACE,QAAS,CACP,cAAe,UAAU,aAAa,QAAQ,cAAc,CAAC,EAAA,CAC/D,CACF,EAGF,MAAO,CACL,QAASE,EAAS,QAClB,MAAOA,EAAS,QAAU,OAAYA,EAAS,QAC/C,aAAaQ,EAAAR,EAAS,OAAT,YAAAQ,EAAe,WAAA,CAEhC,OAASN,EAAO,CACd,eAAQ,MAAM,uCAAwC,CAAE,WAAAL,EAAY,YAAAC,EAAa,MAAAI,EAAO,EACjF,CACL,QAAS,GACT,MAAOA,aAAiB,MAAQA,EAAM,QAAU,wBAAA,CAEpD,CACF"}
1
+ {"version":3,"file":"resourceService-BNH7uNar.js","sources":["../../src/services/resourceService.ts"],"sourcesContent":["import { apiDelete, apiPost, apiPut } from '../utils/fetchInterceptor';\n\n/**\n * Toggle a resource's enabled state for a specific server\n */\nexport const toggleResource = async (\n serverName: string,\n resourceUri: string,\n enabled: boolean,\n): Promise<{ success: boolean; error?: string }> => {\n try {\n const response = await apiPost<any>(\n `/servers/${encodeURIComponent(serverName)}/resources/${encodeURIComponent(resourceUri)}/toggle`,\n { enabled },\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('mcphub_token')}`,\n },\n },\n );\n\n return {\n success: response.success,\n error: response.success ? undefined : response.message,\n };\n } catch (error) {\n console.error('Error toggling resource', { serverName, resourceUri, enabled, error });\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n};\n\n/**\n * Update a resource's description for a specific server\n */\nexport const updateResourceDescription = async (\n serverName: string,\n resourceUri: string,\n description: string,\n): Promise<{ success: boolean; error?: string }> => {\n try {\n const response = await apiPut<any>(\n `/servers/${encodeURIComponent(serverName)}/resources/${encodeURIComponent(resourceUri)}/description`,\n { description },\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('mcphub_token')}`,\n },\n },\n );\n\n return {\n success: response.success,\n error: response.success ? undefined : response.message,\n };\n } catch (error) {\n console.error('Error updating resource description', { serverName, resourceUri, error });\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n};\n\nexport const resetResourceDescription = async (\n serverName: string,\n resourceUri: string,\n): Promise<{ success: boolean; error?: string; description?: string }> => {\n try {\n const response = await apiDelete<any>(\n `/servers/${encodeURIComponent(serverName)}/resources/${encodeURIComponent(resourceUri)}/description`,\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('mcphub_token')}`,\n },\n },\n );\n\n return {\n success: response.success,\n error: response.success ? undefined : response.message,\n description: response.data?.description,\n };\n } catch (error) {\n console.error('Error resetting resource description', { serverName, resourceUri, error });\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n};\n"],"names":["toggleResource","serverName","resourceUri","enabled","response","apiPost","error","updateResourceDescription","description","apiPut","resetResourceDescription","apiDelete","_a"],"mappings":"kKAKO,MAAMA,EAAiB,MAC5BC,EACAC,EACAC,IACkD,CAClD,GAAI,CACF,MAAMC,EAAW,MAAMC,EACrB,YAAY,mBAAmBJ,CAAU,CAAC,cAAc,mBAAmBC,CAAW,CAAC,UACvF,CAAE,QAAAC,CAAA,EACF,CACE,QAAS,CACP,cAAe,UAAU,aAAa,QAAQ,cAAc,CAAC,EAAA,CAC/D,CACF,EAGF,MAAO,CACL,QAASC,EAAS,QAClB,MAAOA,EAAS,QAAU,OAAYA,EAAS,OAAA,CAEnD,OAASE,EAAO,CACd,eAAQ,MAAM,0BAA2B,CAAE,WAAAL,EAAY,YAAAC,EAAa,QAAAC,EAAS,MAAAG,EAAO,EAC7E,CACL,QAAS,GACT,MAAOA,aAAiB,MAAQA,EAAM,QAAU,wBAAA,CAEpD,CACF,EAKaC,EAA4B,MACvCN,EACAC,EACAM,IACkD,CAClD,GAAI,CACF,MAAMJ,EAAW,MAAMK,EACrB,YAAY,mBAAmBR,CAAU,CAAC,cAAc,mBAAmBC,CAAW,CAAC,eACvF,CAAE,YAAAM,CAAA,EACF,CACE,QAAS,CACP,cAAe,UAAU,aAAa,QAAQ,cAAc,CAAC,EAAA,CAC/D,CACF,EAGF,MAAO,CACL,QAASJ,EAAS,QAClB,MAAOA,EAAS,QAAU,OAAYA,EAAS,OAAA,CAEnD,OAASE,EAAO,CACd,eAAQ,MAAM,sCAAuC,CAAE,WAAAL,EAAY,YAAAC,EAAa,MAAAI,EAAO,EAChF,CACL,QAAS,GACT,MAAOA,aAAiB,MAAQA,EAAM,QAAU,wBAAA,CAEpD,CACF,EAEaI,EAA2B,MACtCT,EACAC,IACwE,OACxE,GAAI,CACF,MAAME,EAAW,MAAMO,EACrB,YAAY,mBAAmBV,CAAU,CAAC,cAAc,mBAAmBC,CAAW,CAAC,eACvF,CACE,QAAS,CACP,cAAe,UAAU,aAAa,QAAQ,cAAc,CAAC,EAAA,CAC/D,CACF,EAGF,MAAO,CACL,QAASE,EAAS,QAClB,MAAOA,EAAS,QAAU,OAAYA,EAAS,QAC/C,aAAaQ,EAAAR,EAAS,OAAT,YAAAQ,EAAe,WAAA,CAEhC,OAASN,EAAO,CACd,eAAQ,MAAM,uCAAwC,CAAE,WAAAL,EAAY,YAAAC,EAAa,MAAAI,EAAO,EACjF,CACL,QAAS,GACT,MAAOA,aAAiB,MAAQA,EAAM,QAAU,wBAAA,CAEpD,CACF"}
@@ -1,2 +1,2 @@
1
- import{p as v,h as d}from"./index-6AyPtx0A.js";import{r as s}from"./framework-vendor-D0S_ys6r.js";const w=r=>{const c=v(),{refreshIfNeeded:u}=c;return s.useEffect(()=>{r!=null&&r.refreshOnMount&&u()},[r==null?void 0:r.refreshOnMount,u]),c},E=(r="")=>{const[c,u]=s.useState([]),[h,C]=s.useState([]),[m,o]=s.useState(!0),a=s.useRef(null),f=s.useCallback(async()=>{try{o(!0);const[e,t]=await Promise.all([d("/cost/servers"),d("/cost/groups")]);return e!=null&&e.success&&Array.isArray(e.data)&&u(e.data),t!=null&&t.success&&Array.isArray(t.data)&&C(t.data),!!(e!=null&&e.success&&Array.isArray(e.data)&&(t!=null&&t.success)&&Array.isArray(t.data))}catch(e){return console.error("Error fetching context footprint:",e),!1}finally{o(!1)}},[]),n=s.useCallback(()=>(a.current||(a.current=f().finally(()=>{a.current=null})),a.current),[f]);return s.useEffect(()=>{let e=!0,t,i=0;const l=async()=>{const A=await n();e&&!A&&i<3&&(t=setTimeout(()=>void l(),2e3*2**i++))},y=a.current;return(async()=>(y&&await y,e&&await l()))(),()=>{e=!1,clearTimeout(t)}},[n,r]),{serverCosts:c,groupCosts:h,loading:m,refetch:n}};export{E as a,w as u};
2
- //# sourceMappingURL=useCostData-CcFSYViI.js.map
1
+ import{p as v,h as d}from"./index-CGRjM_NC.js";import{r as s}from"./framework-vendor-D0S_ys6r.js";const w=r=>{const c=v(),{refreshIfNeeded:u}=c;return s.useEffect(()=>{r!=null&&r.refreshOnMount&&u()},[r==null?void 0:r.refreshOnMount,u]),c},E=(r="")=>{const[c,u]=s.useState([]),[h,C]=s.useState([]),[m,o]=s.useState(!0),a=s.useRef(null),f=s.useCallback(async()=>{try{o(!0);const[e,t]=await Promise.all([d("/cost/servers"),d("/cost/groups")]);return e!=null&&e.success&&Array.isArray(e.data)&&u(e.data),t!=null&&t.success&&Array.isArray(t.data)&&C(t.data),!!(e!=null&&e.success&&Array.isArray(e.data)&&(t!=null&&t.success)&&Array.isArray(t.data))}catch(e){return console.error("Error fetching context footprint:",e),!1}finally{o(!1)}},[]),n=s.useCallback(()=>(a.current||(a.current=f().finally(()=>{a.current=null})),a.current),[f]);return s.useEffect(()=>{let e=!0,t,i=0;const l=async()=>{const A=await n();e&&!A&&i<3&&(t=setTimeout(()=>void l(),2e3*2**i++))},y=a.current;return(async()=>(y&&await y,e&&await l()))(),()=>{e=!1,clearTimeout(t)}},[n,r]),{serverCosts:c,groupCosts:h,loading:m,refetch:n}};export{E as a,w as u};
2
+ //# sourceMappingURL=useCostData-B2d2eLCD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCostData-CcFSYViI.js","sources":["../../src/hooks/useServerData.ts","../../src/hooks/useCostData.ts"],"sourcesContent":["// This hook now delegates to the ServerContext to avoid duplicate requests\n// All components will share the same server data and polling mechanism\nimport { useServerContext } from '@/contexts/ServerContext';\nimport { useEffect } from 'react';\n\nexport const useServerData = (options?: { refreshOnMount?: boolean }) => {\n const context = useServerContext();\n const { refreshIfNeeded } = context;\n\n // Optionally refresh on mount for pages that need fresh data\n useEffect(() => {\n if (options?.refreshOnMount) {\n refreshIfNeeded();\n }\n }, [options?.refreshOnMount, refreshIfNeeded]);\n\n return context;\n};\n\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { apiGet } from '../utils/fetchInterceptor';\nimport type { ApiResponse, ServerCost, GroupCost } from '@/types';\n\nexport const useCostData = (revision = '') => {\n const [serverCosts, setServerCosts] = useState<ServerCost[]>([]);\n const [groupCosts, setGroupCosts] = useState<GroupCost[]>([]);\n const [loading, setLoading] = useState(true);\n\n const inFlight = useRef<Promise<boolean> | null>(null);\n\n const loadCosts = useCallback(async () => {\n try {\n setLoading(true);\n const [servers, groups] = await Promise.all([\n apiGet('/cost/servers') as Promise<ApiResponse<ServerCost[]>>,\n apiGet('/cost/groups') as Promise<ApiResponse<GroupCost[]>>,\n ]);\n if (servers?.success && Array.isArray(servers.data)) setServerCosts(servers.data);\n if (groups?.success && Array.isArray(groups.data)) setGroupCosts(groups.data);\n return Boolean(\n servers?.success &&\n Array.isArray(servers.data) &&\n groups?.success &&\n Array.isArray(groups.data),\n );\n } catch (err) {\n console.error('Error fetching context footprint:', err);\n return false;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const fetchCosts = useCallback(() => {\n if (!inFlight.current) {\n inFlight.current = loadCosts().finally(() => {\n inFlight.current = null;\n });\n }\n return inFlight.current;\n }, [loadCosts]);\n\n useEffect(() => {\n // A revision change during an active request must still fetch the new state.\n let active = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let retries = 0;\n const refresh = async () => {\n const success = await fetchCosts();\n if (active && !success && retries < 3) {\n // Retry transient failures even when catalog revisions stay unchanged.\n timer = setTimeout(() => void refresh(), 2000 * 2 ** retries++);\n }\n };\n const previous = inFlight.current;\n void (async () => {\n if (previous) await previous;\n if (active) await refresh();\n })();\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [fetchCosts, revision]);\n\n return { serverCosts, groupCosts, loading, refetch: fetchCosts };\n};\n"],"names":["useServerData","options","context","useServerContext","refreshIfNeeded","useEffect","useCostData","revision","serverCosts","setServerCosts","useState","groupCosts","setGroupCosts","loading","setLoading","inFlight","useRef","loadCosts","useCallback","servers","groups","apiGet","err","fetchCosts","active","timer","retries","refresh","success","previous"],"mappings":"kGAKO,MAAMA,EAAiBC,GAA2C,CACvE,MAAMC,EAAUC,EAAA,EACV,CAAE,gBAAAC,GAAoBF,EAG5BG,OAAAA,EAAAA,UAAU,IAAM,CACVJ,GAAA,MAAAA,EAAS,gBACXG,EAAA,CAEJ,EAAG,CAACH,GAAA,YAAAA,EAAS,eAAgBG,CAAe,CAAC,EAEtCF,CACT,ECbaI,EAAc,CAACC,EAAW,KAAO,CAC5C,KAAM,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAAuB,CAAA,CAAE,EACzD,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAsB,CAAA,CAAE,EACtD,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAS,EAAI,EAErCK,EAAWC,EAAAA,OAAgC,IAAI,EAE/CC,EAAYC,EAAAA,YAAY,SAAY,CACxC,GAAI,CACFJ,EAAW,EAAI,EACf,KAAM,CAACK,EAASC,CAAM,EAAI,MAAM,QAAQ,IAAI,CAC1CC,EAAO,eAAe,EACtBA,EAAO,cAAc,CAAA,CACtB,EACD,OAAIF,GAAA,MAAAA,EAAS,SAAW,MAAM,QAAQA,EAAQ,IAAI,GAAGV,EAAeU,EAAQ,IAAI,EAC5EC,GAAA,MAAAA,EAAQ,SAAW,MAAM,QAAQA,EAAO,IAAI,GAAGR,EAAcQ,EAAO,IAAI,EACrE,GACLD,GAAA,MAAAA,EAAS,SACP,MAAM,QAAQA,EAAQ,IAAI,IAC1BC,GAAA,MAAAA,EAAQ,UACR,MAAM,QAAQA,EAAO,IAAI,EAE/B,OAASE,EAAK,CACZ,eAAQ,MAAM,oCAAqCA,CAAG,EAC/C,EACT,QAAA,CACER,EAAW,EAAK,CAClB,CACF,EAAG,CAAA,CAAE,EAECS,EAAaL,EAAAA,YAAY,KACxBH,EAAS,UACZA,EAAS,QAAUE,EAAA,EAAY,QAAQ,IAAM,CAC3CF,EAAS,QAAU,IACrB,CAAC,GAEIA,EAAS,SACf,CAACE,CAAS,CAAC,EAEdZ,OAAAA,EAAAA,UAAU,IAAM,CAEd,IAAImB,EAAS,GACTC,EACAC,EAAU,EACd,MAAMC,EAAU,SAAY,CAC1B,MAAMC,EAAU,MAAML,EAAA,EAClBC,GAAU,CAACI,GAAWF,EAAU,IAElCD,EAAQ,WAAW,IAAM,KAAKE,IAAW,IAAO,GAAKD,GAAS,EAElE,EACMG,EAAWd,EAAS,QAC1B,OAAM,UACAc,GAAU,MAAMA,EAChBL,SAAcG,EAAA,MAEb,IAAM,CACXH,EAAS,GACT,aAAaC,CAAK,CACpB,CACF,EAAG,CAACF,EAAYhB,CAAQ,CAAC,EAElB,CAAE,YAAAC,EAAa,WAAAG,EAAY,QAAAE,EAAS,QAASU,CAAA,CACtD"}
1
+ {"version":3,"file":"useCostData-B2d2eLCD.js","sources":["../../src/hooks/useServerData.ts","../../src/hooks/useCostData.ts"],"sourcesContent":["// This hook now delegates to the ServerContext to avoid duplicate requests\n// All components will share the same server data and polling mechanism\nimport { useServerContext } from '@/contexts/ServerContext';\nimport { useEffect } from 'react';\n\nexport const useServerData = (options?: { refreshOnMount?: boolean }) => {\n const context = useServerContext();\n const { refreshIfNeeded } = context;\n\n // Optionally refresh on mount for pages that need fresh data\n useEffect(() => {\n if (options?.refreshOnMount) {\n refreshIfNeeded();\n }\n }, [options?.refreshOnMount, refreshIfNeeded]);\n\n return context;\n};\n\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { apiGet } from '../utils/fetchInterceptor';\nimport type { ApiResponse, ServerCost, GroupCost } from '@/types';\n\nexport const useCostData = (revision = '') => {\n const [serverCosts, setServerCosts] = useState<ServerCost[]>([]);\n const [groupCosts, setGroupCosts] = useState<GroupCost[]>([]);\n const [loading, setLoading] = useState(true);\n\n const inFlight = useRef<Promise<boolean> | null>(null);\n\n const loadCosts = useCallback(async () => {\n try {\n setLoading(true);\n const [servers, groups] = await Promise.all([\n apiGet('/cost/servers') as Promise<ApiResponse<ServerCost[]>>,\n apiGet('/cost/groups') as Promise<ApiResponse<GroupCost[]>>,\n ]);\n if (servers?.success && Array.isArray(servers.data)) setServerCosts(servers.data);\n if (groups?.success && Array.isArray(groups.data)) setGroupCosts(groups.data);\n return Boolean(\n servers?.success &&\n Array.isArray(servers.data) &&\n groups?.success &&\n Array.isArray(groups.data),\n );\n } catch (err) {\n console.error('Error fetching context footprint:', err);\n return false;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const fetchCosts = useCallback(() => {\n if (!inFlight.current) {\n inFlight.current = loadCosts().finally(() => {\n inFlight.current = null;\n });\n }\n return inFlight.current;\n }, [loadCosts]);\n\n useEffect(() => {\n // A revision change during an active request must still fetch the new state.\n let active = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let retries = 0;\n const refresh = async () => {\n const success = await fetchCosts();\n if (active && !success && retries < 3) {\n // Retry transient failures even when catalog revisions stay unchanged.\n timer = setTimeout(() => void refresh(), 2000 * 2 ** retries++);\n }\n };\n const previous = inFlight.current;\n void (async () => {\n if (previous) await previous;\n if (active) await refresh();\n })();\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [fetchCosts, revision]);\n\n return { serverCosts, groupCosts, loading, refetch: fetchCosts };\n};\n"],"names":["useServerData","options","context","useServerContext","refreshIfNeeded","useEffect","useCostData","revision","serverCosts","setServerCosts","useState","groupCosts","setGroupCosts","loading","setLoading","inFlight","useRef","loadCosts","useCallback","servers","groups","apiGet","err","fetchCosts","active","timer","retries","refresh","success","previous"],"mappings":"kGAKO,MAAMA,EAAiBC,GAA2C,CACvE,MAAMC,EAAUC,EAAA,EACV,CAAE,gBAAAC,GAAoBF,EAG5BG,OAAAA,EAAAA,UAAU,IAAM,CACVJ,GAAA,MAAAA,EAAS,gBACXG,EAAA,CAEJ,EAAG,CAACH,GAAA,YAAAA,EAAS,eAAgBG,CAAe,CAAC,EAEtCF,CACT,ECbaI,EAAc,CAACC,EAAW,KAAO,CAC5C,KAAM,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAAuB,CAAA,CAAE,EACzD,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAsB,CAAA,CAAE,EACtD,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAS,EAAI,EAErCK,EAAWC,EAAAA,OAAgC,IAAI,EAE/CC,EAAYC,EAAAA,YAAY,SAAY,CACxC,GAAI,CACFJ,EAAW,EAAI,EACf,KAAM,CAACK,EAASC,CAAM,EAAI,MAAM,QAAQ,IAAI,CAC1CC,EAAO,eAAe,EACtBA,EAAO,cAAc,CAAA,CACtB,EACD,OAAIF,GAAA,MAAAA,EAAS,SAAW,MAAM,QAAQA,EAAQ,IAAI,GAAGV,EAAeU,EAAQ,IAAI,EAC5EC,GAAA,MAAAA,EAAQ,SAAW,MAAM,QAAQA,EAAO,IAAI,GAAGR,EAAcQ,EAAO,IAAI,EACrE,GACLD,GAAA,MAAAA,EAAS,SACP,MAAM,QAAQA,EAAQ,IAAI,IAC1BC,GAAA,MAAAA,EAAQ,UACR,MAAM,QAAQA,EAAO,IAAI,EAE/B,OAASE,EAAK,CACZ,eAAQ,MAAM,oCAAqCA,CAAG,EAC/C,EACT,QAAA,CACER,EAAW,EAAK,CAClB,CACF,EAAG,CAAA,CAAE,EAECS,EAAaL,EAAAA,YAAY,KACxBH,EAAS,UACZA,EAAS,QAAUE,EAAA,EAAY,QAAQ,IAAM,CAC3CF,EAAS,QAAU,IACrB,CAAC,GAEIA,EAAS,SACf,CAACE,CAAS,CAAC,EAEdZ,OAAAA,EAAAA,UAAU,IAAM,CAEd,IAAImB,EAAS,GACTC,EACAC,EAAU,EACd,MAAMC,EAAU,SAAY,CAC1B,MAAMC,EAAU,MAAML,EAAA,EAClBC,GAAU,CAACI,GAAWF,EAAU,IAElCD,EAAQ,WAAW,IAAM,KAAKE,IAAW,IAAO,GAAKD,GAAS,EAElE,EACMG,EAAWd,EAAS,QAC1B,OAAM,UACAc,GAAU,MAAMA,EAChBL,SAAcG,EAAA,MAEb,IAAM,CACXH,EAAS,GACT,aAAaC,CAAK,CACpB,CACF,EAAG,CAACF,EAAYhB,CAAQ,CAAC,EAElB,CAAE,YAAAC,EAAa,WAAAG,EAAY,QAAAE,EAAS,QAASU,CAAA,CACtD"}