comfyui-frontend-package 1.38.5__py3-none-any.whl → 1.38.6__py3-none-any.whl

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 (139) hide show
  1. comfyui_frontend_package/static/assets/{AboutPanel-CHse5rOA.js → AboutPanel-lkjGFasi.js} +2 -2
  2. comfyui_frontend_package/static/assets/{AboutPanel-CHse5rOA.js.map → AboutPanel-lkjGFasi.js.map} +1 -1
  3. comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CAa8V66L.js → AudioPreviewPlayer-BxCSKPl9.js} +2 -2
  4. comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CAa8V66L.js.map → AudioPreviewPlayer-BxCSKPl9.js.map} +1 -1
  5. comfyui_frontend_package/static/assets/AudioPreviewPlayer-CkxKvcVf.js +1 -0
  6. comfyui_frontend_package/static/assets/{BaseViewTemplate-DA6zfigT.js → BaseViewTemplate-CjODF2hh.js} +2 -2
  7. comfyui_frontend_package/static/assets/{BaseViewTemplate-DA6zfigT.js.map → BaseViewTemplate-CjODF2hh.js.map} +1 -1
  8. comfyui_frontend_package/static/assets/{CloudAuthTimeoutView-9OPBS1hE.js → CloudAuthTimeoutView-D-QkjPNh.js} +2 -2
  9. comfyui_frontend_package/static/assets/{CloudAuthTimeoutView-9OPBS1hE.js.map → CloudAuthTimeoutView-D-QkjPNh.js.map} +1 -1
  10. comfyui_frontend_package/static/assets/{CloudBadge-BnLiAHDN.js → CloudBadge-B4nmLus2.js} +2 -2
  11. comfyui_frontend_package/static/assets/{CloudBadge-BnLiAHDN.js.map → CloudBadge-B4nmLus2.js.map} +1 -1
  12. comfyui_frontend_package/static/assets/{CloudForgotPasswordView-BqDR_C7K.js → CloudForgotPasswordView-DOEV9hGr.js} +2 -2
  13. comfyui_frontend_package/static/assets/{CloudForgotPasswordView-BqDR_C7K.js.map → CloudForgotPasswordView-DOEV9hGr.js.map} +1 -1
  14. comfyui_frontend_package/static/assets/{CloudLayoutView-vTrrVUOY.js → CloudLayoutView-ShKH6rRV.js} +2 -2
  15. comfyui_frontend_package/static/assets/{CloudLayoutView-vTrrVUOY.js.map → CloudLayoutView-ShKH6rRV.js.map} +1 -1
  16. comfyui_frontend_package/static/assets/{CloudLoginView-T17euJly.js → CloudLoginView-C3Te42U9.js} +2 -2
  17. comfyui_frontend_package/static/assets/{CloudLoginView-T17euJly.js.map → CloudLoginView-C3Te42U9.js.map} +1 -1
  18. comfyui_frontend_package/static/assets/CloudRunButtonWrapper-Cub7EB34.js +3 -0
  19. comfyui_frontend_package/static/assets/{CloudRunButtonWrapper-hQc4BNkX.js.map → CloudRunButtonWrapper-Cub7EB34.js.map} +1 -1
  20. comfyui_frontend_package/static/assets/{CloudSignupView-vEDby5k3.js → CloudSignupView-X2oiL3ZR.js} +2 -2
  21. comfyui_frontend_package/static/assets/{CloudSignupView-vEDby5k3.js.map → CloudSignupView-X2oiL3ZR.js.map} +1 -1
  22. comfyui_frontend_package/static/assets/{CloudSubscriptionRedirectView-DPyO745g.js → CloudSubscriptionRedirectView-UjNv8emo.js} +2 -2
  23. comfyui_frontend_package/static/assets/{CloudSubscriptionRedirectView-DPyO745g.js.map → CloudSubscriptionRedirectView-UjNv8emo.js.map} +1 -1
  24. comfyui_frontend_package/static/assets/{CloudSurveyView-CBtTd9Ru.js → CloudSurveyView-IaiucCTP.js} +2 -2
  25. comfyui_frontend_package/static/assets/{CloudSurveyView-CBtTd9Ru.js.map → CloudSurveyView-IaiucCTP.js.map} +1 -1
  26. comfyui_frontend_package/static/assets/ComfyQueueButton-BppnHbrl.js +1 -0
  27. comfyui_frontend_package/static/assets/{ComfyQueueButton-MZrp7wYJ.js → ComfyQueueButton-HjSIKZKO.js} +2 -2
  28. comfyui_frontend_package/static/assets/{ComfyQueueButton-MZrp7wYJ.js.map → ComfyQueueButton-HjSIKZKO.js.map} +1 -1
  29. comfyui_frontend_package/static/assets/{ExtensionPanel-CrWVGUtg.js → ExtensionPanel-Bzb9QtKj.js} +2 -2
  30. comfyui_frontend_package/static/assets/{ExtensionPanel-CrWVGUtg.js.map → ExtensionPanel-Bzb9QtKj.js.map} +1 -1
  31. comfyui_frontend_package/static/assets/{GlobalToast-BiCmpIvO.js → GlobalToast-BSCvu6Hw.js} +2 -2
  32. comfyui_frontend_package/static/assets/{GlobalToast-BiCmpIvO.js.map → GlobalToast-BSCvu6Hw.js.map} +1 -1
  33. comfyui_frontend_package/static/assets/{GraphView-BCkpNGgz.js → GraphView-gYVCtm1V.js} +5 -5
  34. comfyui_frontend_package/static/assets/GraphView-gYVCtm1V.js.map +1 -0
  35. comfyui_frontend_package/static/assets/{KeybindingPanel-CAXL5TlV.js → KeybindingPanel-DF-bG4iO.js} +2 -2
  36. comfyui_frontend_package/static/assets/{KeybindingPanel-CAXL5TlV.js.map → KeybindingPanel-DF-bG4iO.js.map} +1 -1
  37. comfyui_frontend_package/static/assets/{LegacyCreditsPanel-6vR8koQy.js → LegacyCreditsPanel-D-CboO8k.js} +2 -2
  38. comfyui_frontend_package/static/assets/{LegacyCreditsPanel-6vR8koQy.js.map → LegacyCreditsPanel-D-CboO8k.js.map} +1 -1
  39. comfyui_frontend_package/static/assets/Load3D-c9UwgGoI.js +1 -0
  40. comfyui_frontend_package/static/assets/{Load3D-ei1BUF9O.js → Load3D-vYr8M3jJ.js} +2 -2
  41. comfyui_frontend_package/static/assets/{Load3D-ei1BUF9O.js.map → Load3D-vYr8M3jJ.js.map} +1 -1
  42. comfyui_frontend_package/static/assets/{PanelTemplate-BjN5XNg2.js → PanelTemplate-BJda9e5J.js} +2 -2
  43. comfyui_frontend_package/static/assets/{PanelTemplate-BjN5XNg2.js.map → PanelTemplate-BJda9e5J.js.map} +1 -1
  44. comfyui_frontend_package/static/assets/{ServerConfigPanel-CxovH9Qk.js → ServerConfigPanel-VsC6xlZJ.js} +2 -2
  45. comfyui_frontend_package/static/assets/{ServerConfigPanel-CxovH9Qk.js.map → ServerConfigPanel-VsC6xlZJ.js.map} +1 -1
  46. comfyui_frontend_package/static/assets/{SubscribeButton-CTOQRkfg.js → SubscribeButton-DZBycfCA.js} +2 -2
  47. comfyui_frontend_package/static/assets/{SubscribeButton-CTOQRkfg.js.map → SubscribeButton-DZBycfCA.js.map} +1 -1
  48. comfyui_frontend_package/static/assets/{SubscribeToRun-DnXzV8y0.js → SubscribeToRun-4YolxBOL.js} +2 -2
  49. comfyui_frontend_package/static/assets/{SubscribeToRun-DnXzV8y0.js.map → SubscribeToRun-4YolxBOL.js.map} +1 -1
  50. comfyui_frontend_package/static/assets/{SubscriptionPanel-D9uv7z8f.js → SubscriptionPanel-B6txX4Vm.js} +2 -2
  51. comfyui_frontend_package/static/assets/{SubscriptionPanel-D9uv7z8f.js.map → SubscriptionPanel-B6txX4Vm.js.map} +1 -1
  52. comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent--VmT16oc.js → SubscriptionRequiredDialogContent-COEF2VQ_.js} +2 -2
  53. comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent--VmT16oc.js.map → SubscriptionRequiredDialogContent-COEF2VQ_.js.map} +1 -1
  54. comfyui_frontend_package/static/assets/{UserCheckView-spD3LyMu.js → UserCheckView-x-fkcYzc.js} +2 -2
  55. comfyui_frontend_package/static/assets/{UserCheckView-spD3LyMu.js.map → UserCheckView-x-fkcYzc.js.map} +1 -1
  56. comfyui_frontend_package/static/assets/{UserPanel-Su6NtJ5q.js → UserPanel-7N9QknQj.js} +2 -2
  57. comfyui_frontend_package/static/assets/{UserPanel-Su6NtJ5q.js.map → UserPanel-7N9QknQj.js.map} +1 -1
  58. comfyui_frontend_package/static/assets/{UserSelectView-C5LBOPcv.js → UserSelectView-BYjOkfSa.js} +2 -2
  59. comfyui_frontend_package/static/assets/{UserSelectView-C5LBOPcv.js.map → UserSelectView-BYjOkfSa.js.map} +1 -1
  60. comfyui_frontend_package/static/assets/{ValueControlPopover-BdlDzT8l.js → ValueControlPopover-BPAa35QG.js} +2 -2
  61. comfyui_frontend_package/static/assets/{ValueControlPopover-BdlDzT8l.js.map → ValueControlPopover-BPAa35QG.js.map} +1 -1
  62. comfyui_frontend_package/static/assets/{WidgetAudioUI-BDZxDx_r.js → WidgetAudioUI-Dw-r3Ews.js} +2 -2
  63. comfyui_frontend_package/static/assets/{WidgetAudioUI-BDZxDx_r.js.map → WidgetAudioUI-Dw-r3Ews.js.map} +1 -1
  64. comfyui_frontend_package/static/assets/{WidgetImageCrop-CYRW7t2Q.js → WidgetImageCrop-kERy9g5I.js} +2 -2
  65. comfyui_frontend_package/static/assets/{WidgetImageCrop-CYRW7t2Q.js.map → WidgetImageCrop-kERy9g5I.js.map} +1 -1
  66. comfyui_frontend_package/static/assets/{WidgetInputNumber-BOKO36G3.js → WidgetInputNumber-BaClCNAC.js} +1 -1
  67. comfyui_frontend_package/static/assets/WidgetInputNumber-DU_D0Fzy.js +3 -0
  68. comfyui_frontend_package/static/assets/WidgetInputNumber-DU_D0Fzy.js.map +1 -0
  69. comfyui_frontend_package/static/assets/{WidgetLegacy-Bslv9wZZ.js → WidgetLegacy-B4nipUM9.js} +1 -1
  70. comfyui_frontend_package/static/assets/{WidgetRecordAudio-Bzy8PIzN.js → WidgetRecordAudio-Nk8dH238.js} +2 -2
  71. comfyui_frontend_package/static/assets/{WidgetRecordAudio-Bzy8PIzN.js.map → WidgetRecordAudio-Nk8dH238.js.map} +1 -1
  72. comfyui_frontend_package/static/assets/WidgetSelect-DzZPpO_-.js +1 -0
  73. comfyui_frontend_package/static/assets/{WidgetSelect-zgrFVzHH.js → WidgetSelect-nSQrk_hd.js} +2 -2
  74. comfyui_frontend_package/static/assets/{WidgetSelect-zgrFVzHH.js.map → WidgetSelect-nSQrk_hd.js.map} +1 -1
  75. comfyui_frontend_package/static/assets/{WidgetWithControl-Dh2FWOiA.js → WidgetWithControl-Da6zUB5e.js} +3 -3
  76. comfyui_frontend_package/static/assets/{WidgetWithControl-Dh2FWOiA.js.map → WidgetWithControl-Da6zUB5e.js.map} +1 -1
  77. comfyui_frontend_package/static/assets/{api-CUAc7rDA.js → api-Dwq2LQIW.js} +4 -4
  78. comfyui_frontend_package/static/assets/api-Dwq2LQIW.js.map +1 -0
  79. comfyui_frontend_package/static/assets/{audioService-DvndbCi2.js → audioService-DvVaKhuU.js} +2 -2
  80. comfyui_frontend_package/static/assets/{audioService-DvndbCi2.js.map → audioService-DvVaKhuU.js.map} +1 -1
  81. comfyui_frontend_package/static/assets/{audioUtils-DpjpcKbH.js → audioUtils-DD4rUYVZ.js} +2 -2
  82. comfyui_frontend_package/static/assets/{audioUtils-DpjpcKbH.js.map → audioUtils-DD4rUYVZ.js.map} +1 -1
  83. comfyui_frontend_package/static/assets/{auth-B8ZZ0KKQ.js → auth-B9axG-yZ.js} +2 -2
  84. comfyui_frontend_package/static/assets/{auth-B8ZZ0KKQ.js.map → auth-B9axG-yZ.js.map} +1 -1
  85. comfyui_frontend_package/static/assets/auth-D74DTev8.js +1 -0
  86. comfyui_frontend_package/static/assets/{cloudBadges-C1a7fBky.js → cloudBadges-D5mGJbRy.js} +2 -2
  87. comfyui_frontend_package/static/assets/{cloudBadges-C1a7fBky.js.map → cloudBadges-D5mGJbRy.js.map} +1 -1
  88. comfyui_frontend_package/static/assets/{cloudFeedbackTopbarButton-DR0T8sWG.js → cloudFeedbackTopbarButton-RZUssOmb.js} +2 -2
  89. comfyui_frontend_package/static/assets/{cloudFeedbackTopbarButton-DR0T8sWG.js.map → cloudFeedbackTopbarButton-RZUssOmb.js.map} +1 -1
  90. comfyui_frontend_package/static/assets/{cloudRemoteConfig-DhMjC5TB.js → cloudRemoteConfig-F9J0iGyF.js} +2 -2
  91. comfyui_frontend_package/static/assets/{cloudRemoteConfig-DhMjC5TB.js.map → cloudRemoteConfig-F9J0iGyF.js.map} +1 -1
  92. comfyui_frontend_package/static/assets/{cloudSessionCookie-Duxk6ux1.js → cloudSessionCookie-MEORlqtg.js} +2 -2
  93. comfyui_frontend_package/static/assets/{cloudSessionCookie-Duxk6ux1.js.map → cloudSessionCookie-MEORlqtg.js.map} +1 -1
  94. comfyui_frontend_package/static/assets/{cloudSubscription-B8l6B9Nx.js → cloudSubscription-CuWNXKVx.js} +2 -2
  95. comfyui_frontend_package/static/assets/{cloudSubscription-B8l6B9Nx.js.map → cloudSubscription-CuWNXKVx.js.map} +1 -1
  96. comfyui_frontend_package/static/assets/{core-DBfeqMDR.js → core-IYu8XAIx.js} +4 -4
  97. comfyui_frontend_package/static/assets/{core-DBfeqMDR.js.map → core-IYu8XAIx.js.map} +1 -1
  98. comfyui_frontend_package/static/assets/{dialogService-BZ1FmjZL.js → dialogService-YG0RH337.js} +9 -9
  99. comfyui_frontend_package/static/assets/{dialogService-BZ1FmjZL.js.map → dialogService-YG0RH337.js.map} +1 -1
  100. comfyui_frontend_package/static/assets/firebaseAuthStore-DnNaPbuZ.js +1 -0
  101. comfyui_frontend_package/static/assets/{graphHasMissingNodes-C79Wi51S.js → graphHasMissingNodes-BhD1N6zI.js} +2 -2
  102. comfyui_frontend_package/static/assets/{graphHasMissingNodes-C79Wi51S.js.map → graphHasMissingNodes-BhD1N6zI.js.map} +1 -1
  103. comfyui_frontend_package/static/assets/{index-CGxJFSof.js → index-BMy3twho.js} +3 -3
  104. comfyui_frontend_package/static/assets/{index-CGxJFSof.js.map → index-BMy3twho.js.map} +1 -1
  105. comfyui_frontend_package/static/assets/{index-DNpOhRra.css → index-KMO9qFHH.css} +1 -1
  106. comfyui_frontend_package/static/assets/{keybindingService-B88NjeAU.js → keybindingService-CBLPjYHI.js} +2 -2
  107. comfyui_frontend_package/static/assets/{keybindingService-B88NjeAU.js.map → keybindingService-CBLPjYHI.js.map} +1 -1
  108. comfyui_frontend_package/static/assets/{releaseStore-x0vHjxrw.js → releaseStore-DDOxzkVb.js} +2 -2
  109. comfyui_frontend_package/static/assets/{releaseStore-x0vHjxrw.js.map → releaseStore-DDOxzkVb.js.map} +1 -1
  110. comfyui_frontend_package/static/assets/releaseStore-iVkqunL8.js +1 -0
  111. comfyui_frontend_package/static/assets/{subscriptionCheckoutUtil-B_OvUP2T.js → subscriptionCheckoutUtil-DswSOreM.js} +2 -2
  112. comfyui_frontend_package/static/assets/{subscriptionCheckoutUtil-B_OvUP2T.js.map → subscriptionCheckoutUtil-DswSOreM.js.map} +1 -1
  113. comfyui_frontend_package/static/assets/{useCurrentUser-BJcn2Vgo.js → useCurrentUser-NdaCJzIK.js} +1 -1
  114. comfyui_frontend_package/static/assets/{useErrorHandling-CI8_F4yx.js → useErrorHandling-Cfa5N_7c.js} +2 -2
  115. comfyui_frontend_package/static/assets/{useErrorHandling-CI8_F4yx.js.map → useErrorHandling-Cfa5N_7c.js.map} +1 -1
  116. comfyui_frontend_package/static/assets/{useSubscriptionDialog-Chxkdny5.js → useSubscriptionDialog-792qfEJ2.js} +3 -3
  117. comfyui_frontend_package/static/assets/{useSubscriptionDialog-Chxkdny5.js.map → useSubscriptionDialog-792qfEJ2.js.map} +1 -1
  118. comfyui_frontend_package/static/assets/useSubscriptionDialog-B-eGeK3j.js +1 -0
  119. comfyui_frontend_package/static/assets/{userStore-BkgQPjq6.js → userStore-BAS9m9W6.js} +2 -2
  120. comfyui_frontend_package/static/assets/{userStore-BkgQPjq6.js.map → userStore-BAS9m9W6.js.map} +1 -1
  121. comfyui_frontend_package/static/assets/vendor-three-BFcUNSs9.js.map +1 -1
  122. comfyui_frontend_package/static/index.html +1 -1
  123. {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/METADATA +1 -1
  124. {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/RECORD +126 -126
  125. comfyui_frontend_package/static/assets/AudioPreviewPlayer-BoEdyGI_.js +0 -1
  126. comfyui_frontend_package/static/assets/CloudRunButtonWrapper-hQc4BNkX.js +0 -3
  127. comfyui_frontend_package/static/assets/ComfyQueueButton-BbQnRThI.js +0 -1
  128. comfyui_frontend_package/static/assets/GraphView-BCkpNGgz.js.map +0 -1
  129. comfyui_frontend_package/static/assets/Load3D-DHBmC_AU.js +0 -1
  130. comfyui_frontend_package/static/assets/WidgetInputNumber-DGKypM5j.js +0 -3
  131. comfyui_frontend_package/static/assets/WidgetInputNumber-DGKypM5j.js.map +0 -1
  132. comfyui_frontend_package/static/assets/WidgetSelect-DsJGH12l.js +0 -1
  133. comfyui_frontend_package/static/assets/api-CUAc7rDA.js.map +0 -1
  134. comfyui_frontend_package/static/assets/auth-D3RiiqZ8.js +0 -1
  135. comfyui_frontend_package/static/assets/firebaseAuthStore-CZgxeMyf.js +0 -1
  136. comfyui_frontend_package/static/assets/releaseStore-CubqSv5t.js +0 -1
  137. comfyui_frontend_package/static/assets/useSubscriptionDialog-BzMzio2H.js +0 -1
  138. {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/WHEEL +0 -0
  139. {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,3 @@
1
- var l=Object.defineProperty;var r=(s,c)=>l(s,"name",{value:c,configurable:!0});import{r as p,t as u}from"./vendor-other-DlQF6V2E.js";import{It as m,r as f}from"./api-CUAc7rDA.js";var i=!1;const y=r(()=>{const s=r((e,t,n)=>{console.error(`Audio Service Error (${e}):`,t,n)},"handleError");return{convertBlobToFileAndSubmit:r(async e=>{const t=`recording-${Date.now()}.wav`,n=new File([e],t,{type:e.type||"audio/wav"}),o=new FormData;o.append("image",n),o.append("subfolder","audio"),o.append("type","temp");const a=await f.fetchApi("/upload/image",{method:"POST",body:o});if(a.status!==200){const d=`Error uploading temp file: ${a.status} - ${a.statusText}`;throw m().addAlert(d),new Error(d)}return`audio/${(await a.json()).name} [temp]`},"convertBlobToFileAndSubmit"),registerWavEncoder:r(async()=>{if(!i)try{await p(await u()),i=!0}catch(e){e instanceof Error&&e.message.includes("already an encoder stored")?i=!0:s("encoder","Failed to register WAV encoder",e)}},"registerWavEncoder"),stopAllTracks:r(e=>{e&&(e.getTracks().forEach(t=>{t.stop()}),e=null)},"stopAllTracks")}},"useAudioService");export{y as t};
1
+ var l=Object.defineProperty;var r=(s,c)=>l(s,"name",{value:c,configurable:!0});import{r as p,t as u}from"./vendor-other-DlQF6V2E.js";import{It as m,r as f}from"./api-Dwq2LQIW.js";var i=!1;const y=r(()=>{const s=r((e,t,n)=>{console.error(`Audio Service Error (${e}):`,t,n)},"handleError");return{convertBlobToFileAndSubmit:r(async e=>{const t=`recording-${Date.now()}.wav`,n=new File([e],t,{type:e.type||"audio/wav"}),o=new FormData;o.append("image",n),o.append("subfolder","audio"),o.append("type","temp");const a=await f.fetchApi("/upload/image",{method:"POST",body:o});if(a.status!==200){const d=`Error uploading temp file: ${a.status} - ${a.statusText}`;throw m().addAlert(d),new Error(d)}return`audio/${(await a.json()).name} [temp]`},"convertBlobToFileAndSubmit"),registerWavEncoder:r(async()=>{if(!i)try{await p(await u()),i=!0}catch(e){e instanceof Error&&e.message.includes("already an encoder stored")?i=!0:s("encoder","Failed to register WAV encoder",e)}},"registerWavEncoder"),stopAllTracks:r(e=>{e&&(e.getTracks().forEach(t=>{t.stop()}),e=null)},"stopAllTracks")}},"useAudioService");export{y as t};
2
2
 
3
- //# sourceMappingURL=audioService-DvndbCi2.js.map
3
+ //# sourceMappingURL=audioService-DvVaKhuU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audioService-DvndbCi2.js","names":[],"sources":["../../src/services/audioService.ts"],"sourcesContent":["import { register } from 'extendable-media-recorder'\nimport { connect } from 'extendable-media-recorder-wav-encoder'\n\nimport { useToastStore } from '@/platform/updates/common/toastStore'\nimport { api } from '@/scripts/api'\n\nexport interface AudioRecordingError {\n type: 'permission' | 'not_supported' | 'encoder' | 'recording' | 'unknown'\n message: string\n originalError?: unknown\n}\n\nlet isEncoderRegistered: boolean = false\n\nexport const useAudioService = () => {\n const handleError = (\n type: AudioRecordingError['type'],\n message: string,\n originalError?: unknown\n ) => {\n console.error(`Audio Service Error (${type}):`, message, originalError)\n }\n\n const stopAllTracks = (currentStream: MediaStream | null) => {\n if (currentStream) {\n currentStream.getTracks().forEach((track) => {\n track.stop()\n })\n currentStream = null\n }\n }\n\n const registerWavEncoder = async (): Promise<void> => {\n if (isEncoderRegistered) {\n return\n }\n\n try {\n await register(await connect())\n isEncoderRegistered = true\n } catch (err) {\n if (\n err instanceof Error &&\n err.message.includes('already an encoder stored')\n ) {\n isEncoderRegistered = true\n } else {\n handleError('encoder', 'Failed to register WAV encoder', err)\n }\n }\n }\n\n const convertBlobToFileAndSubmit = async (blob: Blob): Promise<string> => {\n const name = `recording-${Date.now()}.wav`\n const file = new File([blob], name, { type: blob.type || 'audio/wav' })\n\n const body = new FormData()\n body.append('image', file)\n body.append('subfolder', 'audio')\n body.append('type', 'temp')\n\n const resp = await api.fetchApi('/upload/image', {\n method: 'POST',\n body\n })\n\n if (resp.status !== 200) {\n const err = `Error uploading temp file: ${resp.status} - ${resp.statusText}`\n useToastStore().addAlert(err)\n throw new Error(err)\n }\n\n const tempAudio = await resp.json()\n\n return `audio/${tempAudio.name} [temp]`\n }\n\n return {\n // Methods\n convertBlobToFileAndSubmit,\n registerWavEncoder,\n stopAllTracks\n }\n}\n"],"mappings":"mLAYA,IAAI,EAA+B,GAEnC,MAAa,EAAA,EAAA,IAAwB,CACnC,MAAM,EAAA,EAAA,CACJ,EACA,EACA,IACG,CACH,QAAQ,MAAM,wBAAwB,CAAA,KAAU,EAAS,CAAA,GALrD,eA8DN,MAAO,CAEL,2BA3BiC,EAAA,MAAO,GAAgC,CACxE,MAAM,EAAO,aAAa,KAAK,IAAA,CAAK,OAC9B,EAAO,IAAI,KAAK,CAAC,CAAA,EAAO,EAAM,CAAE,KAAM,EAAK,MAAQ,WAAA,CAAa,EAEhE,EAAO,IAAI,SACjB,EAAK,OAAO,QAAS,CAAA,EACrB,EAAK,OAAO,YAAa,OAAA,EACzB,EAAK,OAAO,OAAQ,MAAA,EAEpB,MAAM,EAAO,MAAM,EAAI,SAAS,gBAAiB,CAC/C,OAAQ,OACR,KAAA,EACD,EAED,GAAI,EAAK,SAAW,IAAK,CACvB,MAAM,EAAM,8BAA8B,EAAK,MAAA,MAAY,EAAK,UAAA,GAChE,MAAA,EAAA,EAAgB,SAAS,CAAA,EACnB,IAAI,MAAM,CAAA,EAKlB,MAAO,UAFW,MAAM,EAAK,KAAA,GAEH,IAAA,WAtBO,8BA4BjC,mBAhDyB,EAAA,SAA2B,CACpD,GAAI,CAAA,EAIJ,GAAI,CACF,MAAM,EAAS,MAAM,EAAA,CAAS,EAC9B,EAAsB,SACf,EAAK,CAEV,aAAe,OACf,EAAI,QAAQ,SAAS,2BAAA,EAErB,EAAsB,GAEtB,EAAY,UAAW,iCAAkC,CAAA,IAfpC,sBAiDzB,cA1DI,EAAiB,GAAsC,CACvD,IACF,EAAc,UAAA,EAAY,QAAS,GAAU,CAC3C,EAAM,KAAA,IAER,EAAgB,OALd,mBATK"}
1
+ {"version":3,"file":"audioService-DvVaKhuU.js","names":[],"sources":["../../src/services/audioService.ts"],"sourcesContent":["import { register } from 'extendable-media-recorder'\nimport { connect } from 'extendable-media-recorder-wav-encoder'\n\nimport { useToastStore } from '@/platform/updates/common/toastStore'\nimport { api } from '@/scripts/api'\n\nexport interface AudioRecordingError {\n type: 'permission' | 'not_supported' | 'encoder' | 'recording' | 'unknown'\n message: string\n originalError?: unknown\n}\n\nlet isEncoderRegistered: boolean = false\n\nexport const useAudioService = () => {\n const handleError = (\n type: AudioRecordingError['type'],\n message: string,\n originalError?: unknown\n ) => {\n console.error(`Audio Service Error (${type}):`, message, originalError)\n }\n\n const stopAllTracks = (currentStream: MediaStream | null) => {\n if (currentStream) {\n currentStream.getTracks().forEach((track) => {\n track.stop()\n })\n currentStream = null\n }\n }\n\n const registerWavEncoder = async (): Promise<void> => {\n if (isEncoderRegistered) {\n return\n }\n\n try {\n await register(await connect())\n isEncoderRegistered = true\n } catch (err) {\n if (\n err instanceof Error &&\n err.message.includes('already an encoder stored')\n ) {\n isEncoderRegistered = true\n } else {\n handleError('encoder', 'Failed to register WAV encoder', err)\n }\n }\n }\n\n const convertBlobToFileAndSubmit = async (blob: Blob): Promise<string> => {\n const name = `recording-${Date.now()}.wav`\n const file = new File([blob], name, { type: blob.type || 'audio/wav' })\n\n const body = new FormData()\n body.append('image', file)\n body.append('subfolder', 'audio')\n body.append('type', 'temp')\n\n const resp = await api.fetchApi('/upload/image', {\n method: 'POST',\n body\n })\n\n if (resp.status !== 200) {\n const err = `Error uploading temp file: ${resp.status} - ${resp.statusText}`\n useToastStore().addAlert(err)\n throw new Error(err)\n }\n\n const tempAudio = await resp.json()\n\n return `audio/${tempAudio.name} [temp]`\n }\n\n return {\n // Methods\n convertBlobToFileAndSubmit,\n registerWavEncoder,\n stopAllTracks\n }\n}\n"],"mappings":"mLAYA,IAAI,EAA+B,GAEnC,MAAa,EAAA,EAAA,IAAwB,CACnC,MAAM,EAAA,EAAA,CACJ,EACA,EACA,IACG,CACH,QAAQ,MAAM,wBAAwB,CAAA,KAAU,EAAS,CAAA,GALrD,eA8DN,MAAO,CAEL,2BA3BiC,EAAA,MAAO,GAAgC,CACxE,MAAM,EAAO,aAAa,KAAK,IAAA,CAAK,OAC9B,EAAO,IAAI,KAAK,CAAC,CAAA,EAAO,EAAM,CAAE,KAAM,EAAK,MAAQ,WAAA,CAAa,EAEhE,EAAO,IAAI,SACjB,EAAK,OAAO,QAAS,CAAA,EACrB,EAAK,OAAO,YAAa,OAAA,EACzB,EAAK,OAAO,OAAQ,MAAA,EAEpB,MAAM,EAAO,MAAM,EAAI,SAAS,gBAAiB,CAC/C,OAAQ,OACR,KAAA,EACD,EAED,GAAI,EAAK,SAAW,IAAK,CACvB,MAAM,EAAM,8BAA8B,EAAK,MAAA,MAAY,EAAK,UAAA,GAChE,MAAA,EAAA,EAAgB,SAAS,CAAA,EACnB,IAAI,MAAM,CAAA,EAKlB,MAAO,UAFW,MAAM,EAAK,KAAA,GAEH,IAAA,WAtBO,8BA4BjC,mBAhDyB,EAAA,SAA2B,CACpD,GAAI,CAAA,EAIJ,GAAI,CACF,MAAM,EAAS,MAAM,EAAA,CAAS,EAC9B,EAAsB,SACf,EAAK,CAEV,aAAe,OACf,EAAI,QAAQ,SAAS,2BAAA,EAErB,EAAsB,GAEtB,EAAY,UAAW,iCAAkC,CAAA,IAfpC,sBAiDzB,cA1DI,EAAiB,GAAsC,CACvD,IACF,EAAc,UAAA,EAAY,QAAS,GAAU,CAC3C,EAAM,KAAA,IAER,EAAgB,OALd,mBATK"}
@@ -1,3 +1,3 @@
1
- var o=Object.defineProperty;var n=(r,t)=>o(r,"name",{value:t,configurable:!0});import{r as a}from"./api-CUAc7rDA.js";import{P as u}from"./dialogService-BZ1FmjZL.js";function g(r){return isNaN(r)||r===0?"0:00":`${Math.floor(r/60)}:${Math.floor(r%60).toString().padStart(2,"0")}`}n(g,"formatTime");function b(r,t="input"){const[i,e]=s(r);return a.apiURL(f(i,e,t))}n(b,"getAudioUrlFromPath");function f(r,t,i="input"){return`/view?${["filename="+encodeURIComponent(t),"type="+i,"subfolder="+r,u.getRandParam().substring(1)].join("&")}`}n(f,"getResourceURL");function s(r){const t=r.lastIndexOf("/");return t===-1?["",r]:[r.substring(0,t),r.substring(t+1)]}n(s,"splitFilePath");export{s as i,b as n,f as r,g as t};
1
+ var o=Object.defineProperty;var n=(r,t)=>o(r,"name",{value:t,configurable:!0});import{r as a}from"./api-Dwq2LQIW.js";import{P as u}from"./dialogService-YG0RH337.js";function g(r){return isNaN(r)||r===0?"0:00":`${Math.floor(r/60)}:${Math.floor(r%60).toString().padStart(2,"0")}`}n(g,"formatTime");function b(r,t="input"){const[i,e]=s(r);return a.apiURL(f(i,e,t))}n(b,"getAudioUrlFromPath");function f(r,t,i="input"){return`/view?${["filename="+encodeURIComponent(t),"type="+i,"subfolder="+r,u.getRandParam().substring(1)].join("&")}`}n(f,"getResourceURL");function s(r){const t=r.lastIndexOf("/");return t===-1?["",r]:[r.substring(0,t),r.substring(t+1)]}n(s,"splitFilePath");export{s as i,b as n,f as r,g as t};
2
2
 
3
- //# sourceMappingURL=audioUtils-DpjpcKbH.js.map
3
+ //# sourceMappingURL=audioUtils-DD4rUYVZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audioUtils-DpjpcKbH.js","names":[],"sources":["../../src/renderer/extensions/vueNodes/widgets/utils/audioUtils.ts"],"sourcesContent":["import type { ResultItemType } from '@/schemas/apiSchema'\nimport { api } from '@/scripts/api'\nimport { app } from '@/scripts/app'\n\n/**\n * Format time in MM:SS format\n */\nexport function formatTime(seconds: number): string {\n if (isNaN(seconds) || seconds === 0) return '0:00'\n\n const mins = Math.floor(seconds / 60)\n const secs = Math.floor(seconds % 60)\n return `${mins}:${secs.toString().padStart(2, '0')}`\n}\n\n/**\n * Get full audio URL from path\n */\nexport function getAudioUrlFromPath(\n path: string,\n type: ResultItemType = 'input'\n): string {\n const [subfolder, filename] = splitFilePath(path)\n return api.apiURL(getResourceURL(subfolder, filename, type))\n}\n\nexport function getResourceURL(\n subfolder: string,\n filename: string,\n type: ResultItemType = 'input'\n): string {\n const params = [\n 'filename=' + encodeURIComponent(filename),\n 'type=' + type,\n 'subfolder=' + subfolder,\n app.getRandParam().substring(1)\n ].join('&')\n\n return `/view?${params}`\n}\n\nexport function splitFilePath(path: string): [string, string] {\n const folder_separator = path.lastIndexOf('/')\n if (folder_separator === -1) {\n return ['', path]\n }\n return [\n path.substring(0, folder_separator),\n path.substring(folder_separator + 1)\n ]\n}\n"],"mappings":"qKAOA,SAAgB,EAAW,EAAyB,CAClD,OAAI,MAAM,CAAA,GAAY,IAAY,EAAU,OAIrC,GAFM,KAAK,MAAM,EAAU,EAAA,CAAG,IACxB,KAAK,MAAM,EAAU,EAAA,EACX,SAAA,EAAW,SAAS,EAAG,GAAA,CAAI,GALpC,EAAA,EAAA,cAWhB,SAAgB,EACd,EACA,EAAuB,QACf,CACR,KAAM,CAAC,EAAW,CAAA,EAAY,EAAc,CAAA,EAC5C,OAAO,EAAI,OAAO,EAAe,EAAW,EAAU,CAAA,CAAK,EAL7C,EAAA,EAAA,uBAQhB,SAAgB,EACd,EACA,EACA,EAAuB,QACf,CAQR,MAAO,SAPQ,CACb,YAAc,mBAAmB,CAAA,EACjC,QAAU,EACV,aAAe,EACf,EAAI,aAAA,EAAe,UAAU,CAAA,GAC7B,KAAK,GAAA,CAAI,GAVG,EAAA,EAAA,kBAehB,SAAgB,EAAc,EAAgC,CAC5D,MAAM,EAAmB,EAAK,YAAY,GAAA,EAC1C,OAAI,IAAqB,GAChB,CAAC,GAAI,CAAA,EAEP,CACL,EAAK,UAAU,EAAG,CAAA,EAClB,EAAK,UAAU,EAAmB,CAAA,CAAE,EAPxB,EAAA,EAAA"}
1
+ {"version":3,"file":"audioUtils-DD4rUYVZ.js","names":[],"sources":["../../src/renderer/extensions/vueNodes/widgets/utils/audioUtils.ts"],"sourcesContent":["import type { ResultItemType } from '@/schemas/apiSchema'\nimport { api } from '@/scripts/api'\nimport { app } from '@/scripts/app'\n\n/**\n * Format time in MM:SS format\n */\nexport function formatTime(seconds: number): string {\n if (isNaN(seconds) || seconds === 0) return '0:00'\n\n const mins = Math.floor(seconds / 60)\n const secs = Math.floor(seconds % 60)\n return `${mins}:${secs.toString().padStart(2, '0')}`\n}\n\n/**\n * Get full audio URL from path\n */\nexport function getAudioUrlFromPath(\n path: string,\n type: ResultItemType = 'input'\n): string {\n const [subfolder, filename] = splitFilePath(path)\n return api.apiURL(getResourceURL(subfolder, filename, type))\n}\n\nexport function getResourceURL(\n subfolder: string,\n filename: string,\n type: ResultItemType = 'input'\n): string {\n const params = [\n 'filename=' + encodeURIComponent(filename),\n 'type=' + type,\n 'subfolder=' + subfolder,\n app.getRandParam().substring(1)\n ].join('&')\n\n return `/view?${params}`\n}\n\nexport function splitFilePath(path: string): [string, string] {\n const folder_separator = path.lastIndexOf('/')\n if (folder_separator === -1) {\n return ['', path]\n }\n return [\n path.substring(0, folder_separator),\n path.substring(folder_separator + 1)\n ]\n}\n"],"mappings":"qKAOA,SAAgB,EAAW,EAAyB,CAClD,OAAI,MAAM,CAAA,GAAY,IAAY,EAAU,OAIrC,GAFM,KAAK,MAAM,EAAU,EAAA,CAAG,IACxB,KAAK,MAAM,EAAU,EAAA,EACX,SAAA,EAAW,SAAS,EAAG,GAAA,CAAI,GALpC,EAAA,EAAA,cAWhB,SAAgB,EACd,EACA,EAAuB,QACf,CACR,KAAM,CAAC,EAAW,CAAA,EAAY,EAAc,CAAA,EAC5C,OAAO,EAAI,OAAO,EAAe,EAAW,EAAU,CAAA,CAAK,EAL7C,EAAA,EAAA,uBAQhB,SAAgB,EACd,EACA,EACA,EAAuB,QACf,CAQR,MAAO,SAPQ,CACb,YAAc,mBAAmB,CAAA,EACjC,QAAU,EACV,aAAe,EACf,EAAI,aAAA,EAAe,UAAU,CAAA,GAC7B,KAAK,GAAA,CAAI,GAVG,EAAA,EAAA,kBAehB,SAAgB,EAAc,EAAgC,CAC5D,MAAM,EAAmB,EAAK,YAAY,GAAA,EAC1C,OAAI,IAAqB,GAChB,CAAC,GAAI,CAAA,EAEP,CACL,EAAK,UAAU,EAAG,CAAA,EAClB,EAAK,UAAU,EAAmB,CAAA,CAAE,EAPxB,EAAA,EAAA"}
@@ -1,3 +1,3 @@
1
- var g=Object.defineProperty;var s=(t,e)=>g(t,"name",{value:e,configurable:!0});import{Rr as h,ls as y,os as i}from"./vendor-other-DlQF6V2E.js";import{r as u}from"./api-CUAc7rDA.js";var o="onboarding_survey";function a(t,e,r,c,p,d){const n={api_endpoint:e,error_type:r};c!==void 0&&(n.http_status=c),p&&(n.operation=p);const f={tags:n,extra:d?{...d}:void 0};y(t,f)}s(a,"captureApiError");function l(t,e){return t instanceof Error&&t.message.startsWith(e)}s(l,"isHttpError");async function w(){try{const t=await u.fetchApi("/user",{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok){const e=new Error(`Failed to get user: ${t.statusText}`);throw a(e,"/user","http_error",t.status,void 0,{api:{method:"GET",endpoint:"/user",status_code:t.status,status_text:t.statusText}}),e}return t.json()}catch(t){throw l(t,"Failed to get user:")||a(t,"/user","network_error"),t}}s(w,"getUserCloudStatus");async function b(){try{const t=await u.fetchApi(`/settings/${o}`,{method:"GET",headers:{"Content-Type":"application/json"}});return t.ok?!h((await t.json()).value):(i({category:"auth",message:"Survey status check returned non-ok response",level:"info",data:{status:t.status,endpoint:`/settings/${o}`}}),!1)}catch(t){return y(t,{tags:{api_endpoint:"/settings/{key}",error_type:"network_error"},extra:{route_template:"/settings/{key}",route_actual:`/settings/${o}`},level:"warning"}),!1}}s(b,"getSurveyCompletedStatus");async function k(t){try{i({category:"auth",message:"Submitting survey",level:"info",data:{survey_fields:Object.keys(t)}});const e=await u.fetchApi("/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({[o]:t})});if(!e.ok){const r=new Error(`Failed to submit survey: ${e.statusText}`);throw a(r,"/settings","http_error",e.status,"submit_survey",{survey:{field_count:Object.keys(t).length,field_names:Object.keys(t)}}),r}i({category:"auth",message:"Survey submitted successfully",level:"info"})}catch(e){throw l(e,"Failed to submit survey:")||a(e,"/settings","network_error",void 0,"submit_survey"),e}}s(k,"submitSurvey");export{w as n,k as r,b as t};
1
+ var g=Object.defineProperty;var s=(t,e)=>g(t,"name",{value:e,configurable:!0});import{Rr as h,ls as y,os as i}from"./vendor-other-DlQF6V2E.js";import{r as u}from"./api-Dwq2LQIW.js";var o="onboarding_survey";function a(t,e,r,c,p,d){const n={api_endpoint:e,error_type:r};c!==void 0&&(n.http_status=c),p&&(n.operation=p);const f={tags:n,extra:d?{...d}:void 0};y(t,f)}s(a,"captureApiError");function l(t,e){return t instanceof Error&&t.message.startsWith(e)}s(l,"isHttpError");async function w(){try{const t=await u.fetchApi("/user",{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok){const e=new Error(`Failed to get user: ${t.statusText}`);throw a(e,"/user","http_error",t.status,void 0,{api:{method:"GET",endpoint:"/user",status_code:t.status,status_text:t.statusText}}),e}return t.json()}catch(t){throw l(t,"Failed to get user:")||a(t,"/user","network_error"),t}}s(w,"getUserCloudStatus");async function b(){try{const t=await u.fetchApi(`/settings/${o}`,{method:"GET",headers:{"Content-Type":"application/json"}});return t.ok?!h((await t.json()).value):(i({category:"auth",message:"Survey status check returned non-ok response",level:"info",data:{status:t.status,endpoint:`/settings/${o}`}}),!1)}catch(t){return y(t,{tags:{api_endpoint:"/settings/{key}",error_type:"network_error"},extra:{route_template:"/settings/{key}",route_actual:`/settings/${o}`},level:"warning"}),!1}}s(b,"getSurveyCompletedStatus");async function k(t){try{i({category:"auth",message:"Submitting survey",level:"info",data:{survey_fields:Object.keys(t)}});const e=await u.fetchApi("/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({[o]:t})});if(!e.ok){const r=new Error(`Failed to submit survey: ${e.statusText}`);throw a(r,"/settings","http_error",e.status,"submit_survey",{survey:{field_count:Object.keys(t).length,field_names:Object.keys(t)}}),r}i({category:"auth",message:"Survey submitted successfully",level:"info"})}catch(e){throw l(e,"Failed to submit survey:")||a(e,"/settings","network_error",void 0,"submit_survey"),e}}s(k,"submitSurvey");export{w as n,k as r,b as t};
2
2
 
3
- //# sourceMappingURL=auth-B8ZZ0KKQ.js.map
3
+ //# sourceMappingURL=auth-B9axG-yZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-B8ZZ0KKQ.js","names":[],"sources":["../../src/platform/cloud/onboarding/auth.ts"],"sourcesContent":["import * as Sentry from '@sentry/vue'\nimport { isEmpty } from 'es-toolkit/compat'\n\nimport { api } from '@/scripts/api'\n\ninterface UserCloudStatus {\n status: 'active'\n}\n\nconst ONBOARDING_SURVEY_KEY = 'onboarding_survey'\n\n/**\n * Helper function to capture API errors with Sentry\n */\nfunction captureApiError(\n error: Error,\n endpoint: string,\n errorType: 'http_error' | 'network_error',\n httpStatus?: number,\n operation?: string,\n extraContext?: Record<string, any>\n) {\n const tags: Record<string, any> = {\n api_endpoint: endpoint,\n error_type: errorType\n }\n\n if (httpStatus !== undefined) {\n tags.http_status = httpStatus\n }\n\n if (operation) {\n tags.operation = operation\n }\n\n const sentryOptions: any = {\n tags,\n extra: extraContext ? { ...extraContext } : undefined\n }\n\n Sentry.captureException(error, sentryOptions)\n}\n\n/**\n * Helper function to check if error is already handled HTTP error\n */\nfunction isHttpError(error: unknown, errorMessagePrefix: string): boolean {\n return error instanceof Error && error.message.startsWith(errorMessagePrefix)\n}\n\nexport async function getUserCloudStatus(): Promise<UserCloudStatus> {\n try {\n const response = await api.fetchApi('/user', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n if (!response.ok) {\n const error = new Error(`Failed to get user: ${response.statusText}`)\n captureApiError(\n error,\n '/user',\n 'http_error',\n response.status,\n undefined,\n {\n api: {\n method: 'GET',\n endpoint: '/user',\n status_code: response.status,\n status_text: response.statusText\n }\n }\n )\n throw error\n }\n\n return response.json()\n } catch (error) {\n // Only capture network errors (not HTTP errors we already captured)\n if (!isHttpError(error, 'Failed to get user:')) {\n captureApiError(error as Error, '/user', 'network_error')\n }\n throw error\n }\n}\n\nexport async function getSurveyCompletedStatus(): Promise<boolean> {\n try {\n const response = await api.fetchApi(`/settings/${ONBOARDING_SURVEY_KEY}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n if (!response.ok) {\n // Not an error case - survey not completed is a valid state\n Sentry.addBreadcrumb({\n category: 'auth',\n message: 'Survey status check returned non-ok response',\n level: 'info',\n data: {\n status: response.status,\n endpoint: `/settings/${ONBOARDING_SURVEY_KEY}`\n }\n })\n return false\n }\n const data = await response.json()\n // Check if data exists and is not empty\n return !isEmpty(data.value)\n } catch (error) {\n // Network error - still capture it as it's not thrown from above\n Sentry.captureException(error, {\n tags: {\n api_endpoint: '/settings/{key}',\n error_type: 'network_error'\n },\n extra: {\n route_template: '/settings/{key}',\n route_actual: `/settings/${ONBOARDING_SURVEY_KEY}`\n },\n level: 'warning'\n })\n return false\n }\n}\n\nexport async function submitSurvey(\n survey: Record<string, unknown>\n): Promise<void> {\n try {\n Sentry.addBreadcrumb({\n category: 'auth',\n message: 'Submitting survey',\n level: 'info',\n data: {\n survey_fields: Object.keys(survey)\n }\n })\n\n const response = await api.fetchApi('/settings', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ [ONBOARDING_SURVEY_KEY]: survey })\n })\n\n if (!response.ok) {\n const error = new Error(`Failed to submit survey: ${response.statusText}`)\n captureApiError(\n error,\n '/settings',\n 'http_error',\n response.status,\n 'submit_survey',\n {\n survey: {\n field_count: Object.keys(survey).length,\n field_names: Object.keys(survey)\n }\n }\n )\n throw error\n }\n\n // Log successful survey submission\n Sentry.addBreadcrumb({\n category: 'auth',\n message: 'Survey submitted successfully',\n level: 'info'\n })\n } catch (error) {\n // Only capture network errors (not HTTP errors we already captured)\n if (!isHttpError(error, 'Failed to submit survey:')) {\n captureApiError(\n error as Error,\n '/settings',\n 'network_error',\n undefined,\n 'submit_survey'\n )\n }\n throw error\n }\n}\n"],"mappings":"qLASA,IAAM,EAAwB,oBAK9B,SAAS,EACP,EACA,EACA,EACA,EACA,EACA,EACA,CACA,MAAM,EAA4B,CAChC,aAAc,EACd,WAAY,GAGV,IAAe,SACjB,EAAK,YAAc,GAGjB,IACF,EAAK,UAAY,GAGnB,MAAM,EAAqB,CACzB,KAAA,EACA,MAAO,EAAe,CAAE,GAAG,CAAA,EAAiB,QAG9C,EAAwB,EAAO,CAAA,EA1BxB,EAAA,EAAA,mBAgCT,SAAS,EAAY,EAAgB,EAAqC,CACxE,OAAO,aAAiB,OAAS,EAAM,QAAQ,WAAW,CAAA,EADnD,EAAA,EAAA,eAIT,eAAsB,GAA+C,CACnE,GAAI,CACF,MAAM,EAAW,MAAM,EAAI,SAAS,QAAS,CAC3C,OAAQ,MACR,QAAS,CACP,eAAgB,kBAAA,EAEnB,EACD,GAAI,CAAC,EAAS,GAAI,CAChB,MAAM,EAAQ,IAAI,MAAM,uBAAuB,EAAS,UAAA,EAAA,EACxD,MAAA,EACE,EACA,QACA,aACA,EAAS,OACT,OACA,CACE,IAAK,CACH,OAAQ,MACR,SAAU,QACV,YAAa,EAAS,OACtB,YAAa,EAAS,WACvB,CACF,EAEG,EAGR,OAAO,EAAS,KAAA,QACT,EAAO,CAEd,MAAK,EAAY,EAAO,qBAAA,GACtB,EAAgB,EAAgB,QAAS,eAAA,EAErC,GAlCY,EAAA,EAAA,sBAsCtB,eAAsB,GAA6C,CACjE,GAAI,CACF,MAAM,EAAW,MAAM,EAAI,SAAS,aAAa,CAAA,GAAyB,CACxE,OAAQ,MACR,QAAS,CACP,eAAgB,kBAAA,EAEnB,EACD,OAAK,EAAS,GAeP,CAAC,GAFK,MAAM,EAAS,KAAA,GAEP,KAAA,GAbnB,EAAqB,CACnB,SAAU,OACV,QAAS,+CACT,MAAO,OACP,KAAM,CACJ,OAAQ,EAAS,OACjB,SAAU,aAAa,CAAA,IAE1B,EACM,UAKF,EAAO,CAEd,OAAA,EAAwB,EAAO,CAC7B,KAAM,CACJ,aAAc,kBACd,WAAY,iBAEd,MAAO,CACL,eAAgB,kBAChB,aAAc,aAAa,CAAA,IAE7B,MAAO,UACR,EACM,IArCW,EAAA,EAAA,4BAyCtB,eAAsB,EACpB,EACe,CACf,GAAI,CACF,EAAqB,CACnB,SAAU,OACV,QAAS,oBACT,MAAO,OACP,KAAM,CACJ,cAAe,OAAO,KAAK,CAAA,CAAO,EAErC,EAED,MAAM,EAAW,MAAM,EAAI,SAAS,YAAa,CAC/C,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CAAA,CAAG,CAAA,EAAwB,CAAA,CAAQ,EACzD,EAED,GAAI,CAAC,EAAS,GAAI,CAChB,MAAM,EAAQ,IAAI,MAAM,4BAA4B,EAAS,UAAA,EAAA,EAC7D,MAAA,EACE,EACA,YACA,aACA,EAAS,OACT,gBACA,CACE,OAAQ,CACN,YAAa,OAAO,KAAK,CAAA,EAAQ,OACjC,YAAa,OAAO,KAAK,CAAA,EAC1B,CACF,EAEG,EAIR,EAAqB,CACnB,SAAU,OACV,QAAS,gCACT,MAAO,OACR,QACM,EAAO,CAEd,MAAK,EAAY,EAAO,0BAAA,GACtB,EACE,EACA,YACA,gBACA,OACA,eAAA,EAGE,GAxDY,EAAA,EAAA"}
1
+ {"version":3,"file":"auth-B9axG-yZ.js","names":[],"sources":["../../src/platform/cloud/onboarding/auth.ts"],"sourcesContent":["import * as Sentry from '@sentry/vue'\nimport { isEmpty } from 'es-toolkit/compat'\n\nimport { api } from '@/scripts/api'\n\ninterface UserCloudStatus {\n status: 'active'\n}\n\nconst ONBOARDING_SURVEY_KEY = 'onboarding_survey'\n\n/**\n * Helper function to capture API errors with Sentry\n */\nfunction captureApiError(\n error: Error,\n endpoint: string,\n errorType: 'http_error' | 'network_error',\n httpStatus?: number,\n operation?: string,\n extraContext?: Record<string, any>\n) {\n const tags: Record<string, any> = {\n api_endpoint: endpoint,\n error_type: errorType\n }\n\n if (httpStatus !== undefined) {\n tags.http_status = httpStatus\n }\n\n if (operation) {\n tags.operation = operation\n }\n\n const sentryOptions: any = {\n tags,\n extra: extraContext ? { ...extraContext } : undefined\n }\n\n Sentry.captureException(error, sentryOptions)\n}\n\n/**\n * Helper function to check if error is already handled HTTP error\n */\nfunction isHttpError(error: unknown, errorMessagePrefix: string): boolean {\n return error instanceof Error && error.message.startsWith(errorMessagePrefix)\n}\n\nexport async function getUserCloudStatus(): Promise<UserCloudStatus> {\n try {\n const response = await api.fetchApi('/user', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n if (!response.ok) {\n const error = new Error(`Failed to get user: ${response.statusText}`)\n captureApiError(\n error,\n '/user',\n 'http_error',\n response.status,\n undefined,\n {\n api: {\n method: 'GET',\n endpoint: '/user',\n status_code: response.status,\n status_text: response.statusText\n }\n }\n )\n throw error\n }\n\n return response.json()\n } catch (error) {\n // Only capture network errors (not HTTP errors we already captured)\n if (!isHttpError(error, 'Failed to get user:')) {\n captureApiError(error as Error, '/user', 'network_error')\n }\n throw error\n }\n}\n\nexport async function getSurveyCompletedStatus(): Promise<boolean> {\n try {\n const response = await api.fetchApi(`/settings/${ONBOARDING_SURVEY_KEY}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n if (!response.ok) {\n // Not an error case - survey not completed is a valid state\n Sentry.addBreadcrumb({\n category: 'auth',\n message: 'Survey status check returned non-ok response',\n level: 'info',\n data: {\n status: response.status,\n endpoint: `/settings/${ONBOARDING_SURVEY_KEY}`\n }\n })\n return false\n }\n const data = await response.json()\n // Check if data exists and is not empty\n return !isEmpty(data.value)\n } catch (error) {\n // Network error - still capture it as it's not thrown from above\n Sentry.captureException(error, {\n tags: {\n api_endpoint: '/settings/{key}',\n error_type: 'network_error'\n },\n extra: {\n route_template: '/settings/{key}',\n route_actual: `/settings/${ONBOARDING_SURVEY_KEY}`\n },\n level: 'warning'\n })\n return false\n }\n}\n\nexport async function submitSurvey(\n survey: Record<string, unknown>\n): Promise<void> {\n try {\n Sentry.addBreadcrumb({\n category: 'auth',\n message: 'Submitting survey',\n level: 'info',\n data: {\n survey_fields: Object.keys(survey)\n }\n })\n\n const response = await api.fetchApi('/settings', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ [ONBOARDING_SURVEY_KEY]: survey })\n })\n\n if (!response.ok) {\n const error = new Error(`Failed to submit survey: ${response.statusText}`)\n captureApiError(\n error,\n '/settings',\n 'http_error',\n response.status,\n 'submit_survey',\n {\n survey: {\n field_count: Object.keys(survey).length,\n field_names: Object.keys(survey)\n }\n }\n )\n throw error\n }\n\n // Log successful survey submission\n Sentry.addBreadcrumb({\n category: 'auth',\n message: 'Survey submitted successfully',\n level: 'info'\n })\n } catch (error) {\n // Only capture network errors (not HTTP errors we already captured)\n if (!isHttpError(error, 'Failed to submit survey:')) {\n captureApiError(\n error as Error,\n '/settings',\n 'network_error',\n undefined,\n 'submit_survey'\n )\n }\n throw error\n }\n}\n"],"mappings":"qLASA,IAAM,EAAwB,oBAK9B,SAAS,EACP,EACA,EACA,EACA,EACA,EACA,EACA,CACA,MAAM,EAA4B,CAChC,aAAc,EACd,WAAY,GAGV,IAAe,SACjB,EAAK,YAAc,GAGjB,IACF,EAAK,UAAY,GAGnB,MAAM,EAAqB,CACzB,KAAA,EACA,MAAO,EAAe,CAAE,GAAG,CAAA,EAAiB,QAG9C,EAAwB,EAAO,CAAA,EA1BxB,EAAA,EAAA,mBAgCT,SAAS,EAAY,EAAgB,EAAqC,CACxE,OAAO,aAAiB,OAAS,EAAM,QAAQ,WAAW,CAAA,EADnD,EAAA,EAAA,eAIT,eAAsB,GAA+C,CACnE,GAAI,CACF,MAAM,EAAW,MAAM,EAAI,SAAS,QAAS,CAC3C,OAAQ,MACR,QAAS,CACP,eAAgB,kBAAA,EAEnB,EACD,GAAI,CAAC,EAAS,GAAI,CAChB,MAAM,EAAQ,IAAI,MAAM,uBAAuB,EAAS,UAAA,EAAA,EACxD,MAAA,EACE,EACA,QACA,aACA,EAAS,OACT,OACA,CACE,IAAK,CACH,OAAQ,MACR,SAAU,QACV,YAAa,EAAS,OACtB,YAAa,EAAS,WACvB,CACF,EAEG,EAGR,OAAO,EAAS,KAAA,QACT,EAAO,CAEd,MAAK,EAAY,EAAO,qBAAA,GACtB,EAAgB,EAAgB,QAAS,eAAA,EAErC,GAlCY,EAAA,EAAA,sBAsCtB,eAAsB,GAA6C,CACjE,GAAI,CACF,MAAM,EAAW,MAAM,EAAI,SAAS,aAAa,CAAA,GAAyB,CACxE,OAAQ,MACR,QAAS,CACP,eAAgB,kBAAA,EAEnB,EACD,OAAK,EAAS,GAeP,CAAC,GAFK,MAAM,EAAS,KAAA,GAEP,KAAA,GAbnB,EAAqB,CACnB,SAAU,OACV,QAAS,+CACT,MAAO,OACP,KAAM,CACJ,OAAQ,EAAS,OACjB,SAAU,aAAa,CAAA,IAE1B,EACM,UAKF,EAAO,CAEd,OAAA,EAAwB,EAAO,CAC7B,KAAM,CACJ,aAAc,kBACd,WAAY,iBAEd,MAAO,CACL,eAAgB,kBAChB,aAAc,aAAa,CAAA,IAE7B,MAAO,UACR,EACM,IArCW,EAAA,EAAA,4BAyCtB,eAAsB,EACpB,EACe,CACf,GAAI,CACF,EAAqB,CACnB,SAAU,OACV,QAAS,oBACT,MAAO,OACP,KAAM,CACJ,cAAe,OAAO,KAAK,CAAA,CAAO,EAErC,EAED,MAAM,EAAW,MAAM,EAAI,SAAS,YAAa,CAC/C,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CAAA,CAAG,CAAA,EAAwB,CAAA,CAAQ,EACzD,EAED,GAAI,CAAC,EAAS,GAAI,CAChB,MAAM,EAAQ,IAAI,MAAM,4BAA4B,EAAS,UAAA,EAAA,EAC7D,MAAA,EACE,EACA,YACA,aACA,EAAS,OACT,gBACA,CACE,OAAQ,CACN,YAAa,OAAO,KAAK,CAAA,EAAQ,OACjC,YAAa,OAAO,KAAK,CAAA,EAC1B,CACF,EAEG,EAIR,EAAqB,CACnB,SAAU,OACV,QAAS,gCACT,MAAO,OACR,QACM,EAAO,CAEd,MAAK,EAAY,EAAO,0BAAA,GACtB,EACE,EACA,YACA,gBACA,OACA,eAAA,EAGE,GAxDY,EAAA,EAAA"}
@@ -0,0 +1 @@
1
+ import"./vendor-primevue-DcMRXJN3.js";import"./vendor-other-DlQF6V2E.js";import"./api-Dwq2LQIW.js";import"./colorUtil-CzxntCbX.js";import{t as i}from"./auth-B9axG-yZ.js";export{i as getSurveyCompletedStatus};
@@ -1,3 +1,3 @@
1
- import"./vendor-primevue-DcMRXJN3.js";import{za as e}from"./vendor-other-DlQF6V2E.js";import{A as o}from"./api-CUAc7rDA.js";import{r as i}from"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-CI8_F4yx.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BjN5XNg2.js";import{Sn as m}from"./dialogService-BZ1FmjZL.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BkgQPjq6.js";var a=e(()=>{const r=[],t=i.value.server_health_alert;return t&&r.push({text:t.message,label:t.badge,variant:t.severity??"error",tooltip:t.tooltip}),r.push({label:o("g.beta"),text:"Comfy Cloud"}),r});m().registerExtension({name:"Comfy.Cloud.Badges",get topbarBadges(){return a.value}});
1
+ import"./vendor-primevue-DcMRXJN3.js";import{za as e}from"./vendor-other-DlQF6V2E.js";import{A as o}from"./api-Dwq2LQIW.js";import{r as i}from"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-Cfa5N_7c.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BJda9e5J.js";import{Sn as m}from"./dialogService-YG0RH337.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BAS9m9W6.js";var a=e(()=>{const r=[],t=i.value.server_health_alert;return t&&r.push({text:t.message,label:t.badge,variant:t.severity??"error",tooltip:t.tooltip}),r.push({label:o("g.beta"),text:"Comfy Cloud"}),r});m().registerExtension({name:"Comfy.Cloud.Badges",get topbarBadges(){return a.value}});
2
2
 
3
- //# sourceMappingURL=cloudBadges-C1a7fBky.js.map
3
+ //# sourceMappingURL=cloudBadges-D5mGJbRy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudBadges-C1a7fBky.js","names":[],"sources":["../../src/extensions/core/cloudBadges.ts"],"sourcesContent":["import { computed } from 'vue'\n\nimport { remoteConfig } from '@/platform/remoteConfig/remoteConfig'\nimport { t } from '@/i18n'\nimport { useExtensionService } from '@/services/extensionService'\nimport type { TopbarBadge } from '@/types/comfy'\n\nconst badges = computed<TopbarBadge[]>(() => {\n const result: TopbarBadge[] = []\n\n // Add server health alert first (if present)\n const alert = remoteConfig.value.server_health_alert\n if (alert) {\n result.push({\n text: alert.message,\n label: alert.badge,\n variant: alert.severity ?? 'error',\n tooltip: alert.tooltip\n })\n }\n\n // Always add cloud badge last (furthest right)\n result.push({\n label: t('g.beta'),\n text: 'Comfy Cloud'\n })\n\n return result\n})\n\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.Badges',\n get topbarBadges() {\n return badges.value\n }\n})\n"],"mappings":"yhBAOA,IAAM,EAAS,EAAA,IAA8B,CAC3C,MAAM,EAAwB,CAAA,EAGxB,EAAQ,EAAa,MAAM,oBACjC,OAAI,GACF,EAAO,KAAK,CACV,KAAM,EAAM,QACZ,MAAO,EAAM,MACb,QAAS,EAAM,UAAY,QAC3B,QAAS,EAAM,QAChB,EAIH,EAAO,KAAK,CACV,MAAO,EAAE,QAAA,EACT,KAAM,cACP,EAEM,IAGT,EAAA,EAAsB,kBAAkB,CACtC,KAAM,qBACN,IAAI,cAAe,CACjB,OAAO,EAAO,OAEjB"}
1
+ {"version":3,"file":"cloudBadges-D5mGJbRy.js","names":[],"sources":["../../src/extensions/core/cloudBadges.ts"],"sourcesContent":["import { computed } from 'vue'\n\nimport { remoteConfig } from '@/platform/remoteConfig/remoteConfig'\nimport { t } from '@/i18n'\nimport { useExtensionService } from '@/services/extensionService'\nimport type { TopbarBadge } from '@/types/comfy'\n\nconst badges = computed<TopbarBadge[]>(() => {\n const result: TopbarBadge[] = []\n\n // Add server health alert first (if present)\n const alert = remoteConfig.value.server_health_alert\n if (alert) {\n result.push({\n text: alert.message,\n label: alert.badge,\n variant: alert.severity ?? 'error',\n tooltip: alert.tooltip\n })\n }\n\n // Always add cloud badge last (furthest right)\n result.push({\n label: t('g.beta'),\n text: 'Comfy Cloud'\n })\n\n return result\n})\n\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.Badges',\n get topbarBadges() {\n return badges.value\n }\n})\n"],"mappings":"yhBAOA,IAAM,EAAS,EAAA,IAA8B,CAC3C,MAAM,EAAwB,CAAA,EAGxB,EAAQ,EAAa,MAAM,oBACjC,OAAI,GACF,EAAO,KAAK,CACV,KAAM,EAAM,QACZ,MAAO,EAAM,MACb,QAAS,EAAM,UAAY,QAC3B,QAAS,EAAM,QAChB,EAIH,EAAO,KAAK,CACV,MAAO,EAAE,QAAA,EACT,KAAM,cACP,EAEM,IAGT,EAAA,EAAsB,kBAAkB,CACtC,KAAM,qBACN,IAAI,cAAe,CACjB,OAAO,EAAO,OAEjB"}
@@ -1,3 +1,3 @@
1
- var e=Object.defineProperty;var o=(r,i)=>e(r,"name",{value:i,configurable:!0});import"./vendor-primevue-DcMRXJN3.js";import"./vendor-other-DlQF6V2E.js";import{A as t}from"./api-CUAc7rDA.js";import"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-CI8_F4yx.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BjN5XNg2.js";import{Sn as n}from"./dialogService-BZ1FmjZL.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BkgQPjq6.js";var m="https://support.comfy.org/hc/en-us/requests/new?ticket_form_id=43066738713236",p=[{icon:"icon-[lucide--message-circle-question-mark]",label:t("actionbar.feedback"),tooltip:t("actionbar.feedbackTooltip"),onClick:o(()=>{window.open(m,"_blank","noopener,noreferrer")},"onClick")}];n().registerExtension({name:"Comfy.Cloud.FeedbackButton",actionBarButtons:p});
1
+ var e=Object.defineProperty;var o=(r,i)=>e(r,"name",{value:i,configurable:!0});import"./vendor-primevue-DcMRXJN3.js";import"./vendor-other-DlQF6V2E.js";import{A as t}from"./api-Dwq2LQIW.js";import"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-Cfa5N_7c.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BJda9e5J.js";import{Sn as n}from"./dialogService-YG0RH337.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BAS9m9W6.js";var m="https://support.comfy.org/hc/en-us/requests/new?ticket_form_id=43066738713236",p=[{icon:"icon-[lucide--message-circle-question-mark]",label:t("actionbar.feedback"),tooltip:t("actionbar.feedbackTooltip"),onClick:o(()=>{window.open(m,"_blank","noopener,noreferrer")},"onClick")}];n().registerExtension({name:"Comfy.Cloud.FeedbackButton",actionBarButtons:p});
2
2
 
3
- //# sourceMappingURL=cloudFeedbackTopbarButton-DR0T8sWG.js.map
3
+ //# sourceMappingURL=cloudFeedbackTopbarButton-RZUssOmb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudFeedbackTopbarButton-DR0T8sWG.js","names":[],"sources":["../../src/extensions/core/cloudFeedbackTopbarButton.ts"],"sourcesContent":["import { t } from '@/i18n'\nimport { useExtensionService } from '@/services/extensionService'\nimport type { ActionBarButton } from '@/types/comfy'\n\n// Zendesk feedback URL - update this with the actual URL\nconst ZENDESK_FEEDBACK_URL =\n 'https://support.comfy.org/hc/en-us/requests/new?ticket_form_id=43066738713236'\n\nconst buttons: ActionBarButton[] = [\n {\n icon: 'icon-[lucide--message-circle-question-mark]',\n label: t('actionbar.feedback'),\n tooltip: t('actionbar.feedbackTooltip'),\n onClick: () => {\n window.open(ZENDESK_FEEDBACK_URL, '_blank', 'noopener,noreferrer')\n }\n }\n]\n\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.FeedbackButton',\n actionBarButtons: buttons\n})\n"],"mappings":"+kBAKA,IAAM,EACJ,gFAEI,EAA6B,CACjC,CACE,KAAM,8CACN,MAAO,EAAE,oBAAA,EACT,QAAS,EAAE,2BAAA,EACX,QAAA,EAAA,IAAe,CACb,OAAO,KAAK,EAAsB,SAAU,qBAAA,GAD9C,WAGD,EAGH,EAAA,EAAsB,kBAAkB,CACtC,KAAM,6BACN,iBAAkB,EACnB"}
1
+ {"version":3,"file":"cloudFeedbackTopbarButton-RZUssOmb.js","names":[],"sources":["../../src/extensions/core/cloudFeedbackTopbarButton.ts"],"sourcesContent":["import { t } from '@/i18n'\nimport { useExtensionService } from '@/services/extensionService'\nimport type { ActionBarButton } from '@/types/comfy'\n\n// Zendesk feedback URL - update this with the actual URL\nconst ZENDESK_FEEDBACK_URL =\n 'https://support.comfy.org/hc/en-us/requests/new?ticket_form_id=43066738713236'\n\nconst buttons: ActionBarButton[] = [\n {\n icon: 'icon-[lucide--message-circle-question-mark]',\n label: t('actionbar.feedback'),\n tooltip: t('actionbar.feedbackTooltip'),\n onClick: () => {\n window.open(ZENDESK_FEEDBACK_URL, '_blank', 'noopener,noreferrer')\n }\n }\n]\n\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.FeedbackButton',\n actionBarButtons: buttons\n})\n"],"mappings":"+kBAKA,IAAM,EACJ,gFAEI,EAA6B,CACjC,CACE,KAAM,8CACN,MAAO,EAAE,oBAAA,EACT,QAAS,EAAE,2BAAA,EACX,QAAA,EAAA,IAAe,CACb,OAAO,KAAK,EAAsB,SAAU,qBAAA,GAD9C,WAGD,EAGH,EAAA,EAAsB,kBAAkB,CACtC,KAAM,6BACN,iBAAkB,EACnB"}
@@ -1,3 +1,3 @@
1
- var i=Object.defineProperty;var t=(o,e)=>i(o,"name",{value:e,configurable:!0});import"./vendor-primevue-DcMRXJN3.js";import{ea as s}from"./vendor-other-DlQF6V2E.js";import{r as n}from"./api-CUAc7rDA.js";import{n as a,r}from"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-CI8_F4yx.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BjN5XNg2.js";import{Dr as m,Nr as c,Sn as u}from"./dialogService-BZ1FmjZL.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BkgQPjq6.js";async function f(){try{const o=await n.fetchApi("/features",{cache:"no-store"});if(o.ok){const e=await o.json();window.__CONFIG__=e,r.value=e;return}console.warn("Failed to load remote config:",o.statusText),(o.status===401||o.status===403)&&(window.__CONFIG__={},r.value={})}catch(o){console.error("Failed to fetch remote config:",o)}}t(f,"refreshRemoteConfig");u().registerExtension({name:"Comfy.Cloud.RemoteConfig",setup:t(async()=>{const{isLoggedIn:o}=m(),{isActiveSubscription:e}=c();s([o,e],()=>{o.value&&f()},{debounce:256,immediate:!0}),setInterval(()=>{a()},6e5)},"setup")});
1
+ var i=Object.defineProperty;var t=(o,e)=>i(o,"name",{value:e,configurable:!0});import"./vendor-primevue-DcMRXJN3.js";import{ea as s}from"./vendor-other-DlQF6V2E.js";import{r as n}from"./api-Dwq2LQIW.js";import{n as a,r}from"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-Cfa5N_7c.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BJda9e5J.js";import{Dr as m,Nr as c,Sn as u}from"./dialogService-YG0RH337.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BAS9m9W6.js";async function f(){try{const o=await n.fetchApi("/features",{cache:"no-store"});if(o.ok){const e=await o.json();window.__CONFIG__=e,r.value=e;return}console.warn("Failed to load remote config:",o.statusText),(o.status===401||o.status===403)&&(window.__CONFIG__={},r.value={})}catch(o){console.error("Failed to fetch remote config:",o)}}t(f,"refreshRemoteConfig");u().registerExtension({name:"Comfy.Cloud.RemoteConfig",setup:t(async()=>{const{isLoggedIn:o}=m(),{isActiveSubscription:e}=c();s([o,e],()=>{o.value&&f()},{debounce:256,immediate:!0}),setInterval(()=>{a()},6e5)},"setup")});
2
2
 
3
- //# sourceMappingURL=cloudRemoteConfig-DhMjC5TB.js.map
3
+ //# sourceMappingURL=cloudRemoteConfig-F9J0iGyF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudRemoteConfig-DhMjC5TB.js","names":[],"sources":["../../src/platform/remoteConfig/refreshRemoteConfig.ts","../../src/extensions/core/cloudRemoteConfig.ts"],"sourcesContent":["import { api } from '@/scripts/api'\n\nimport { remoteConfig } from './remoteConfig'\n\nexport async function refreshRemoteConfig(): Promise<void> {\n try {\n const response = await api.fetchApi('/features', { cache: 'no-store' })\n if (response.ok) {\n const config = await response.json()\n window.__CONFIG__ = config\n remoteConfig.value = config\n return\n }\n\n console.warn('Failed to load remote config:', response.statusText)\n if (response.status === 401 || response.status === 403) {\n window.__CONFIG__ = {}\n remoteConfig.value = {}\n }\n } catch (error) {\n console.error('Failed to fetch remote config:', error)\n }\n}\n","import { watchDebounced } from '@vueuse/core'\n\nimport { useCurrentUser } from '@/composables/auth/useCurrentUser'\nimport { useSubscription } from '@/platform/cloud/subscription/composables/useSubscription'\nimport { loadRemoteConfig } from '@/platform/remoteConfig/remoteConfig'\nimport { refreshRemoteConfig } from '@/platform/remoteConfig/refreshRemoteConfig'\nimport { useExtensionService } from '@/services/extensionService'\n\n/**\n * Cloud-only extension that polls for remote config updates\n * Initial config load happens in main.ts before any other imports\n */\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.RemoteConfig',\n\n setup: async () => {\n const { isLoggedIn } = useCurrentUser()\n const { isActiveSubscription } = useSubscription()\n\n watchDebounced(\n [isLoggedIn, isActiveSubscription],\n () => {\n if (!isLoggedIn.value) return\n void refreshRemoteConfig()\n },\n { debounce: 256, immediate: true }\n )\n\n // Poll for config updates every 10 minutes\n setInterval(() => void loadRemoteConfig(), 600_000)\n }\n})\n"],"mappings":"0nBAIA,eAAsB,GAAqC,CACzD,GAAI,CACF,MAAM,EAAW,MAAM,EAAI,SAAS,YAAa,CAAE,MAAO,UAAA,CAAY,EACtE,GAAI,EAAS,GAAI,CACf,MAAM,EAAS,MAAM,EAAS,KAAA,EAC9B,OAAO,WAAa,EACpB,EAAa,MAAQ,EACrB,OAGF,QAAQ,KAAK,gCAAiC,EAAS,UAAA,GACnD,EAAS,SAAW,KAAO,EAAS,SAAW,OACjD,OAAO,WAAa,CAAA,EACpB,EAAa,MAAQ,CAAA,SAEhB,EAAO,CACd,QAAQ,MAAM,iCAAkC,CAAA,GAhB9B,EAAA,EAAA,uBCQtB,EAAA,EAAsB,kBAAkB,CACtC,KAAM,2BAEN,MAAO,EAAA,SAAY,CACjB,KAAM,CAAE,WAAA,CAAA,EAAe,EAAA,EACjB,CAAE,qBAAA,CAAA,EAAyB,EAAA,EAEjC,EACE,CAAC,EAAY,CAAA,EAAqB,IAC5B,CACC,EAAW,OACX,EAAA,GAEP,CAAE,SAAU,IAAK,UAAW,GAAM,EAIpC,YAAA,IAAA,CAAuB,EAAA,GAAoB,GAAA,GAdtC,SAgBR"}
1
+ {"version":3,"file":"cloudRemoteConfig-F9J0iGyF.js","names":[],"sources":["../../src/platform/remoteConfig/refreshRemoteConfig.ts","../../src/extensions/core/cloudRemoteConfig.ts"],"sourcesContent":["import { api } from '@/scripts/api'\n\nimport { remoteConfig } from './remoteConfig'\n\nexport async function refreshRemoteConfig(): Promise<void> {\n try {\n const response = await api.fetchApi('/features', { cache: 'no-store' })\n if (response.ok) {\n const config = await response.json()\n window.__CONFIG__ = config\n remoteConfig.value = config\n return\n }\n\n console.warn('Failed to load remote config:', response.statusText)\n if (response.status === 401 || response.status === 403) {\n window.__CONFIG__ = {}\n remoteConfig.value = {}\n }\n } catch (error) {\n console.error('Failed to fetch remote config:', error)\n }\n}\n","import { watchDebounced } from '@vueuse/core'\n\nimport { useCurrentUser } from '@/composables/auth/useCurrentUser'\nimport { useSubscription } from '@/platform/cloud/subscription/composables/useSubscription'\nimport { loadRemoteConfig } from '@/platform/remoteConfig/remoteConfig'\nimport { refreshRemoteConfig } from '@/platform/remoteConfig/refreshRemoteConfig'\nimport { useExtensionService } from '@/services/extensionService'\n\n/**\n * Cloud-only extension that polls for remote config updates\n * Initial config load happens in main.ts before any other imports\n */\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.RemoteConfig',\n\n setup: async () => {\n const { isLoggedIn } = useCurrentUser()\n const { isActiveSubscription } = useSubscription()\n\n watchDebounced(\n [isLoggedIn, isActiveSubscription],\n () => {\n if (!isLoggedIn.value) return\n void refreshRemoteConfig()\n },\n { debounce: 256, immediate: true }\n )\n\n // Poll for config updates every 10 minutes\n setInterval(() => void loadRemoteConfig(), 600_000)\n }\n})\n"],"mappings":"0nBAIA,eAAsB,GAAqC,CACzD,GAAI,CACF,MAAM,EAAW,MAAM,EAAI,SAAS,YAAa,CAAE,MAAO,UAAA,CAAY,EACtE,GAAI,EAAS,GAAI,CACf,MAAM,EAAS,MAAM,EAAS,KAAA,EAC9B,OAAO,WAAa,EACpB,EAAa,MAAQ,EACrB,OAGF,QAAQ,KAAK,gCAAiC,EAAS,UAAA,GACnD,EAAS,SAAW,KAAO,EAAS,SAAW,OACjD,OAAO,WAAa,CAAA,EACpB,EAAa,MAAQ,CAAA,SAEhB,EAAO,CACd,QAAQ,MAAM,iCAAkC,CAAA,GAhB9B,EAAA,EAAA,uBCQtB,EAAA,EAAsB,kBAAkB,CACtC,KAAM,2BAEN,MAAO,EAAA,SAAY,CACjB,KAAM,CAAE,WAAA,CAAA,EAAe,EAAA,EACjB,CAAE,qBAAA,CAAA,EAAyB,EAAA,EAEjC,EACE,CAAC,EAAY,CAAA,EAAqB,IAC5B,CACC,EAAW,OACX,EAAA,GAEP,CAAE,SAAU,IAAK,UAAW,GAAM,EAIpC,YAAA,IAAA,CAAuB,EAAA,GAAoB,GAAA,GAdtC,SAgBR"}
@@ -1,3 +1,3 @@
1
- var d=Object.defineProperty;var t=(o,n)=>d(o,"name",{value:n,configurable:!0});import"./vendor-primevue-DcMRXJN3.js";import"./vendor-other-DlQF6V2E.js";import{Lt as c,r as l}from"./api-CUAc7rDA.js";import{r as u}from"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-CI8_F4yx.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BjN5XNg2.js";import{Sn as m,Vr as h}from"./dialogService-BZ1FmjZL.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BkgQPjq6.js";const r=t(()=>({createSession:t(async()=>{if(c)try{const e=h();let a;if(u.value.team_workspaces_enabled){const s=await e.getIdToken();if(!s){console.warn("Failed to create session cookie:","No Firebase token available for session creation");return}a={Authorization:`Bearer ${s}`}}else{const s=await e.getAuthHeader();if(!s){console.warn("Failed to create session cookie:","No auth header available for session creation");return}a=s}const i=await fetch(l.apiURL("/auth/session"),{method:"POST",credentials:"include",headers:{...a,"Content-Type":"application/json"}});if(!i.ok){const s=await i.json().catch(()=>({}));console.warn("Failed to create session cookie:",s.message||i.statusText)}}catch(e){console.warn("Failed to create session cookie:",e)}},"createSession"),deleteSession:t(async()=>{if(c)try{const e=await fetch(l.apiURL("/auth/session"),{method:"DELETE",credentials:"include"});if(!e.ok){const a=await e.json().catch(()=>({}));console.warn("Failed to delete session cookie:",a.message||e.statusText)}}catch(e){console.warn("Failed to delete session cookie:",e)}},"deleteSession")}),"useSessionCookie");m().registerExtension({name:"Comfy.Cloud.SessionCookie",onAuthUserResolved:t(async()=>{const{createSession:o}=r();await o()},"onAuthUserResolved"),onAuthTokenRefreshed:t(async()=>{const{createSession:o}=r();await o()},"onAuthTokenRefreshed"),onAuthUserLogout:t(async()=>{const{deleteSession:o}=r();await o()},"onAuthUserLogout")});
1
+ var d=Object.defineProperty;var t=(o,n)=>d(o,"name",{value:n,configurable:!0});import"./vendor-primevue-DcMRXJN3.js";import"./vendor-other-DlQF6V2E.js";import{Lt as c,r as l}from"./api-Dwq2LQIW.js";import{r as u}from"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-Cfa5N_7c.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BJda9e5J.js";import{Sn as m,Vr as h}from"./dialogService-YG0RH337.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BAS9m9W6.js";const r=t(()=>({createSession:t(async()=>{if(c)try{const e=h();let a;if(u.value.team_workspaces_enabled){const s=await e.getIdToken();if(!s){console.warn("Failed to create session cookie:","No Firebase token available for session creation");return}a={Authorization:`Bearer ${s}`}}else{const s=await e.getAuthHeader();if(!s){console.warn("Failed to create session cookie:","No auth header available for session creation");return}a=s}const i=await fetch(l.apiURL("/auth/session"),{method:"POST",credentials:"include",headers:{...a,"Content-Type":"application/json"}});if(!i.ok){const s=await i.json().catch(()=>({}));console.warn("Failed to create session cookie:",s.message||i.statusText)}}catch(e){console.warn("Failed to create session cookie:",e)}},"createSession"),deleteSession:t(async()=>{if(c)try{const e=await fetch(l.apiURL("/auth/session"),{method:"DELETE",credentials:"include"});if(!e.ok){const a=await e.json().catch(()=>({}));console.warn("Failed to delete session cookie:",a.message||e.statusText)}}catch(e){console.warn("Failed to delete session cookie:",e)}},"deleteSession")}),"useSessionCookie");m().registerExtension({name:"Comfy.Cloud.SessionCookie",onAuthUserResolved:t(async()=>{const{createSession:o}=r();await o()},"onAuthUserResolved"),onAuthTokenRefreshed:t(async()=>{const{createSession:o}=r();await o()},"onAuthTokenRefreshed"),onAuthUserLogout:t(async()=>{const{deleteSession:o}=r();await o()},"onAuthUserLogout")});
2
2
 
3
- //# sourceMappingURL=cloudSessionCookie-Duxk6ux1.js.map
3
+ //# sourceMappingURL=cloudSessionCookie-MEORlqtg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudSessionCookie-Duxk6ux1.js","names":[],"sources":["../../src/platform/auth/session/useSessionCookie.ts","../../src/extensions/core/cloudSessionCookie.ts"],"sourcesContent":["import { isCloud } from '@/platform/distribution/types'\nimport { remoteConfig } from '@/platform/remoteConfig/remoteConfig'\nimport { api } from '@/scripts/api'\nimport { useFirebaseAuthStore } from '@/stores/firebaseAuthStore'\n\n/**\n * Session cookie management for cloud authentication.\n * Creates and deletes session cookies on the ComfyUI server.\n */\nexport const useSessionCookie = () => {\n /**\n * Creates or refreshes the session cookie.\n * Called after login and on token refresh.\n *\n * When team_workspaces_enabled is true, uses Firebase token directly\n * (since getAuthHeader() returns workspace token which shouldn't be used for session creation).\n * When disabled, uses getAuthHeader() for backward compatibility.\n */\n const createSession = async (): Promise<void> => {\n if (!isCloud) return\n\n try {\n const authStore = useFirebaseAuthStore()\n\n let authHeader: Record<string, string>\n\n if (remoteConfig.value.team_workspaces_enabled) {\n const firebaseToken = await authStore.getIdToken()\n if (!firebaseToken) {\n console.warn(\n 'Failed to create session cookie:',\n 'No Firebase token available for session creation'\n )\n return\n }\n authHeader = { Authorization: `Bearer ${firebaseToken}` }\n } else {\n const header = await authStore.getAuthHeader()\n if (!header) {\n console.warn(\n 'Failed to create session cookie:',\n 'No auth header available for session creation'\n )\n return\n }\n authHeader = header\n }\n\n const response = await fetch(api.apiURL('/auth/session'), {\n method: 'POST',\n credentials: 'include',\n headers: {\n ...authHeader,\n 'Content-Type': 'application/json'\n }\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n console.warn(\n 'Failed to create session cookie:',\n errorData.message || response.statusText\n )\n }\n } catch (error) {\n console.warn('Failed to create session cookie:', error)\n }\n }\n\n /**\n * Deletes the session cookie.\n * Called on logout.\n */\n const deleteSession = async (): Promise<void> => {\n if (!isCloud) return\n\n try {\n const response = await fetch(api.apiURL('/auth/session'), {\n method: 'DELETE',\n credentials: 'include'\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n console.warn(\n 'Failed to delete session cookie:',\n errorData.message || response.statusText\n )\n }\n } catch (error) {\n console.warn('Failed to delete session cookie:', error)\n }\n }\n\n return {\n createSession,\n deleteSession\n }\n}\n","import { useSessionCookie } from '@/platform/auth/session/useSessionCookie'\nimport { useExtensionService } from '@/services/extensionService'\n\n/**\n * Cloud-only extension that manages session cookies for authentication.\n * Creates session cookie on login, refreshes it when token refreshes, and deletes on logout.\n */\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.SessionCookie',\n\n onAuthUserResolved: async () => {\n const { createSession } = useSessionCookie()\n await createSession()\n },\n\n onAuthTokenRefreshed: async () => {\n const { createSession } = useSessionCookie()\n await createSession()\n },\n\n onAuthUserLogout: async () => {\n const { deleteSession } = useSessionCookie()\n await deleteSession()\n }\n})\n"],"mappings":"2mBASA,MAAa,EAAA,EAAA,KAqFJ,CACL,cA7EoB,EAAA,SAA2B,CAC/C,GAAK,EAEL,GAAI,CACF,MAAM,EAAY,EAAA,EAElB,IAAI,EAEJ,GAAI,EAAa,MAAM,wBAAyB,CAC9C,MAAM,EAAgB,MAAM,EAAU,WAAA,EACtC,GAAI,CAAC,EAAe,CAClB,QAAQ,KACN,mCACA,kDAAA,EAEF,OAEF,EAAa,CAAE,cAAe,UAAU,CAAA,EAAA,MACnC,CACL,MAAM,EAAS,MAAM,EAAU,cAAA,EAC/B,GAAI,CAAC,EAAQ,CACX,QAAQ,KACN,mCACA,+CAAA,EAEF,OAEF,EAAa,EAGf,MAAM,EAAW,MAAM,MAAM,EAAI,OAAO,eAAA,EAAkB,CACxD,OAAQ,OACR,YAAa,UACb,QAAS,CACP,GAAG,EACH,eAAgB,oBAEnB,EAED,GAAI,CAAC,EAAS,GAAI,CAChB,MAAM,EAAY,MAAM,EAAS,KAAA,EAAO,MAAA,KAAa,CAAA,EAAE,EACvD,QAAQ,KACN,mCACA,EAAU,SAAW,EAAS,UAAA,SAG3B,EAAO,CACd,QAAQ,KAAK,mCAAoC,CAAA,IA/C/B,iBA8EpB,cAvBoB,EAAA,SAA2B,CAC/C,GAAK,EAEL,GAAI,CACF,MAAM,EAAW,MAAM,MAAM,EAAI,OAAO,eAAA,EAAkB,CACxD,OAAQ,SACR,YAAa,UACd,EAED,GAAI,CAAC,EAAS,GAAI,CAChB,MAAM,EAAY,MAAM,EAAS,KAAA,EAAO,MAAA,KAAa,CAAA,EAAE,EACvD,QAAQ,KACN,mCACA,EAAU,SAAW,EAAS,UAAA,SAG3B,EAAO,CACd,QAAQ,KAAK,mCAAoC,CAAA,IAjB/B,mBAhEX,oBCFb,EAAA,EAAsB,kBAAkB,CACtC,KAAM,4BAEN,mBAAoB,EAAA,SAAY,CAC9B,KAAM,CAAE,cAAA,CAAA,EAAkB,EAAA,EAC1B,MAAM,EAAA,GAFY,sBAKpB,qBAAsB,EAAA,SAAY,CAChC,KAAM,CAAE,cAAA,CAAA,EAAkB,EAAA,EAC1B,MAAM,EAAA,GAFc,wBAKtB,iBAAkB,EAAA,SAAY,CAC5B,KAAM,CAAE,cAAA,CAAA,EAAkB,EAAA,EAC1B,MAAM,EAAA,GAFU,oBAInB"}
1
+ {"version":3,"file":"cloudSessionCookie-MEORlqtg.js","names":[],"sources":["../../src/platform/auth/session/useSessionCookie.ts","../../src/extensions/core/cloudSessionCookie.ts"],"sourcesContent":["import { isCloud } from '@/platform/distribution/types'\nimport { remoteConfig } from '@/platform/remoteConfig/remoteConfig'\nimport { api } from '@/scripts/api'\nimport { useFirebaseAuthStore } from '@/stores/firebaseAuthStore'\n\n/**\n * Session cookie management for cloud authentication.\n * Creates and deletes session cookies on the ComfyUI server.\n */\nexport const useSessionCookie = () => {\n /**\n * Creates or refreshes the session cookie.\n * Called after login and on token refresh.\n *\n * When team_workspaces_enabled is true, uses Firebase token directly\n * (since getAuthHeader() returns workspace token which shouldn't be used for session creation).\n * When disabled, uses getAuthHeader() for backward compatibility.\n */\n const createSession = async (): Promise<void> => {\n if (!isCloud) return\n\n try {\n const authStore = useFirebaseAuthStore()\n\n let authHeader: Record<string, string>\n\n if (remoteConfig.value.team_workspaces_enabled) {\n const firebaseToken = await authStore.getIdToken()\n if (!firebaseToken) {\n console.warn(\n 'Failed to create session cookie:',\n 'No Firebase token available for session creation'\n )\n return\n }\n authHeader = { Authorization: `Bearer ${firebaseToken}` }\n } else {\n const header = await authStore.getAuthHeader()\n if (!header) {\n console.warn(\n 'Failed to create session cookie:',\n 'No auth header available for session creation'\n )\n return\n }\n authHeader = header\n }\n\n const response = await fetch(api.apiURL('/auth/session'), {\n method: 'POST',\n credentials: 'include',\n headers: {\n ...authHeader,\n 'Content-Type': 'application/json'\n }\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n console.warn(\n 'Failed to create session cookie:',\n errorData.message || response.statusText\n )\n }\n } catch (error) {\n console.warn('Failed to create session cookie:', error)\n }\n }\n\n /**\n * Deletes the session cookie.\n * Called on logout.\n */\n const deleteSession = async (): Promise<void> => {\n if (!isCloud) return\n\n try {\n const response = await fetch(api.apiURL('/auth/session'), {\n method: 'DELETE',\n credentials: 'include'\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n console.warn(\n 'Failed to delete session cookie:',\n errorData.message || response.statusText\n )\n }\n } catch (error) {\n console.warn('Failed to delete session cookie:', error)\n }\n }\n\n return {\n createSession,\n deleteSession\n }\n}\n","import { useSessionCookie } from '@/platform/auth/session/useSessionCookie'\nimport { useExtensionService } from '@/services/extensionService'\n\n/**\n * Cloud-only extension that manages session cookies for authentication.\n * Creates session cookie on login, refreshes it when token refreshes, and deletes on logout.\n */\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.SessionCookie',\n\n onAuthUserResolved: async () => {\n const { createSession } = useSessionCookie()\n await createSession()\n },\n\n onAuthTokenRefreshed: async () => {\n const { createSession } = useSessionCookie()\n await createSession()\n },\n\n onAuthUserLogout: async () => {\n const { deleteSession } = useSessionCookie()\n await deleteSession()\n }\n})\n"],"mappings":"2mBASA,MAAa,EAAA,EAAA,KAqFJ,CACL,cA7EoB,EAAA,SAA2B,CAC/C,GAAK,EAEL,GAAI,CACF,MAAM,EAAY,EAAA,EAElB,IAAI,EAEJ,GAAI,EAAa,MAAM,wBAAyB,CAC9C,MAAM,EAAgB,MAAM,EAAU,WAAA,EACtC,GAAI,CAAC,EAAe,CAClB,QAAQ,KACN,mCACA,kDAAA,EAEF,OAEF,EAAa,CAAE,cAAe,UAAU,CAAA,EAAA,MACnC,CACL,MAAM,EAAS,MAAM,EAAU,cAAA,EAC/B,GAAI,CAAC,EAAQ,CACX,QAAQ,KACN,mCACA,+CAAA,EAEF,OAEF,EAAa,EAGf,MAAM,EAAW,MAAM,MAAM,EAAI,OAAO,eAAA,EAAkB,CACxD,OAAQ,OACR,YAAa,UACb,QAAS,CACP,GAAG,EACH,eAAgB,oBAEnB,EAED,GAAI,CAAC,EAAS,GAAI,CAChB,MAAM,EAAY,MAAM,EAAS,KAAA,EAAO,MAAA,KAAa,CAAA,EAAE,EACvD,QAAQ,KACN,mCACA,EAAU,SAAW,EAAS,UAAA,SAG3B,EAAO,CACd,QAAQ,KAAK,mCAAoC,CAAA,IA/C/B,iBA8EpB,cAvBoB,EAAA,SAA2B,CAC/C,GAAK,EAEL,GAAI,CACF,MAAM,EAAW,MAAM,MAAM,EAAI,OAAO,eAAA,EAAkB,CACxD,OAAQ,SACR,YAAa,UACd,EAED,GAAI,CAAC,EAAS,GAAI,CAChB,MAAM,EAAY,MAAM,EAAS,KAAA,EAAO,MAAA,KAAa,CAAA,EAAE,EACvD,QAAQ,KACN,mCACA,EAAU,SAAW,EAAS,UAAA,SAG3B,EAAO,CACd,QAAQ,KAAK,mCAAoC,CAAA,IAjB/B,mBAhEX,oBCFb,EAAA,EAAsB,kBAAkB,CACtC,KAAM,4BAEN,mBAAoB,EAAA,SAAY,CAC9B,KAAM,CAAE,cAAA,CAAA,EAAkB,EAAA,EAC1B,MAAM,EAAA,GAFY,sBAKpB,qBAAsB,EAAA,SAAY,CAChC,KAAM,CAAE,cAAA,CAAA,EAAkB,EAAA,EAC1B,MAAM,EAAA,GAFc,wBAKtB,iBAAkB,EAAA,SAAY,CAC5B,KAAM,CAAE,cAAA,CAAA,EAAkB,EAAA,EAC1B,MAAM,EAAA,GAFU,oBAInB"}
@@ -1,3 +1,3 @@
1
- var o=Object.defineProperty;var r=(t,i)=>o(t,"name",{value:i,configurable:!0});import"./vendor-primevue-DcMRXJN3.js";import{wo as e}from"./vendor-other-DlQF6V2E.js";import"./api-CUAc7rDA.js";import"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-CI8_F4yx.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BjN5XNg2.js";import{Dr as s,Nr as m,Sn as p}from"./dialogService-BZ1FmjZL.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BkgQPjq6.js";p().registerExtension({name:"Comfy.Cloud.Subscription",setup:r(async()=>{const{isLoggedIn:t}=s(),{requireActiveSubscription:i}=m();e(()=>t.value,r(()=>{t.value&&i()},"checkSubscriptionStatus"),{immediate:!0})},"setup")});
1
+ var o=Object.defineProperty;var r=(t,i)=>o(t,"name",{value:i,configurable:!0});import"./vendor-primevue-DcMRXJN3.js";import{wo as e}from"./vendor-other-DlQF6V2E.js";import"./api-Dwq2LQIW.js";import"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-Cfa5N_7c.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BJda9e5J.js";import{Dr as s,Nr as m,Sn as p}from"./dialogService-YG0RH337.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BAS9m9W6.js";p().registerExtension({name:"Comfy.Cloud.Subscription",setup:r(async()=>{const{isLoggedIn:t}=s(),{requireActiveSubscription:i}=m();e(()=>t.value,r(()=>{t.value&&i()},"checkSubscriptionStatus"),{immediate:!0})},"setup")});
2
2
 
3
- //# sourceMappingURL=cloudSubscription-B8l6B9Nx.js.map
3
+ //# sourceMappingURL=cloudSubscription-CuWNXKVx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudSubscription-B8l6B9Nx.js","names":[],"sources":["../../src/extensions/core/cloudSubscription.ts"],"sourcesContent":["import { watch } from 'vue'\n\nimport { useCurrentUser } from '@/composables/auth/useCurrentUser'\nimport { useSubscription } from '@/platform/cloud/subscription/composables/useSubscription'\nimport { useExtensionService } from '@/services/extensionService'\n\n/**\n * Cloud-only extension that enforces active subscription requirement\n */\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.Subscription',\n\n setup: async () => {\n const { isLoggedIn } = useCurrentUser()\n const { requireActiveSubscription } = useSubscription()\n\n const checkSubscriptionStatus = () => {\n if (!isLoggedIn.value) return\n void requireActiveSubscription()\n }\n\n watch(() => isLoggedIn.value, checkSubscriptionStatus, {\n immediate: true\n })\n }\n})\n"],"mappings":"gmBASA,EAAA,EAAsB,kBAAkB,CACtC,KAAM,2BAEN,MAAO,EAAA,SAAY,CACjB,KAAM,CAAE,WAAA,CAAA,EAAe,EAAA,EACjB,CAAE,0BAAA,CAAA,EAA8B,EAAA,EAOtC,EAAA,IAAY,EAAW,MALjB,EAAA,IAAgC,CAC/B,EAAW,OACX,EAAA,GAFD,2BAKiD,CACrD,UAAW,EAAA,CACZ,GAXI,SAaR"}
1
+ {"version":3,"file":"cloudSubscription-CuWNXKVx.js","names":[],"sources":["../../src/extensions/core/cloudSubscription.ts"],"sourcesContent":["import { watch } from 'vue'\n\nimport { useCurrentUser } from '@/composables/auth/useCurrentUser'\nimport { useSubscription } from '@/platform/cloud/subscription/composables/useSubscription'\nimport { useExtensionService } from '@/services/extensionService'\n\n/**\n * Cloud-only extension that enforces active subscription requirement\n */\nuseExtensionService().registerExtension({\n name: 'Comfy.Cloud.Subscription',\n\n setup: async () => {\n const { isLoggedIn } = useCurrentUser()\n const { requireActiveSubscription } = useSubscription()\n\n const checkSubscriptionStatus = () => {\n if (!isLoggedIn.value) return\n void requireActiveSubscription()\n }\n\n watch(() => isLoggedIn.value, checkSubscriptionStatus, {\n immediate: true\n })\n }\n})\n"],"mappings":"gmBASA,EAAA,EAAsB,kBAAkB,CACtC,KAAM,2BAEN,MAAO,EAAA,SAAY,CACjB,KAAM,CAAE,WAAA,CAAA,EAAe,EAAA,EACjB,CAAE,0BAAA,CAAA,EAA8B,EAAA,EAOtC,EAAA,IAAY,EAAW,MALjB,EAAA,IAAgC,CAC/B,EAAW,OACX,EAAA,GAFD,2BAKiD,CACrD,UAAW,EAAA,CACZ,GAXI,SAaR"}