squidcloudctl 1.1.2 → 1.1.3

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 (188) hide show
  1. package/dist/{auth-revoke-I5FM6N2S.js → auth-revoke-B2JBJB36.js} +2 -2
  2. package/dist/{auth-revoke-I5FM6N2S.js.map → auth-revoke-B2JBJB36.js.map} +1 -1
  3. package/dist/{auth-sessions-ALQEGBDS.js → auth-sessions-ZPMHJBIJ.js} +2 -2
  4. package/dist/{auth-sessions-ALQEGBDS.js.map → auth-sessions-ZPMHJBIJ.js.map} +1 -1
  5. package/dist/{auth-status-4VVTCDII.js → auth-status-BZGX7ZXN.js} +2 -2
  6. package/dist/{auth-status-4VVTCDII.js.map → auth-status-BZGX7ZXN.js.map} +1 -1
  7. package/dist/bin/squidcloud.js +1 -1
  8. package/dist/chunk-E2I4VVR5.js +2 -0
  9. package/dist/chunk-E2I4VVR5.js.map +1 -0
  10. package/dist/{chunk-BC2OVPRV.js → chunk-RXARHDCW.js} +2 -2
  11. package/dist/{chunk-BC2OVPRV.js.map → chunk-RXARHDCW.js.map} +1 -1
  12. package/dist/client-RBFTHJQ4.js +2 -0
  13. package/dist/{client-RFYERFWZ.js.map → client-RBFTHJQ4.js.map} +1 -1
  14. package/dist/{collab-activity-5RK36CJW.js → collab-activity-LEPWGNXB.js} +2 -2
  15. package/dist/{collab-activity-5RK36CJW.js.map → collab-activity-LEPWGNXB.js.map} +1 -1
  16. package/dist/collab-invite-6QGPY7SO.js +2 -0
  17. package/dist/{collab-invite-HAMMPEAQ.js.map → collab-invite-6QGPY7SO.js.map} +1 -1
  18. package/dist/{collab-leave-MTCXHQ4T.js → collab-leave-YMTEY2CZ.js} +2 -2
  19. package/dist/{collab-leave-MTCXHQ4T.js.map → collab-leave-YMTEY2CZ.js.map} +1 -1
  20. package/dist/{collab-list-JV4ZCWLB.js → collab-list-AQUFYKGI.js} +2 -2
  21. package/dist/{collab-list-JV4ZCWLB.js.map → collab-list-AQUFYKGI.js.map} +1 -1
  22. package/dist/collab-remove-CJSQYEUI.js +2 -0
  23. package/dist/{collab-remove-DO4BIA5R.js.map → collab-remove-CJSQYEUI.js.map} +1 -1
  24. package/dist/{collab-transfer-6CG5PHVC.js → collab-transfer-I6O6T3AC.js} +2 -2
  25. package/dist/{collab-transfer-6CG5PHVC.js.map → collab-transfer-I6O6T3AC.js.map} +1 -1
  26. package/dist/{deploy-X5HX7V4J.js → deploy-3AMFZQ7I.js} +3 -3
  27. package/dist/{deploy-X5HX7V4J.js.map → deploy-3AMFZQ7I.js.map} +1 -1
  28. package/dist/{doctor-RSKBJYUX.js → doctor-DAYHBLCK.js} +2 -2
  29. package/dist/{doctor-RSKBJYUX.js.map → doctor-DAYHBLCK.js.map} +1 -1
  30. package/dist/forms-clear-BFDMRIWW.js +2 -0
  31. package/dist/{forms-clear-UJ23UHUN.js.map → forms-clear-BFDMRIWW.js.map} +1 -1
  32. package/dist/forms-create-EWU47AIO.js +2 -0
  33. package/dist/{forms-create-CWC7MGOJ.js.map → forms-create-EWU47AIO.js.map} +1 -1
  34. package/dist/{forms-delete-TKHTM6L5.js → forms-delete-HJISSH4G.js} +2 -2
  35. package/dist/{forms-delete-TKHTM6L5.js.map → forms-delete-HJISSH4G.js.map} +1 -1
  36. package/dist/{forms-embed-FF3VMR4M.js → forms-embed-GSIGC4V7.js} +3 -3
  37. package/dist/{forms-embed-FF3VMR4M.js.map → forms-embed-GSIGC4V7.js.map} +1 -1
  38. package/dist/{forms-export-5ZNEL3V2.js → forms-export-KLFI4NJ7.js} +2 -2
  39. package/dist/{forms-export-5ZNEL3V2.js.map → forms-export-KLFI4NJ7.js.map} +1 -1
  40. package/dist/{forms-info-SUST47TN.js → forms-info-BRG5D5D7.js} +2 -2
  41. package/dist/{forms-info-SUST47TN.js.map → forms-info-BRG5D5D7.js.map} +1 -1
  42. package/dist/{forms-list-W2UUPFFD.js → forms-list-GYBKM5YD.js} +2 -2
  43. package/dist/{forms-list-W2UUPFFD.js.map → forms-list-GYBKM5YD.js.map} +1 -1
  44. package/dist/{forms-submissions-UTLSYPWS.js → forms-submissions-RKNVL2FS.js} +2 -2
  45. package/dist/{forms-submissions-UTLSYPWS.js.map → forms-submissions-RKNVL2FS.js.map} +1 -1
  46. package/dist/{login-SO6BZ4HE.js → login-CG7LSZMB.js} +2 -2
  47. package/dist/{login-SO6BZ4HE.js.map → login-CG7LSZMB.js.map} +1 -1
  48. package/dist/logout-HGLROFNP.js +2 -0
  49. package/dist/{logout-QERO6G6B.js.map → logout-HGLROFNP.js.map} +1 -1
  50. package/dist/{logs-export-DYOPV2LT.js → logs-export-547MGHOL.js} +2 -2
  51. package/dist/{logs-export-DYOPV2LT.js.map → logs-export-547MGHOL.js.map} +1 -1
  52. package/dist/{logs-search-323KRPG4.js → logs-search-P52C7PUZ.js} +2 -2
  53. package/dist/{logs-search-323KRPG4.js.map → logs-search-P52C7PUZ.js.map} +1 -1
  54. package/dist/{logs-tail-J64TCZG5.js → logs-tail-K4CWSSGP.js} +3 -3
  55. package/dist/{logs-tail-J64TCZG5.js.map → logs-tail-K4CWSSGP.js.map} +1 -1
  56. package/dist/{monitor-DKLGO5H7.js → monitor-IEQ4UD2H.js} +2 -2
  57. package/dist/{monitor-DKLGO5H7.js.map → monitor-IEQ4UD2H.js.map} +1 -1
  58. package/dist/{monitor-automations-4XOOCRFY.js → monitor-automations-4UNPGIZG.js} +2 -2
  59. package/dist/{monitor-automations-4XOOCRFY.js.map → monitor-automations-4UNPGIZG.js.map} +1 -1
  60. package/dist/{monitor-pipelines-EPL24J3S.js → monitor-pipelines-FVASSAV4.js} +2 -2
  61. package/dist/{monitor-pipelines-EPL24J3S.js.map → monitor-pipelines-FVASSAV4.js.map} +1 -1
  62. package/dist/{monitor-sites-QIVG5TPF.js → monitor-sites-GN2CSO6K.js} +2 -2
  63. package/dist/{monitor-sites-QIVG5TPF.js.map → monitor-sites-GN2CSO6K.js.map} +1 -1
  64. package/dist/{monitor-storage-HBCC34K7.js → monitor-storage-XBPKQTPJ.js} +2 -2
  65. package/dist/{monitor-storage-HBCC34K7.js.map → monitor-storage-XBPKQTPJ.js.map} +1 -1
  66. package/dist/scripts-cancel-NOVNOP4C.js +2 -0
  67. package/dist/{scripts-cancel-JS3LL2AT.js.map → scripts-cancel-NOVNOP4C.js.map} +1 -1
  68. package/dist/scripts-delete-GDPLFXWI.js +2 -0
  69. package/dist/{scripts-delete-274TW63X.js.map → scripts-delete-GDPLFXWI.js.map} +1 -1
  70. package/dist/scripts-disable-GQCO7Z2O.js +2 -0
  71. package/dist/{scripts-disable-JPATOVO4.js.map → scripts-disable-GQCO7Z2O.js.map} +1 -1
  72. package/dist/scripts-enable-MEC2YFAZ.js +2 -0
  73. package/dist/{scripts-enable-JVAA6AMP.js.map → scripts-enable-MEC2YFAZ.js.map} +1 -1
  74. package/dist/{scripts-list-YPFNLI3P.js → scripts-list-CWCKTE6G.js} +2 -2
  75. package/dist/{scripts-list-YPFNLI3P.js.map → scripts-list-CWCKTE6G.js.map} +1 -1
  76. package/dist/{scripts-logs-VISO5ONQ.js → scripts-logs-BFI7ZBMA.js} +2 -2
  77. package/dist/{scripts-logs-VISO5ONQ.js.map → scripts-logs-BFI7ZBMA.js.map} +1 -1
  78. package/dist/{scripts-run-3NBYKEMQ.js → scripts-run-D5WQF7CD.js} +2 -2
  79. package/dist/{scripts-run-3NBYKEMQ.js.map → scripts-run-D5WQF7CD.js.map} +1 -1
  80. package/dist/{scripts-status-45K3IL5L.js → scripts-status-H3DZSNGH.js} +2 -2
  81. package/dist/{scripts-status-45K3IL5L.js.map → scripts-status-H3DZSNGH.js.map} +1 -1
  82. package/dist/{scripts-validate-JZPIIMIX.js → scripts-validate-GFEEMXGM.js} +2 -2
  83. package/dist/{scripts-validate-JZPIIMIX.js.map → scripts-validate-GFEEMXGM.js.map} +1 -1
  84. package/dist/{scripts-watch-XZ7MZIMK.js → scripts-watch-YNPV5J7L.js} +2 -2
  85. package/dist/{scripts-watch-XZ7MZIMK.js.map → scripts-watch-YNPV5J7L.js.map} +1 -1
  86. package/dist/{session-AZGWAAQQ.js → session-TQAYXXL4.js} +2 -2
  87. package/dist/{session-AZGWAAQQ.js.map → session-TQAYXXL4.js.map} +1 -1
  88. package/dist/sign-cancel-65ENAT3A.js +2 -0
  89. package/dist/{sign-cancel-OUJM5UZT.js.map → sign-cancel-65ENAT3A.js.map} +1 -1
  90. package/dist/{sign-download-FS5G6J27.js → sign-download-DRG6AEW7.js} +2 -2
  91. package/dist/{sign-download-FS5G6J27.js.map → sign-download-DRG6AEW7.js.map} +1 -1
  92. package/dist/{sign-list-FV7SQSWT.js → sign-list-G5SAZIGV.js} +2 -2
  93. package/dist/{sign-list-FV7SQSWT.js.map → sign-list-G5SAZIGV.js.map} +1 -1
  94. package/dist/{sign-request-VVFYWT3Y.js → sign-request-KDWRY6NM.js} +2 -2
  95. package/dist/{sign-request-VVFYWT3Y.js.map → sign-request-KDWRY6NM.js.map} +1 -1
  96. package/dist/{sign-status-LKG5UFBX.js → sign-status-IHMHFX4R.js} +2 -2
  97. package/dist/{sign-status-LKG5UFBX.js.map → sign-status-IHMHFX4R.js.map} +1 -1
  98. package/dist/{sign-verify-CVTTJSDL.js → sign-verify-6GZYRRYD.js} +2 -2
  99. package/dist/{sign-verify-CVTTJSDL.js.map → sign-verify-6GZYRRYD.js.map} +1 -1
  100. package/dist/{sites-analytics-JK4UFMWX.js → sites-analytics-5U7LPRGD.js} +2 -2
  101. package/dist/{sites-analytics-JK4UFMWX.js.map → sites-analytics-5U7LPRGD.js.map} +1 -1
  102. package/dist/{sites-delete-SUHEQDZQ.js → sites-delete-T5H6QHHE.js} +2 -2
  103. package/dist/{sites-delete-SUHEQDZQ.js.map → sites-delete-T5H6QHHE.js.map} +1 -1
  104. package/dist/{sites-deploys-C4TVID2W.js → sites-deploys-AGHGIVLV.js} +2 -2
  105. package/dist/{sites-deploys-C4TVID2W.js.map → sites-deploys-AGHGIVLV.js.map} +1 -1
  106. package/dist/{sites-info-BZUK57TH.js → sites-info-55Y5G46C.js} +2 -2
  107. package/dist/{sites-info-BZUK57TH.js.map → sites-info-55Y5G46C.js.map} +1 -1
  108. package/dist/{sites-list-LLULSE5J.js → sites-list-AESG52QR.js} +2 -2
  109. package/dist/{sites-list-LLULSE5J.js.map → sites-list-AESG52QR.js.map} +1 -1
  110. package/dist/{sites-logs-NILNXF4L.js → sites-logs-CLJ35QZF.js} +3 -3
  111. package/dist/{sites-logs-NILNXF4L.js.map → sites-logs-CLJ35QZF.js.map} +1 -1
  112. package/dist/sites-open-6FLQLGDU.js +3 -0
  113. package/dist/{sites-open-R7A5EQWM.js.map → sites-open-6FLQLGDU.js.map} +1 -1
  114. package/dist/sites-purge-3EE6M54Y.js +2 -0
  115. package/dist/{sites-purge-VHERQRUB.js.map → sites-purge-3EE6M54Y.js.map} +1 -1
  116. package/dist/{sites-rename-MOO6HVW3.js → sites-rename-JJPIKOEV.js} +2 -2
  117. package/dist/{sites-rename-MOO6HVW3.js.map → sites-rename-JJPIKOEV.js.map} +1 -1
  118. package/dist/{sites-rollback-SPW2Z73L.js → sites-rollback-LG76J5XE.js} +2 -2
  119. package/dist/{sites-rollback-SPW2Z73L.js.map → sites-rollback-LG76J5XE.js.map} +1 -1
  120. package/dist/{sites-unpublish-6P7SQGIU.js → sites-unpublish-77EWOZI6.js} +2 -2
  121. package/dist/{sites-unpublish-6P7SQGIU.js.map → sites-unpublish-77EWOZI6.js.map} +1 -1
  122. package/dist/sites-visibility-E6MDL2R5.js +2 -0
  123. package/dist/{sites-visibility-R3AQJ76F.js.map → sites-visibility-E6MDL2R5.js.map} +1 -1
  124. package/dist/storage-cat-NMDWAEM4.js +2 -0
  125. package/dist/{storage-cat-HXFOJJG5.js.map → storage-cat-NMDWAEM4.js.map} +1 -1
  126. package/dist/{storage-clean-LEQEYWL6.js → storage-clean-6S5GP2AR.js} +2 -2
  127. package/dist/{storage-clean-LEQEYWL6.js.map → storage-clean-6S5GP2AR.js.map} +1 -1
  128. package/dist/storage-cp-XM6KPPDU.js +2 -0
  129. package/dist/{storage-cp-JTPTXZRQ.js.map → storage-cp-XM6KPPDU.js.map} +1 -1
  130. package/dist/{storage-diff-XURHVTPC.js → storage-diff-2UTHBORN.js} +2 -2
  131. package/dist/{storage-diff-XURHVTPC.js.map → storage-diff-2UTHBORN.js.map} +1 -1
  132. package/dist/{storage-download-5OYCNXKL.js → storage-download-6OZCB7M4.js} +3 -3
  133. package/dist/{storage-download-5OYCNXKL.js.map → storage-download-6OZCB7M4.js.map} +1 -1
  134. package/dist/{storage-info-WA74POPR.js → storage-info-ZD6LDRFG.js} +2 -2
  135. package/dist/{storage-info-WA74POPR.js.map → storage-info-ZD6LDRFG.js.map} +1 -1
  136. package/dist/{storage-ls-7RZQ3AXR.js → storage-ls-KE7UDC3I.js} +2 -2
  137. package/dist/{storage-ls-7RZQ3AXR.js.map → storage-ls-KE7UDC3I.js.map} +1 -1
  138. package/dist/storage-mkdir-YR6DI3T6.js +2 -0
  139. package/dist/{storage-mkdir-NWOHGAQI.js.map → storage-mkdir-YR6DI3T6.js.map} +1 -1
  140. package/dist/storage-mv-3NQNRFPE.js +2 -0
  141. package/dist/{storage-mv-XQ7EPX3M.js.map → storage-mv-3NQNRFPE.js.map} +1 -1
  142. package/dist/{storage-rm-LYO6UR3G.js → storage-rm-EF36YTVT.js} +2 -2
  143. package/dist/{storage-rm-LYO6UR3G.js.map → storage-rm-EF36YTVT.js.map} +1 -1
  144. package/dist/{storage-search-RIT5ISCA.js → storage-search-73OT4DNB.js} +2 -2
  145. package/dist/{storage-search-RIT5ISCA.js.map → storage-search-73OT4DNB.js.map} +1 -1
  146. package/dist/{storage-share-OURRQWZK.js → storage-share-VK5Z3IRP.js} +2 -2
  147. package/dist/{storage-share-OURRQWZK.js.map → storage-share-VK5Z3IRP.js.map} +1 -1
  148. package/dist/{storage-tag-NGJGUJSZ.js → storage-tag-VMF6QLSU.js} +2 -2
  149. package/dist/{storage-tag-NGJGUJSZ.js.map → storage-tag-VMF6QLSU.js.map} +1 -1
  150. package/dist/storage-unshare-NAVNQCKH.js +2 -0
  151. package/dist/{storage-unshare-3DXEKHEH.js.map → storage-unshare-NAVNQCKH.js.map} +1 -1
  152. package/dist/{storage-upload-5M6PBHOC.js → storage-upload-LA2VFTEN.js} +2 -2
  153. package/dist/{storage-upload-5M6PBHOC.js.map → storage-upload-LA2VFTEN.js.map} +1 -1
  154. package/dist/{time-list-GMZYZAOU.js → time-list-4FAFRADD.js} +2 -2
  155. package/dist/{time-list-GMZYZAOU.js.map → time-list-4FAFRADD.js.map} +1 -1
  156. package/dist/time-lock-L4PL43SC.js +2 -0
  157. package/dist/{time-lock-2OLEVQPJ.js.map → time-lock-L4PL43SC.js.map} +1 -1
  158. package/dist/{time-proof-RUTDAEKP.js → time-proof-ZOOUFIKS.js} +2 -2
  159. package/dist/{time-proof-RUTDAEKP.js.map → time-proof-ZOOUFIKS.js.map} +1 -1
  160. package/dist/{time-status-TVNJBFKC.js → time-status-M4QX6GTM.js} +2 -2
  161. package/dist/{time-status-TVNJBFKC.js.map → time-status-M4QX6GTM.js.map} +1 -1
  162. package/dist/{time-unlock-OO6QH5R6.js → time-unlock-UPHP5V74.js} +2 -2
  163. package/dist/{time-unlock-OO6QH5R6.js.map → time-unlock-UPHP5V74.js.map} +1 -1
  164. package/dist/{whoami-SAURQARO.js → whoami-2ABU6JQD.js} +2 -2
  165. package/dist/{whoami-SAURQARO.js.map → whoami-2ABU6JQD.js.map} +1 -1
  166. package/package.json +1 -1
  167. package/dist/chunk-4NTVRCZM.js +0 -2
  168. package/dist/chunk-4NTVRCZM.js.map +0 -1
  169. package/dist/client-RFYERFWZ.js +0 -2
  170. package/dist/collab-invite-HAMMPEAQ.js +0 -2
  171. package/dist/collab-remove-DO4BIA5R.js +0 -2
  172. package/dist/forms-clear-UJ23UHUN.js +0 -2
  173. package/dist/forms-create-CWC7MGOJ.js +0 -2
  174. package/dist/logout-QERO6G6B.js +0 -2
  175. package/dist/scripts-cancel-JS3LL2AT.js +0 -2
  176. package/dist/scripts-delete-274TW63X.js +0 -2
  177. package/dist/scripts-disable-JPATOVO4.js +0 -2
  178. package/dist/scripts-enable-JVAA6AMP.js +0 -2
  179. package/dist/sign-cancel-OUJM5UZT.js +0 -2
  180. package/dist/sites-open-R7A5EQWM.js +0 -3
  181. package/dist/sites-purge-VHERQRUB.js +0 -2
  182. package/dist/sites-visibility-R3AQJ76F.js +0 -2
  183. package/dist/storage-cat-HXFOJJG5.js +0 -2
  184. package/dist/storage-cp-JTPTXZRQ.js +0 -2
  185. package/dist/storage-mkdir-NWOHGAQI.js +0 -2
  186. package/dist/storage-mv-XQ7EPX3M.js +0 -2
  187. package/dist/storage-unshare-3DXEKHEH.js +0 -2
  188. package/dist/time-lock-2OLEVQPJ.js +0 -2
@@ -1,2 +1,2 @@
1
- import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-BC2OVPRV.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {g}from'./chunk-QT7R3AXE.js';import {o}from'./chunk-4NTVRCZM.js';import a from'inquirer';async function c(e$1){if(e$1.all){let{confirm:s}=await a.prompt([{type:"confirm",name:"confirm",message:"Revoke ALL active sessions? This will log out every device.",default:false}]);if(!s)return;let t=b("Revoking all sessions...");t.start(),await e("/api/auth/ssp/revoke-all",{},{authenticated:true}),await o(),t.succeed(),g("All sessions revoked");return}if(e$1.session){let s=b(`Revoking session ${e$1.session}...`);s.start(),await e("/api/auth/ssp/revoke",{session_id:e$1.session},{authenticated:true}),s.succeed(),g(`Session ${e$1.session} revoked`);return}console.error("Specify --session <id> or --all"),process.exit(1);}export{c as default};//# sourceMappingURL=auth-revoke-I5FM6N2S.js.map
2
- //# sourceMappingURL=auth-revoke-I5FM6N2S.js.map
1
+ import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-RXARHDCW.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {g}from'./chunk-QT7R3AXE.js';import {o}from'./chunk-E2I4VVR5.js';import a from'inquirer';async function c(e$1){if(e$1.all){let{confirm:s}=await a.prompt([{type:"confirm",name:"confirm",message:"Revoke ALL active sessions? This will log out every device.",default:false}]);if(!s)return;let t=b("Revoking all sessions...");t.start(),await e("/api/auth/ssp/revoke-all",{},{authenticated:true}),await o(),t.succeed(),g("All sessions revoked");return}if(e$1.session){let s=b(`Revoking session ${e$1.session}...`);s.start(),await e("/api/auth/ssp/revoke",{session_id:e$1.session},{authenticated:true}),s.succeed(),g(`Session ${e$1.session} revoked`);return}console.error("Specify --session <id> or --all"),process.exit(1);}export{c as default};//# sourceMappingURL=auth-revoke-B2JBJB36.js.map
2
+ //# sourceMappingURL=auth-revoke-B2JBJB36.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/auth/auth-revoke.ts"],"names":["authRevoke","options","confirm","inquirer","spinner","createSpinner","apiPost","clearSession","logSuccess"],"mappings":"gOAOA,eAAOA,CAAAA,CAAkCC,GAAAA,CAA6D,CACpG,GAAIA,GAAAA,CAAQ,GAAA,CAAK,CACf,GAAM,CAAE,QAAAC,CAAQ,CAAA,CAAI,MAAMC,CAAAA,CAAS,MAAA,CAAO,CAAC,CACzC,IAAA,CAAM,SAAA,CACN,IAAA,CAAM,SAAA,CACN,OAAA,CAAS,6DAAA,CACT,QAAS,KACX,CAAC,CAAC,CAAA,CACF,GAAI,CAACD,EAAS,OACd,IAAME,CAAAA,CAAUC,CAAAA,CAAc,0BAA0B,CAAA,CACxDD,EAAQ,KAAA,EAAM,CACd,MAAME,CAAAA,CAAQ,0BAAA,CAA4B,EAAC,CAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CACrE,MAAMC,CAAAA,GACNH,CAAAA,CAAQ,OAAA,EAAQ,CAChBI,CAAAA,CAAW,sBAAsB,CAAA,CACjC,MACF,CAEA,GAAIP,GAAAA,CAAQ,OAAA,CAAS,CACnB,IAAMG,EAAUC,CAAAA,CAAc,CAAA,iBAAA,EAAoBJ,GAAAA,CAAQ,OAAO,CAAA,GAAA,CAAK,CAAA,CACtEG,EAAQ,KAAA,EAAM,CACd,MAAME,CAAAA,CAAQ,sBAAA,CAAwB,CAAE,WAAYL,GAAAA,CAAQ,OAAQ,CAAA,CAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CAC9FG,CAAAA,CAAQ,OAAA,EAAQ,CAChBI,CAAAA,CAAW,CAAA,QAAA,EAAWP,IAAQ,OAAO,CAAA,QAAA,CAAU,CAAA,CAC/C,MACF,CAEA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,CAAA,CAC/C,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB","file":"auth-revoke-I5FM6N2S.js","sourcesContent":["import { Command } from 'commander'\nimport { apiPost } from '../../lib/api/client.js'\nimport { clearSession } from '../../lib/auth/session.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\nimport inquirer from 'inquirer'\n\nexport default async function authRevoke(options: { session?: string; all?: boolean }): Promise<void> {\n if (options.all) {\n const { confirm } = await inquirer.prompt([{\n type: 'confirm',\n name: 'confirm',\n message: 'Revoke ALL active sessions? This will log out every device.',\n default: false,\n }])\n if (!confirm) return\n const spinner = createSpinner('Revoking all sessions...')\n spinner.start()\n await apiPost('/api/auth/ssp/revoke-all', {}, { authenticated: true })\n await clearSession()\n spinner.succeed()\n logSuccess('All sessions revoked')\n return\n }\n\n if (options.session) {\n const spinner = createSpinner(`Revoking session ${options.session}...`)\n spinner.start()\n await apiPost('/api/auth/ssp/revoke', { session_id: options.session }, { authenticated: true })\n spinner.succeed()\n logSuccess(`Session ${options.session} revoked`)\n return\n }\n\n console.error('Specify --session <id> or --all')\n process.exit(1)\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/auth/auth-revoke.ts"],"names":["authRevoke","options","confirm","inquirer","spinner","createSpinner","apiPost","clearSession","logSuccess"],"mappings":"gOAOA,eAAOA,CAAAA,CAAkCC,GAAAA,CAA6D,CACpG,GAAIA,GAAAA,CAAQ,GAAA,CAAK,CACf,GAAM,CAAE,QAAAC,CAAQ,CAAA,CAAI,MAAMC,CAAAA,CAAS,MAAA,CAAO,CAAC,CACzC,IAAA,CAAM,SAAA,CACN,IAAA,CAAM,SAAA,CACN,OAAA,CAAS,6DAAA,CACT,QAAS,KACX,CAAC,CAAC,CAAA,CACF,GAAI,CAACD,EAAS,OACd,IAAME,CAAAA,CAAUC,CAAAA,CAAc,0BAA0B,CAAA,CACxDD,EAAQ,KAAA,EAAM,CACd,MAAME,CAAAA,CAAQ,0BAAA,CAA4B,EAAC,CAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CACrE,MAAMC,CAAAA,GACNH,CAAAA,CAAQ,OAAA,EAAQ,CAChBI,CAAAA,CAAW,sBAAsB,CAAA,CACjC,MACF,CAEA,GAAIP,GAAAA,CAAQ,OAAA,CAAS,CACnB,IAAMG,EAAUC,CAAAA,CAAc,CAAA,iBAAA,EAAoBJ,GAAAA,CAAQ,OAAO,CAAA,GAAA,CAAK,CAAA,CACtEG,EAAQ,KAAA,EAAM,CACd,MAAME,CAAAA,CAAQ,sBAAA,CAAwB,CAAE,WAAYL,GAAAA,CAAQ,OAAQ,CAAA,CAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CAC9FG,CAAAA,CAAQ,OAAA,EAAQ,CAChBI,CAAAA,CAAW,CAAA,QAAA,EAAWP,IAAQ,OAAO,CAAA,QAAA,CAAU,CAAA,CAC/C,MACF,CAEA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,CAAA,CAC/C,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB","file":"auth-revoke-B2JBJB36.js","sourcesContent":["import { Command } from 'commander'\nimport { apiPost } from '../../lib/api/client.js'\nimport { clearSession } from '../../lib/auth/session.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\nimport inquirer from 'inquirer'\n\nexport default async function authRevoke(options: { session?: string; all?: boolean }): Promise<void> {\n if (options.all) {\n const { confirm } = await inquirer.prompt([{\n type: 'confirm',\n name: 'confirm',\n message: 'Revoke ALL active sessions? This will log out every device.',\n default: false,\n }])\n if (!confirm) return\n const spinner = createSpinner('Revoking all sessions...')\n spinner.start()\n await apiPost('/api/auth/ssp/revoke-all', {}, { authenticated: true })\n await clearSession()\n spinner.succeed()\n logSuccess('All sessions revoked')\n return\n }\n\n if (options.session) {\n const spinner = createSpinner(`Revoking session ${options.session}...`)\n spinner.start()\n await apiPost('/api/auth/ssp/revoke', { session_id: options.session }, { authenticated: true })\n spinner.succeed()\n logSuccess(`Session ${options.session} revoked`)\n return\n }\n\n console.error('Specify --session <id> or --all')\n process.exit(1)\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {d}from'./chunk-BC2OVPRV.js';import'./chunk-NDB6KXYI.js';import {a}from'./chunk-THMWE2I6.js';import {b,c}from'./chunk-G4JU7IUC.js';import'./chunk-QT7R3AXE.js';import'./chunk-4NTVRCZM.js';async function s(){let i=((await d("/api/auth/ssp/sessions",{authenticated:true})).sessions||[]).map(e=>({id:e.id.slice(0,8)+"...",device:e.device_fingerprint.slice(0,12),platform:e.platform||"unknown",last_seen:c(e.last_seen),created:b(e.created_at),current:e.current?"\u25CF":""}));console.log(a(i,[{key:"id",label:"Session ID"},{key:"device",label:"Fingerprint"},{key:"platform",label:"Platform"},{key:"last_seen",label:"Last Seen"},{key:"created",label:"Created"},{key:"current",label:""}]));}export{s as default};//# sourceMappingURL=auth-sessions-ALQEGBDS.js.map
2
- //# sourceMappingURL=auth-sessions-ALQEGBDS.js.map
1
+ import {d}from'./chunk-RXARHDCW.js';import'./chunk-NDB6KXYI.js';import {a}from'./chunk-THMWE2I6.js';import {b,c}from'./chunk-G4JU7IUC.js';import'./chunk-QT7R3AXE.js';import'./chunk-E2I4VVR5.js';async function s(){let i=((await d("/api/auth/ssp/sessions",{authenticated:true})).sessions||[]).map(e=>({id:e.id.slice(0,8)+"...",device:e.device_fingerprint.slice(0,12),platform:e.platform||"unknown",last_seen:c(e.last_seen),created:b(e.created_at),current:e.current?"\u25CF":""}));console.log(a(i,[{key:"id",label:"Session ID"},{key:"device",label:"Fingerprint"},{key:"platform",label:"Platform"},{key:"last_seen",label:"Last Seen"},{key:"created",label:"Created"},{key:"current",label:""}]));}export{s as default};//# sourceMappingURL=auth-sessions-ZPMHJBIJ.js.map
2
+ //# sourceMappingURL=auth-sessions-ZPMHJBIJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/auth/auth-sessions.ts"],"names":["authSessions","rows","apiGet","s","formatRelative","formatDate","renderTable"],"mappings":"kMAaA,eAAOA,CAAAA,EAAqD,CAE1D,IAAMC,CAAAA,CAAAA,CAAAA,CADO,MAAMC,CAAAA,CAAoC,wBAAA,CAA0B,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,EACrF,QAAA,EAAY,EAAC,EAAG,GAAA,CAAIC,IAAM,CAC3C,EAAA,CAAIA,CAAAA,CAAE,EAAA,CAAG,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAAI,KAAA,CACvB,OAAQA,CAAAA,CAAE,kBAAA,CAAmB,MAAM,CAAA,CAAG,EAAE,EACxC,QAAA,CAAUA,CAAAA,CAAE,UAAY,SAAA,CACxB,SAAA,CAAWC,EAAeD,CAAAA,CAAE,SAAS,EACrC,OAAA,CAASE,CAAAA,CAAWF,CAAAA,CAAE,UAAU,CAAA,CAChC,OAAA,CAASA,EAAE,OAAA,CAAU,QAAA,CAAM,EAC7B,CAAA,CAAE,CAAA,CACF,QAAQ,GAAA,CAAIG,CAAAA,CAAYL,EAAM,CAC5B,CAAE,IAAK,IAAA,CAAM,KAAA,CAAO,YAAa,CAAA,CACjC,CAAE,IAAK,QAAA,CAAU,KAAA,CAAO,aAAc,CAAA,CACtC,CAAE,GAAA,CAAK,WAAY,KAAA,CAAO,UAAW,EACrC,CAAE,GAAA,CAAK,YAAa,KAAA,CAAO,WAAY,CAAA,CACvC,CAAE,GAAA,CAAK,SAAA,CAAW,MAAO,SAAU,CAAA,CACnC,CAAE,GAAA,CAAK,SAAA,CAAW,MAAO,EAAG,CAC9B,CAAC,CAAC,EACJ","file":"auth-sessions-ALQEGBDS.js","sourcesContent":["import { apiGet } from '../../lib/api/client.js'\nimport { renderTable } from '../../lib/output/table.js'\nimport { formatDate, formatRelative } from '../../lib/utils/format.js'\n\ninterface SessionInfo {\n id: string\n device_fingerprint: string\n platform: string\n last_seen: string\n created_at: string\n current: boolean\n}\n\nexport default async function authSessions(): Promise<void> {\n const data = await apiGet<{ sessions: SessionInfo[] }>('/api/auth/ssp/sessions', { authenticated: true })\n const rows = (data.sessions || []).map(s => ({\n id: s.id.slice(0, 8) + '...',\n device: s.device_fingerprint.slice(0, 12),\n platform: s.platform || 'unknown',\n last_seen: formatRelative(s.last_seen),\n created: formatDate(s.created_at),\n current: s.current ? '●' : '',\n }))\n console.log(renderTable(rows, [\n { key: 'id', label: 'Session ID' },\n { key: 'device', label: 'Fingerprint' },\n { key: 'platform', label: 'Platform' },\n { key: 'last_seen', label: 'Last Seen' },\n { key: 'created', label: 'Created' },\n { key: 'current', label: '' },\n ]))\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/auth/auth-sessions.ts"],"names":["authSessions","rows","apiGet","s","formatRelative","formatDate","renderTable"],"mappings":"kMAaA,eAAOA,CAAAA,EAAqD,CAE1D,IAAMC,CAAAA,CAAAA,CAAAA,CADO,MAAMC,CAAAA,CAAoC,wBAAA,CAA0B,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,EACrF,QAAA,EAAY,EAAC,EAAG,GAAA,CAAIC,IAAM,CAC3C,EAAA,CAAIA,CAAAA,CAAE,EAAA,CAAG,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAAI,KAAA,CACvB,OAAQA,CAAAA,CAAE,kBAAA,CAAmB,MAAM,CAAA,CAAG,EAAE,EACxC,QAAA,CAAUA,CAAAA,CAAE,UAAY,SAAA,CACxB,SAAA,CAAWC,EAAeD,CAAAA,CAAE,SAAS,EACrC,OAAA,CAASE,CAAAA,CAAWF,CAAAA,CAAE,UAAU,CAAA,CAChC,OAAA,CAASA,EAAE,OAAA,CAAU,QAAA,CAAM,EAC7B,CAAA,CAAE,CAAA,CACF,QAAQ,GAAA,CAAIG,CAAAA,CAAYL,EAAM,CAC5B,CAAE,IAAK,IAAA,CAAM,KAAA,CAAO,YAAa,CAAA,CACjC,CAAE,IAAK,QAAA,CAAU,KAAA,CAAO,aAAc,CAAA,CACtC,CAAE,GAAA,CAAK,WAAY,KAAA,CAAO,UAAW,EACrC,CAAE,GAAA,CAAK,YAAa,KAAA,CAAO,WAAY,CAAA,CACvC,CAAE,GAAA,CAAK,SAAA,CAAW,MAAO,SAAU,CAAA,CACnC,CAAE,GAAA,CAAK,SAAA,CAAW,MAAO,EAAG,CAC9B,CAAC,CAAC,EACJ","file":"auth-sessions-ZPMHJBIJ.js","sourcesContent":["import { apiGet } from '../../lib/api/client.js'\nimport { renderTable } from '../../lib/output/table.js'\nimport { formatDate, formatRelative } from '../../lib/utils/format.js'\n\ninterface SessionInfo {\n id: string\n device_fingerprint: string\n platform: string\n last_seen: string\n created_at: string\n current: boolean\n}\n\nexport default async function authSessions(): Promise<void> {\n const data = await apiGet<{ sessions: SessionInfo[] }>('/api/auth/ssp/sessions', { authenticated: true })\n const rows = (data.sessions || []).map(s => ({\n id: s.id.slice(0, 8) + '...',\n device: s.device_fingerprint.slice(0, 12),\n platform: s.platform || 'unknown',\n last_seen: formatRelative(s.last_seen),\n created: formatDate(s.created_at),\n current: s.current ? '●' : '',\n }))\n console.log(renderTable(rows, [\n { key: 'id', label: 'Session ID' },\n { key: 'device', label: 'Fingerprint' },\n { key: 'platform', label: 'Platform' },\n { key: 'last_seen', label: 'Last Seen' },\n { key: 'created', label: 'Created' },\n { key: 'current', label: '' },\n ]))\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {d}from'./chunk-G4JU7IUC.js';import {h,f,m as m$1,l as l$1}from'./chunk-QT7R3AXE.js';import {m,l,r}from'./chunk-4NTVRCZM.js';import e from'chalk';async function u(){let i=await m();i||(h("Not authenticated"),process.exit(1));let f$1=l(),t=i.device_fingerprint===f$1,o=r(i),s=o<=120*1e3;if(f()){m$1({authenticated:true,session_id:i.session_id,expires_in_ms:o,fingerprint_match:t,needs_refresh:s,user:i.user});return}l$1(""),l$1(`${e.bold("Session Health")}`),l$1(`${e.dim("\u2500\u2500\u2500".repeat(15))}`),l$1(` ${e.bold("Session ID:")} ${e.dim(i.session_id)}`),l$1(` ${e.bold("User:")} ${i.user.email} (${i.user.username})`),l$1(` ${e.bold("Plan:")} ${e.hex("#7C4DFF")(i.user.plan)}`),l$1(` ${e.bold("Expires:")} ${o>0?d(o):e.red("expired")}`),l$1(` ${e.bold("Fingerprint:")} ${t?e.green("\u2713 match"):e.red("\u2717 mismatch")}`),l$1(` ${e.bold("Refresh:")} ${s?e.yellow("needed soon"):e.green("ok")}`),l$1("");}export{u as default};//# sourceMappingURL=auth-status-4VVTCDII.js.map
2
- //# sourceMappingURL=auth-status-4VVTCDII.js.map
1
+ import {d}from'./chunk-G4JU7IUC.js';import {h,f,m as m$1,l as l$1}from'./chunk-QT7R3AXE.js';import {m,l,r}from'./chunk-E2I4VVR5.js';import e from'chalk';async function u(){let i=await m();i||(h("Not authenticated"),process.exit(1));let f$1=l(),t=i.device_fingerprint===f$1,o=r(i),s=o<=120*1e3;if(f()){m$1({authenticated:true,session_id:i.session_id,expires_in_ms:o,fingerprint_match:t,needs_refresh:s,user:i.user});return}l$1(""),l$1(`${e.bold("Session Health")}`),l$1(`${e.dim("\u2500\u2500\u2500".repeat(15))}`),l$1(` ${e.bold("Session ID:")} ${e.dim(i.session_id)}`),l$1(` ${e.bold("User:")} ${i.user.email} (${i.user.username})`),l$1(` ${e.bold("Plan:")} ${e.hex("#7C4DFF")(i.user.plan)}`),l$1(` ${e.bold("Expires:")} ${o>0?d(o):e.red("expired")}`),l$1(` ${e.bold("Fingerprint:")} ${t?e.green("\u2713 match"):e.red("\u2717 mismatch")}`),l$1(` ${e.bold("Refresh:")} ${s?e.yellow("needed soon"):e.green("ok")}`),l$1("");}export{u as default};//# sourceMappingURL=auth-status-BZGX7ZXN.js.map
2
+ //# sourceMappingURL=auth-status-BZGX7ZXN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/auth/auth-status.ts"],"names":["authStatus","session","loadSession","logError","currentFingerprint","computeDeviceFingerprint","fingerprintMatch","timeLeft","getTimeUntilExpiry","needsRefresh","isJsonMode","logJSON","logRaw","chalk","formatCountdown"],"mappings":"yJAOA,eAAOA,GAAmD,CACxD,IAAMC,EAAU,MAAMC,CAAAA,GACjBD,CAAAA,GACHE,CAAAA,CAAS,mBAAmB,CAAA,CAC5B,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAGhB,IAAMC,GAAAA,CAAqBC,CAAAA,EAAyB,CAC9CC,CAAAA,CAAmBL,EAAQ,kBAAA,GAAuBG,GAAAA,CAClDG,EAAWC,CAAAA,CAAmBP,CAAO,EACrCQ,CAAAA,CAAeF,CAAAA,EAAY,IAAS,GAAA,CAE1C,GAAIG,GAAW,CAAG,CAChBC,IAAQ,CACN,aAAA,CAAe,KACf,UAAA,CAAYV,CAAAA,CAAQ,UAAA,CACpB,aAAA,CAAeM,EACf,iBAAA,CAAmBD,CAAAA,CACnB,cAAeG,CAAAA,CACf,IAAA,CAAMR,EAAQ,IAChB,CAAC,EACD,MACF,CAEAW,IAAO,EAAE,CAAA,CACTA,IAAO,CAAA,EAAGC,CAAAA,CAAM,KAAK,gBAAgB,CAAC,EAAE,CAAA,CACxCD,GAAAA,CAAO,GAAGC,CAAAA,CAAM,GAAA,CAAI,qBAAM,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAE,EACvCD,GAAAA,CAAO,CAAA,EAAA,EAAKC,EAAM,IAAA,CAAK,aAAa,CAAC,CAAA,IAAA,EAAOA,CAAAA,CAAM,IAAIZ,CAAAA,CAAQ,UAAU,CAAC,CAAA,CAAE,EAC3EW,GAAAA,CAAO,CAAA,EAAA,EAAKC,EAAM,IAAA,CAAK,OAAO,CAAC,CAAA,UAAA,EAAaZ,CAAAA,CAAQ,KAAK,KAAK,CAAA,EAAA,EAAKA,EAAQ,IAAA,CAAK,QAAQ,GAAG,CAAA,CAC3FW,GAAAA,CAAO,KAAKC,CAAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,UAAA,EAAaA,EAAM,GAAA,CAAI,SAAS,EAAEZ,CAAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,EACrFW,GAAAA,CAAO,CAAA,EAAA,EAAKC,EAAM,IAAA,CAAK,UAAU,CAAC,CAAA,OAAA,EAAUN,CAAAA,CAAW,EAAIO,CAAAA,CAAgBP,CAAQ,CAAA,CAAIM,CAAAA,CAAM,IAAI,SAAS,CAAC,EAAE,CAAA,CAC7GD,GAAAA,CAAO,KAAKC,CAAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA,GAAA,EAAMP,EAAmBO,CAAAA,CAAM,KAAA,CAAM,cAAS,CAAA,CAAIA,CAAAA,CAAM,IAAI,iBAAY,CAAC,EAAE,CAAA,CACjHD,GAAAA,CAAO,KAAKC,CAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,OAAA,EAAUJ,EAAeI,CAAAA,CAAM,MAAA,CAAO,aAAa,CAAA,CAAIA,CAAAA,CAAM,MAAM,IAAI,CAAC,EAAE,CAAA,CAC5GD,GAAAA,CAAO,EAAE,EACX","file":"auth-status-4VVTCDII.js","sourcesContent":["import { loadSession, getTimeUntilExpiry } from '../../lib/auth/session.js'\nimport { computeDeviceFingerprint } from '../../lib/auth/fingerprint.js'\nimport { logError, logJSON, logRaw } from '../../lib/output/logger.js'\nimport { isJsonMode } from '../../lib/output/logger.js'\nimport chalk from 'chalk'\nimport { formatCountdown } from '../../lib/utils/format.js'\n\nexport default async function authStatus(): Promise<void> {\n const session = await loadSession()\n if (!session) {\n logError('Not authenticated')\n process.exit(1)\n }\n\n const currentFingerprint = computeDeviceFingerprint()\n const fingerprintMatch = session.device_fingerprint === currentFingerprint\n const timeLeft = getTimeUntilExpiry(session)\n const needsRefresh = timeLeft <= 2 * 60 * 1000\n\n if (isJsonMode()) {\n logJSON({\n authenticated: true,\n session_id: session.session_id,\n expires_in_ms: timeLeft,\n fingerprint_match: fingerprintMatch,\n needs_refresh: needsRefresh,\n user: session.user,\n })\n return\n }\n\n logRaw('')\n logRaw(`${chalk.bold('Session Health')}`)\n logRaw(`${chalk.dim('───'.repeat(15))}`)\n logRaw(` ${chalk.bold('Session ID:')} ${chalk.dim(session.session_id)}`)\n logRaw(` ${chalk.bold('User:')} ${session.user.email} (${session.user.username})`)\n logRaw(` ${chalk.bold('Plan:')} ${chalk.hex('#7C4DFF')(session.user.plan)}`)\n logRaw(` ${chalk.bold('Expires:')} ${timeLeft > 0 ? formatCountdown(timeLeft) : chalk.red('expired')}`)\n logRaw(` ${chalk.bold('Fingerprint:')} ${fingerprintMatch ? chalk.green('✓ match') : chalk.red('✗ mismatch')}`)\n logRaw(` ${chalk.bold('Refresh:')} ${needsRefresh ? chalk.yellow('needed soon') : chalk.green('ok')}`)\n logRaw('')\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/auth/auth-status.ts"],"names":["authStatus","session","loadSession","logError","currentFingerprint","computeDeviceFingerprint","fingerprintMatch","timeLeft","getTimeUntilExpiry","needsRefresh","isJsonMode","logJSON","logRaw","chalk","formatCountdown"],"mappings":"yJAOA,eAAOA,GAAmD,CACxD,IAAMC,EAAU,MAAMC,CAAAA,GACjBD,CAAAA,GACHE,CAAAA,CAAS,mBAAmB,CAAA,CAC5B,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAGhB,IAAMC,GAAAA,CAAqBC,CAAAA,EAAyB,CAC9CC,CAAAA,CAAmBL,EAAQ,kBAAA,GAAuBG,GAAAA,CAClDG,EAAWC,CAAAA,CAAmBP,CAAO,EACrCQ,CAAAA,CAAeF,CAAAA,EAAY,IAAS,GAAA,CAE1C,GAAIG,GAAW,CAAG,CAChBC,IAAQ,CACN,aAAA,CAAe,KACf,UAAA,CAAYV,CAAAA,CAAQ,UAAA,CACpB,aAAA,CAAeM,EACf,iBAAA,CAAmBD,CAAAA,CACnB,cAAeG,CAAAA,CACf,IAAA,CAAMR,EAAQ,IAChB,CAAC,EACD,MACF,CAEAW,IAAO,EAAE,CAAA,CACTA,IAAO,CAAA,EAAGC,CAAAA,CAAM,KAAK,gBAAgB,CAAC,EAAE,CAAA,CACxCD,GAAAA,CAAO,GAAGC,CAAAA,CAAM,GAAA,CAAI,qBAAM,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAE,EACvCD,GAAAA,CAAO,CAAA,EAAA,EAAKC,EAAM,IAAA,CAAK,aAAa,CAAC,CAAA,IAAA,EAAOA,CAAAA,CAAM,IAAIZ,CAAAA,CAAQ,UAAU,CAAC,CAAA,CAAE,EAC3EW,GAAAA,CAAO,CAAA,EAAA,EAAKC,EAAM,IAAA,CAAK,OAAO,CAAC,CAAA,UAAA,EAAaZ,CAAAA,CAAQ,KAAK,KAAK,CAAA,EAAA,EAAKA,EAAQ,IAAA,CAAK,QAAQ,GAAG,CAAA,CAC3FW,GAAAA,CAAO,KAAKC,CAAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,UAAA,EAAaA,EAAM,GAAA,CAAI,SAAS,EAAEZ,CAAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,EACrFW,GAAAA,CAAO,CAAA,EAAA,EAAKC,EAAM,IAAA,CAAK,UAAU,CAAC,CAAA,OAAA,EAAUN,CAAAA,CAAW,EAAIO,CAAAA,CAAgBP,CAAQ,CAAA,CAAIM,CAAAA,CAAM,IAAI,SAAS,CAAC,EAAE,CAAA,CAC7GD,GAAAA,CAAO,KAAKC,CAAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA,GAAA,EAAMP,EAAmBO,CAAAA,CAAM,KAAA,CAAM,cAAS,CAAA,CAAIA,CAAAA,CAAM,IAAI,iBAAY,CAAC,EAAE,CAAA,CACjHD,GAAAA,CAAO,KAAKC,CAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,OAAA,EAAUJ,EAAeI,CAAAA,CAAM,MAAA,CAAO,aAAa,CAAA,CAAIA,CAAAA,CAAM,MAAM,IAAI,CAAC,EAAE,CAAA,CAC5GD,GAAAA,CAAO,EAAE,EACX","file":"auth-status-BZGX7ZXN.js","sourcesContent":["import { loadSession, getTimeUntilExpiry } from '../../lib/auth/session.js'\nimport { computeDeviceFingerprint } from '../../lib/auth/fingerprint.js'\nimport { logError, logJSON, logRaw } from '../../lib/output/logger.js'\nimport { isJsonMode } from '../../lib/output/logger.js'\nimport chalk from 'chalk'\nimport { formatCountdown } from '../../lib/utils/format.js'\n\nexport default async function authStatus(): Promise<void> {\n const session = await loadSession()\n if (!session) {\n logError('Not authenticated')\n process.exit(1)\n }\n\n const currentFingerprint = computeDeviceFingerprint()\n const fingerprintMatch = session.device_fingerprint === currentFingerprint\n const timeLeft = getTimeUntilExpiry(session)\n const needsRefresh = timeLeft <= 2 * 60 * 1000\n\n if (isJsonMode()) {\n logJSON({\n authenticated: true,\n session_id: session.session_id,\n expires_in_ms: timeLeft,\n fingerprint_match: fingerprintMatch,\n needs_refresh: needsRefresh,\n user: session.user,\n })\n return\n }\n\n logRaw('')\n logRaw(`${chalk.bold('Session Health')}`)\n logRaw(`${chalk.dim('───'.repeat(15))}`)\n logRaw(` ${chalk.bold('Session ID:')} ${chalk.dim(session.session_id)}`)\n logRaw(` ${chalk.bold('User:')} ${session.user.email} (${session.user.username})`)\n logRaw(` ${chalk.bold('Plan:')} ${chalk.hex('#7C4DFF')(session.user.plan)}`)\n logRaw(` ${chalk.bold('Expires:')} ${timeLeft > 0 ? formatCountdown(timeLeft) : chalk.red('expired')}`)\n logRaw(` ${chalk.bold('Fingerprint:')} ${fingerprintMatch ? chalk.green('✓ match') : chalk.red('✗ mismatch')}`)\n logRaw(` ${chalk.bold('Refresh:')} ${needsRefresh ? chalk.yellow('needed soon') : chalk.green('ok')}`)\n logRaw('')\n}\n"]}
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import'../chunk-FYFPDKJM.js';import {a}from'../chunk-BC2OVPRV.js';import'../chunk-NDB6KXYI.js';import'../chunk-THMWE2I6.js';import {e,d,h,n}from'../chunk-QT7R3AXE.js';import {m,q}from'../chunk-4NTVRCZM.js';import {Command}from'commander';var A=[{name:"login",aliases:[],description:"Authenticate with SquidCloud",requiresAuth:false,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"auth",handler:()=>import('../login-SO6BZ4HE.js')},{name:"logout",aliases:[],description:"End current CLI session and clear credentials",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"auth",handler:()=>import('../logout-QERO6G6B.js')},{name:"whoami",aliases:["auth whoami"],description:"Show current authenticated account info",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"auth",handler:()=>import('../whoami-SAURQARO.js')},{name:"auth status",aliases:[],description:"Detailed session health check",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"auth",handler:()=>import('../auth-status-4VVTCDII.js')},{name:"auth sessions",aliases:[],description:"List all active CLI sessions",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"auth",handler:()=>import('../auth-sessions-ALQEGBDS.js')},{name:"auth revoke",aliases:[],description:"Revoke a session or all sessions",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"destructive",category:"auth",handler:()=>import('../auth-revoke-I5FM6N2S.js')},{name:"storage ls",aliases:["storage list"],description:"List files and folders in storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-ls-7RZQ3AXR.js')},{name:"storage upload",aliases:["storage up"],description:"Upload files or folders to storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-upload-5M6PBHOC.js')},{name:"storage download",aliases:["storage dl"],description:"Download files or folders from storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-download-5OYCNXKL.js')},{name:"storage cp",aliases:[],description:"Copy files within storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-cp-JTPTXZRQ.js')},{name:"storage mv",aliases:[],description:"Move/rename files within storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"storage",handler:()=>import('../storage-mv-XQ7EPX3M.js')},{name:"storage rm",aliases:[],description:"Delete files from storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"storage",handler:()=>import('../storage-rm-LYO6UR3G.js')},{name:"storage mkdir",aliases:[],description:"Create a folder in storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-mkdir-NWOHGAQI.js')},{name:"storage cat",aliases:[],description:"Print file contents to terminal",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-cat-HXFOJJG5.js')},{name:"storage info",aliases:[],description:"Show file metadata",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-info-WA74POPR.js')},{name:"storage share",aliases:[],description:"Generate a share link for a file",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-share-OURRQWZK.js')},{name:"storage unshare",aliases:[],description:"Revoke all share links for a file",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"storage",handler:()=>import('../storage-unshare-3DXEKHEH.js')},{name:"storage tag",aliases:[],description:"Add or remove file tags",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-tag-NGJGUJSZ.js')},{name:"storage search",aliases:[],description:"Search storage by filename",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-search-RIT5ISCA.js')},{name:"storage diff",aliases:[],description:"Compare local and remote storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-diff-XURHVTPC.js')},{name:"storage clean",aliases:[],description:"Clean orphaned files from storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"storage",handler:()=>import('../storage-clean-LEQEYWL6.js')},{name:"deploy",aliases:["squidsite deploy"],description:"Deploy a static website to SquidCloud Sites",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"deploy",handler:()=>import('../deploy-X5HX7V4J.js')},{name:"sites list",aliases:["sites ls"],description:"List all published sites",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-list-LLULSE5J.js')},{name:"sites info",aliases:[],description:"Show site details",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-info-BZUK57TH.js')},{name:"sites open",aliases:[],description:"Open site in browser",requiresAuth:true,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-open-R7A5EQWM.js')},{name:"sites unpublish",aliases:[],description:"Take a site offline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"sites",handler:()=>import('../sites-unpublish-6P7SQGIU.js')},{name:"sites delete",aliases:[],description:"Permanently delete a site",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"sites",handler:()=>import('../sites-delete-SUHEQDZQ.js')},{name:"sites visibility",aliases:[],description:"Change site visibility (public/private)",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"sites",handler:()=>import('../sites-visibility-R3AQJ76F.js')},{name:"sites rename",aliases:[],description:"Rename a site slug",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"sites",handler:()=>import('../sites-rename-MOO6HVW3.js')},{name:"sites rollback",aliases:[],description:"Rollback to a previous deployment",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"sites",handler:()=>import('../sites-rollback-SPW2Z73L.js')},{name:"sites deploys",aliases:[],description:"Show deployment history",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-deploys-C4TVID2W.js')},{name:"sites logs",aliases:[],description:"Stream live site access logs",requiresAuth:true,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-logs-NILNXF4L.js')},{name:"sites analytics",aliases:[],description:"Show site traffic analytics",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-analytics-JK4UFMWX.js')},{name:"sites purge",aliases:[],description:"Purge CDN cache for a site",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"sites",handler:()=>import('../sites-purge-VHERQRUB.js')},{name:"scripts list",aliases:[],description:"List registered SquidScripts",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-list-YPFNLI3P.js')},{name:"scripts run",aliases:[],description:"Run a SquidScript pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-run-3NBYKEMQ.js')},{name:"scripts logs",aliases:[],description:"View pipeline run logs",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-logs-VISO5ONQ.js')},{name:"scripts validate",aliases:[],description:"Validate a .squid.yml file",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-validate-JZPIIMIX.js')},{name:"scripts init",aliases:[],description:"Create a new pipeline interactively",requiresAuth:true,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-init-AU6WNMKB.js')},{name:"scripts enable",aliases:[],description:"Enable a disabled pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-enable-JVAA6AMP.js')},{name:"scripts disable",aliases:[],description:"Disable a pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"scripts",handler:()=>import('../scripts-disable-JPATOVO4.js')},{name:"scripts delete",aliases:[],description:"Delete a pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"scripts",handler:()=>import('../scripts-delete-274TW63X.js')},{name:"scripts status",aliases:[],description:"Show pipeline status",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-status-45K3IL5L.js')},{name:"scripts cancel",aliases:[],description:"Cancel a running pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"scripts",handler:()=>import('../scripts-cancel-JS3LL2AT.js')},{name:"scripts watch",aliases:[],description:"Watch .squid.yml for changes",requiresAuth:false,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-watch-XZ7MZIMK.js')},{name:"filereq list",aliases:["forms list","filereq ls"],description:"List file requests",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-list-W2UUPFFD.js')},{name:"filereq create",aliases:["forms create"],description:"Create a file request",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-create-CWC7MGOJ.js')},{name:"filereq info",aliases:["forms info"],description:"View file request details",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-info-SUST47TN.js')},{name:"filereq submissions",aliases:["forms submissions"],description:"View file request submissions",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-submissions-UTLSYPWS.js')},{name:"filereq export",aliases:["forms export"],description:"Export submissions as CSV",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-export-5ZNEL3V2.js')},{name:"filereq clear",aliases:["forms clear"],description:"Clear all submissions",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"forms",handler:()=>import('../forms-clear-UJ23UHUN.js')},{name:"filereq delete",aliases:["forms delete"],description:"Delete a file request",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"forms",handler:()=>import('../forms-delete-TKHTM6L5.js')},{name:"filereq embed",aliases:["forms embed"],description:"Get HTML embed snippet",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-embed-FF3VMR4M.js')},{name:"time lock",aliases:[],description:"Time-lock a file or folder",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"time",handler:()=>import('../time-lock-2OLEVQPJ.js')},{name:"time unlock",aliases:[],description:"Unlock a time-locked file",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"time",handler:()=>import('../time-unlock-OO6QH5R6.js')},{name:"time status",aliases:[],description:"Check time-lock status",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"time",handler:()=>import('../time-status-TVNJBFKC.js')},{name:"time list",aliases:[],description:"List all time-locked files",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"time",handler:()=>import('../time-list-GMZYZAOU.js')},{name:"time proof",aliases:[],description:"Export cryptographic existence proof",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"time",handler:()=>import('../time-proof-RUTDAEKP.js')},{name:"collab invite",aliases:[],description:"Invite a collaborator to a folder",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"collab",handler:()=>import('../collab-invite-HAMMPEAQ.js')},{name:"collab list",aliases:[],description:"List folder collaborators",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"collab",handler:()=>import('../collab-list-JV4ZCWLB.js')},{name:"collab remove",aliases:[],description:"Remove a collaborator",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"collab",handler:()=>import('../collab-remove-DO4BIA5R.js')},{name:"collab activity",aliases:[],description:"View collaborator activity feed",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"collab",handler:()=>import('../collab-activity-5RK36CJW.js')},{name:"collab leave",aliases:[],description:"Leave a shared folder",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"collab",handler:()=>import('../collab-leave-MTCXHQ4T.js')},{name:"collab transfer",aliases:[],description:"Transfer folder ownership",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"collab",handler:()=>import('../collab-transfer-6CG5PHVC.js')},{name:"sign request",aliases:[],description:"Request a digital signature",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-request-VVFYWT3Y.js')},{name:"sign status",aliases:[],description:"Check signing request status",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-status-LKG5UFBX.js')},{name:"sign list",aliases:[],description:"List signing requests",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-list-FV7SQSWT.js')},{name:"sign cancel",aliases:[],description:"Cancel a signing request",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"sign",handler:()=>import('../sign-cancel-OUJM5UZT.js')},{name:"sign verify",aliases:[],description:"Verify a signed document",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-verify-CVTTJSDL.js')},{name:"sign download",aliases:[],description:"Download signed document",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-download-FS5G6J27.js')},{name:"monitor",aliases:[],description:"At-a-glance SquidCloud health dashboard",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-DKLGO5H7.js')},{name:"monitor sites",aliases:[],description:"Site health overview",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-sites-QIVG5TPF.js')},{name:"monitor pipelines",aliases:[],description:"Pipeline health overview",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-pipelines-EPL24J3S.js')},{name:"monitor storage",aliases:[],description:"Storage health report",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-storage-HBCC34K7.js')},{name:"monitor automations",aliases:[],description:"Automation health overview",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-automations-4XOOCRFY.js')},{name:"logs tail",aliases:[],description:"Stream live logs",requiresAuth:true,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"logs",handler:()=>import('../logs-tail-J64TCZG5.js')},{name:"logs search",aliases:[],description:"Search historical logs",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"logs",handler:()=>import('../logs-search-323KRPG4.js')},{name:"logs export",aliases:[],description:"Export logs as JSONL or CSV",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"logs",handler:()=>import('../logs-export-DYOPV2LT.js')},{name:"doctor",aliases:[],description:"Run system diagnostics",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../doctor-RSKBJYUX.js')},{name:"version",aliases:["--version","-v"],description:"Show CLI version",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../version-LHSDYI7Q.js')},{name:"config list",aliases:["config ls"],description:"List CLI configuration",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../config-7G24FXQJ.js')},{name:"config set",aliases:[],description:"Set a config value",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../config-set-O6JKOGGN.js')},{name:"config get",aliases:[],description:"Get a config value",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../config-get-DDNSM5EH.js')},{name:"config delete",aliases:[],description:"Delete a config value",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../config-delete-VSIFFODZ.js')},{name:"config reset",aliases:[],description:"Reset all configuration",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"utility",handler:()=>import('../config-reset-ZFMP4J5H.js')},{name:"completion",aliases:[],description:"Generate shell completion scripts",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"utility",handler:()=>import('../completion-IF3NB7PB.js')},{name:"feedback",aliases:[],description:"Submit feedback or report a bug",requiresAuth:false,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"utility",handler:()=>import('../feedback-QUGQAWZB.js')},{name:"update",aliases:[],description:"Update the CLI to latest version",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../update-XJQSXSFU.js')}];function v(){return [...A]}var p=new Command,y={version:"1.0.0",description:"SquidCloud CLI \u2014 static sites, storage, pipelines, and more."};p.name("squidcloud").description(y.description).version(y.version,"-v, --version","Display CLI version").option("--output <format>","Output format (json)","text").hook("preAction",async e$1=>{e$1.optsWithGlobals().output==="json"&&e(true),d()&&e(false);});async function L(e){if(!e.requiresAuth)return;let s=await m();s||(h("Not authenticated. Run `squidcloud login` first."),process.exit(1)),q(s)&&(await a()||(h("Session expired. Please run `squidcloud login` again."),process.exit(1)));}function C(e){let s=new Map;for(let r of e){let u=r.name.split(" ");if(u.length===1)s.set(r.name,new Map);else if(u.length===2){let[t,o]=u;s.has(t)||s.set(t,new Map),s.get(t).set(o,r);}}for(let[r,u]of s)if(u.size===0){let t=e.find(a=>a.name===r),o=p.command(r);o.description(t.description),t.aliases.length>0&&o.aliases(t.aliases),o.action(async(...a)=>{try{await L(t);let i=await t.handler();if(typeof i.default=="function"){let n=a.slice(0,-2);await i.default(...n);}n(t.name,process.argv.slice(2).join(" "),0);}catch(i){let n$1=i instanceof Error?i.message:String(i);h(n$1),n(t.name,process.argv.slice(2).join(" "),1),process.exit(1);}});}else {let t=p.command(r);t.description(`SquidCloud ${r} commands`);for(let[o,a]of u){let i=`${r} ${o}`,n$1=t.command(o);n$1.description(a.description),a.aliases.length>0&&n$1.aliases(a.aliases.map(f=>f.replace(`${r} `,""))),n$1.action(async(...f)=>{try{await L(a);let l=await a.handler();if(typeof l.default=="function"){let m=f.slice(0,-2);await l.default(...m);}n(i,process.argv.slice(2).join(" "),0);}catch(l){let m=l instanceof Error?l.message:String(l);h(m),n(i,process.argv.slice(2).join(" "),1),process.exit(1);}});}}}async function b(){let e=process.argv.slice(2);if(e.includes("--version")||e.includes("-v")){let{showVersion:r}=await import('../version-LHSDYI7Q.js');await r();return}if(e.length===0&&!e.includes("--help")&&!e.includes("-h")){let{showVersion:r}=await import('../version-LHSDYI7Q.js');await r(),console.log(""),p.outputHelp();return}let s=v();C(s),p.addHelpText("beforeAll",`
2
+ import'../chunk-FYFPDKJM.js';import {a}from'../chunk-RXARHDCW.js';import'../chunk-NDB6KXYI.js';import'../chunk-THMWE2I6.js';import {e,d,h,n}from'../chunk-QT7R3AXE.js';import {m,q}from'../chunk-E2I4VVR5.js';import {Command}from'commander';var A=[{name:"login",aliases:[],description:"Authenticate with SquidCloud",requiresAuth:false,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"auth",handler:()=>import('../login-CG7LSZMB.js')},{name:"logout",aliases:[],description:"End current CLI session and clear credentials",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"auth",handler:()=>import('../logout-HGLROFNP.js')},{name:"whoami",aliases:["auth whoami"],description:"Show current authenticated account info",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"auth",handler:()=>import('../whoami-2ABU6JQD.js')},{name:"auth status",aliases:[],description:"Detailed session health check",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"auth",handler:()=>import('../auth-status-BZGX7ZXN.js')},{name:"auth sessions",aliases:[],description:"List all active CLI sessions",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"auth",handler:()=>import('../auth-sessions-ZPMHJBIJ.js')},{name:"auth revoke",aliases:[],description:"Revoke a session or all sessions",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"destructive",category:"auth",handler:()=>import('../auth-revoke-B2JBJB36.js')},{name:"storage ls",aliases:["storage list"],description:"List files and folders in storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-ls-KE7UDC3I.js')},{name:"storage upload",aliases:["storage up"],description:"Upload files or folders to storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-upload-LA2VFTEN.js')},{name:"storage download",aliases:["storage dl"],description:"Download files or folders from storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-download-6OZCB7M4.js')},{name:"storage cp",aliases:[],description:"Copy files within storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-cp-XM6KPPDU.js')},{name:"storage mv",aliases:[],description:"Move/rename files within storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"storage",handler:()=>import('../storage-mv-3NQNRFPE.js')},{name:"storage rm",aliases:[],description:"Delete files from storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"storage",handler:()=>import('../storage-rm-EF36YTVT.js')},{name:"storage mkdir",aliases:[],description:"Create a folder in storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-mkdir-YR6DI3T6.js')},{name:"storage cat",aliases:[],description:"Print file contents to terminal",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-cat-NMDWAEM4.js')},{name:"storage info",aliases:[],description:"Show file metadata",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-info-ZD6LDRFG.js')},{name:"storage share",aliases:[],description:"Generate a share link for a file",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-share-VK5Z3IRP.js')},{name:"storage unshare",aliases:[],description:"Revoke all share links for a file",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"storage",handler:()=>import('../storage-unshare-NAVNQCKH.js')},{name:"storage tag",aliases:[],description:"Add or remove file tags",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-tag-VMF6QLSU.js')},{name:"storage search",aliases:[],description:"Search storage by filename",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-search-73OT4DNB.js')},{name:"storage diff",aliases:[],description:"Compare local and remote storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"storage",handler:()=>import('../storage-diff-2UTHBORN.js')},{name:"storage clean",aliases:[],description:"Clean orphaned files from storage",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"storage",handler:()=>import('../storage-clean-6S5GP2AR.js')},{name:"deploy",aliases:["squidsite deploy"],description:"Deploy a static website to SquidCloud Sites",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"deploy",handler:()=>import('../deploy-3AMFZQ7I.js')},{name:"sites list",aliases:["sites ls"],description:"List all published sites",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-list-AESG52QR.js')},{name:"sites info",aliases:[],description:"Show site details",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-info-55Y5G46C.js')},{name:"sites open",aliases:[],description:"Open site in browser",requiresAuth:true,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-open-6FLQLGDU.js')},{name:"sites unpublish",aliases:[],description:"Take a site offline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"sites",handler:()=>import('../sites-unpublish-77EWOZI6.js')},{name:"sites delete",aliases:[],description:"Permanently delete a site",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"sites",handler:()=>import('../sites-delete-T5H6QHHE.js')},{name:"sites visibility",aliases:[],description:"Change site visibility (public/private)",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"sites",handler:()=>import('../sites-visibility-E6MDL2R5.js')},{name:"sites rename",aliases:[],description:"Rename a site slug",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"sites",handler:()=>import('../sites-rename-JJPIKOEV.js')},{name:"sites rollback",aliases:[],description:"Rollback to a previous deployment",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"sites",handler:()=>import('../sites-rollback-LG76J5XE.js')},{name:"sites deploys",aliases:[],description:"Show deployment history",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-deploys-AGHGIVLV.js')},{name:"sites logs",aliases:[],description:"Stream live site access logs",requiresAuth:true,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-logs-CLJ35QZF.js')},{name:"sites analytics",aliases:[],description:"Show site traffic analytics",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sites",handler:()=>import('../sites-analytics-5U7LPRGD.js')},{name:"sites purge",aliases:[],description:"Purge CDN cache for a site",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"sites",handler:()=>import('../sites-purge-3EE6M54Y.js')},{name:"scripts list",aliases:[],description:"List registered SquidScripts",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-list-CWCKTE6G.js')},{name:"scripts run",aliases:[],description:"Run a SquidScript pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-run-D5WQF7CD.js')},{name:"scripts logs",aliases:[],description:"View pipeline run logs",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-logs-BFI7ZBMA.js')},{name:"scripts validate",aliases:[],description:"Validate a .squid.yml file",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-validate-GFEEMXGM.js')},{name:"scripts init",aliases:[],description:"Create a new pipeline interactively",requiresAuth:true,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-init-AU6WNMKB.js')},{name:"scripts enable",aliases:[],description:"Enable a disabled pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-enable-MEC2YFAZ.js')},{name:"scripts disable",aliases:[],description:"Disable a pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"scripts",handler:()=>import('../scripts-disable-GQCO7Z2O.js')},{name:"scripts delete",aliases:[],description:"Delete a pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"scripts",handler:()=>import('../scripts-delete-GDPLFXWI.js')},{name:"scripts status",aliases:[],description:"Show pipeline status",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-status-H3DZSNGH.js')},{name:"scripts cancel",aliases:[],description:"Cancel a running pipeline",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"scripts",handler:()=>import('../scripts-cancel-NOVNOP4C.js')},{name:"scripts watch",aliases:[],description:"Watch .squid.yml for changes",requiresAuth:false,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"scripts",handler:()=>import('../scripts-watch-YNPV5J7L.js')},{name:"filereq list",aliases:["forms list","filereq ls"],description:"List file requests",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-list-GYBKM5YD.js')},{name:"filereq create",aliases:["forms create"],description:"Create a file request",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-create-EWU47AIO.js')},{name:"filereq info",aliases:["forms info"],description:"View file request details",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-info-BRG5D5D7.js')},{name:"filereq submissions",aliases:["forms submissions"],description:"View file request submissions",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-submissions-RKNVL2FS.js')},{name:"filereq export",aliases:["forms export"],description:"Export submissions as CSV",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-export-KLFI4NJ7.js')},{name:"filereq clear",aliases:["forms clear"],description:"Clear all submissions",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"forms",handler:()=>import('../forms-clear-BFDMRIWW.js')},{name:"filereq delete",aliases:["forms delete"],description:"Delete a file request",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"forms",handler:()=>import('../forms-delete-HJISSH4G.js')},{name:"filereq embed",aliases:["forms embed"],description:"Get HTML embed snippet",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"forms",handler:()=>import('../forms-embed-GSIGC4V7.js')},{name:"time lock",aliases:[],description:"Time-lock a file or folder",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"time",handler:()=>import('../time-lock-L4PL43SC.js')},{name:"time unlock",aliases:[],description:"Unlock a time-locked file",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"time",handler:()=>import('../time-unlock-UPHP5V74.js')},{name:"time status",aliases:[],description:"Check time-lock status",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"time",handler:()=>import('../time-status-M4QX6GTM.js')},{name:"time list",aliases:[],description:"List all time-locked files",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"time",handler:()=>import('../time-list-4FAFRADD.js')},{name:"time proof",aliases:[],description:"Export cryptographic existence proof",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"time",handler:()=>import('../time-proof-ZOOUFIKS.js')},{name:"collab invite",aliases:[],description:"Invite a collaborator to a folder",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"collab",handler:()=>import('../collab-invite-6QGPY7SO.js')},{name:"collab list",aliases:[],description:"List folder collaborators",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"collab",handler:()=>import('../collab-list-AQUFYKGI.js')},{name:"collab remove",aliases:[],description:"Remove a collaborator",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"collab",handler:()=>import('../collab-remove-CJSQYEUI.js')},{name:"collab activity",aliases:[],description:"View collaborator activity feed",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"collab",handler:()=>import('../collab-activity-LEPWGNXB.js')},{name:"collab leave",aliases:[],description:"Leave a shared folder",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"collab",handler:()=>import('../collab-leave-YMTEY2CZ.js')},{name:"collab transfer",aliases:[],description:"Transfer folder ownership",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"collab",handler:()=>import('../collab-transfer-I6O6T3AC.js')},{name:"sign request",aliases:[],description:"Request a digital signature",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-request-KDWRY6NM.js')},{name:"sign status",aliases:[],description:"Check signing request status",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-status-IHMHFX4R.js')},{name:"sign list",aliases:[],description:"List signing requests",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-list-G5SAZIGV.js')},{name:"sign cancel",aliases:[],description:"Cancel a signing request",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"caution",category:"sign",handler:()=>import('../sign-cancel-65ENAT3A.js')},{name:"sign verify",aliases:[],description:"Verify a signed document",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-verify-6GZYRRYD.js')},{name:"sign download",aliases:[],description:"Download signed document",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"sign",handler:()=>import('../sign-download-DRG6AEW7.js')},{name:"monitor",aliases:[],description:"At-a-glance SquidCloud health dashboard",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-IEQ4UD2H.js')},{name:"monitor sites",aliases:[],description:"Site health overview",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-sites-GN2CSO6K.js')},{name:"monitor pipelines",aliases:[],description:"Pipeline health overview",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-pipelines-FVASSAV4.js')},{name:"monitor storage",aliases:[],description:"Storage health report",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-storage-XBPKQTPJ.js')},{name:"monitor automations",aliases:[],description:"Automation health overview",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"monitor",handler:()=>import('../monitor-automations-4UNPGIZG.js')},{name:"logs tail",aliases:[],description:"Stream live logs",requiresAuth:true,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"logs",handler:()=>import('../logs-tail-K4CWSSGP.js')},{name:"logs search",aliases:[],description:"Search historical logs",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"logs",handler:()=>import('../logs-search-P52C7PUZ.js')},{name:"logs export",aliases:[],description:"Export logs as JSONL or CSV",requiresAuth:true,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"logs",handler:()=>import('../logs-export-547MGHOL.js')},{name:"doctor",aliases:[],description:"Run system diagnostics",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../doctor-DAYHBLCK.js')},{name:"version",aliases:["--version","-v"],description:"Show CLI version",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../version-LHSDYI7Q.js')},{name:"config list",aliases:["config ls"],description:"List CLI configuration",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../config-7G24FXQJ.js')},{name:"config set",aliases:[],description:"Set a config value",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../config-set-O6JKOGGN.js')},{name:"config get",aliases:[],description:"Get a config value",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../config-get-DDNSM5EH.js')},{name:"config delete",aliases:[],description:"Delete a config value",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../config-delete-VSIFFODZ.js')},{name:"config reset",aliases:[],description:"Reset all configuration",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"destructive",category:"utility",handler:()=>import('../config-reset-ZFMP4J5H.js')},{name:"completion",aliases:[],description:"Generate shell completion scripts",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:false,dangerLevel:"safe",category:"utility",handler:()=>import('../completion-IF3NB7PB.js')},{name:"feedback",aliases:[],description:"Submit feedback or report a bug",requiresAuth:false,requiresProject:false,ciSafe:false,jsonSupport:false,dangerLevel:"safe",category:"utility",handler:()=>import('../feedback-QUGQAWZB.js')},{name:"update",aliases:[],description:"Update the CLI to latest version",requiresAuth:false,requiresProject:false,ciSafe:true,jsonSupport:true,dangerLevel:"safe",category:"utility",handler:()=>import('../update-XJQSXSFU.js')}];function v(){return [...A]}var p=new Command,y={version:"1.0.0",description:"SquidCloud CLI \u2014 static sites, storage, pipelines, and more."};p.name("squidcloud").description(y.description).version(y.version,"-v, --version","Display CLI version").option("--output <format>","Output format (json)","text").hook("preAction",async e$1=>{e$1.optsWithGlobals().output==="json"&&e(true),d()&&e(false);});async function L(e){if(!e.requiresAuth)return;let s=await m();s||(h("Not authenticated. Run `squidcloud login` first."),process.exit(1)),q(s)&&(await a()||(h("Session expired. Please run `squidcloud login` again."),process.exit(1)));}function C(e){let s=new Map;for(let r of e){let u=r.name.split(" ");if(u.length===1)s.set(r.name,new Map);else if(u.length===2){let[t,o]=u;s.has(t)||s.set(t,new Map),s.get(t).set(o,r);}}for(let[r,u]of s)if(u.size===0){let t=e.find(a=>a.name===r),o=p.command(r);o.description(t.description),t.aliases.length>0&&o.aliases(t.aliases),o.action(async(...a)=>{try{await L(t);let i=await t.handler();if(typeof i.default=="function"){let n=a.slice(0,-2);await i.default(...n);}n(t.name,process.argv.slice(2).join(" "),0);}catch(i){let n$1=i instanceof Error?i.message:String(i);h(n$1),n(t.name,process.argv.slice(2).join(" "),1),process.exit(1);}});}else {let t=p.command(r);t.description(`SquidCloud ${r} commands`);for(let[o,a]of u){let i=`${r} ${o}`,n$1=t.command(o);n$1.description(a.description),a.aliases.length>0&&n$1.aliases(a.aliases.map(f=>f.replace(`${r} `,""))),n$1.action(async(...f)=>{try{await L(a);let l=await a.handler();if(typeof l.default=="function"){let m=f.slice(0,-2);await l.default(...m);}n(i,process.argv.slice(2).join(" "),0);}catch(l){let m=l instanceof Error?l.message:String(l);h(m),n(i,process.argv.slice(2).join(" "),1),process.exit(1);}});}}}async function b(){let e=process.argv.slice(2);if(e.includes("--version")||e.includes("-v")){let{showVersion:r}=await import('../version-LHSDYI7Q.js');await r();return}if(e.length===0&&!e.includes("--help")&&!e.includes("-h")){let{showVersion:r}=await import('../version-LHSDYI7Q.js');await r(),console.log(""),p.outputHelp();return}let s=v();C(s),p.addHelpText("beforeAll",`
3
3
  `),await p.parseAsync(process.argv);}b().catch(e=>{h(e instanceof Error?e.message:String(e)),process.exit(1);});//# sourceMappingURL=squidcloud.js.map
4
4
  //# sourceMappingURL=squidcloud.js.map
@@ -0,0 +1,2 @@
1
+ import s from'os';import S from'path';import a,{existsSync,readFileSync}from'fs';import {concatBytes,randomBytes}from'@noble/hashes/utils';import {sha256}from'@noble/hashes/sha256';import {hkdf}from'@noble/hashes/hkdf';import {gcm}from'@noble/ciphers/aes';import {utils,getPublicKey,verify}from'@noble/ed25519';import {x25519}from'@noble/curves/ed25519.js';import {sha512}from'@noble/hashes/sha512';import {hmac}from'@noble/hashes/hmac';import {blake3}from'@noble/hashes/blake3';import {pbkdf2Sync,createHash}from'crypto';utils.sha512Sync=(...t)=>sha512(concatBytes(...t));var I="squidcloud-session-v1";function ot(){let t=utils.randomPrivateKey();return {pub:getPublicKey(t),priv:t}}function st(){return randomBytes(32)}function at(t,r){let e=Buffer.from(r.slice(0,32).padEnd(32,"\0"));return pbkdf2Sync(t,e,1e5,32,"sha512")}function ct(t,r,e,n){let i=new Uint8Array(t.length+r.length+e.length+8);i.set(t,0),i.set(r,t.length),i.set(e,t.length+r.length);let o=new Uint8Array(8);return new DataView(o.buffer).setBigUint64(0,BigInt(n),false),i.set(o,t.length+r.length+e.length),blake3(i)}function ut(t,r){return x25519.getSharedSecret(r,t)}function pt(t,r,e){let n=new Uint8Array(r.length+e.length);return n.set(r,0),n.set(e,r.length),hkdf(sha256,t,n,I,32)}function mt(t,r,e,n){let i=new Uint8Array(t.length+e.length);i.set(t,0),i.set(e,t.length);let m=gcm(n,r).decrypt(i);return JSON.parse(new TextDecoder().decode(m))}function ft(t,r,e){return verify(t,r,e)}function yt(t,r){return Buffer.from(hmac(sha256,t,r)).toString("hex")}function c(t){return Buffer.from(t).toString("hex")}function f(t){return new Uint8Array(Buffer.from(t,"hex"))}var J=["/etc/machine-id","/var/lib/dbus/machine-id","/etc/hostid"];function L(){for(let r of J)try{if(existsSync(r))return readFileSync(r,"utf-8").trim()}catch{continue}return createHash("sha256").update(s.hostname()+s.arch()+s.platform()).digest("hex")}function l(){let e=[L(),s.hostname(),s.platform(),s.arch(),s.release()].join(":");return c(blake3(e))}var y=S.join(s.homedir(),".squidcloud"),u=S.join(y,".session");function x(){let t=l(),r=new TextEncoder().encode(t);return hkdf(sha256,r,new Uint8Array(32),"squidcloud-fallback-v1",32)}async function A(t){let r=x(),e=randomBytes(12),n=new TextEncoder().encode(t),o=gcm(r,e).encrypt(n);a.existsSync(y)||a.mkdirSync(y,{recursive:true,mode:448});let m={iv:c(e),data:c(o)};a.writeFileSync(u,JSON.stringify(m),{mode:384,encoding:"utf-8"});}async function U(){try{if(!a.existsSync(u))return null;let t=a.readFileSync(u,"utf-8"),{iv:r,data:e}=JSON.parse(t),n=x(),o=gcm(n,f(r)).decrypt(f(e));return new TextDecoder().decode(o)}catch{return null}}async function p(){try{a.existsSync(u)&&a.unlinkSync(u);}catch{}}async function It(){try{let t=await U();if(!t)return null;let r=JSON.parse(t);return !r.session_id||!r.access_token?(await p(),null):r}catch{return await p(),null}}async function Et(t){await A(JSON.stringify(t));}async function Ht(){await p();}function Kt(t){return Date.now()>=t.expires_at}function Ot(t){return t.expires_at-Date.now()<=12e4}function Jt(t){return t.expires_at-Date.now()}export{ot as a,st as b,at as c,ct as d,ut as e,pt as f,mt as g,ft as h,yt as i,c as j,f as k,l,It as m,Et as n,Ht as o,Kt as p,Ot as q,Jt as r};//# sourceMappingURL=chunk-E2I4VVR5.js.map
2
+ //# sourceMappingURL=chunk-E2I4VVR5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/crypto/ssp.ts","../src/lib/auth/fingerprint.ts","../src/lib/auth/keychain.ts","../src/lib/auth/session.ts"],"names":["edUtils","msgs","sha512","concatBytes","HKDF_INFO","generateKeypair","priv","getPublicKey","generateNonce","randomBytes","hashPassword","password","email","salt","pbkdf2Sync","computeSignPayload","clientNonce","serverNonce","clientPub","timestamp","payload","tsBuf","blake3","deriveSharedSecret","pub","x25519","deriveEncryptionKey","ecdhSecret","hkdf","sha256","decryptSession","encrypted","iv","tag","key","combined","plaintext","gcm","verifyServerSignature","signature","serverPub","verify","computeHMAC","data","hmac","bytesToHex","buf","hexToBytes","hex","MACHINE_ID_PATHS","getMachineId","p","existsSync","readFileSync","createHash","os","computeDeviceFingerprint","FALLBACK_DIR","path","FALLBACK_FILE","getFallbackKey","fingerprint","ikm","storeSession","sessionJson","fs","getSession","raw","decrypted","deleteSession","loadSession","session","saveSession","clearSession","isSessionExpired","shouldRefreshToken","getTimeUntilExpiry"],"mappings":"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","file":"chunk-E2I4VVR5.js","sourcesContent":["import { getPublicKey, sign, verify, utils as edUtils } from '@noble/ed25519'\nimport { x25519 } from '@noble/curves/ed25519.js'\nimport { sha256 } from '@noble/hashes/sha256'\nimport { sha512 } from '@noble/hashes/sha512'\nimport { hmac } from '@noble/hashes/hmac'\nimport { hkdf } from '@noble/hashes/hkdf'\nimport { blake3 } from '@noble/hashes/blake3'\nimport { randomBytes, concatBytes } from '@noble/hashes/utils'\nimport { gcm } from '@noble/ciphers/aes'\nimport { pbkdf2Sync } from 'node:crypto'\nimport { hostname, platform, arch } from 'node:os'\n\nedUtils.sha512Sync = (...msgs: Uint8Array[]) => sha512(concatBytes(...msgs))\n\nconst HKDF_INFO = 'squidcloud-session-v1'\n\nexport interface SSPHello {\n email: string\n password_proof: string\n client_ephemeral_pub: string\n client_nonce: string\n device_fingerprint: string\n timestamp: number\n}\n\nexport interface SSPResponse {\n server_nonce: string\n server_ephemeral_pub: string\n server_signature: string\n encrypted_session: string\n session_iv: string\n session_tag: string\n}\n\nexport interface SquidSession {\n session_id: string\n access_token: string\n refresh_token: string\n refresh_token_id: string\n device_fingerprint: string\n issued_at: number\n expires_at: number\n user: {\n id: string\n email: string\n username: string\n plan: 'free' | 'pro' | 'team'\n }\n}\n\nexport function generateKeypair(): { pub: Uint8Array; priv: Uint8Array } {\n const priv = edUtils.randomPrivateKey()\n const pub = getPublicKey(priv)\n return { pub, priv }\n}\n\nexport function generateNonce(): Uint8Array {\n return randomBytes(32)\n}\n\nexport function hashPassword(password: string, email: string): Buffer {\n const salt = Buffer.from(email.slice(0, 32).padEnd(32, '\\x00'))\n return pbkdf2Sync(password, salt, 100000, 32, 'sha512')\n}\n\nexport function computeDeviceFingerprint(machineId: string): string {\n const data = `${machineId}:${hostname()}:${platform()}:${arch()}`\n return Buffer.from(blake3(data)).toString('hex')\n}\n\nexport function computeSignPayload(clientNonce: Uint8Array, serverNonce: Uint8Array, clientPub: Uint8Array, timestamp: number): Uint8Array {\n const payload = new Uint8Array(clientNonce.length + serverNonce.length + clientPub.length + 8)\n payload.set(clientNonce, 0)\n payload.set(serverNonce, clientNonce.length)\n payload.set(clientPub, clientNonce.length + serverNonce.length)\n const tsBuf = new Uint8Array(8)\n new DataView(tsBuf.buffer).setBigUint64(0, BigInt(timestamp), false)\n payload.set(tsBuf, clientNonce.length + serverNonce.length + clientPub.length)\n return blake3(payload)\n}\n\nexport function deriveSharedSecret(pub: Uint8Array, priv: Uint8Array): Uint8Array {\n return x25519.getSharedSecret(priv, pub)\n}\n\nexport function deriveEncryptionKey(ecdhSecret: Uint8Array, clientNonce: Uint8Array, serverNonce: Uint8Array): Uint8Array {\n const salt = new Uint8Array(clientNonce.length + serverNonce.length)\n salt.set(clientNonce, 0)\n salt.set(serverNonce, clientNonce.length)\n return hkdf(sha256, ecdhSecret, salt, HKDF_INFO, 32)\n}\n\nexport function encryptSession(session: SquidSession, key: Uint8Array): { ciphertext: Uint8Array; iv: Uint8Array; tag: Uint8Array } {\n const iv = randomBytes(12)\n const plaintext = new TextEncoder().encode(JSON.stringify(session))\n const aes = gcm(key, iv)\n const encrypted = aes.encrypt(plaintext)\n const ciphertext = encrypted.slice(0, -16)\n const tag = encrypted.slice(-16)\n return { ciphertext, iv, tag }\n}\n\nexport function decryptSession(encrypted: Uint8Array, iv: Uint8Array, tag: Uint8Array, key: Uint8Array): SquidSession {\n const combined = new Uint8Array(encrypted.length + tag.length)\n combined.set(encrypted, 0)\n combined.set(tag, encrypted.length)\n const aes = gcm(key, iv)\n const plaintext = aes.decrypt(combined)\n return JSON.parse(new TextDecoder().decode(plaintext)) as SquidSession\n}\n\nexport function verifyServerSignature(signature: Uint8Array, payload: Uint8Array, serverPub: Uint8Array): Promise<boolean> {\n return verify(signature, payload, serverPub)\n}\n\nexport function signPayload(priv: Uint8Array, payload: Uint8Array): Promise<Uint8Array> {\n return sign(payload, priv)\n}\n\nexport function computeHMAC(key: Uint8Array, data: string): string {\n return Buffer.from(hmac(sha256, key, data)).toString('hex')\n}\n\nexport function bytesToHex(buf: Uint8Array): string {\n return Buffer.from(buf).toString('hex')\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n return new Uint8Array(Buffer.from(hex, 'hex'))\n}\n","import { createHash, randomBytes } from 'node:crypto'\nimport os from 'node:os'\nimport { readFileSync, existsSync } from 'node:fs'\nimport { blake3 } from '@noble/hashes/blake3'\nimport { bytesToHex } from '../crypto/ssp.js'\n\nconst MACHINE_ID_PATHS = [\n '/etc/machine-id',\n '/var/lib/dbus/machine-id',\n '/etc/hostid',\n]\n\nfunction getMachineId(): string {\n for (const p of MACHINE_ID_PATHS) {\n try {\n if (existsSync(p)) {\n return readFileSync(p, 'utf-8').trim()\n }\n } catch {\n continue\n }\n }\n const h = createHash('sha256').update(os.hostname() + os.arch() + os.platform()).digest('hex')\n return h\n}\n\nexport function computeDeviceFingerprint(): string {\n const machineId = getMachineId()\n const components = [\n machineId,\n os.hostname(),\n os.platform(),\n os.arch(),\n os.release(),\n ]\n const data = components.join(':')\n return bytesToHex(blake3(data))\n}\n\nexport function generateDeviceId(): string {\n return randomBytes(32).toString('hex')\n}\n","import os from 'node:os'\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { randomBytes } from '@noble/hashes/utils'\nimport { sha256 } from '@noble/hashes/sha256'\nimport { hkdf } from '@noble/hashes/hkdf'\nimport { blake3 } from '@noble/hashes/blake3'\nimport { gcm } from '@noble/ciphers/aes'\nimport { bytesToHex, hexToBytes } from '../crypto/ssp.js'\nimport { computeDeviceFingerprint } from './fingerprint.js'\n\nconst FALLBACK_DIR = path.join(os.homedir(), '.squidcloud')\nconst FALLBACK_FILE = path.join(FALLBACK_DIR, '.session')\n\nfunction getFallbackKey(): Uint8Array {\n const fingerprint = computeDeviceFingerprint()\n const ikm = new TextEncoder().encode(fingerprint)\n return hkdf(sha256, ikm, new Uint8Array(32), 'squidcloud-fallback-v1', 32)\n}\n\nexport async function storeSession(sessionJson: string): Promise<void> {\n const key = getFallbackKey()\n const iv = randomBytes(12)\n const plaintext = new TextEncoder().encode(sessionJson)\n const aes = gcm(key, iv)\n const encrypted = aes.encrypt(plaintext)\n if (!fs.existsSync(FALLBACK_DIR)) {\n fs.mkdirSync(FALLBACK_DIR, { recursive: true, mode: 0o700 })\n }\n const payload = {\n iv: bytesToHex(iv),\n data: bytesToHex(encrypted),\n }\n fs.writeFileSync(FALLBACK_FILE, JSON.stringify(payload), { mode: 0o600, encoding: 'utf-8' })\n}\n\nexport async function getSession(): Promise<string | null> {\n try {\n if (!fs.existsSync(FALLBACK_FILE)) return null\n const raw = fs.readFileSync(FALLBACK_FILE, 'utf-8')\n const { iv, data } = JSON.parse(raw) as { iv: string; data: string }\n const key = getFallbackKey()\n const aes = gcm(key, hexToBytes(iv))\n const decrypted = aes.decrypt(hexToBytes(data))\n return new TextDecoder().decode(decrypted)\n } catch {\n return null\n }\n}\n\nexport async function deleteSession(): Promise<void> {\n try {\n if (fs.existsSync(FALLBACK_FILE)) {\n fs.unlinkSync(FALLBACK_FILE)\n }\n } catch {\n // ignore\n }\n}\n","import { SquidSession } from '../crypto/ssp.js'\nimport { storeSession, getSession, deleteSession } from './keychain.js'\n\nexport async function loadSession(): Promise<SquidSession | null> {\n try {\n const raw = await getSession()\n if (!raw) return null\n const session = JSON.parse(raw) as SquidSession\n if (!session.session_id || !session.access_token) {\n await deleteSession()\n return null\n }\n return session\n } catch {\n await deleteSession()\n return null\n }\n}\n\nexport async function saveSession(session: SquidSession): Promise<void> {\n await storeSession(JSON.stringify(session))\n}\n\nexport async function clearSession(): Promise<void> {\n await deleteSession()\n}\n\nexport function isSessionExpired(session: SquidSession): boolean {\n return Date.now() >= session.expires_at\n}\n\nexport function shouldRefreshToken(session: SquidSession): boolean {\n const twoMinutes = 2 * 60 * 1000\n return (session.expires_at - Date.now()) <= twoMinutes\n}\n\nexport function getTimeUntilExpiry(session: SquidSession): number {\n return session.expires_at - Date.now()\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {a}from'./chunk-NDB6KXYI.js';import {m,l,o,n,i}from'./chunk-4NTVRCZM.js';import {nanoid}from'nanoid';import u from'fs';import D from'path';import X from'os';var T=D.join(X.homedir(),".squidcloud",".refresh.lock");function L(){let t=D.dirname(T);u.existsSync(t)||u.mkdirSync(t,{recursive:true,mode:448});}async function Q(){L();let t=false,e=0;for(;!t&&e<50;)try{let n=u.openSync(T,"wx");u.writeSync(n,String(process.pid)),u.closeSync(n),t=!0;}catch{let n=u.statSync(T);if(Date.now()-n.mtimeMs>1e4)try{u.unlinkSync(T);}catch{}await new Promise(r=>setTimeout(r,100)),e++;}return ()=>{try{u.unlinkSync(T);}catch{}}}async function $(){let t=await Q();try{let e=await m();if(!e)return null;let n$1=l();if(e.device_fingerprint!==n$1)return await o(),null;let s=await A("/api/auth/ssp/refresh",{refresh_token:e.refresh_token,refresh_token_id:e.refresh_token_id,device_fingerprint:n$1});if(!s||!s.session)return await o(),null;let r={...s.session,device_fingerprint:n$1};return await n(r),r}catch{return await o(),null}finally{t();}}var F=3,M=1e3,O=1e3,C=a(),I=0;async function H(){let e=Date.now()-I;e<O&&await new Promise(n=>setTimeout(n,O-e)),I=Date.now();}function v(){return nanoid(21)}async function b(t,e,n,s,r){let f=`${t}:${e}:${n}:${s}`;return i(new TextEncoder().encode(r),f)}async function k(t,e={}){let{method:n="GET",headers:s={},body:r,authenticated:f=false,retries:h=F}=e;await H();let d=v(),m$1=Date.now(),i={"Content-Type":"application/json","X-SQC-Request-ID":d,"X-SQC-Timestamp":String(m$1),...s};if(f){let o=await m();if(o){let c=l();i["X-SQC-Fingerprint"]=c,o.access_token&&(i.Authorization=`Bearer ${o.access_token}`,i["X-SQC-Signature"]=await b(d,m$1,n,t,o.access_token));}}let g=`${C}${t}`,a={method:n,headers:i};r&&n!=="GET"&&(a.body=JSON.stringify(r));let P=null;for(let o=0;o<=h;o++)try{let c=await fetch(g,a);if(c.status===401&&f){let p=await $();if(p){i.Authorization=`Bearer ${p.access_token}`,i["X-SQC-Signature"]=await b(d,m$1,n,t,p.access_token),a.headers=i;let q=await fetch(g,a);return R(q)}}return R(c)}catch(c){if(P=c instanceof Error?c:new Error(String(c)),o<h){let p=M*Math.pow(2,o)*(.5+Math.random()*.5);await new Promise(q=>setTimeout(q,p));}}throw P||new Error(`Request failed: ${t}`)}async function R(t){if(t.status===204)return;if((t.headers.get("content-type")||"").includes("application/json")){let s=await t.json();if(!t.ok){let r=s?.error?.message||s?.message||`HTTP ${t.status}`;throw new y(r,t.status,s?.error)}return s}if(!t.ok){let s=await t.text();throw new y(s||`HTTP ${t.status}`,t.status)}return await t.text()}var y=class extends Error{constructor(n,s,r){super(n);this.status=s;this.details=r;this.name="ApiError";}status;details};async function nt(t,e){return k(t,{...e,method:"GET"})}async function A(t,e,n){return k(t,{...n,method:"POST",body:e})}async function st(t,e,n){return k(t,{...n,method:"PUT",body:e})}async function rt(t,e){return k(t,{...e,method:"DELETE"})}async function it(t,e,n){let{method:s="POST",headers:r={},authenticated:f=false}=n||{},h=v(),d=Date.now(),m$1={...r,"X-SQC-Request-ID":h,"X-SQC-Timestamp":String(d)};if(f){let a=await m();a&&(m$1["X-SQC-Fingerprint"]=l(),a.access_token&&(m$1.Authorization=`Bearer ${a.access_token}`));}let i=`${C}${t}`,g=await fetch(i,{method:s,headers:m$1,body:e});return R(g)}export{$ as a,k as b,y as c,nt as d,A as e,st as f,rt as g,it as h};//# sourceMappingURL=chunk-BC2OVPRV.js.map
2
- //# sourceMappingURL=chunk-BC2OVPRV.js.map
1
+ import {a}from'./chunk-NDB6KXYI.js';import {m,l,o,n,i}from'./chunk-E2I4VVR5.js';import {nanoid}from'nanoid';import u from'fs';import D from'path';import X from'os';var T=D.join(X.homedir(),".squidcloud",".refresh.lock");function L(){let t=D.dirname(T);u.existsSync(t)||u.mkdirSync(t,{recursive:true,mode:448});}async function Q(){L();let t=false,e=0;for(;!t&&e<50;)try{let n=u.openSync(T,"wx");u.writeSync(n,String(process.pid)),u.closeSync(n),t=!0;}catch{let n=u.statSync(T);if(Date.now()-n.mtimeMs>1e4)try{u.unlinkSync(T);}catch{}await new Promise(r=>setTimeout(r,100)),e++;}return ()=>{try{u.unlinkSync(T);}catch{}}}async function $(){let t=await Q();try{let e=await m();if(!e)return null;let n$1=l();if(e.device_fingerprint!==n$1)return await o(),null;let s=await A("/api/auth/ssp/refresh",{refresh_token:e.refresh_token,refresh_token_id:e.refresh_token_id,device_fingerprint:n$1});if(!s||!s.session)return await o(),null;let r={...s.session,device_fingerprint:n$1};return await n(r),r}catch{return await o(),null}finally{t();}}var F=3,M=1e3,O=1e3,C=a(),I=0;async function H(){let e=Date.now()-I;e<O&&await new Promise(n=>setTimeout(n,O-e)),I=Date.now();}function v(){return nanoid(21)}async function b(t,e,n,s,r){let f=`${t}:${e}:${n}:${s}`;return i(new TextEncoder().encode(r),f)}async function k(t,e={}){let{method:n="GET",headers:s={},body:r,authenticated:f=false,retries:h=F}=e;await H();let d=v(),m$1=Date.now(),i={"Content-Type":"application/json","X-SQC-Request-ID":d,"X-SQC-Timestamp":String(m$1),...s};if(f){let o=await m();if(o){let c=l();i["X-SQC-Fingerprint"]=c,o.access_token&&(i.Authorization=`Bearer ${o.access_token}`,i["X-SQC-Signature"]=await b(d,m$1,n,t,o.access_token));}}let g=`${C}${t}`,a={method:n,headers:i};r&&n!=="GET"&&(a.body=JSON.stringify(r));let P=null;for(let o=0;o<=h;o++)try{let c=await fetch(g,a);if(c.status===401&&f){let p=await $();if(p){i.Authorization=`Bearer ${p.access_token}`,i["X-SQC-Signature"]=await b(d,m$1,n,t,p.access_token),a.headers=i;let q=await fetch(g,a);return R(q)}}return R(c)}catch(c){if(P=c instanceof Error?c:new Error(String(c)),o<h){let p=M*Math.pow(2,o)*(.5+Math.random()*.5);await new Promise(q=>setTimeout(q,p));}}throw P||new Error(`Request failed: ${t}`)}async function R(t){if(t.status===204)return;if((t.headers.get("content-type")||"").includes("application/json")){let s=await t.json();if(!t.ok){let r=s?.error?.message||s?.message||`HTTP ${t.status}`;throw new y(r,t.status,s?.error)}return s}if(!t.ok){let s=await t.text();throw new y(s||`HTTP ${t.status}`,t.status)}return await t.text()}var y=class extends Error{constructor(n,s,r){super(n);this.status=s;this.details=r;this.name="ApiError";}status;details};async function nt(t,e){return k(t,{...e,method:"GET"})}async function A(t,e,n){return k(t,{...n,method:"POST",body:e})}async function st(t,e,n){return k(t,{...n,method:"PUT",body:e})}async function rt(t,e){return k(t,{...e,method:"DELETE"})}async function it(t,e,n){let{method:s="POST",headers:r={},authenticated:f=false}=n||{},h=v(),d=Date.now(),m$1={...r,"X-SQC-Request-ID":h,"X-SQC-Timestamp":String(d)};if(f){let a=await m();a&&(m$1["X-SQC-Fingerprint"]=l(),a.access_token&&(m$1.Authorization=`Bearer ${a.access_token}`));}let i=`${C}${t}`,g=await fetch(i,{method:s,headers:m$1,body:e});return R(g)}export{$ as a,k as b,y as c,nt as d,A as e,st as f,rt as g,it as h};//# sourceMappingURL=chunk-RXARHDCW.js.map
2
+ //# sourceMappingURL=chunk-RXARHDCW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/auth/refresh.ts","../src/lib/api/client.ts"],"names":["LOCK_FILE","path","os","ensureLockDir","dir","fs","acquireLock","acquired","attempts","fd","stat","refreshAccessToken","release","session","loadSession","fingerprint","computeDeviceFingerprint","clearSession","response","apiPost","newSession","saveSession","MAX_RETRIES","BASE_DELAY","RATE_LIMIT_WINDOW","API_BASE","getApiBase","lastRequestTime","rateLimit","elapsed","r","buildRequestId","nanoid","signRequest","requestId","timestamp","method","accessToken","data","computeHMAC","apiRequest","options","headers","body","authenticated","retries","reqHeaders","url","fetchOptions","lastError","attempt","retryResponse","handleResponse","err","delay","message","ApiError","text","status","details","apiGet","apiPut","apiDelete","apiUpload","formData"],"mappings":"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","file":"chunk-BC2OVPRV.js","sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { SquidSession } from '../crypto/ssp.js'\nimport { apiPost } from '../api/client.js'\nimport { computeDeviceFingerprint } from './fingerprint.js'\nimport { loadSession, saveSession, clearSession } from './session.js'\n\nconst LOCK_FILE = path.join(os.homedir(), '.squidcloud', '.refresh.lock')\n\nfunction ensureLockDir(): void {\n const dir = path.dirname(LOCK_FILE)\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n}\n\nasync function acquireLock(): Promise<() => void> {\n ensureLockDir()\n let acquired = false\n let attempts = 0\n while (!acquired && attempts < 50) {\n try {\n const fd = fs.openSync(LOCK_FILE, 'wx')\n fs.writeSync(fd, String(process.pid))\n fs.closeSync(fd)\n acquired = true\n } catch {\n const stat = fs.statSync(LOCK_FILE)\n const age = Date.now() - stat.mtimeMs\n if (age > 10000) {\n try { fs.unlinkSync(LOCK_FILE) } catch {}\n }\n await new Promise(r => setTimeout(r, 100))\n attempts++\n }\n }\n return () => {\n try { fs.unlinkSync(LOCK_FILE) } catch {}\n }\n}\n\nexport async function refreshAccessToken(): Promise<SquidSession | null> {\n const release = await acquireLock()\n try {\n const session = await loadSession()\n if (!session) return null\n\n const fingerprint = computeDeviceFingerprint()\n if (session.device_fingerprint !== fingerprint) {\n await clearSession()\n return null\n }\n\n const response = await apiPost<{ session: SquidSession }>('/api/auth/ssp/refresh', {\n refresh_token: session.refresh_token,\n refresh_token_id: session.refresh_token_id,\n device_fingerprint: fingerprint,\n })\n\n if (!response || !response.session) {\n await clearSession()\n return null\n }\n\n const newSession: SquidSession = {\n ...response.session,\n device_fingerprint: fingerprint,\n }\n await saveSession(newSession)\n return newSession\n } catch {\n await clearSession()\n return null\n } finally {\n release()\n }\n}\n","import { nanoid } from 'nanoid'\nimport { computeHMAC } from '../crypto/ssp.js'\nimport { loadSession } from '../auth/session.js'\nimport { refreshAccessToken } from '../auth/refresh.js'\nimport { computeDeviceFingerprint } from '../auth/fingerprint.js'\nimport { getApiBase } from './cert-pin.js'\n\nconst MAX_RETRIES = 3\nconst BASE_DELAY = 1000\nconst RATE_LIMIT_WINDOW = 1000\nconst API_BASE = getApiBase()\n\ninterface RequestOptions {\n method?: string\n headers?: Record<string, string>\n body?: unknown\n authenticated?: boolean\n retries?: number\n}\n\nlet lastRequestTime = 0\n\nasync function rateLimit(): Promise<void> {\n const now = Date.now()\n const elapsed = now - lastRequestTime\n if (elapsed < RATE_LIMIT_WINDOW) {\n await new Promise(r => setTimeout(r, RATE_LIMIT_WINDOW - elapsed))\n }\n lastRequestTime = Date.now()\n}\n\nfunction buildRequestId(): string {\n return nanoid(21)\n}\n\nasync function signRequest(requestId: string, timestamp: number, method: string, path: string, accessToken: string): Promise<string> {\n const data = `${requestId}:${timestamp}:${method}:${path}`\n return computeHMAC(new TextEncoder().encode(accessToken), data)\n}\n\nexport async function apiRequest<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { method = 'GET', headers = {}, body, authenticated = false, retries = MAX_RETRIES } = options\n\n await rateLimit()\n\n const requestId = buildRequestId()\n const timestamp = Date.now()\n\n const reqHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-SQC-Request-ID': requestId,\n 'X-SQC-Timestamp': String(timestamp),\n ...headers,\n }\n\n if (authenticated) {\n let session = await loadSession()\n if (session) {\n const fingerprint = computeDeviceFingerprint()\n reqHeaders['X-SQC-Fingerprint'] = fingerprint\n\n if (session.access_token) {\n reqHeaders['Authorization'] = `Bearer ${session.access_token}`\n reqHeaders['X-SQC-Signature'] = await signRequest(requestId, timestamp, method, path, session.access_token)\n }\n }\n }\n\n const url = `${API_BASE}${path}`\n const fetchOptions: RequestInit = {\n method,\n headers: reqHeaders,\n }\n\n if (body && method !== 'GET') {\n fetchOptions.body = JSON.stringify(body)\n }\n\n let lastError: Error | null = null\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const response = await fetch(url, fetchOptions)\n\n if (response.status === 401 && authenticated) {\n const newSession = await refreshAccessToken()\n if (newSession) {\n reqHeaders['Authorization'] = `Bearer ${newSession.access_token}`\n reqHeaders['X-SQC-Signature'] = await signRequest(requestId, timestamp, method, path, newSession.access_token)\n fetchOptions.headers = reqHeaders\n const retryResponse = await fetch(url, fetchOptions)\n return handleResponse<T>(retryResponse)\n }\n }\n\n return handleResponse<T>(response)\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err))\n if (attempt < retries) {\n const delay = BASE_DELAY * Math.pow(2, attempt) * (0.5 + Math.random() * 0.5)\n await new Promise(r => setTimeout(r, delay))\n }\n }\n }\n\n throw lastError || new Error(`Request failed: ${path}`)\n}\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n if (response.status === 204) {\n return undefined as T\n }\n const contentType = response.headers.get('content-type') || ''\n if (contentType.includes('application/json')) {\n const data = await response.json()\n if (!response.ok) {\n const message = data?.error?.message || data?.message || `HTTP ${response.status}`\n throw new ApiError(message, response.status, data?.error)\n }\n return data as T\n }\n if (!response.ok) {\n const text = await response.text()\n throw new ApiError(text || `HTTP ${response.status}`, response.status)\n }\n const text = await response.text()\n return text as unknown as T\n}\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public details?: unknown,\n ) {\n super(message)\n this.name = 'ApiError'\n }\n}\n\nexport async function apiGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return apiRequest<T>(path, { ...options, method: 'GET' })\n}\n\nexport async function apiPost<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return apiRequest<T>(path, { ...options, method: 'POST', body })\n}\n\nexport async function apiPut<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return apiRequest<T>(path, { ...options, method: 'PUT', body })\n}\n\nexport async function apiDelete<T>(path: string, options?: RequestOptions): Promise<T> {\n return apiRequest<T>(path, { ...options, method: 'DELETE' })\n}\n\nexport async function apiUpload<T>(path: string, formData: FormData, options?: RequestOptions): Promise<T> {\n const { method = 'POST', headers = {}, authenticated = false } = options || {}\n const requestId = buildRequestId()\n const timestamp = Date.now()\n\n const reqHeaders: Record<string, string> = {\n ...headers,\n 'X-SQC-Request-ID': requestId,\n 'X-SQC-Timestamp': String(timestamp),\n }\n\n if (authenticated) {\n const session = await loadSession()\n if (session) {\n reqHeaders['X-SQC-Fingerprint'] = computeDeviceFingerprint()\n if (session.access_token) {\n reqHeaders['Authorization'] = `Bearer ${session.access_token}`\n }\n }\n }\n\n const url = `${API_BASE}${path}`\n const response = await fetch(url, {\n method,\n headers: reqHeaders,\n body: formData,\n })\n\n return handleResponse<T>(response)\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/auth/refresh.ts","../src/lib/api/client.ts"],"names":["LOCK_FILE","path","os","ensureLockDir","dir","fs","acquireLock","acquired","attempts","fd","stat","refreshAccessToken","release","session","loadSession","fingerprint","computeDeviceFingerprint","clearSession","response","apiPost","newSession","saveSession","MAX_RETRIES","BASE_DELAY","RATE_LIMIT_WINDOW","API_BASE","getApiBase","lastRequestTime","rateLimit","elapsed","r","buildRequestId","nanoid","signRequest","requestId","timestamp","method","accessToken","data","computeHMAC","apiRequest","options","headers","body","authenticated","retries","reqHeaders","url","fetchOptions","lastError","attempt","retryResponse","handleResponse","err","delay","message","ApiError","text","status","details","apiGet","apiPut","apiDelete","apiUpload","formData"],"mappings":"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","file":"chunk-RXARHDCW.js","sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { SquidSession } from '../crypto/ssp.js'\nimport { apiPost } from '../api/client.js'\nimport { computeDeviceFingerprint } from './fingerprint.js'\nimport { loadSession, saveSession, clearSession } from './session.js'\n\nconst LOCK_FILE = path.join(os.homedir(), '.squidcloud', '.refresh.lock')\n\nfunction ensureLockDir(): void {\n const dir = path.dirname(LOCK_FILE)\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n}\n\nasync function acquireLock(): Promise<() => void> {\n ensureLockDir()\n let acquired = false\n let attempts = 0\n while (!acquired && attempts < 50) {\n try {\n const fd = fs.openSync(LOCK_FILE, 'wx')\n fs.writeSync(fd, String(process.pid))\n fs.closeSync(fd)\n acquired = true\n } catch {\n const stat = fs.statSync(LOCK_FILE)\n const age = Date.now() - stat.mtimeMs\n if (age > 10000) {\n try { fs.unlinkSync(LOCK_FILE) } catch {}\n }\n await new Promise(r => setTimeout(r, 100))\n attempts++\n }\n }\n return () => {\n try { fs.unlinkSync(LOCK_FILE) } catch {}\n }\n}\n\nexport async function refreshAccessToken(): Promise<SquidSession | null> {\n const release = await acquireLock()\n try {\n const session = await loadSession()\n if (!session) return null\n\n const fingerprint = computeDeviceFingerprint()\n if (session.device_fingerprint !== fingerprint) {\n await clearSession()\n return null\n }\n\n const response = await apiPost<{ session: SquidSession }>('/api/auth/ssp/refresh', {\n refresh_token: session.refresh_token,\n refresh_token_id: session.refresh_token_id,\n device_fingerprint: fingerprint,\n })\n\n if (!response || !response.session) {\n await clearSession()\n return null\n }\n\n const newSession: SquidSession = {\n ...response.session,\n device_fingerprint: fingerprint,\n }\n await saveSession(newSession)\n return newSession\n } catch {\n await clearSession()\n return null\n } finally {\n release()\n }\n}\n","import { nanoid } from 'nanoid'\nimport { computeHMAC } from '../crypto/ssp.js'\nimport { loadSession } from '../auth/session.js'\nimport { refreshAccessToken } from '../auth/refresh.js'\nimport { computeDeviceFingerprint } from '../auth/fingerprint.js'\nimport { getApiBase } from './cert-pin.js'\n\nconst MAX_RETRIES = 3\nconst BASE_DELAY = 1000\nconst RATE_LIMIT_WINDOW = 1000\nconst API_BASE = getApiBase()\n\ninterface RequestOptions {\n method?: string\n headers?: Record<string, string>\n body?: unknown\n authenticated?: boolean\n retries?: number\n}\n\nlet lastRequestTime = 0\n\nasync function rateLimit(): Promise<void> {\n const now = Date.now()\n const elapsed = now - lastRequestTime\n if (elapsed < RATE_LIMIT_WINDOW) {\n await new Promise(r => setTimeout(r, RATE_LIMIT_WINDOW - elapsed))\n }\n lastRequestTime = Date.now()\n}\n\nfunction buildRequestId(): string {\n return nanoid(21)\n}\n\nasync function signRequest(requestId: string, timestamp: number, method: string, path: string, accessToken: string): Promise<string> {\n const data = `${requestId}:${timestamp}:${method}:${path}`\n return computeHMAC(new TextEncoder().encode(accessToken), data)\n}\n\nexport async function apiRequest<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { method = 'GET', headers = {}, body, authenticated = false, retries = MAX_RETRIES } = options\n\n await rateLimit()\n\n const requestId = buildRequestId()\n const timestamp = Date.now()\n\n const reqHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-SQC-Request-ID': requestId,\n 'X-SQC-Timestamp': String(timestamp),\n ...headers,\n }\n\n if (authenticated) {\n let session = await loadSession()\n if (session) {\n const fingerprint = computeDeviceFingerprint()\n reqHeaders['X-SQC-Fingerprint'] = fingerprint\n\n if (session.access_token) {\n reqHeaders['Authorization'] = `Bearer ${session.access_token}`\n reqHeaders['X-SQC-Signature'] = await signRequest(requestId, timestamp, method, path, session.access_token)\n }\n }\n }\n\n const url = `${API_BASE}${path}`\n const fetchOptions: RequestInit = {\n method,\n headers: reqHeaders,\n }\n\n if (body && method !== 'GET') {\n fetchOptions.body = JSON.stringify(body)\n }\n\n let lastError: Error | null = null\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const response = await fetch(url, fetchOptions)\n\n if (response.status === 401 && authenticated) {\n const newSession = await refreshAccessToken()\n if (newSession) {\n reqHeaders['Authorization'] = `Bearer ${newSession.access_token}`\n reqHeaders['X-SQC-Signature'] = await signRequest(requestId, timestamp, method, path, newSession.access_token)\n fetchOptions.headers = reqHeaders\n const retryResponse = await fetch(url, fetchOptions)\n return handleResponse<T>(retryResponse)\n }\n }\n\n return handleResponse<T>(response)\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err))\n if (attempt < retries) {\n const delay = BASE_DELAY * Math.pow(2, attempt) * (0.5 + Math.random() * 0.5)\n await new Promise(r => setTimeout(r, delay))\n }\n }\n }\n\n throw lastError || new Error(`Request failed: ${path}`)\n}\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n if (response.status === 204) {\n return undefined as T\n }\n const contentType = response.headers.get('content-type') || ''\n if (contentType.includes('application/json')) {\n const data = await response.json()\n if (!response.ok) {\n const message = data?.error?.message || data?.message || `HTTP ${response.status}`\n throw new ApiError(message, response.status, data?.error)\n }\n return data as T\n }\n if (!response.ok) {\n const text = await response.text()\n throw new ApiError(text || `HTTP ${response.status}`, response.status)\n }\n const text = await response.text()\n return text as unknown as T\n}\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public details?: unknown,\n ) {\n super(message)\n this.name = 'ApiError'\n }\n}\n\nexport async function apiGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return apiRequest<T>(path, { ...options, method: 'GET' })\n}\n\nexport async function apiPost<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return apiRequest<T>(path, { ...options, method: 'POST', body })\n}\n\nexport async function apiPut<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return apiRequest<T>(path, { ...options, method: 'PUT', body })\n}\n\nexport async function apiDelete<T>(path: string, options?: RequestOptions): Promise<T> {\n return apiRequest<T>(path, { ...options, method: 'DELETE' })\n}\n\nexport async function apiUpload<T>(path: string, formData: FormData, options?: RequestOptions): Promise<T> {\n const { method = 'POST', headers = {}, authenticated = false } = options || {}\n const requestId = buildRequestId()\n const timestamp = Date.now()\n\n const reqHeaders: Record<string, string> = {\n ...headers,\n 'X-SQC-Request-ID': requestId,\n 'X-SQC-Timestamp': String(timestamp),\n }\n\n if (authenticated) {\n const session = await loadSession()\n if (session) {\n reqHeaders['X-SQC-Fingerprint'] = computeDeviceFingerprint()\n if (session.access_token) {\n reqHeaders['Authorization'] = `Bearer ${session.access_token}`\n }\n }\n }\n\n const url = `${API_BASE}${path}`\n const response = await fetch(url, {\n method,\n headers: reqHeaders,\n body: formData,\n })\n\n return handleResponse<T>(response)\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export{c as ApiError,g as apiDelete,d as apiGet,e as apiPost,f as apiPut,b as apiRequest,h as apiUpload}from'./chunk-RXARHDCW.js';import'./chunk-NDB6KXYI.js';import'./chunk-E2I4VVR5.js';//# sourceMappingURL=client-RBFTHJQ4.js.map
2
+ //# sourceMappingURL=client-RBFTHJQ4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"client-RFYERFWZ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"client-RBFTHJQ4.js"}
@@ -1,2 +1,2 @@
1
- import {a}from'./chunk-NDB6KXYI.js';import {m}from'./chunk-4NTVRCZM.js';import {WebSocket}from'ws';import e from'chalk';async function f(r){let i=await m();i||(console.error("Not authenticated"),process.exit(1));let a$1=a().replace(/^http/,"ws"),s=new WebSocket(`${a$1}/api/v1/collab/${encodeURIComponent(r)}/activity`,{headers:{Authorization:`Bearer ${i.access_token}`}});console.log(e.dim(`Streaming activity for "${r}"... (Ctrl+C to stop)`)),s.on("message",t=>{try{let o=JSON.parse(t.toString()),l=e.dim(new Date(o.timestamp).toLocaleTimeString()),p=e.hex("#4FC3F7")(o.user||"unknown"),m=o.action==="upload"?e.green("uploaded"):o.action==="delete"?e.red("deleted"):o.action==="edit"?e.yellow("edited"):o.action,d=o.file||o.path||"";console.log(`${l} ${p} ${m} ${d}`);}catch{console.log(t.toString());}}),s.on("error",t=>{console.error(e.red(`Error: ${t.message}`)),process.exit(1);}),process.on("SIGINT",()=>{s.close(),process.exit(0);});}export{f as default};//# sourceMappingURL=collab-activity-5RK36CJW.js.map
2
- //# sourceMappingURL=collab-activity-5RK36CJW.js.map
1
+ import {a}from'./chunk-NDB6KXYI.js';import {m}from'./chunk-E2I4VVR5.js';import {WebSocket}from'ws';import e from'chalk';async function f(r){let i=await m();i||(console.error("Not authenticated"),process.exit(1));let a$1=a().replace(/^http/,"ws"),s=new WebSocket(`${a$1}/api/v1/collab/${encodeURIComponent(r)}/activity`,{headers:{Authorization:`Bearer ${i.access_token}`}});console.log(e.dim(`Streaming activity for "${r}"... (Ctrl+C to stop)`)),s.on("message",t=>{try{let o=JSON.parse(t.toString()),l=e.dim(new Date(o.timestamp).toLocaleTimeString()),p=e.hex("#4FC3F7")(o.user||"unknown"),m=o.action==="upload"?e.green("uploaded"):o.action==="delete"?e.red("deleted"):o.action==="edit"?e.yellow("edited"):o.action,d=o.file||o.path||"";console.log(`${l} ${p} ${m} ${d}`);}catch{console.log(t.toString());}}),s.on("error",t=>{console.error(e.red(`Error: ${t.message}`)),process.exit(1);}),process.on("SIGINT",()=>{s.close(),process.exit(0);});}export{f as default};//# sourceMappingURL=collab-activity-LEPWGNXB.js.map
2
+ //# sourceMappingURL=collab-activity-LEPWGNXB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/collab/collab-activity.ts"],"names":["collabActivity","folder","session","loadSession","apiBase","getApiBase","ws","WebSocket","chalk","data","e","ts","user","action","file","err"],"mappings":"wHAKA,eAAOA,CAAAA,CAAsCC,CAAAA,CAA+B,CAC1E,IAAMC,CAAAA,CAAU,MAAMC,CAAAA,EAAY,CAC7BD,IAAW,OAAA,CAAQ,KAAA,CAAM,mBAAmB,CAAA,CAAG,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAElE,IAAME,GAAAA,CAAUC,CAAAA,GAAa,OAAA,CAAQ,OAAA,CAAS,IAAI,CAAA,CAC5CC,CAAAA,CAAK,IAAIC,SAAAA,CAAU,CAAA,EAAGH,GAAO,CAAA,eAAA,EAAkB,kBAAA,CAAmBH,CAAM,CAAC,CAAA,SAAA,CAAA,CAAa,CAC1F,OAAA,CAAS,CAAE,aAAA,CAAe,CAAA,OAAA,EAAUC,EAAQ,YAAY,CAAA,CAAG,CAC7D,CAAC,CAAA,CAED,QAAQ,GAAA,CAAIM,CAAAA,CAAM,IAAI,CAAA,wBAAA,EAA2BP,CAAM,uBAAuB,CAAC,CAAA,CAC/EK,EAAG,EAAA,CAAG,SAAA,CAAYG,GAAiB,CACjC,GAAI,CACF,IAAMC,CAAAA,CAAI,KAAK,KAAA,CAAMD,CAAAA,CAAK,UAAU,CAAA,CAC9BE,EAAKH,CAAAA,CAAM,GAAA,CAAI,IAAI,IAAA,CAAKE,CAAAA,CAAE,SAAS,CAAA,CAAE,kBAAA,EAAoB,CAAA,CACzDE,CAAAA,CAAOJ,EAAM,GAAA,CAAI,SAAS,CAAA,CAAEE,CAAAA,CAAE,MAAQ,SAAS,CAAA,CAC/CG,EAASH,CAAAA,CAAE,MAAA,GAAW,SAAWF,CAAAA,CAAM,KAAA,CAAM,UAAU,CAAA,CAC3DE,CAAAA,CAAE,SAAW,QAAA,CAAWF,CAAAA,CAAM,IAAI,SAAS,CAAA,CAC3CE,EAAE,MAAA,GAAW,MAAA,CAASF,EAAM,MAAA,CAAO,QAAQ,EAAIE,CAAAA,CAAE,MAAA,CAC7CI,EAAOJ,CAAAA,CAAE,IAAA,EAAQA,EAAE,IAAA,EAAQ,EAAA,CACjC,QAAQ,GAAA,CAAI,CAAA,EAAGC,CAAE,CAAA,CAAA,EAAIC,CAAI,IAAIC,CAAM,CAAA,CAAA,EAAIC,CAAI,CAAA,CAAE,EAC/C,CAAA,KAAQ,CACN,QAAQ,GAAA,CAAIL,CAAAA,CAAK,UAAU,EAC7B,CACF,CAAC,CAAA,CACDH,EAAG,EAAA,CAAG,OAAA,CAAUS,GAAQ,CAAE,OAAA,CAAQ,MAAMP,CAAAA,CAAM,GAAA,CAAI,UAAUO,CAAAA,CAAI,OAAO,EAAE,CAAC,CAAA,CAAG,QAAQ,IAAA,CAAK,CAAC,EAAE,CAAC,CAAA,CAC9F,QAAQ,EAAA,CAAG,QAAA,CAAU,IAAM,CAAET,CAAAA,CAAG,OAAM,CAAG,OAAA,CAAQ,KAAK,CAAC,EAAE,CAAC,EAC5D","file":"collab-activity-5RK36CJW.js","sourcesContent":["import { WebSocket } from 'ws'\nimport chalk from 'chalk'\nimport { loadSession } from '../../lib/auth/session.js'\nimport { getApiBase } from '../../lib/api/cert-pin.js'\n\nexport default async function collabActivity(folder: string): Promise<void> {\n const session = await loadSession()\n if (!session) { console.error('Not authenticated'); process.exit(1) }\n\n const apiBase = getApiBase().replace(/^http/, 'ws')\n const ws = new WebSocket(`${apiBase}/api/v1/collab/${encodeURIComponent(folder)}/activity`, {\n headers: { Authorization: `Bearer ${session.access_token}` },\n })\n\n console.log(chalk.dim(`Streaming activity for \"${folder}\"... (Ctrl+C to stop)`))\n ws.on('message', (data: Buffer) => {\n try {\n const e = JSON.parse(data.toString())\n const ts = chalk.dim(new Date(e.timestamp).toLocaleTimeString())\n const user = chalk.hex('#4FC3F7')(e.user || 'unknown')\n const action = e.action === 'upload' ? chalk.green('uploaded') :\n e.action === 'delete' ? chalk.red('deleted') :\n e.action === 'edit' ? chalk.yellow('edited') : e.action\n const file = e.file || e.path || ''\n console.log(`${ts} ${user} ${action} ${file}`)\n } catch {\n console.log(data.toString())\n }\n })\n ws.on('error', (err) => { console.error(chalk.red(`Error: ${err.message}`)); process.exit(1) })\n process.on('SIGINT', () => { ws.close(); process.exit(0) })\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/collab/collab-activity.ts"],"names":["collabActivity","folder","session","loadSession","apiBase","getApiBase","ws","WebSocket","chalk","data","e","ts","user","action","file","err"],"mappings":"wHAKA,eAAOA,CAAAA,CAAsCC,CAAAA,CAA+B,CAC1E,IAAMC,CAAAA,CAAU,MAAMC,CAAAA,EAAY,CAC7BD,IAAW,OAAA,CAAQ,KAAA,CAAM,mBAAmB,CAAA,CAAG,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAElE,IAAME,GAAAA,CAAUC,CAAAA,GAAa,OAAA,CAAQ,OAAA,CAAS,IAAI,CAAA,CAC5CC,CAAAA,CAAK,IAAIC,SAAAA,CAAU,CAAA,EAAGH,GAAO,CAAA,eAAA,EAAkB,kBAAA,CAAmBH,CAAM,CAAC,CAAA,SAAA,CAAA,CAAa,CAC1F,OAAA,CAAS,CAAE,aAAA,CAAe,CAAA,OAAA,EAAUC,EAAQ,YAAY,CAAA,CAAG,CAC7D,CAAC,CAAA,CAED,QAAQ,GAAA,CAAIM,CAAAA,CAAM,IAAI,CAAA,wBAAA,EAA2BP,CAAM,uBAAuB,CAAC,CAAA,CAC/EK,EAAG,EAAA,CAAG,SAAA,CAAYG,GAAiB,CACjC,GAAI,CACF,IAAMC,CAAAA,CAAI,KAAK,KAAA,CAAMD,CAAAA,CAAK,UAAU,CAAA,CAC9BE,EAAKH,CAAAA,CAAM,GAAA,CAAI,IAAI,IAAA,CAAKE,CAAAA,CAAE,SAAS,CAAA,CAAE,kBAAA,EAAoB,CAAA,CACzDE,CAAAA,CAAOJ,EAAM,GAAA,CAAI,SAAS,CAAA,CAAEE,CAAAA,CAAE,MAAQ,SAAS,CAAA,CAC/CG,EAASH,CAAAA,CAAE,MAAA,GAAW,SAAWF,CAAAA,CAAM,KAAA,CAAM,UAAU,CAAA,CAC3DE,CAAAA,CAAE,SAAW,QAAA,CAAWF,CAAAA,CAAM,IAAI,SAAS,CAAA,CAC3CE,EAAE,MAAA,GAAW,MAAA,CAASF,EAAM,MAAA,CAAO,QAAQ,EAAIE,CAAAA,CAAE,MAAA,CAC7CI,EAAOJ,CAAAA,CAAE,IAAA,EAAQA,EAAE,IAAA,EAAQ,EAAA,CACjC,QAAQ,GAAA,CAAI,CAAA,EAAGC,CAAE,CAAA,CAAA,EAAIC,CAAI,IAAIC,CAAM,CAAA,CAAA,EAAIC,CAAI,CAAA,CAAE,EAC/C,CAAA,KAAQ,CACN,QAAQ,GAAA,CAAIL,CAAAA,CAAK,UAAU,EAC7B,CACF,CAAC,CAAA,CACDH,EAAG,EAAA,CAAG,OAAA,CAAUS,GAAQ,CAAE,OAAA,CAAQ,MAAMP,CAAAA,CAAM,GAAA,CAAI,UAAUO,CAAAA,CAAI,OAAO,EAAE,CAAC,CAAA,CAAG,QAAQ,IAAA,CAAK,CAAC,EAAE,CAAC,CAAA,CAC9F,QAAQ,EAAA,CAAG,QAAA,CAAU,IAAM,CAAET,CAAAA,CAAG,OAAM,CAAG,OAAA,CAAQ,KAAK,CAAC,EAAE,CAAC,EAC5D","file":"collab-activity-LEPWGNXB.js","sourcesContent":["import { WebSocket } from 'ws'\nimport chalk from 'chalk'\nimport { loadSession } from '../../lib/auth/session.js'\nimport { getApiBase } from '../../lib/api/cert-pin.js'\n\nexport default async function collabActivity(folder: string): Promise<void> {\n const session = await loadSession()\n if (!session) { console.error('Not authenticated'); process.exit(1) }\n\n const apiBase = getApiBase().replace(/^http/, 'ws')\n const ws = new WebSocket(`${apiBase}/api/v1/collab/${encodeURIComponent(folder)}/activity`, {\n headers: { Authorization: `Bearer ${session.access_token}` },\n })\n\n console.log(chalk.dim(`Streaming activity for \"${folder}\"... (Ctrl+C to stop)`))\n ws.on('message', (data: Buffer) => {\n try {\n const e = JSON.parse(data.toString())\n const ts = chalk.dim(new Date(e.timestamp).toLocaleTimeString())\n const user = chalk.hex('#4FC3F7')(e.user || 'unknown')\n const action = e.action === 'upload' ? chalk.green('uploaded') :\n e.action === 'delete' ? chalk.red('deleted') :\n e.action === 'edit' ? chalk.yellow('edited') : e.action\n const file = e.file || e.path || ''\n console.log(`${ts} ${user} ${action} ${file}`)\n } catch {\n console.log(data.toString())\n }\n })\n ws.on('error', (err) => { console.error(chalk.red(`Error: ${err.message}`)); process.exit(1) })\n process.on('SIGINT', () => { ws.close(); process.exit(0) })\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-RXARHDCW.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {g}from'./chunk-QT7R3AXE.js';import'./chunk-E2I4VVR5.js';async function m(i,e$1){let t=b(`Inviting ${e$1.email} to "${i}" as ${e$1.role}...`);t.start(),await e("/api/v1/collab/invite",{folder:i,email:e$1.email,role:e$1.role},{authenticated:true}),t.succeed(),g(`Invited ${e$1.email} to "${i}" as ${e$1.role}`);}export{m as default};//# sourceMappingURL=collab-invite-6QGPY7SO.js.map
2
+ //# sourceMappingURL=collab-invite-6QGPY7SO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/collab/collab-invite.ts"],"names":["collabInvite","folder","options","spinner","createSpinner","apiPost","logSuccess"],"mappings":"gMAIA,eAAOA,CAAAA,CAAoCC,EAAgBC,GAAAA,CAAyD,CAClH,IAAMC,CAAAA,CAAUC,CAAAA,CAAc,CAAA,SAAA,EAAYF,GAAAA,CAAQ,KAAK,CAAA,KAAA,EAAQD,CAAM,CAAA,KAAA,EAAQC,GAAAA,CAAQ,IAAI,CAAA,GAAA,CAAK,CAAA,CAC9FC,CAAAA,CAAQ,OAAM,CACd,MAAME,CAAAA,CAAQ,uBAAA,CAAyB,CACrC,MAAA,CAAAJ,EACA,KAAA,CAAOC,GAAAA,CAAQ,KAAA,CACf,IAAA,CAAMA,GAAAA,CAAQ,IAChB,EAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CAC1BC,CAAAA,CAAQ,SAAQ,CAChBG,CAAAA,CAAW,CAAA,QAAA,EAAWJ,GAAAA,CAAQ,KAAK,CAAA,KAAA,EAAQD,CAAM,CAAA,KAAA,EAAQC,GAAAA,CAAQ,IAAI,CAAA,CAAE,EACzE","file":"collab-invite-HAMMPEAQ.js","sourcesContent":["import { apiPost } from '../../lib/api/client.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\n\nexport default async function collabInvite(folder: string, options: { email: string; role: string }): Promise<void> {\n const spinner = createSpinner(`Inviting ${options.email} to \"${folder}\" as ${options.role}...`)\n spinner.start()\n await apiPost('/api/v1/collab/invite', {\n folder,\n email: options.email,\n role: options.role,\n }, { authenticated: true })\n spinner.succeed()\n logSuccess(`Invited ${options.email} to \"${folder}\" as ${options.role}`)\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/collab/collab-invite.ts"],"names":["collabInvite","folder","options","spinner","createSpinner","apiPost","logSuccess"],"mappings":"gMAIA,eAAOA,CAAAA,CAAoCC,EAAgBC,GAAAA,CAAyD,CAClH,IAAMC,CAAAA,CAAUC,CAAAA,CAAc,CAAA,SAAA,EAAYF,GAAAA,CAAQ,KAAK,CAAA,KAAA,EAAQD,CAAM,CAAA,KAAA,EAAQC,GAAAA,CAAQ,IAAI,CAAA,GAAA,CAAK,CAAA,CAC9FC,CAAAA,CAAQ,OAAM,CACd,MAAME,CAAAA,CAAQ,uBAAA,CAAyB,CACrC,MAAA,CAAAJ,EACA,KAAA,CAAOC,GAAAA,CAAQ,KAAA,CACf,IAAA,CAAMA,GAAAA,CAAQ,IAChB,EAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CAC1BC,CAAAA,CAAQ,SAAQ,CAChBG,CAAAA,CAAW,CAAA,QAAA,EAAWJ,GAAAA,CAAQ,KAAK,CAAA,KAAA,EAAQD,CAAM,CAAA,KAAA,EAAQC,GAAAA,CAAQ,IAAI,CAAA,CAAE,EACzE","file":"collab-invite-6QGPY7SO.js","sourcesContent":["import { apiPost } from '../../lib/api/client.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\n\nexport default async function collabInvite(folder: string, options: { email: string; role: string }): Promise<void> {\n const spinner = createSpinner(`Inviting ${options.email} to \"${folder}\" as ${options.role}...`)\n spinner.start()\n await apiPost('/api/v1/collab/invite', {\n folder,\n email: options.email,\n role: options.role,\n }, { authenticated: true })\n spinner.succeed()\n logSuccess(`Invited ${options.email} to \"${folder}\" as ${options.role}`)\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-BC2OVPRV.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {g}from'./chunk-QT7R3AXE.js';import'./chunk-4NTVRCZM.js';import n from'inquirer';async function m(e$1){let{confirm:a}=await n.prompt([{type:"confirm",name:"confirm",message:`Remove yourself from "${e$1}"?`,default:false}]);if(!a)return;let t=b(`Leaving "${e$1}"...`);t.start(),await e("/api/v1/collab/leave",{folder:e$1},{authenticated:true}),t.succeed(),g(`You left "${e$1}"`);}export{m as default};//# sourceMappingURL=collab-leave-MTCXHQ4T.js.map
2
- //# sourceMappingURL=collab-leave-MTCXHQ4T.js.map
1
+ import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-RXARHDCW.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {g}from'./chunk-QT7R3AXE.js';import'./chunk-E2I4VVR5.js';import n from'inquirer';async function m(e$1){let{confirm:a}=await n.prompt([{type:"confirm",name:"confirm",message:`Remove yourself from "${e$1}"?`,default:false}]);if(!a)return;let t=b(`Leaving "${e$1}"...`);t.start(),await e("/api/v1/collab/leave",{folder:e$1},{authenticated:true}),t.succeed(),g(`You left "${e$1}"`);}export{m as default};//# sourceMappingURL=collab-leave-YMTEY2CZ.js.map
2
+ //# sourceMappingURL=collab-leave-YMTEY2CZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/collab/collab-leave.ts"],"names":["collabLeave","folder","confirm","inquirer","spinner","createSpinner","apiPost","logSuccess"],"mappings":"wNAKA,eAAOA,CAAAA,CAAmCC,GAAAA,CAA+B,CACvE,GAAM,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAAI,MAAMC,CAAAA,CAAS,MAAA,CAAO,CAAC,CACzC,IAAA,CAAM,SAAA,CACN,IAAA,CAAM,SAAA,CACN,OAAA,CAAS,CAAA,sBAAA,EAAyBF,GAAM,CAAA,EAAA,CAAA,CACxC,OAAA,CAAS,KACX,CAAC,CAAC,EACF,GAAI,CAACC,CAAAA,CAAS,OACd,IAAME,CAAAA,CAAUC,CAAAA,CAAc,CAAA,SAAA,EAAYJ,GAAM,CAAA,IAAA,CAAM,CAAA,CACtDG,CAAAA,CAAQ,KAAA,EAAM,CACd,MAAME,CAAAA,CAAQ,sBAAA,CAAwB,CAAE,MAAA,CAAAL,GAAO,CAAA,CAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CACzEG,CAAAA,CAAQ,OAAA,EAAQ,CAChBG,CAAAA,CAAW,CAAA,UAAA,EAAaN,GAAM,GAAG,EACnC","file":"collab-leave-MTCXHQ4T.js","sourcesContent":["import inquirer from 'inquirer'\nimport { apiPost } from '../../lib/api/client.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\n\nexport default async function collabLeave(folder: string): Promise<void> {\n const { confirm } = await inquirer.prompt([{\n type: 'confirm',\n name: 'confirm',\n message: `Remove yourself from \"${folder}\"?`,\n default: false,\n }])\n if (!confirm) return\n const spinner = createSpinner(`Leaving \"${folder}\"...`)\n spinner.start()\n await apiPost('/api/v1/collab/leave', { folder }, { authenticated: true })\n spinner.succeed()\n logSuccess(`You left \"${folder}\"`)\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/collab/collab-leave.ts"],"names":["collabLeave","folder","confirm","inquirer","spinner","createSpinner","apiPost","logSuccess"],"mappings":"wNAKA,eAAOA,CAAAA,CAAmCC,GAAAA,CAA+B,CACvE,GAAM,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAAI,MAAMC,CAAAA,CAAS,MAAA,CAAO,CAAC,CACzC,IAAA,CAAM,SAAA,CACN,IAAA,CAAM,SAAA,CACN,OAAA,CAAS,CAAA,sBAAA,EAAyBF,GAAM,CAAA,EAAA,CAAA,CACxC,OAAA,CAAS,KACX,CAAC,CAAC,EACF,GAAI,CAACC,CAAAA,CAAS,OACd,IAAME,CAAAA,CAAUC,CAAAA,CAAc,CAAA,SAAA,EAAYJ,GAAM,CAAA,IAAA,CAAM,CAAA,CACtDG,CAAAA,CAAQ,KAAA,EAAM,CACd,MAAME,CAAAA,CAAQ,sBAAA,CAAwB,CAAE,MAAA,CAAAL,GAAO,CAAA,CAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CACzEG,CAAAA,CAAQ,OAAA,EAAQ,CAChBG,CAAAA,CAAW,CAAA,UAAA,EAAaN,GAAM,GAAG,EACnC","file":"collab-leave-YMTEY2CZ.js","sourcesContent":["import inquirer from 'inquirer'\nimport { apiPost } from '../../lib/api/client.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\n\nexport default async function collabLeave(folder: string): Promise<void> {\n const { confirm } = await inquirer.prompt([{\n type: 'confirm',\n name: 'confirm',\n message: `Remove yourself from \"${folder}\"?`,\n default: false,\n }])\n if (!confirm) return\n const spinner = createSpinner(`Leaving \"${folder}\"...`)\n spinner.start()\n await apiPost('/api/v1/collab/leave', { folder }, { authenticated: true })\n spinner.succeed()\n logSuccess(`You left \"${folder}\"`)\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {d}from'./chunk-BC2OVPRV.js';import'./chunk-NDB6KXYI.js';import {a}from'./chunk-THMWE2I6.js';import {c}from'./chunk-G4JU7IUC.js';import'./chunk-QT7R3AXE.js';import'./chunk-4NTVRCZM.js';import t from'chalk';async function n(r){let i=((await d(`/api/v1/collab/list?folder=${encodeURIComponent(r)}`,{authenticated:true})).collaborators||[]).map(e=>({email:e.email,user:e.username,role:t.hex("#7C4DFF")(e.role),joined:c(e.joined_at),active:e.last_active?c(e.last_active):t.dim("never")}));console.log(a(i,[{key:"email",label:"Email"},{key:"user",label:"User"},{key:"role",label:"Role"},{key:"joined",label:"Joined"},{key:"active",label:"Last Active"}]));}export{n as default};//# sourceMappingURL=collab-list-JV4ZCWLB.js.map
2
- //# sourceMappingURL=collab-list-JV4ZCWLB.js.map
1
+ import {d}from'./chunk-RXARHDCW.js';import'./chunk-NDB6KXYI.js';import {a}from'./chunk-THMWE2I6.js';import {c}from'./chunk-G4JU7IUC.js';import'./chunk-QT7R3AXE.js';import'./chunk-E2I4VVR5.js';import t from'chalk';async function n(r){let i=((await d(`/api/v1/collab/list?folder=${encodeURIComponent(r)}`,{authenticated:true})).collaborators||[]).map(e=>({email:e.email,user:e.username,role:t.hex("#7C4DFF")(e.role),joined:c(e.joined_at),active:e.last_active?c(e.last_active):t.dim("never")}));console.log(a(i,[{key:"email",label:"Email"},{key:"user",label:"User"},{key:"role",label:"Role"},{key:"joined",label:"Joined"},{key:"active",label:"Last Active"}]));}export{n as default};//# sourceMappingURL=collab-list-AQUFYKGI.js.map
2
+ //# sourceMappingURL=collab-list-AQUFYKGI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/collab/collab-list.ts"],"names":["collabList","folder","rows","apiGet","c","chalk","formatRelative","renderTable"],"mappings":"qNAaA,eAAOA,CAAAA,CAAkCC,EAA+B,CAEtE,IAAMC,IADO,MAAMC,CAAAA,CAA0C,8BAA8B,kBAAA,CAAmBF,CAAM,CAAC,CAAA,CAAA,CAAI,CAAE,cAAe,IAAK,CAAC,GAC7H,aAAA,EAAiB,IAAI,GAAA,CAAIG,CAAAA,GAAM,CAChD,KAAA,CAAOA,CAAAA,CAAE,MACT,IAAA,CAAMA,CAAAA,CAAE,SACR,IAAA,CAAMC,CAAAA,CAAM,IAAI,SAAS,CAAA,CAAED,EAAE,IAAI,CAAA,CACjC,OAAQE,CAAAA,CAAeF,CAAAA,CAAE,SAAS,CAAA,CAClC,MAAA,CAAQA,CAAAA,CAAE,YAAcE,CAAAA,CAAeF,CAAAA,CAAE,WAAW,CAAA,CAAIC,CAAAA,CAAM,IAAI,OAAO,CAC3E,EAAE,CAAA,CACF,OAAA,CAAQ,IAAIE,CAAAA,CAAYL,CAAAA,CAAM,CAC5B,CAAE,GAAA,CAAK,QAAS,KAAA,CAAO,OAAQ,CAAA,CAC/B,CAAE,GAAA,CAAK,MAAA,CAAQ,MAAO,MAAO,CAAA,CAC7B,CAAE,GAAA,CAAK,MAAA,CAAQ,MAAO,MAAO,CAAA,CAC7B,CAAE,GAAA,CAAK,QAAA,CAAU,MAAO,QAAS,CAAA,CACjC,CAAE,GAAA,CAAK,QAAA,CAAU,MAAO,aAAc,CACxC,CAAC,CAAC,EACJ","file":"collab-list-JV4ZCWLB.js","sourcesContent":["import { apiGet } from '../../lib/api/client.js'\nimport { renderTable } from '../../lib/output/table.js'\nimport { formatRelative } from '../../lib/utils/format.js'\nimport chalk from 'chalk'\n\ninterface Collaborator {\n email: string\n username: string\n role: string\n joined_at: string\n last_active: string | null\n}\n\nexport default async function collabList(folder: string): Promise<void> {\n const data = await apiGet<{ collaborators: Collaborator[] }>(`/api/v1/collab/list?folder=${encodeURIComponent(folder)}`, { authenticated: true })\n const rows = (data.collaborators || []).map(c => ({\n email: c.email,\n user: c.username,\n role: chalk.hex('#7C4DFF')(c.role),\n joined: formatRelative(c.joined_at),\n active: c.last_active ? formatRelative(c.last_active) : chalk.dim('never'),\n }))\n console.log(renderTable(rows, [\n { key: 'email', label: 'Email' },\n { key: 'user', label: 'User' },\n { key: 'role', label: 'Role' },\n { key: 'joined', label: 'Joined' },\n { key: 'active', label: 'Last Active' },\n ]))\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/collab/collab-list.ts"],"names":["collabList","folder","rows","apiGet","c","chalk","formatRelative","renderTable"],"mappings":"qNAaA,eAAOA,CAAAA,CAAkCC,EAA+B,CAEtE,IAAMC,IADO,MAAMC,CAAAA,CAA0C,8BAA8B,kBAAA,CAAmBF,CAAM,CAAC,CAAA,CAAA,CAAI,CAAE,cAAe,IAAK,CAAC,GAC7H,aAAA,EAAiB,IAAI,GAAA,CAAIG,CAAAA,GAAM,CAChD,KAAA,CAAOA,CAAAA,CAAE,MACT,IAAA,CAAMA,CAAAA,CAAE,SACR,IAAA,CAAMC,CAAAA,CAAM,IAAI,SAAS,CAAA,CAAED,EAAE,IAAI,CAAA,CACjC,OAAQE,CAAAA,CAAeF,CAAAA,CAAE,SAAS,CAAA,CAClC,MAAA,CAAQA,CAAAA,CAAE,YAAcE,CAAAA,CAAeF,CAAAA,CAAE,WAAW,CAAA,CAAIC,CAAAA,CAAM,IAAI,OAAO,CAC3E,EAAE,CAAA,CACF,OAAA,CAAQ,IAAIE,CAAAA,CAAYL,CAAAA,CAAM,CAC5B,CAAE,GAAA,CAAK,QAAS,KAAA,CAAO,OAAQ,CAAA,CAC/B,CAAE,GAAA,CAAK,MAAA,CAAQ,MAAO,MAAO,CAAA,CAC7B,CAAE,GAAA,CAAK,MAAA,CAAQ,MAAO,MAAO,CAAA,CAC7B,CAAE,GAAA,CAAK,QAAA,CAAU,MAAO,QAAS,CAAA,CACjC,CAAE,GAAA,CAAK,QAAA,CAAU,MAAO,aAAc,CACxC,CAAC,CAAC,EACJ","file":"collab-list-AQUFYKGI.js","sourcesContent":["import { apiGet } from '../../lib/api/client.js'\nimport { renderTable } from '../../lib/output/table.js'\nimport { formatRelative } from '../../lib/utils/format.js'\nimport chalk from 'chalk'\n\ninterface Collaborator {\n email: string\n username: string\n role: string\n joined_at: string\n last_active: string | null\n}\n\nexport default async function collabList(folder: string): Promise<void> {\n const data = await apiGet<{ collaborators: Collaborator[] }>(`/api/v1/collab/list?folder=${encodeURIComponent(folder)}`, { authenticated: true })\n const rows = (data.collaborators || []).map(c => ({\n email: c.email,\n user: c.username,\n role: chalk.hex('#7C4DFF')(c.role),\n joined: formatRelative(c.joined_at),\n active: c.last_active ? formatRelative(c.last_active) : chalk.dim('never'),\n }))\n console.log(renderTable(rows, [\n { key: 'email', label: 'Email' },\n { key: 'user', label: 'User' },\n { key: 'role', label: 'Role' },\n { key: 'joined', label: 'Joined' },\n { key: 'active', label: 'Last Active' },\n ]))\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-RXARHDCW.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {g}from'./chunk-QT7R3AXE.js';import'./chunk-E2I4VVR5.js';async function o(e$1,i){let m=b(`Removing ${i.email} from "${e$1}"...`);m.start(),await e("/api/v1/collab/remove",{folder:e$1,email:i.email},{authenticated:true}),m.succeed(),g(`Removed ${i.email} from "${e$1}"`);}export{o as default};//# sourceMappingURL=collab-remove-CJSQYEUI.js.map
2
+ //# sourceMappingURL=collab-remove-CJSQYEUI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/collab/collab-remove.ts"],"names":["collabRemove","folder","options","spinner","createSpinner","apiPost","logSuccess"],"mappings":"gMAIA,eAAOA,EAAoCC,GAAAA,CAAgBC,CAAAA,CAA2C,CACpG,IAAMC,CAAAA,CAAUC,EAAc,CAAA,SAAA,EAAYF,CAAAA,CAAQ,KAAK,CAAA,OAAA,EAAUD,GAAM,MAAM,CAAA,CAC7EE,CAAAA,CAAQ,OAAM,CACd,MAAME,EAAQ,uBAAA,CAAyB,CAAE,MAAA,CAAAJ,GAAAA,CAAQ,MAAOC,CAAAA,CAAQ,KAAM,EAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CAChGC,EAAQ,OAAA,EAAQ,CAChBG,EAAW,CAAA,QAAA,EAAWJ,CAAAA,CAAQ,KAAK,CAAA,OAAA,EAAUD,GAAM,GAAG,EACxD","file":"collab-remove-DO4BIA5R.js","sourcesContent":["import { apiPost } from '../../lib/api/client.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\n\nexport default async function collabRemove(folder: string, options: { email: string }): Promise<void> {\n const spinner = createSpinner(`Removing ${options.email} from \"${folder}\"...`)\n spinner.start()\n await apiPost('/api/v1/collab/remove', { folder, email: options.email }, { authenticated: true })\n spinner.succeed()\n logSuccess(`Removed ${options.email} from \"${folder}\"`)\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/collab/collab-remove.ts"],"names":["collabRemove","folder","options","spinner","createSpinner","apiPost","logSuccess"],"mappings":"gMAIA,eAAOA,EAAoCC,GAAAA,CAAgBC,CAAAA,CAA2C,CACpG,IAAMC,CAAAA,CAAUC,EAAc,CAAA,SAAA,EAAYF,CAAAA,CAAQ,KAAK,CAAA,OAAA,EAAUD,GAAM,MAAM,CAAA,CAC7EE,CAAAA,CAAQ,OAAM,CACd,MAAME,EAAQ,uBAAA,CAAyB,CAAE,MAAA,CAAAJ,GAAAA,CAAQ,MAAOC,CAAAA,CAAQ,KAAM,EAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CAChGC,EAAQ,OAAA,EAAQ,CAChBG,EAAW,CAAA,QAAA,EAAWJ,CAAAA,CAAQ,KAAK,CAAA,OAAA,EAAUD,GAAM,GAAG,EACxD","file":"collab-remove-CJSQYEUI.js","sourcesContent":["import { apiPost } from '../../lib/api/client.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\n\nexport default async function collabRemove(folder: string, options: { email: string }): Promise<void> {\n const spinner = createSpinner(`Removing ${options.email} from \"${folder}\"...`)\n spinner.start()\n await apiPost('/api/v1/collab/remove', { folder, email: options.email }, { authenticated: true })\n spinner.succeed()\n logSuccess(`Removed ${options.email} from \"${folder}\"`)\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-BC2OVPRV.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {g}from'./chunk-QT7R3AXE.js';import'./chunk-4NTVRCZM.js';import c from'inquirer';async function m(r,t){let{confirm:a}=await c.prompt([{type:"input",name:"confirm",message:`Type "${r}" to confirm ownership transfer to ${t.to}:`,validate:s=>s===r?true:"Type the exact folder name to confirm"}]);if(a!==r)return;let e$1=b(`Transferring ownership of "${r}" to ${t.to}...`);e$1.start(),await e("/api/v1/collab/transfer",{folder:r,new_owner:t.to},{authenticated:true}),e$1.succeed(),g(`Ownership of "${r}" transferred to ${t.to}`);}export{m as default};//# sourceMappingURL=collab-transfer-6CG5PHVC.js.map
2
- //# sourceMappingURL=collab-transfer-6CG5PHVC.js.map
1
+ import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-RXARHDCW.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {g}from'./chunk-QT7R3AXE.js';import'./chunk-E2I4VVR5.js';import c from'inquirer';async function m(r,t){let{confirm:a}=await c.prompt([{type:"input",name:"confirm",message:`Type "${r}" to confirm ownership transfer to ${t.to}:`,validate:s=>s===r?true:"Type the exact folder name to confirm"}]);if(a!==r)return;let e$1=b(`Transferring ownership of "${r}" to ${t.to}...`);e$1.start(),await e("/api/v1/collab/transfer",{folder:r,new_owner:t.to},{authenticated:true}),e$1.succeed(),g(`Ownership of "${r}" transferred to ${t.to}`);}export{m as default};//# sourceMappingURL=collab-transfer-I6O6T3AC.js.map
2
+ //# sourceMappingURL=collab-transfer-I6O6T3AC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/collab/collab-transfer.ts"],"names":["collabTransfer","folder","options","confirm","inquirer","v","spinner","createSpinner","apiPost","logSuccess"],"mappings":"wNAKA,eAAOA,CAAAA,CAAsCC,CAAAA,CAAgBC,EAAwC,CACnG,GAAM,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAAI,MAAMC,CAAAA,CAAS,MAAA,CAAO,CAAC,CACzC,IAAA,CAAM,OAAA,CACN,IAAA,CAAM,UACN,OAAA,CAAS,CAAA,MAAA,EAASH,CAAM,CAAA,mCAAA,EAAsCC,EAAQ,EAAE,CAAA,CAAA,CAAA,CACxE,QAAA,CAAWG,CAAAA,EAAcA,IAAMJ,CAAAA,CAAS,IAAA,CAAO,uCACjD,CAAC,CAAC,EACF,GAAIE,CAAAA,GAAYF,CAAAA,CAAQ,OAExB,IAAMK,GAAAA,CAAUC,CAAAA,CAAc,CAAA,2BAAA,EAA8BN,CAAM,QAAQC,CAAAA,CAAQ,EAAE,CAAA,GAAA,CAAK,CAAA,CACzFI,IAAQ,KAAA,EAAM,CACd,MAAME,CAAAA,CAAQ,yBAAA,CAA2B,CAAE,MAAA,CAAAP,CAAAA,CAAQ,SAAA,CAAWC,CAAAA,CAAQ,EAAG,CAAA,CAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CACnGI,GAAAA,CAAQ,OAAA,EAAQ,CAChBG,EAAW,CAAA,cAAA,EAAiBR,CAAM,oBAAoBC,CAAAA,CAAQ,EAAE,EAAE,EACpE","file":"collab-transfer-6CG5PHVC.js","sourcesContent":["import inquirer from 'inquirer'\nimport { apiPost } from '../../lib/api/client.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\n\nexport default async function collabTransfer(folder: string, options: { to: string }): Promise<void> {\n const { confirm } = await inquirer.prompt([{\n type: 'input',\n name: 'confirm',\n message: `Type \"${folder}\" to confirm ownership transfer to ${options.to}:`,\n validate: (v: string) => v === folder ? true : 'Type the exact folder name to confirm',\n }])\n if (confirm !== folder) return\n\n const spinner = createSpinner(`Transferring ownership of \"${folder}\" to ${options.to}...`)\n spinner.start()\n await apiPost('/api/v1/collab/transfer', { folder, new_owner: options.to }, { authenticated: true })\n spinner.succeed()\n logSuccess(`Ownership of \"${folder}\" transferred to ${options.to}`)\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/collab/collab-transfer.ts"],"names":["collabTransfer","folder","options","confirm","inquirer","v","spinner","createSpinner","apiPost","logSuccess"],"mappings":"wNAKA,eAAOA,CAAAA,CAAsCC,CAAAA,CAAgBC,EAAwC,CACnG,GAAM,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAAI,MAAMC,CAAAA,CAAS,MAAA,CAAO,CAAC,CACzC,IAAA,CAAM,OAAA,CACN,IAAA,CAAM,UACN,OAAA,CAAS,CAAA,MAAA,EAASH,CAAM,CAAA,mCAAA,EAAsCC,EAAQ,EAAE,CAAA,CAAA,CAAA,CACxE,QAAA,CAAWG,CAAAA,EAAcA,IAAMJ,CAAAA,CAAS,IAAA,CAAO,uCACjD,CAAC,CAAC,EACF,GAAIE,CAAAA,GAAYF,CAAAA,CAAQ,OAExB,IAAMK,GAAAA,CAAUC,CAAAA,CAAc,CAAA,2BAAA,EAA8BN,CAAM,QAAQC,CAAAA,CAAQ,EAAE,CAAA,GAAA,CAAK,CAAA,CACzFI,IAAQ,KAAA,EAAM,CACd,MAAME,CAAAA,CAAQ,yBAAA,CAA2B,CAAE,MAAA,CAAAP,CAAAA,CAAQ,SAAA,CAAWC,CAAAA,CAAQ,EAAG,CAAA,CAAG,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CACnGI,GAAAA,CAAQ,OAAA,EAAQ,CAChBG,EAAW,CAAA,cAAA,EAAiBR,CAAM,oBAAoBC,CAAAA,CAAQ,EAAE,EAAE,EACpE","file":"collab-transfer-I6O6T3AC.js","sourcesContent":["import inquirer from 'inquirer'\nimport { apiPost } from '../../lib/api/client.js'\nimport { createSpinner } from '../../lib/output/spinner.js'\nimport { logSuccess } from '../../lib/output/logger.js'\n\nexport default async function collabTransfer(folder: string, options: { to: string }): Promise<void> {\n const { confirm } = await inquirer.prompt([{\n type: 'input',\n name: 'confirm',\n message: `Type \"${folder}\" to confirm ownership transfer to ${options.to}:`,\n validate: (v: string) => v === folder ? true : 'Type the exact folder name to confirm',\n }])\n if (confirm !== folder) return\n\n const spinner = createSpinner(`Transferring ownership of \"${folder}\" to ${options.to}...`)\n spinner.start()\n await apiPost('/api/v1/collab/transfer', { folder, new_owner: options.to }, { authenticated: true })\n spinner.succeed()\n logSuccess(`Ownership of \"${folder}\" transferred to ${options.to}`)\n}\n"]}
@@ -1,3 +1,3 @@
1
- import {a}from'./chunk-MKRWNV2T.js';import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-BC2OVPRV.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {h as h$1,i,f,m,g,c,b as b$1}from'./chunk-QT7R3AXE.js';import'./chunk-4NTVRCZM.js';import h from'path';import P from'fs';import A from'clipboardy';import v from'chalk';import B from'cli-progress';async function F(d){let e=h.resolve(d),a=P.statSync(e);if(a.isFile())return h.extname(e).toLowerCase()===".html"?{type:"single-file",rootPath:e,hasIndexHtml:true,htmlFiles:[e],totalFiles:1}:{type:"invalid",rootPath:e,hasIndexHtml:false,htmlFiles:[],totalFiles:0};if(a.isDirectory()){let m=function(i){let u=P.readdirSync(i,{withFileTypes:true});for(let n of u){let c=h.join(i,n.name);n.isDirectory()?!n.name.startsWith(".")&&n.name!=="node_modules"&&m(c):n.isFile()&&(l++,n.name.endsWith(".html")&&t.push(c));}};let t=[],l=0;if(m(e),t.length===0)return {type:"invalid",rootPath:e,hasIndexHtml:false,htmlFiles:[],totalFiles:l};let o=t.some(i=>h.basename(i).toLowerCase()==="index.html");return {type:"codebase",rootPath:e,hasIndexHtml:o,htmlFiles:t,totalFiles:l}}return {type:"invalid",rootPath:e,hasIndexHtml:false,htmlFiles:[],totalFiles:0}}async function L(d,e$1){let a$1=d?h.resolve(d):process.cwd(),r=b("Analyzing project...");r.start();let t=await F(a$1);t.type==="invalid"&&(r.fail(),h$1(`No deployable content found at ${a$1}. Provide an HTML file or folder containing HTML files.`),process.exit(1)),t.type==="codebase"&&!t.hasIndexHtml&&(r.warn(),i("No index.html found at root. Scanning one level deep for entry point...")),r.text="Uploading files...";let l={source:a$1,type:t.type,slug:e$1?.name,environment:e$1?.env||(e$1?.preview?"preview":"production"),force:e$1?.force||false};if(t.type==="codebase"){let n=function(p){let y=P.readdirSync(p,{withFileTypes:true});for(let s of y){let f=h.join(p,s.name);s.isDirectory()?!s.name.startsWith(".")&&s.name!=="node_modules"&&n(f):s.isFile()&&(a(s.name)?i.push(f):u.push(f));}};let i=[],u=[];n(t.rootPath),!e$1?.force&&t.type==="codebase"&&(r.text="Computing diff...");let c=new B.SingleBar({format:`${v.hex("#7C4DFF")("\u25B8")} Uploading |${v.hex("#7C4DFF")("{bar}")}| {percentage}% | {value}/{total} files | {speed}`,barCompleteChar:"\u2588",barIncompleteChar:"\u2591",hideCursor:true});c.start(i.length,0);let w=new FormData,b=0;for(let p of i){let y=h.relative(t.rootPath,p),s=P.readFileSync(p),f=new Blob([s]);w.append("files",f,y),b++,c.update(b);}c.stop(),r.stop(),l.files=w;}if(t.type==="single-file"){let o=P.readFileSync(t.rootPath,"utf-8");l.htmlContent=o;}r.text="Deploying to SquidCloud...",r.start();try{let o=await e("/api/v1/deploy",l,{authenticated:!0});r.succeed();let i=o.url||`https://squidcloud.vercel.app/sites/${e$1?.name||o.deploy_id}`;try{await A.write(i);}catch{}if(f()){m(o);return}g("Deployed successfully!"),console.log(` ${v.hex("#4FC3F7")(i)} ${c("")}`),o.file_count&&console.log(` ${b$1(`${o.file_count} files \xB7 ${o.deploy_time_ms}ms`)}`);}catch(o){throw r.fail(),o}}
2
- export{L as default};//# sourceMappingURL=deploy-X5HX7V4J.js.map
3
- //# sourceMappingURL=deploy-X5HX7V4J.js.map
1
+ import {a}from'./chunk-MKRWNV2T.js';import {b}from'./chunk-FYFPDKJM.js';import {e}from'./chunk-RXARHDCW.js';import'./chunk-NDB6KXYI.js';import'./chunk-THMWE2I6.js';import {h as h$1,i,f,m,g,c,b as b$1}from'./chunk-QT7R3AXE.js';import'./chunk-E2I4VVR5.js';import h from'path';import P from'fs';import A from'clipboardy';import v from'chalk';import B from'cli-progress';async function F(d){let e=h.resolve(d),a=P.statSync(e);if(a.isFile())return h.extname(e).toLowerCase()===".html"?{type:"single-file",rootPath:e,hasIndexHtml:true,htmlFiles:[e],totalFiles:1}:{type:"invalid",rootPath:e,hasIndexHtml:false,htmlFiles:[],totalFiles:0};if(a.isDirectory()){let m=function(i){let u=P.readdirSync(i,{withFileTypes:true});for(let n of u){let c=h.join(i,n.name);n.isDirectory()?!n.name.startsWith(".")&&n.name!=="node_modules"&&m(c):n.isFile()&&(l++,n.name.endsWith(".html")&&t.push(c));}};let t=[],l=0;if(m(e),t.length===0)return {type:"invalid",rootPath:e,hasIndexHtml:false,htmlFiles:[],totalFiles:l};let o=t.some(i=>h.basename(i).toLowerCase()==="index.html");return {type:"codebase",rootPath:e,hasIndexHtml:o,htmlFiles:t,totalFiles:l}}return {type:"invalid",rootPath:e,hasIndexHtml:false,htmlFiles:[],totalFiles:0}}async function L(d,e$1){let a$1=d?h.resolve(d):process.cwd(),r=b("Analyzing project...");r.start();let t=await F(a$1);t.type==="invalid"&&(r.fail(),h$1(`No deployable content found at ${a$1}. Provide an HTML file or folder containing HTML files.`),process.exit(1)),t.type==="codebase"&&!t.hasIndexHtml&&(r.warn(),i("No index.html found at root. Scanning one level deep for entry point...")),r.text="Uploading files...";let l={source:a$1,type:t.type,slug:e$1?.name,environment:e$1?.env||(e$1?.preview?"preview":"production"),force:e$1?.force||false};if(t.type==="codebase"){let n=function(p){let y=P.readdirSync(p,{withFileTypes:true});for(let s of y){let f=h.join(p,s.name);s.isDirectory()?!s.name.startsWith(".")&&s.name!=="node_modules"&&n(f):s.isFile()&&(a(s.name)?i.push(f):u.push(f));}};let i=[],u=[];n(t.rootPath),!e$1?.force&&t.type==="codebase"&&(r.text="Computing diff...");let c=new B.SingleBar({format:`${v.hex("#7C4DFF")("\u25B8")} Uploading |${v.hex("#7C4DFF")("{bar}")}| {percentage}% | {value}/{total} files | {speed}`,barCompleteChar:"\u2588",barIncompleteChar:"\u2591",hideCursor:true});c.start(i.length,0);let w=new FormData,b=0;for(let p of i){let y=h.relative(t.rootPath,p),s=P.readFileSync(p),f=new Blob([s]);w.append("files",f,y),b++,c.update(b);}c.stop(),r.stop(),l.files=w;}if(t.type==="single-file"){let o=P.readFileSync(t.rootPath,"utf-8");l.htmlContent=o;}r.text="Deploying to SquidCloud...",r.start();try{let o=await e("/api/v1/deploy",l,{authenticated:!0});r.succeed();let i=o.url||`https://squidcloud.vercel.app/sites/${e$1?.name||o.deploy_id}`;try{await A.write(i);}catch{}if(f()){m(o);return}g("Deployed successfully!"),console.log(` ${v.hex("#4FC3F7")(i)} ${c("")}`),o.file_count&&console.log(` ${b$1(`${o.file_count} files \xB7 ${o.deploy_time_ms}ms`)}`);}catch(o){throw r.fail(),o}}
2
+ export{L as default};//# sourceMappingURL=deploy-3AMFZQ7I.js.map
3
+ //# sourceMappingURL=deploy-3AMFZQ7I.js.map