aspect-sync 0.1.23 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +6 -6
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as Wt}from"commander";import Ye from"node:path";import{readFileSync as Kt}from"node:fs";import{fileURLToPath as Yt}from"node:url";import Xe from"node:os";import Fe from"node:path";var Ve="phc_rDzmwduU3NzHyELgLEg7nMjqpTgaSpC2a6tMKL8VyjN",Je="https://t.aspect.inc",Ze="https://t.aspect.inc";function et(n){let e=n.match(/^(\d+(?:\.\d+)?)\s*(B|KB|MB|GB|TB)$/i);if(!e)return null;let t=parseFloat(e[1]),s=e[2].toUpperCase(),r={B:1,KB:1024,MB:1024*1024,GB:1024*1024*1024,TB:1024*1024*1024*1024};return t*(r[s]||1)}function ve(n){let e=n.options.apiKey||n.environment.ASPECT_API_KEY||"";if(!e)throw new Error("Error: --api-key is required (or set ASPECT_API_KEY env variable)");let t=ue({value:n.options.rcloneTransfers,optionName:"--rclone-transfers"}),s=ue({value:n.options.rcloneMultiThreadStreams,optionName:"--rclone-multi-thread-streams"}),r=ue({value:n.options.uploadConcurrent,optionName:"--upload-concurrent"}),i=tt(n.options.batchSize),o=n.options.session??st({now:n.now??new Date,highResolutionTime:n.highResolutionTime??process.hrtime.bigint()}),a=n.options.tempDir||Fe.join(Xe.homedir(),".aspect","sync");return{remote:n.options.remote,remotePath:n.options.path,directoryId:n.options.directoryId,projectId:n.options.projectId,apiUrl:n.options.apiUrl||n.environment.ASPECT_API_URL||"https://api.aspect.inc",edgeWorkerUrl:n.options.edgeWorkerUrl||n.environment.ASPECT_EDGE_WORKER_URL||"https://mackinac.aspect.inc",apiKey:e,maxConcurrent:r,keepLocal:n.options.keepLocal,localTempDir:Fe.join(a,o),sessionName:o,rcloneOptions:{transfers:t,checkers:t>=16?Math.floor(t/4):t,multiThreadStreams:s,multiThreadChunkSize:n.options.rcloneMultiThreadChunkSize,multiThreadCutoff:n.options.rcloneMultiThreadCutoff,bufferSize:n.options.rcloneBufferSize,useMmap:!n.options.rcloneNoMmap,extraRcloneArgs:n.options.rcloneExtra},batchSizeBytes:i,analytics:{posthogKey:n.environment.ASPECT_POSTHOG_KEY||n.environment.POSTHOG_KEY||n.environment.POSTHOG_API_KEY||Ve,posthogHost:n.environment.ASPECT_POSTHOG_HOST||n.environment.POSTHOG_HOST||Je||Ze,disabled:Ie(n.environment.ASPECT_DISABLE_POSTHOG)||Ie(n.environment.POSTHOG_DISABLED)}}}function ue(n){let e=parseInt(n.value,10);if(Number.isNaN(e)||e<1)throw new Error(`Error: ${n.optionName} must be a positive integer`);return e}function tt(n){if(!n)return;let e=et(n);if(e===null)throw new Error(`Error: Invalid batch size format: ${n}`);return e}function Ie(n){return n?["1","true","yes"].includes(n.toLowerCase()):!1}function st(n){let e=n.now.getFullYear(),t=String(n.now.getMonth()+1).padStart(2,"0"),s=String(n.now.getDate()).padStart(2,"0"),r=String(n.now.getHours()).padStart(2,"0"),i=String(n.now.getMinutes()).padStart(2,"0"),o=String(n.now.getSeconds()).padStart(2,"0"),a=n.highResolutionTime%1000000000n,l=String(a).padStart(9,"0");return`${e}-${t}-${s}_${r}h-${i}m-${o}s-${l}ns`}import q from"node:fs/promises";import Ue from"node:path";import{spawn as J}from"child_process";import*as Ae from"fs";import*as H from"path";import U from"node:path";function W(n,e){if(e.length===0)return"queued";if(n.isCreatingFolders)return"creating-folders";let t={queued:0,paused:0,inProgress:0,success:0,failed:0,cancelled:0};for(let r of e)switch(r.status){case"queued":t.queued++;break;case"paused":t.paused++;break;case"in-progress":t.inProgress++;break;case"success":t.success++;break;case"failed":t.failed++;break;case"cancelled":t.cancelled++;break}let s=e.length;return t.failed===s?"all-failed":t.failed>0?"some-failed":t.success===s?"success":t.paused>0&&t.queued===0&&t.inProgress===0?"paused":t.queued>0||t.inProgress>0?t.queued+t.paused===s?"queued":"in-progress":"cancelled"}function ce(n,e){let t=W(n,e);return t==="creating-folders"||t==="in-progress"||t==="queued"||t==="paused"?"cancelled":t}function de(n){let e=[];for(let t of Object.values(n))t.chunkedState&&(t.status==="queued"||t.status==="in-progress"||t.status==="paused")&&e.push(t.chunkedState.assetId);return e}function he(n){for(let e of Object.values(n))if(e.status==="queued"||e.status==="in-progress"||e.status==="paused")return!0;return!1}function D(n){let t=Object.values(n).reduce((s,r)=>{switch(r.status!=="failed"&&r.status!=="cancelled"&&(s.totalBytesToUpload+=r.totalBytesToUpload,s.totalBytesUploaded+=r.bytesUploaded),s.totalAssetCount+=1,r.status){case"queued":s.queuedAssetCount+=1;break;case"paused":s.pausedAssetCount+=1;break;case"in-progress":s.inProgressAssetCount+=1;break;case"success":s.successAssetCount+=1;break;case"failed":s.failedAssetCount+=1;break;case"cancelled":s.cancelledAssetCount+=1;break}return s},{totalBytesToUpload:0,totalBytesUploaded:0,totalAssetCount:0,queuedAssetCount:0,pausedAssetCount:0,inProgressAssetCount:0,successAssetCount:0,failedAssetCount:0,cancelledAssetCount:0,hasActiveUploads:!1,progress:0});return t.hasActiveUploads=t.totalAssetCount-t.successAssetCount-t.failedAssetCount-t.cancelledAssetCount>0,t.progress=t.hasActiveUploads?t.totalBytesUploaded/t.totalBytesToUpload:0,t}function pe(n,e){if(e.length===0)return null;let t=e.reduce((s,r)=>(r.status!=="failed"&&r.status!=="cancelled"&&(s.totalBytes+=r.totalBytesToUpload,s.uploadedBytes+=r.bytesUploaded),r.status==="success"?s.filesSucceeded++:r.status==="failed"&&s.filesFailed++,(r.status==="success"||r.status==="failed"||r.status==="cancelled")&&s.filesCompleted++,s),{totalBytes:0,uploadedBytes:0,filesCompleted:0,filesSucceeded:0,filesTotal:e.length,filesFailed:0,percentage:0});return t.percentage=t.totalBytes>0?t.uploadedBytes/t.totalBytes*100:0,t}function me(n){let e=Object.values(n).filter(t=>t.status==="queued"||t.status==="in-progress"||t.status==="paused");return e.length===0?!1:e.every(t=>t.status==="paused")}function ge(n){return Object.values(n).some(e=>e.status==="paused")}import as from"axios";var B=class{#t;#s;#e;#n;#o;#i=0;#a=0;#l=0;#r=0;#u=0;#y=0;constructor(e){this.#t=e?.alphaFast??.1,this.#s=e?.alphaMax??.5,this.#e=e?.consecutiveForBoost??3,this.#n=e?.minSamples??3,this.#o=e?.maxGapSeconds??2}sample(e){let t=Date.now();if(this.#r===0){this.#r=t,this.#u=e;return}let r=(t-this.#r)/1e3,i=e-this.#u;if(r<=0||i<0)return;if(r>this.#o){this.#r=t,this.#u=e;return}let o=i/r;if(this.#y===0)this.#i=o;else{let l=o-this.#i>=0?1:-1;this.#l!==0&&l===this.#l?this.#a++:this.#a=0,this.#l=l;let u=Math.min(1,this.#a/this.#e),c=this.#t+(this.#s-this.#t)*u;this.#i=c*o+(1-c)*this.#i}this.#r=t,this.#u=e,this.#y++}etaSeconds(e){return!this.isWarmedUp||this.#i<=0?0:e/this.#i}adjustTotalBytes(e){this.#u+=e}reset(){this.#i=0,this.#a=0,this.#l=0,this.#r=0,this.#u=0,this.#y=0}serialize(){return{displaySpeedBps:this.#i,lastSampleTimestamp:this.#r,lastSampleTotalBytes:this.#u,sampleCount:this.#y}}get speedBps(){return this.#i}get speedMbps(){return this.#i*8/1e6}get isWarmedUp(){return this.#y>=this.#n}};function F(n){let e={"X-Aspect-Share-Id":n.shareId};return n.shareAuthentication&&(e["X-Aspect-Share-Authentication"]=n.shareAuthentication),e}var L=class{#t;#s;#e;#n;#o;#i;#a;#l;#r;#u;#y;#f;#x;#g;#D;#P;#A;#v;#S;#R;#C;#d;#U;#k;#h;#F;#p;#c;#_;#w;#I;#m;#E;constructor(e){this.#s=e?.minConcurrency??1,this.#e=e?.maxConcurrency??8,this.#t=e?.initialConcurrency??this.#s,this.#n=e?.errorThreshold??1,this.#o=(e?.cooldownSeconds??10)*1e3,this.#i=e?.plateauThreshold??.05,this.#a=e?.onChange,this.#l=e?.now??Date.now,this.#r=this.#t,this.#u="probing",this.#y=0,this.#f=0,this.#x=0,this.#g=0,this.#D=!1,this.#P=0,this.#A=0,this.#v=1/0,this.#w=0,this.#I=0,this.#m=0,this.#E=0,this.#S=1/0,this.#R=0,this.#C=3e4,this.#d=0,this.#U=0,this.#k=0,this.#h=0,this.#F=0,this.#p=0,this.#c=0,this.#_=0}recordSuccess(e,t){if(e<=0)return;if(this.#P>0){this.#P--;return}this.#g++,this.#w+=e;let s=this.#l();if(this.#I===0){this.#I=s;return}let r=s-this.#I;if(r>=200){let c=this.#w/r*1e3;this.#E===0?this.#m=c:this.#m=.3*c+(1-.3)*this.#m,this.#E++,this.#E>=5&&(this.#k=Math.max(this.#k,this.#m)),this.#w=0,this.#I=s}if(t!==void 0&&t>0&&e>0){let c=t/(e/1048576);this.#F===0?this.#h=c:this.#h=.3*c+(1-.3)*this.#h,this.#F++}if(this.#u==="cooldown"&&s>=this.#y&&(this.#u="probing"),this.#u!=="probing")return;if(this.#f>0){let c;if(this.#E>=25?c=.03:this.#E>=15?c=.04:this.#E>=5&&(c=.07),c!==void 0&&(this.#m-this.#f)/this.#f<=-c){this.#c=0,this.#_=0,this.#L();return}}let i=this.#D?this.#r*2:this.#r;if(this.#g<i)return;if(this.#x=0,this.#E<5){this.#g=0;return}let o=this.#S<1/0&&this.#l()<this.#R?this.#S-1:this.#e,a=Math.min(this.#e,this.#v-1,o);if(this.#r>=a){if(this.#S<1/0&&this.#m>0&&this.#d>0){let c=(this.#m-this.#d)/this.#d;if(c>.2){this.#S=1/0,this.#R=0,this.#C=3e4,this.#d=0,this.#U=0,this.#g=0;return}if(c<=-.07){this.#g=0;return}}if(this.#k>0&&this.#m>0&&this.#E>=5&&(this.#k-this.#m)/this.#k>.07){this.#S=1/0,this.#R=0,this.#C=3e4,this.#d=0,this.#U=0,this.#k=this.#m,this.#g=0;return}if(this.#U>0&&this.#h>0&&this.#F>=2&&(this.#U-this.#h)/this.#U>.2){this.#S=1/0,this.#R=0,this.#C=3e4,this.#d=0,this.#U=0,this.#g=0;return}this.#g=0;return}let l=this.#m;if(this.#f>0){let c=Math.max(.02,this.#i*3/this.#r),d=(l-this.#f)/this.#f;if(d<=-.07){this.#c=0,this.#_=0,this.#L();return}else if(d<c){if(this.#F>=2&&this.#p>0){let p=this.#h/this.#p,h=this.#r/(this.#r-1);if(p<h*.9){this.#g=0;return}}if(this.#c++,this.#c<3){this.#g=0;return}this.#c=0,this.#_=0,this.#L();return}else if(d<c*2){if(this.#_++,this.#_<2){this.#g=0;return}this.#c=0,this.#_=0}else this.#c=0,this.#_=0;this.#S<1/0&&(this.#S=1/0,this.#R=0,this.#C=3e4,this.#d=0,this.#U=0)}this.#p=this.#h,this.#c=0,this.#_=0;let u=this.#r;this.#r++,this.#f=l,this.#g=0,this.#P=Math.max(0,u-1),this.#w=0,this.#I=0,this.#m=0,this.#E=0,this.#h=0,this.#F=0,this.#a?.(this.#r)}#L(){let e=Math.max(this.#s,this.#r-1);e<this.#r&&(this.#S=Math.min(this.#S,this.#r),this.#R=this.#l()+this.#C,this.#C=Math.min(this.#C*2,12e4),this.#d=this.#f,this.#U=this.#p,this.#r=e,this.#f=0,this.#w=0,this.#I=0,this.#m=0,this.#E=0,this.#h=0,this.#F=0,this.#a?.(this.#r)),this.#g=0}recordError(){if(this.#P>0&&this.#P--,this.#x++,this.#x<this.#n)return;this.#r===this.#A&&(this.#v=Math.min(this.#v,this.#r)),this.#A=this.#r;let e=this.#r;this.#r=Math.max(this.#s,Math.floor(this.#r/2)),this.#u="cooldown",this.#y=this.#l()+this.#o,this.#D=!0,this.#x=0,this.#g=0,this.#P=0,this.#f=0,this.#w=0,this.#I=0,this.#m=0,this.#E=0,this.#h=0,this.#F=0,this.#p=0,this.#c=0,this.#_=0,this.#r!==e&&this.#a?.(this.#r)}get concurrency(){return this.#r}get speedBps(){return this.#m}get latencyMsPerMB(){return this.#h}reset(){this.#r=this.#t,this.#u="probing",this.#y=0,this.#f=0,this.#x=0,this.#g=0,this.#D=!1,this.#P=0,this.#A=0,this.#v=1/0,this.#S=1/0,this.#R=0,this.#C=3e4,this.#d=0,this.#U=0,this.#k=0,this.#h=0,this.#F=0,this.#p=0,this.#c=0,this.#_=0,this.#w=0,this.#I=0,this.#m=0,this.#E=0,this.#a?.(this.#r)}};function _e(n){let e=`[${n}]`;return{info:(...t)=>console.info(e,...t),warn:(...t)=>console.warn(e,...t),error:(...t)=>console.error(e,...t)}}var fe=_e("transfer");var K=class{uploadAssets={};uploadGroups={};#t=new B;get uploadSpeedState(){return this.#t.serialize()}uploadStats={uploadSpeedMbps:0,timeRemainingSeconds:0,formattedSpeed:"Calculating...",formattedTime:"Calculating..."};dirtyAssetIds=new Set;dirtyGroupIds=new Set;dirtyHistoryGroupIds=new Set;#s(e){e!==0&&this.#t.adjustTotalBytes(-e)}adjustSpeedBaselineForSkippedBytes(e){e!==0&&this.#t.adjustTotalBytes(e)}#e(){Object.values(this.uploadAssets).some(t=>t.status==="queued"||t.status==="in-progress")||this.#t.reset()}#n(e){this.dirtyAssetIds.add(e)}#o(e){this.dirtyGroupIds.add(e)}addUploadAsset({assetId:e,fileReader:t,abortController:s,parentId:r,projectId:i,groupId:o,chunkSize:a,shareContext:l}){this.uploadAssets[e]={assetId:e,totalBytesToUpload:t.size,bytesUploaded:0,status:"queued",fileName:t.name,createdAt:new Date().toISOString(),i:Object.keys(this.uploadAssets).length,parentId:r,projectId:i,groupId:o,retryCount:0,chunkSize:a??0,fileReader:t,abortController:s,shareContext:l},this.#n(e)}updateUploadProgress(e,t){let s=this.uploadAssets[e];if(!s||s.status==="paused"||s.status==="cancelled"||s.status==="success"||s.status==="failed")return;let r=t>0&&s.status==="queued"?"in-progress":s.status,i=Math.min(t,s.totalBytesToUpload);s.bytesUploaded=i,s.status=r,this.#n(e)}markUploadInProgress(e){let t=this.uploadAssets[e];t&&(t.status="in-progress",this.#n(e))}markUploadSuccess(e){let t=this.uploadAssets[e];t&&(t.status="success",t.bytesUploaded=t.totalBytesToUpload,this.#n(e),this.#e(),this.cleanupOnCompletion(e))}markUploadFailed(e,t){let s=this.uploadAssets[e];if(!s)return;let r=s.bytesUploaded;s.status="failed",s.errorMessage=t,s.bytesUploaded=0,this.#n(e),this.#s(r),this.#e(),this.cleanupOnCompletion(e)}removeUploadAsset(e){let s=this.uploadAssets[e]?.bytesUploaded??0;delete this.uploadAssets[e],this.#n(e),this.#s(s),this.#e()}clearAllUploads(){this.uploadAssets={},this.#t.reset()}clearTerminalState(){if(!Object.values(this.uploadAssets).some(t=>t.status==="queued"||t.status==="in-progress"||t.status==="paused")){for(let t of Object.keys(this.uploadAssets))delete this.uploadAssets[t];for(let t of Object.keys(this.uploadGroups))delete this.uploadGroups[t];this.#t.reset()}}resetAssetForRetryQueue(e){let t=this.uploadAssets[e];t&&(t.status="queued",t.bytesUploaded=0,t.errorMessage=void 0,t.retryCount=t.retryCount+1,this.#n(e))}resetAssetForRetrying(e){let t=this.uploadAssets[e];t&&(t.status="queued",t.bytesUploaded=0,t.retryCount=0,this.#n(e))}pauseUpload(e){let t=this.uploadAssets[e];if(!t||t.status!=="queued"&&t.status!=="in-progress")return;let s=0;if(t.chunkedState){let{completedChunkIndices:i,chunkSize:o}=t.chunkedState;for(let a of i){let l=a*o,u=Math.min(l+o,t.totalBytesToUpload);s+=u-l}}let r=t.bytesUploaded-s;t.status="paused",t.bytesUploaded=s,this.#n(e),this.#s(r),this.#e(),t.abortController.abort()}unpauseUpload(e){let t=this.uploadAssets[e];t&&t.status==="paused"&&(t.status="queued",this.#n(e))}pauseUploadGroup(e){let t=this.uploadGroups[e];if(t&&!t.isCreatingFolders){t.isPaused=!0,this.#o(e);for(let s of t.assetIds)this.pauseUpload(s)}}unpauseUploadGroup(e){let t=this.uploadGroups[e];t&&(t.isPaused=!1,this.#o(e))}pauseAllUploads(){for(let e of Object.values(this.uploadGroups))e.isCreatingFolders||this.pauseUploadGroup(e.id)}resumeAllUploads(){for(let e of Object.values(this.uploadGroups))e.isPaused&&this.unpauseUploadGroup(e.id)}markUploadCancelled(e){let t=this.uploadAssets[e];if(!t||t.status==="success"||t.status==="failed"||t.status==="cancelled")return;let s=t.bytesUploaded;t.status="cancelled",this.#n(e),this.#s(s),this.#e(),this.cleanupOnCompletion(e)}setChunkedState(e,t){let s=this.uploadAssets[e];s&&(s.chunkedState=t,this.#n(e))}addCompletedChunkIndex(e,t){let s=this.uploadAssets[e];!s||!s.chunkedState||(s.chunkedState={...s.chunkedState,completedChunkIndices:[...s.chunkedState.completedChunkIndices,t]},this.#n(e))}clearChunkedState(e){let t=this.uploadAssets[e];t&&(t.chunkedState=void 0,this.#n(e))}hasGroupsCreatingFolders(){return Object.values(this.uploadGroups).some(e=>e.isCreatingFolders===!0)}areAllUploadsPaused(){return me(this.uploadAssets)}hasPausedUploads(){return ge(this.uploadAssets)}getUploadAsset(e){return this.uploadAssets[e]}getSerializableAsset(e){let t=this.uploadAssets[e];if(t)return this.#l(t)}getUploadSummary(){return D(this.#u())}getAllUploadAssetsSortedByRecent(){return Object.values(this.uploadAssets).map(e=>this.#l(e)).sort((e,t)=>t.i-e.i)}getGroupAssets(e){let t=this.uploadGroups[e];return!t||!t.assetIds?[]:t.assetIds.map(s=>this.uploadAssets[s]).filter(Boolean).map(s=>this.#l(s))}getGroupAssetsInternal(e){let t=this.uploadGroups[e];return!t||!t.assetIds?[]:t.assetIds.map(s=>this.uploadAssets[s]).filter(Boolean)}addUploadGroup(e){let t=crypto.randomUUID();return this.uploadGroups[t]={...e,id:t,fileReaders:new Map},this.#o(t),t}updateUploadGroup(e,t){let s=this.uploadGroups[e];s&&(Object.assign(s,t),this.#o(e))}addAssetToGroup(e,t){let s=this.uploadGroups[e];s&&(s.assetIds.push(t),this.#o(e))}removeUploadGroup(e){let t=this.uploadGroups[e];if(t)for(let s of t.assetIds)delete this.uploadAssets[s],this.#n(s);delete this.uploadGroups[e],this.#o(e)}getUploadGroup(e){let t=this.uploadGroups[e];if(t)return this.#r(t)}getAllUploadGroups(){return Object.values(this.uploadGroups).map(e=>this.#r(e)).sort((e,t)=>t.createdAt.localeCompare(e.createdAt))}getUploadGroupProgress(e){let t=this.uploadGroups[e];if(!t)return null;let s=this.getGroupAssets(e);return pe(this.#r(t),s)}getUploadGroupStatus(e){let t=this.uploadGroups[e];if(!t)return null;let s=this.getGroupAssets(e);return s.length>0?W(this.#r(t),s):null}getAssetsByParentId(e){return Object.values(this.uploadAssets).filter(t=>t.parentId===e).map(t=>this.#l(t))}getActiveUploadGroups(){return Object.values(this.uploadGroups).filter(e=>{let t=this.getUploadGroupStatus(e.id);return t&&["queued","creating-folders","in-progress"].includes(t)}).map(e=>this.#r(e))}cleanupOnCompletion(e){let t=this.uploadAssets[e];if(!t)return;let s=t.groupId;if(s){let i=this.uploadGroups[s];if(i){let o=this.getGroupAssets(s),a=this.#r(i);this.dirtyHistoryGroupIds.add(s),!o.some(u=>u.status==="queued"||u.status==="in-progress")&&!i.completedAt&&(i.completedAt=new Date().toISOString(),this.#o(s))}}let r=this.getUploadSummary();if(r.cancelledAssetCount+r.failedAssetCount+r.successAssetCount===r.totalAssetCount)for(let i of Object.keys(this.uploadAssets)){let o=this.uploadAssets[i];o&&(o.bytesUploaded=0,this.#n(i))}}updateUploadStats(){let e=this.getUploadSummary(),t=e.queuedAssetCount>0||e.inProgressAssetCount>0;t&&this.#t.sample(e.totalBytesUploaded);let s=this.#t.isWarmedUp?this.#t.speedMbps:0,r=t&&this.#t.isWarmedUp?this.#t.etaSeconds(e.totalBytesToUpload-e.totalBytesUploaded):0;this.uploadStats={uploadSpeedMbps:s,timeRemainingSeconds:r,formattedSpeed:this.#i(s),formattedTime:this.#a(r)}}#i(e){return!Number.isFinite(e)||e<=0?"Calculating...":e<1?`${(e*1e3).toFixed(0)} Kbps`:`${e.toFixed(1)} Mbps`}#a(e){if(!Number.isFinite(e)||e<=0)return"Calculating...";let t=Math.floor(e/3600),s=Math.floor(e%3600/60),r=Math.floor(e%60);return t>0?`${t}h ${s}m left`:s>0?`${s}m ${r}s left`:`${r}s left`}buildHistoryItem(e){let t=this.uploadGroups[e];if(!t)return null;let s=this.getGroupAssets(e),r=this.#r(t);return{groupId:t.id,name:t.name,type:t.type,fileCount:t.fileCount,folderCount:t.folderCount,topLevelFileCount:t.topLevelFileCount,topLevelFolderCount:t.topLevelFolderCount,status:ce(r,s),createdAt:t.createdAt,completedAt:t.completedAt,rootDirectoryId:t.rootDirectoryId,projectId:t.projectId,errorMessage:t.errorMessage,conflictResolution:t.conflictResolution}}#l({fileReader:e,abortController:t,shareContext:s,...r}){return r}#r({fileReaders:e,...t}){return t}#u(){let e={};for(let[t,s]of Object.entries(this.uploadAssets))e[t]=this.#l(s);return e}#y(){let e={};for(let[t,s]of Object.entries(this.uploadGroups))e[t]=this.#r(s);return e}getSerializableSnapshot(){return{uploadAssets:this.#u(),uploadGroups:this.#y(),uploadStats:{...this.uploadStats},uploadSpeedState:this.uploadSpeedState}}getDirtyDelta(){let e={};for(let s of this.dirtyAssetIds){let r=this.uploadAssets[s];r&&(e[s]=this.#l(r))}let t={};for(let s of this.dirtyGroupIds){let r=this.uploadGroups[s];r&&(t[s]=this.#r(r))}return{assets:e,groups:t}}clearDirtyFlags(){this.dirtyAssetIds.clear(),this.dirtyGroupIds.clear(),this.dirtyHistoryGroupIds.clear()}};function it(n,e){let t=new Date(n).getTime(),s=Date.now();return t-s<=e}var Y=class{#t;#s=new Map;#e=new Map;constructor(e){this.#t=e}seedToken(e,t,s){this.#s.set(e,{token:t,expiresAt:s})}async getToken(e,t){let s=this.#s.get(e);if(s&&!it(s.expiresAt,3e5))return s.token;let r=this.#e.get(e);if(r)return r;let i=t?F(t):void 0,o=this.#t.post(`/assets/${e}/token`,{},i).then(a=>{if(!a.token)throw new Error("Token refresh failed: no token in response");return this.#s.set(e,{token:a.token,expiresAt:a.token_expires_at}),this.#e.delete(e),a.token}).catch(a=>{throw this.#e.delete(e),a});return this.#e.set(e,o),o}clearCache(e){e?this.#s.delete(e):this.#s.clear()}};var Q=class{#t=[];registerAsset(e){this.#t.push({assetId:e.assetId,totalChunks:e.totalChunks,nextChunkToClaim:0,completedChunkIndices:new Set(e.completedChunkIndices),isPaused:!1})}claimNextChunk(){for(let e of this.#t)if(!e.isPaused)for(;e.nextChunkToClaim<e.totalChunks;){let t=e.nextChunkToClaim;if(e.nextChunkToClaim++,!e.completedChunkIndices.has(t))return{assetId:e.assetId,chunkIndex:t}}return null}markChunkCompleted(e,t){let s=this.#s(e);return s?(s.completedChunkIndices.add(t),s.completedChunkIndices.size>=s.totalChunks):!1}pauseAsset(e){let t=this.#s(e);t&&(t.isPaused=!0)}unpauseAsset(e){let t=this.#s(e);t&&(t.isPaused=!1,this.#e(t))}removeAsset(e){this.#t=this.#t.filter(t=>t.assetId!==e)}hasAsset(e){return this.#t.some(t=>t.assetId===e)}clear(){this.#t=[]}#s(e){return this.#t.find(t=>t.assetId===e)}#e(e){for(let t=0;t<e.totalChunks;t++)if(!e.completedChunkIndices.has(t)){e.nextChunkToClaim=t;return}e.nextChunkToClaim=e.totalChunks}};var ot=/[/\\:*?"<>|\x00-\x1F]/g,at=["CON","PRN","AUX","NUL","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9"];function O(n){let e=n.replace(ot,"_");e=e.replace(/[. ]+$/,""),(!e||e==="."||e==="..")&&(e="unnamed");let t=e.includes(".")?e.substring(0,e.lastIndexOf(".")):e;at.includes(t.toUpperCase())&&(e=`_${e}`);let s=new TextEncoder;if(s.encode(e).length>255){let r=e.lastIndexOf("."),i=r>0?e.substring(r):"",o=r>0?e.substring(0,r):e,l=255-s.encode(i).length;for(;s.encode(o).length>l&&o.length>0;)o=o.slice(0,-1);e=o+i}return e}var R=class extends Error{constructor(){super("Upload cancelled"),this.name="CancelledError"}};function M(n){return n instanceof R||n instanceof Error&&n.name==="CancelledError"||n instanceof Error&&n.name==="CanceledError"||n instanceof Error&&n.name==="AbortError"}function mt(n){return M(n)||n instanceof Error&&n.name==="NoAuthError"}function gt(n){return new Promise(e=>setTimeout(e,n))}function ft(n){return n instanceof Blob?n.size:n.byteLength}var N=class{#t;#s;#e;#n;#o;#i;#a;#l;#r;#u;#y;#f;#x;#g=null;#D=0;#P=!1;#A=[];#v=new Set;#S=!1;#R=!1;#C=!1;#d=[];#U=!1;#k=!1;#h=new Q;#F=0;#p=new Map;#c=new Map;#_=[];#w=!1;#I=null;#m="keep_both";#E=new Map;#L=null;#b=!1;#B=null;#N=!1;constructor(e){this.#t=e.httpClient,this.#s=new Y(e.httpClient),this.#e=new K,this.#n=e.historyStore??null,this.#o=e.settingsStore??null,this.#i=e.analytics??null,this.#a=e.logger??fe,this.#l=e.onChange??null,this.#r=e.onClear??null,this.#u=e.onSummary??null,this.#y=e.onConcurrencyAdjusted??null,this.#x=e.deltaIntervalMs??333;let t=e.maxConcurrency??4;if(e.adaptiveConcurrency!==!1){let s=e.adaptiveConcurrencyConfig;this.#B=new L({initialConcurrency:s?.initialConcurrency??Math.min(2,t),minConcurrency:s?.minConcurrency??1,maxConcurrency:s?.maxConcurrency??t,errorThreshold:s?.errorThreshold,cooldownSeconds:s?.cooldownSeconds??10,plateauThreshold:s?.plateauThreshold,onChange:r=>{let i=this.#f;if(this.setMaxConcurrency(r),i===r)return;let o=this.#N?"reset":r>i?"probe_increase":"error_decrease",a=Math.round(this.#B.speedBps/(1024*1024)*100)/100,l=Math.round(this.#B.latencyMsPerMB*100)/100;this.#a.info(`Adaptive concurrency: ${i} \u2192 ${r} (${o}), speed=${a}MB/s, latency=${l}ms/MB`),this.#y?.({previousConcurrency:i,newConcurrency:r,reason:o,speedMbps:a,latencyMsPerMB:l})},now:s?.now}),this.#f=this.#B.concurrency}else this.#f=t;this.#n&&(this.#A=this.#n.load()),this.#o&&(this.#I=this.#o.getBandwidthLimitBps(),this.#m=this.#o.getConflictResolution()),(this.#l||this.#u)&&(this.#g=setInterval(()=>{this.#le()},this.#x)),this.#i&&(this.#L=setInterval(()=>{this.#ce()},6e4))}startUpload(e){let t=e.assetId||crypto.randomUUID(),s=!!e.assetId,r;if(s){let o=this.#e.getUploadAsset(t);if(!o)throw new Error(`Cannot retry: asset ${t} not found`);r=o.chunkSize}else{if(e.chunkSize===void 0||e.chunkSize===null)throw new Error("chunkSize is required for new uploads");r=e.chunkSize}let i=new AbortController;if(s){if(this.#e.getUploadAsset(t).status==="cancelled")return t;e.resetRetryCount&&this.#e.resetAssetForRetrying(t);let a=this.#e.getUploadAsset(t);a.abortController=i,a.fileReader=e.fileReader,e.shareContext&&(a.shareContext=e.shareContext)}else this.#e.addUploadAsset({assetId:t,fileReader:e.fileReader,abortController:i,parentId:e.directoryId,projectId:e.projectId,groupId:e.groupId,chunkSize:r,shareContext:e.shareContext});return this.#d.push(t),this.#G(),this.#T(),t}startGroupUpload(e){this.#e.clearTerminalState();let t=this.#e.addUploadGroup({type:e.type,name:e.name,assetIds:[],fileCount:e.fileCount,folderCount:e.folderCount,topLevelFileCount:e.topLevelFileCount,topLevelFolderCount:e.topLevelFolderCount,isCreatingFolders:!1,isPaused:!1,createdAt:new Date().toISOString(),rootDirectoryId:e.rootDirectoryId,projectId:e.projectId,retryCount:0,conflictResolution:e.conflictResolutionOverride??this.#m});return this.#E.set(t,Date.now()),this.#i?.("upload:started",{file_count:e.fileCount,total_bytes:e.totalBytes??0,has_folders:e.folderCount>0,project_id:e.projectId}),this.#e.dirtyHistoryGroupIds.add(t),this.#H(),this.#T(),t}pauseUpload(e){let t=this.#e.getUploadAsset(e);this.#e.pauseUpload(e),this.#d=this.#d.filter(s=>s!==e),this.#h.pauseAsset(e),!this.#b&&t&&this.#i&&this.#i("upload:file_paused",{file_name:t.fileName,file_size:t.totalBytesToUpload,bytes_uploaded:t.bytesUploaded,project_id:t.projectId??""}),this.#T()}unpauseUpload(e){this.#e.unpauseUpload(e),this.#T()}cancelUpload(e){let t=this.#e.getUploadAsset(e);if(!t||t.status==="success"||t.status==="failed"||t.status==="cancelled")return;let s=t.fileName,r=t.totalBytesToUpload,i=t.bytesUploaded,o=t.projectId,a=t.chunkedState?.assetId;(t.status==="queued"||t.status==="in-progress")&&t.abortController.abort(),this.#d=this.#d.filter(l=>l!==e),this.#h.removeAsset(e),this.#p.delete(e),this.#c.delete(e),this.#e.markUploadCancelled(e),this.#e.clearChunkedState(e),t.fileReader.close?.(),!this.#b&&this.#i&&this.#i("upload:file_cancelled",{file_name:s,file_size:r,bytes_uploaded:i,project_id:o??""}),this.#T(),this.#O(),this.#G(),this.#q(),a&&(this.#_.push(a),this.#K())}cancelAllUploads(){let e=this.#W();this.#b=!0;try{let s=Object.values(this.#e.uploadAssets).filter(r=>r.status==="queued"||r.status==="in-progress"||r.status==="paused");for(let r of s)this.cancelUpload(r.assetId)}finally{this.#b=!1}this.#i?.("upload:all_cancelled",e)}retryUpload(e){let t=this.#e.getUploadAsset(e);t&&t.status==="failed"&&this.startUpload({fileReader:t.fileReader,directoryId:t.parentId??"",projectId:t.projectId,groupId:t.groupId,assetId:e,resumeChunked:t.chunkedState,resetRetryCount:!0,shareContext:t.shareContext})}resumeUpload(e){let t=this.#e.getUploadAsset(e);if(!t||t.status!=="paused")return;!this.#b&&this.#i&&this.#i("upload:file_resumed",{file_name:t.fileName,file_size:t.totalBytesToUpload,bytes_uploaded:t.bytesUploaded,project_id:t.projectId??""});let s=new AbortController;t.abortController=s,this.#e.unpauseUpload(e),this.#h.hasAsset(e)?(this.#h.unpauseAsset(e),this.#T(),this.#O()):this.startUpload({fileReader:t.fileReader,directoryId:t.parentId??"",projectId:t.projectId,groupId:t.groupId,assetId:e,resumeChunked:t.chunkedState,shareContext:t.shareContext})}pauseUploadGroup(e){let t=this.#e.uploadGroups[e];if(!t)return;let s=this.#b;this.#b=!0,this.#e.pauseUploadGroup(e);for(let r of t.assetIds)this.#d=this.#d.filter(i=>i!==r),this.#h.pauseAsset(r);this.#b=s,this.#b||this.#X(e,t,"upload:group_paused"),this.#T()}unpauseUploadGroup(e){this.#e.unpauseUploadGroup(e),this.#T()}cancelUploadGroup(e){let t=this.#e.uploadGroups[e];if(!t)return;let{totalBytes:s,bytesUploaded:r,filesRemaining:i}=this.#Q(t),o=this.#b;this.#b=!0;for(let a of t.assetIds)this.cancelUpload(a);this.#b=o,this.#b||this.#i?.("upload:group_cancelled",{file_count:t.assetIds.length,files_remaining:i,total_bytes:s,bytes_uploaded:r,project_id:t.projectId}),this.#E.delete(e)}resumeUploadGroup(e){let t=this.#e.uploadGroups[e];if(!t)return;this.#b||this.#X(e,t,"upload:group_resumed");let s=this.#b;this.#b=!0,this.#e.unpauseUploadGroup(e);for(let r of t.assetIds){let i=this.#e.getUploadAsset(r);i&&i.status==="paused"&&this.resumeUpload(r)}this.#b=s}retryUploadGroup(e){let t=this.#e.uploadGroups[e];if(t)for(let s of t.assetIds){let r=this.#e.getUploadAsset(s);r&&r.status==="failed"&&this.retryUpload(s)}}setGroupCreatingFolders(e,t){this.#e.updateUploadGroup(e,{isCreatingFolders:t}),this.#T()}addAssetToGroup(e,t){this.#e.addAssetToGroup(e,t)}pauseAllUploads(){let e=this.#W();this.#b=!0;try{for(let t of Object.values(this.#e.uploadAssets))t.groupId||this.pauseUpload(t.assetId);for(let t of Object.values(this.#e.uploadGroups))t.isCreatingFolders||this.pauseUploadGroup(t.id)}finally{this.#b=!1}this.#i?.("upload:all_paused",e),this.#T()}resumeAllUploads(){let e=this.#W();this.#b=!0;try{for(let t of Object.values(this.#e.uploadAssets))!t.groupId&&t.status==="paused"&&this.resumeUpload(t.assetId);for(let t of Object.values(this.#e.uploadGroups))t.isPaused&&this.resumeUploadGroup(t.id)}finally{this.#b=!1}this.#i?.("upload:all_resumed",e),this.#T()}clearAllUploads(){this.#d=[],this.#h.clear(),this.#p.clear(),this.#c.clear(),this.#e.clearAllUploads(),this.#e.uploadGroups={},this.#B&&(this.#N=!0,this.#B.reset(),this.#N=!1),this.#r?.({all:!0}),this.#u?.(this.#z())}clearHistory(){this.#A=[],this.#n?.clear(),this.#S=!0,this.#v.clear(),this.#C=!0,this.#T()}removeHistoryItem(e){this.#A=this.#A.filter(t=>t.groupId!==e),this.#n?.remove(e),this.#v.add(e),this.#C=!0,this.#T()}removeGroup(e){this.#e.removeUploadGroup(e),this.#A=this.#A.filter(t=>t.groupId!==e),this.#n?.remove(e),this.#v.add(e),this.#C=!0,this.#r?.({groupId:e}),this.#u?.(this.#z()),this.#T()}getHttpClient(){return this.#t}setBandwidthLimit(e){this.#I=e,this.#o?.setBandwidthLimitBps(e),this.#C=!0,this.#T()}getBandwidthLimit(){return this.#I}setConflictResolution(e){this.#m=e,this.#o?.setConflictResolution(e),this.#C=!0,this.#T()}getConflictResolution(){return this.#m}getGroupConflictResolution(e){return this.#e.getUploadGroup(e)?.conflictResolution??this.#m}setMaxConcurrency(e){this.#f=e,this.#O()}#J(){return this.#I===null?null:Math.floor(this.#I/Math.max(1,this.#f))}getSnapshot(){return this.#e.updateUploadStats(),{...this.#e.getSerializableSnapshot(),uploadHistory:[...this.#A??[]],uploadSummary:this.#z(),bandwidthLimitBps:this.#I,conflictResolution:this.#m}}getUploadAsset(e){return this.#e.getSerializableAsset(e)}getUploadSummary(){return this.#z()}getGroupAssets(e){return this.#e.getGroupAssets(e)}getUploadGroupStatus(e){return this.#e.getUploadGroupStatus(e)}getUploadGroupProgress(e){return this.#e.getUploadGroupProgress(e)}hasGroupsCreatingFolders(){return this.#e.hasGroupsCreatingFolders()}areAllUploadsPaused(){return this.#e.areAllUploadsPaused()}hasPausedUploads(){return this.#e.hasPausedUploads()}hasActiveUploads(){return he(this.#e.getSerializableSnapshot().uploadAssets)}getServerAssetIdsToCancel(){return de(this.#e.getSerializableSnapshot().uploadAssets)}async cancelActiveServerUploads(){let e=this.getServerAssetIdsToCancel();if(e.length!==0)try{await this.#t.post("/assets/cancel-uploads",{asset_ids:e})}catch{await this.#t.post("/assets/cancel-uploads",{asset_ids:e})}}destroy(){this.#R=!0,this.#g&&(clearInterval(this.#g),this.#g=null),this.#L&&(clearInterval(this.#L),this.#L=null),this.#d=[],this.#h.clear();for(let e of Object.values(this.#e.uploadAssets))e.abortController.abort(),e.fileReader.close?.()}#G(){this.#k||(this.#k=!0,queueMicrotask(()=>{this.#k=!1,this.#Z()}))}async#Z(){if(!this.#U){for(this.#U=!0;this.#d.length>0&&!(this.#p.size>5);){let e=Math.min(this.#d.length,20-this.#p.size);if(e<=0)break;let t=[],s=[];for(let r=0;r<e&&this.#d.length>0;r++){let i=this.#d[0],o=this.#e.getUploadAsset(i);if(!o||o.status==="cancelled"){this.#d.shift(),r--;continue}if(this.#d.shift(),s.push(i),o.chunkedState)try{this.#ee(i,o),this.#O()}catch(a){M(a)||this.#M(i,a)}else t.push(i)}if(t.length>0){let r=new Map;for(let i of t){let a=this.#e.getUploadAsset(i)?.shareContext?.shareId??"",l=r.get(a);l||(l=[],r.set(a,l)),l.push(i)}for(let i of r.values())try{await this.#te(i)}catch(o){for(let a of i)this.#M(a,o instanceof Error?o:new Error(String(o)))}this.#O()}}this.#U=!1}}#ee(e,t){let s=t.chunkedState,r={serverAssetId:s.assetId,chunkIds:s.chunkIds,chunkSize:s.chunkSize,totalChunks:s.totalChunks,sizeBytes:s.sizeBytes},i=s.completedChunkIndices;this.#p.set(e,r);let o=new Array(r.totalChunks).fill(0);if(i.length>0){for(let l of i){let u=l*r.chunkSize,c=Math.min(u+r.chunkSize,t.totalBytesToUpload);o[l]=c-u}let a=o.reduce((l,u)=>l+u,0);this.#e.updateUploadProgress(e,a)}if(this.#c.set(e,o),r.totalChunks===0||i.length>=r.totalChunks){this.#j(e).catch(a=>{this.#M(e,a)});return}this.#h.registerAsset({assetId:e,totalChunks:r.totalChunks,completedChunkIndices:i})}async#te(e){let t=[],s=[];for(let a of e){let l=this.#e.getUploadAsset(a);if(!l||l.status==="cancelled")continue;let u=O(l.fileName),c=l.groupId?this.#e.getUploadGroup(l.groupId)?.conflictResolution??this.#m:this.#m,d=(()=>{switch(c){case"keep_both":return{auto_rename:"parenthesized"};case"replace":return{conflict_resolution:"replace"};case"skip":return{conflict_resolution:"skip"}}})();t.push({directory_id:l.parentId,id:a,name:u,size_bytes:l.totalBytesToUpload,...d}),s.push(a)}if(t.length===0)return;let r=this.#e.getUploadAsset(s[0]),i=r?.shareContext?F(r.shareContext):void 0,o=await this.#t.post("/assets/chunked/initiate",t,i);for(let a=0;a<s.length;a++){let l=s[a],u=o[a];if(!u||u.error){this.#M(l,new Error(u?.error??"Unknown batch initiation error"));continue}if(u.skipped){let m=this.#e.getUploadAsset(l);m&&(this.#e.adjustSpeedBaselineForSkippedBytes(m.totalBytesToUpload),this.#e.markUploadSuccess(l),this.#e.dirtyHistoryGroupIds.add(m.groupId??""),this.#H(),m.fileReader.close?.());continue}let c=u.result,d=this.#e.getUploadAsset(l);if(!d||d.status==="cancelled"||d.status==="paused"){(!d||d.status==="cancelled")&&(this.#_.push(c.asset_id),this.#K());continue}let p=Math.ceil(d.totalBytesToUpload/c.chunk_size),h=Array.from({length:p},()=>crypto.randomUUID());this.#s.seedToken(c.asset_id,c.token,c.token_expires_at);let y={serverAssetId:c.asset_id,chunkIds:h,chunkSize:c.chunk_size,totalChunks:p,sizeBytes:d.totalBytesToUpload};this.#e.setChunkedState(l,{assetId:y.serverAssetId,chunkIds:y.chunkIds,completedChunkIndices:[],chunkSize:y.chunkSize,totalChunks:y.totalChunks,sizeBytes:y.sizeBytes}),this.#p.set(l,y);let S=new Array(y.totalChunks).fill(0);if(this.#c.set(l,S),y.totalChunks===0){this.#j(l).catch(m=>{this.#M(l,m)});continue}this.#h.registerAsset({assetId:l,totalChunks:y.totalChunks,completedChunkIndices:[]})}}#O(){if(!this.#R)for(;this.#F<this.#f;){let e=this.#h.claimNextChunk();if(!e)break;this.#F++;let{assetId:t,chunkIndex:s}=e;this.#se(t,s).then(r=>{this.#F--,this.#ne(t,s,r),this.#O()}).catch(r=>{if(this.#F--,M(r)){this.#O();return}this.#ie(t,s,r),this.#O()})}}async#se(e,t){let s;for(let r=0;r<3;r++)try{let i=this.#c.get(e);return i&&(i[t]=0,this.#$(e)),await this.#re(e,t)}catch(i){if(M(i))throw i;if(s=i instanceof Error?i:new Error(String(i)),this.#B?.recordError(),this.#oe(e,t,s,r),r===2)throw s;let o=this.#c.get(e);o&&(o[t]=0,this.#$(e));let a=1e3*Math.pow(2,r);await gt(a)}throw s||new Error("Unknown error during chunk upload")}async#re(e,t){let s=this.#e.getUploadAsset(e);if(!s)throw new R;if(s.abortController.signal.aborted)throw new R;let r=this.#p.get(e);if(!r)throw new Error(`No chunk metadata for asset ${e}`);let i=t*r.chunkSize,o=Math.min(i+r.chunkSize,s.totalBytesToUpload),a=await s.fileReader.readChunk(i,o),l=ft(a);if(s.abortController.signal.aborted)throw new R;let u=r.chunkIds[t],c=await this.#s.getToken(r.serverAssetId,s.shareContext),d=`/uploads/chunks/${u}`,p=Date.now(),h=await this.#t.putWithToken(d,a,c,{signal:s.abortController.signal,onProgress:m=>{let A=this.#c.get(e);A&&(A[t]=m,this.#$(e))},contentType:"application/octet-stream",getMaxUploadRate:()=>this.#J()}),y=Date.now()-p;if(!h.status||h.status<200||h.status>=300)throw this.#a.error("Chunk upload returned unexpected status",{chunkIndex:t,chunkId:u,assetId:e,serverAssetId:r.serverAssetId,chunkSizeBytes:l,durationMs:y,httpStatus:h.status,statusText:h.statusText,responseBody:h.data,responseHeaders:h.headers}),new Error(`Chunk ${t} upload failed: unexpected status ${h.status}`);let S=this.#c.get(e);return S&&(S[t]=l,this.#$(e)),y}#$(e){let t=this.#c.get(e);if(!t)return;let s=t.reduce((r,i)=>r+i,0);this.#e.updateUploadProgress(e,s)}#ne(e,t,s){if(this.#B){let i=this.#p.get(e);if(i){let o=t*i.chunkSize,l=Math.min(o+i.chunkSize,i.sizeBytes)-o;this.#B.recordSuccess(l,s)}}this.#e.addCompletedChunkIndex(e,t),this.#h.markChunkCompleted(e,t)&&this.#j(e).catch(i=>{this.#M(e,i)})}#ie(e,t,s){this.#M(e,s)}#oe(e,t,s,r){if(!this.#i)return;let i=this.#e.getUploadAsset(e);if(!i)return;let o=this.#p.get(e);if(!o)return;let a=t*o.chunkSize,u=Math.min(a+o.chunkSize,o.sizeBytes)-a,c=s,d=typeof c.code=="string"?c.code:null,p=c.response?.status,h=typeof p=="number"?p:null,y=s.cause?s.cause instanceof Error?s.cause.message:String(s.cause):null;this.#i("upload:chunk_error",{file_name:i.fileName,file_size:i.totalBytesToUpload,chunk_index:t,chunk_size:u,chunks_total:o.totalChunks,attempt:r+1,max_attempts:3,is_final_attempt:r===2,error_type:s.name,error_message:s.message,error_code:d,http_status:h,error_stack:s.stack??null,error_cause:y,project_id:i.projectId??""})}#ae(e,t,s,r){if(!this.#i||M(t))return;let i=t instanceof Error?t.message:"Unknown error",o=t,a=t instanceof Error&&t.cause?t.cause instanceof Error?t.cause.message:String(t.cause):null,l=typeof o.code=="string"?o.code:null,u=o.response?.status,c=typeof u=="number"?u:null,d=this.#p.get(e.assetId);this.#i("upload:file_error",{file_name:e.fileName,file_size:e.totalBytesToUpload,bytes_uploaded:e.bytesUploaded,chunks_completed:e.chunkedState?.completedChunkIndices.length??0,chunks_total:d?.totalChunks??0,attempt:s+1,max_attempts:4,is_final_attempt:r,error_type:t instanceof Error?t.name:"Unknown",error_message:i,error_code:l,http_status:c,error_stack:t instanceof Error?t.stack??null:null,error_cause:a,project_id:e.projectId??""})}async#j(e){let t=this.#e.getUploadAsset(e);if(!t)return;let s=this.#p.get(e);if(!s)return;if(t.abortController.signal.aborted)throw new R;let r=crypto.randomUUID(),i=JSON.stringify(s.chunkIds),o=new TextEncoder().encode(i),a=await this.#s.getToken(s.serverAssetId,t.shareContext),l=`/uploads/manifests/${r}`;try{await this.#t.putWithToken(l,o,a,{signal:t.abortController.signal,contentType:"application/json"})}catch(u){throw this.#a.error("Manifest upload failed",{assetId:e,serverAssetId:s.serverAssetId,manifestId:r},u),u}if(t.abortController.signal.aborted)throw new R;try{let u=t.shareContext?F(t.shareContext):void 0;await this.#t.post(`/assets/${s.serverAssetId}/revisions/commit`,{manifest_id:r,size_bytes:s.sizeBytes,is_initial_upload:!0,client_performed_at:new Date().toISOString()},u)}catch(u){throw this.#a.error("Commit revision failed",{assetId:e,serverAssetId:s.serverAssetId,manifestId:r,sizeBytes:s.sizeBytes},u),u}this.#e.markUploadSuccess(e),this.#e.clearChunkedState(e),this.#H(),this.#T(),this.#p.delete(e),this.#c.delete(e),this.#h.removeAsset(e),await t.fileReader.close?.(),this.#V(e),this.#G(),this.#q()}#M(e,t){let s=this.#e.getUploadAsset(e);if(!s||s.status==="paused"||s.status==="cancelled")return;let r=s.retryCount,i=r>=3||mt(t);if(this.#ae(s,t,r,i),i){let o=t instanceof Error?t.message:"Unknown error";this.#a.error("Asset upload permanently failed",{assetId:e,fileName:s.fileName,totalRetries:r,bytesUploaded:s.bytesUploaded,totalBytes:s.totalBytesToUpload,chunksCompleted:s.chunkedState?.completedChunkIndices.length??0},t),s.abortController.abort(),this.#e.markUploadFailed(e,o),this.#h.removeAsset(e),this.#p.delete(e),this.#c.delete(e),this.#H(),this.#T(),this.#V(e),this.#G(),this.#q()}else{this.#a.warn("Asset upload failed, scheduling retry",{assetId:e,fileName:s.fileName,retryAttempt:r+1,maxRetries:3},t);let o=s.chunkedState;s.abortController.abort(),this.#h.removeAsset(e),this.#p.delete(e),this.#c.delete(e),this.#e.resetAssetForRetryQueue(e),this.#T(),this.#G();let a=2e3*Math.pow(2,r);setTimeout(()=>{if(this.#R)return;let l=this.#e.getUploadAsset(e);!l||l.status!=="queued"||this.startUpload({fileReader:l.fileReader,directoryId:l.parentId??"",projectId:l.projectId,groupId:l.groupId,assetId:e,resumeChunked:o,shareContext:l.shareContext})},a)}}#q(){this.#B&&(this.hasActiveUploads()||(this.#N=!0,this.#B.reset(),this.#N=!1))}#K(){this.#w||(this.#w=!0,queueMicrotask(()=>{this.#w=!1;let e=this.#_.splice(0);e.length!==0&&this.#t.post("/assets/cancel-uploads",{asset_ids:e}).catch(t=>{this.#a.error("Failed to batch abort uploads",{assetIds:e},t)})}))}#z(){return D(this.#e.getSerializableSnapshot().uploadAssets)}#T(){this.#P||(this.#P=!0,queueMicrotask(()=>{this.#P=!1,this.#ue()}))}#le(){this.#Y(!0)}#ue(){this.#Y(!1)}#Y(e){if(this.#R||!this.#l&&!this.#u)return;e?this.#e.updateUploadStats():(this.#D++,this.#D%3===0&&this.#e.updateUploadStats());let t=this.#e.getDirtyDelta();if(!this.#C&&Object.keys(t.assets).length===0&&Object.keys(t.groups).length===0&&this.#e.dirtyHistoryGroupIds.size===0)return;this.#C=!1,this.#e.dirtyHistoryGroupIds.size>0&&this.#H();let r=this.#e.dirtyHistoryGroupIds.size>0?this.#de():void 0,i=this.#S?!0:void 0,o=this.#v.size>0?[...this.#v]:void 0;this.#S=!1,this.#v.clear();let a=this.#z(),l={assets:t.assets,groups:t.groups,uploadStats:{...this.#e.uploadStats},uploadSpeedState:this.#e.uploadSpeedState,historyItems:r,removedHistoryGroupIds:o,historyCleared:i,uploadSummary:a,bandwidthLimitBps:this.#I,conflictResolution:this.#m};this.#e.clearDirtyFlags(),this.#l?.(l),this.#u?.(a)}#Q(e){let t=0,s=0,r=0;for(let i of e.assetIds){let o=this.#e.getUploadAsset(i);o&&(t+=o.totalBytesToUpload,s+=o.bytesUploaded,o.status!=="success"&&o.status!=="failed"&&o.status!=="cancelled"&&r++)}return{totalBytes:t,bytesUploaded:s,filesRemaining:r}}#W(){let e=0,t=0,s=0,r=0;for(let i of Object.values(this.#e.uploadGroups)){e++;for(let o of i.assetIds){let a=this.#e.getUploadAsset(o);a&&(a.status==="success"||a.status==="failed"||a.status==="cancelled"||(t++,s+=a.totalBytesToUpload,r+=a.bytesUploaded))}}return{group_count:e,file_count:t,total_bytes:s,bytes_uploaded:r}}#ce(){if(!(!this.#i||this.#R))for(let e of Object.values(this.#e.uploadGroups)){let t=!1,s=0,r=0,i=0,o=0,a=0,l=0,u=0,c=0,d=0,p=0;for(let S of e.assetIds){let m=this.#e.getUploadAsset(S);if(!m)continue;let A=m.totalBytesToUpload;switch(s+=A,r+=m.bytesUploaded,m.status){case"success":i++,o+=A;break;case"failed":a++,l+=A;break;case"cancelled":u++,c+=A;break;case"in-progress":d++,t=!0;break;case"queued":p++,t=!0;break;case"paused":t=!0;break}}if(!t)continue;let h=this.#E.get(e.id),y=h?Date.now()-h:0;this.#i("upload:group_progress",{group_id:e.id,file_count:e.assetIds.length,total_bytes:s,bytes_uploaded:r,duration_ms:y,project_id:e.projectId,succeeded_count:i,succeeded_bytes:o,failed_count:a,failed_bytes:l,cancelled_count:u,cancelled_bytes:c,in_progress_count:d,queued_count:p,progress:s>0?r/s:0,concurrency:this.#f,upload_speed_mbps:this.#e.uploadStats.uploadSpeedMbps})}}#X(e,t,s){if(!this.#i)return;let{totalBytes:r,bytesUploaded:i}=this.#Q(t);this.#i(s,{file_count:t.fileCount,total_bytes:r,bytes_uploaded:i,project_id:t.projectId})}#V(e){if(!this.#i)return;let t=this.#e.getUploadAsset(e);if(!t?.groupId)return;let s=this.#e.uploadGroups[t.groupId];if(!s)return;let r=!0,i=0,o=0,a=0,l=0,u=0,c=0,d=0;for(let y of s.assetIds){let S=this.#e.getUploadAsset(y);if(!S)continue;let m=S.totalBytesToUpload;if(d+=m,S.status==="success")i++,o+=m;else if(S.status==="failed")a++,l+=m;else if(S.status==="cancelled")u++,c+=m;else{r=!1;break}}if(!r)return;let p=this.#E.get(s.id),h=p?Date.now()-p:0;this.#i("upload:group_completed",{file_count:s.assetIds.length,total_bytes:d,duration_ms:h,project_id:s.projectId,succeeded_count:i,succeeded_bytes:o,failed_count:a,failed_bytes:l,cancelled_count:u,cancelled_bytes:c}),this.#E.delete(s.id)}#de(){let e={};for(let t of this.#e.dirtyHistoryGroupIds){let s=this.#e.buildHistoryItem(t);s&&(e[t]=s)}return e}#H(){if(!this.#n)return;let e={};for(let t of this.#e.dirtyHistoryGroupIds){let s=this.#e.buildHistoryItem(t);if(s){e[t]=s;let r=this.#A.findIndex(i=>i.groupId===t);r>=0?this.#A[r]=s:this.#A.unshift(s)}}Object.keys(e).length>0&&this.#n.merge(e)}};var G=class{#t=65536;#s=0;async*createIterator(e,t,s){let r=0,i=Math.max(65536,Math.min(e.byteLength,this.#t)),o=this.#s;for(;r<e.byteLength;){if(s?.aborted)return;let a=Math.min(r+i,e.byteLength),l=e.subarray(r,a),u=l.byteLength,c=performance.now();yield l;let d=performance.now()-c;r=a;let p=t();if(p!==null&&p>0){let h=Math.round(p*50/1e3);if(i=Math.max(65536,Math.min(e.byteLength,h)),r<e.byteLength){let S=u/p*1e3-d;S>1&&await new Promise(m=>setTimeout(m,S))}}else{if(d>=.5){let h=u/d*1e3;o=o===0?h:o*(1-.3)+h*.3}else o===0&&(i=Math.min(e.byteLength,i*2));if(o>0){let h=Math.round(o*50/1e3);i=Math.max(65536,Math.min(e.byteLength,h))}}this.#t=i,this.#s=o}}};function b(n){let e=n.replace(/\\/g,"/");if(e.split("/").some(i=>i===".."))throw new Error(`Remote path cannot contain parent directory segments: ${n}`);let r=U.posix.normalize(e).replace(/^\/+/,"");if(r===""||r===".")throw new Error(`Remote path must resolve to a file path: ${n}`);return r}function xe(n){let e=new Map;for(let i of n){let o=b(i.targetPath??i.path);e.set(o,(e.get(o)??0)+1)}let t=new Set,s=[],r=[];for(let i of n){let o=b(i.path),a=b(i.targetPath??i.path),l=z(a),u=Se(l,t),c=(e.get(a)??0)>1,d=u!==o;t.add(u),s.push({...i,targetPath:u,requiresIdentityDownload:i.requiresIdentityDownload===!0||c}),(d||c)&&r.push({sourcePath:i.path,targetPath:u,reason:c||u!==l?"duplicate":"sanitized"})}return{files:s,changes:r}}function k(n){return b(n.targetPath??n.path)}function we(n,e){let t=k(n);return{relativePath:t,absolutePath:U.join(e,t),fileName:U.posix.basename(t),size:n.size}}function z(n){return n.split("/").map(t=>O(t)).join("/")}function Se(n,e){if(!e.has(n))return n;let t=U.posix.dirname(n),s=U.posix.basename(n),r=U.posix.extname(s),i=r.length>0?s.slice(0,-r.length):s,o=2;for(;;){let a=`${i} (${o})${r}`,l=t==="."?a:`${t}/${a}`;if(!e.has(l))return l;o+=1}}function Ce(n,e){if(!e.has(n))return n;let t=U.posix.dirname(n),s=U.posix.basename(n),r=2;for(;;){let i=`${s} ${r}`,o=t==="."?i:`${t}/${i}`;if(!e.has(o))return o;r+=1}}var T=class extends Error{constructor(t,s){super(t);this.stderr=s;this.name="RcloneError"}stderr};function yt(n){let e=["sync",n.remoteSource,n.localPath];return n.batchFilePath&&e.push("--files-from",n.batchFilePath),e.push("--progress","--stats","1s","--stats-one-line","-v","--transfers",String(n.rcloneOptions.transfers),"--checkers",String(n.rcloneOptions.checkers),"--multi-thread-streams",String(n.rcloneOptions.multiThreadStreams),"--multi-thread-chunk-size",n.rcloneOptions.multiThreadChunkSize,"--multi-thread-cutoff",n.rcloneOptions.multiThreadCutoff,"--fast-list","--buffer-size",n.rcloneOptions.bufferSize),n.rcloneOptions.useMmap&&e.push("--use-mmap"),n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function St(n){let e=["lsjson",n.remoteSource,"--recursive","--fast-list"];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function Ct(n){let e=["backend","query",`${n.remote}:`,n.query];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function bt(n){let e=["copyto",n.remoteFileSource,n.localTargetPath,"--progress","--stats","1s","--stats-one-line","-v","--multi-thread-streams",String(n.rcloneOptions.multiThreadStreams),"--multi-thread-chunk-size",n.rcloneOptions.multiThreadChunkSize,"--multi-thread-cutoff",n.rcloneOptions.multiThreadCutoff,"--buffer-size",n.rcloneOptions.bufferSize];return n.rcloneOptions.useMmap&&e.push("--use-mmap"),n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function At(n){let e=["backend","copyid",`${n.remote}:`,n.fileId,n.localTargetPath];return n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function _(n,e){let t=e.trim(),s={B:1,k:1024,Ki:1024,KiB:1024,kB:1e3,M:1024*1024,Mi:1024*1024,MiB:1024*1024,MB:1e3*1e3,G:1024*1024*1024,Gi:1024*1024*1024,GiB:1024*1024*1024,GB:1e3*1e3*1e3,T:1024*1024*1024*1024,Ti:1024*1024*1024*1024,TiB:1024*1024*1024*1024,TB:1e3*1e3*1e3*1e3};return n*(s[t]||1)}function De(n){let e=0,t=n.match(/(\d+)h/),s=n.match(/(\d+)m/),r=n.match(/(\d+)s/);return t&&(e+=parseInt(t[1],10)*3600),s&&(e+=parseInt(s[1],10)*60),r&&(e+=parseInt(r[1],10)),e}function Et(n){let e=n.trim(),t=/^([\d.]+)\s*([A-Za-z]+)\s*\/\s*([\d.]+)\s*([A-Za-z]+),\s*([\d.]+)%?,\s*([\d.]+)\s*([A-Za-z]+)\/s,\s*ETA\s+(.+)$/,s=e.match(t);if(s){let a=s[8].trim();return{bytesTransferred:_(parseFloat(s[1]),s[2]),totalBytes:_(parseFloat(s[3]),s[4]),percentComplete:parseFloat(s[5]),speed:_(parseFloat(s[6]),s[7]),eta:a==="-"?0:De(a)}}let r=e.match(/Transferred:\s+([\d.]+)\s*([A-Za-z]+)\s*\/\s*([\d.]+)\s*([A-Za-z]+),\s*([\d.]+)%/);if(!r)return null;let i=e.match(/([\d.]+)\s*([A-Za-z]+)\/s/),o=e.match(/ETA\s+([^\s]+)$/);return{bytesTransferred:_(parseFloat(r[1]),r[2]),totalBytes:_(parseFloat(r[3]),r[4]),percentComplete:parseFloat(r[5]),speed:i?_(parseFloat(i[1]),i[2]):0,eta:o&&o[1]!=="-"?De(o[1]):0}}function be(n){return new Promise((e,t)=>{let s=J("rclone",n.args,{stdio:["ignore","pipe","pipe"]}),r="",i=0,o=a=>{for(let l of a.split(`
|
|
3
|
-
`)){if(l.trim().length===0)continue;let u=
|
|
2
|
+
import{Command as Vt}from"commander";import Ve from"node:path";import{readFileSync as Jt}from"node:fs";import{fileURLToPath as Zt}from"node:url";import tt from"node:os";import ke from"node:path";var st="phc_rDzmwduU3NzHyELgLEg7nMjqpTgaSpC2a6tMKL8VyjN",rt="https://t.aspect.inc",nt="https://t.aspect.inc";function it(n){let e=n.match(/^(\d+(?:\.\d+)?)\s*(B|KB|MB|GB|TB)$/i);if(!e)return null;let t=parseFloat(e[1]),s=e[2].toUpperCase(),r={B:1,KB:1024,MB:1024*1024,GB:1024*1024*1024,TB:1024*1024*1024*1024};return t*(r[s]||1)}function xe(n){let e=n.options.apiKey||n.environment.ASPECT_API_KEY||"";if(!e)throw new Error("Error: --api-key is required (or set ASPECT_API_KEY env variable)");let t=he({value:n.options.rcloneTransfers,optionName:"--rclone-transfers"}),s=he({value:n.options.rcloneMultiThreadStreams,optionName:"--rclone-multi-thread-streams"}),r=he({value:n.options.uploadConcurrent,optionName:"--upload-concurrent"}),i=ot(n.options.batchSize),o=n.options.session??at({now:n.now??new Date,highResolutionTime:n.highResolutionTime??process.hrtime.bigint()}),a=n.options.tempDir||ke.join(tt.homedir(),".aspect","sync");return{remote:n.options.remote,remotePath:n.options.path,directoryId:n.options.directoryId,projectId:n.options.projectId,apiUrl:n.options.apiUrl||n.environment.ASPECT_API_URL||"https://api.aspect.inc",edgeWorkerUrl:n.options.edgeWorkerUrl||n.environment.ASPECT_EDGE_WORKER_URL||"https://mackinac.aspect.inc",apiKey:e,maxConcurrent:r,keepLocal:n.options.keepLocal,localTempDir:ke.join(a,o),sessionName:o,rcloneOptions:{transfers:t,checkers:t>=16?Math.floor(t/4):t,multiThreadStreams:s,multiThreadChunkSize:n.options.rcloneMultiThreadChunkSize,multiThreadCutoff:n.options.rcloneMultiThreadCutoff,bufferSize:n.options.rcloneBufferSize,useMmap:!n.options.rcloneNoMmap,extraRcloneArgs:n.options.rcloneExtra},batchSizeBytes:i,analytics:{posthogKey:n.environment.ASPECT_POSTHOG_KEY||n.environment.POSTHOG_KEY||n.environment.POSTHOG_API_KEY||st,posthogHost:n.environment.ASPECT_POSTHOG_HOST||n.environment.POSTHOG_HOST||rt||nt,disabled:_e(n.environment.ASPECT_DISABLE_POSTHOG)||_e(n.environment.POSTHOG_DISABLED)}}}function he(n){let e=parseInt(n.value,10);if(Number.isNaN(e)||e<1)throw new Error(`Error: ${n.optionName} must be a positive integer`);return e}function ot(n){if(!n)return;let e=it(n);if(e===null)throw new Error(`Error: Invalid batch size format: ${n}`);return e}function _e(n){return n?["1","true","yes"].includes(n.toLowerCase()):!1}function at(n){let e=n.now.getFullYear(),t=String(n.now.getMonth()+1).padStart(2,"0"),s=String(n.now.getDate()).padStart(2,"0"),r=String(n.now.getHours()).padStart(2,"0"),i=String(n.now.getMinutes()).padStart(2,"0"),o=String(n.now.getSeconds()).padStart(2,"0"),a=n.highResolutionTime%1000000000n,l=String(a).padStart(9,"0");return`${e}-${t}-${s}_${r}h-${i}m-${o}s-${l}ns`}import K from"node:fs/promises";import Ie from"node:path";import{spawn as te}from"child_process";import*as Te from"fs";import*as j from"path";import P from"node:path";function Q(n,e){if(e.length===0)return"queued";if(n.isCreatingFolders)return"creating-folders";let t={queued:0,paused:0,inProgress:0,success:0,failed:0,cancelled:0};for(let r of e)switch(r.status){case"queued":t.queued++;break;case"paused":t.paused++;break;case"in-progress":t.inProgress++;break;case"success":t.success++;break;case"failed":t.failed++;break;case"cancelled":t.cancelled++;break}let s=e.length;return t.failed===s?"all-failed":t.failed>0?"some-failed":t.success===s?"success":t.paused>0&&t.queued===0&&t.inProgress===0?"paused":t.queued>0||t.inProgress>0?t.queued+t.paused===s?"queued":"in-progress":"cancelled"}function pe(n,e){let t=Q(n,e);return t==="creating-folders"||t==="in-progress"||t==="queued"||t==="paused"?"cancelled":t}function me(n){let e=[];for(let t of Object.values(n))t.chunkedState&&(t.status==="queued"||t.status==="in-progress"||t.status==="paused")&&e.push(t.chunkedState.assetId);return e}function ge(n){for(let e of Object.values(n))if(e.status==="queued"||e.status==="in-progress"||e.status==="paused")return!0;return!1}function L(n){let t=Object.values(n).reduce((s,r)=>{switch(r.status!=="failed"&&r.status!=="cancelled"&&(s.totalBytesToUpload+=r.totalBytesToUpload,s.totalBytesUploaded+=r.bytesUploaded),s.totalAssetCount+=1,r.status){case"queued":s.queuedAssetCount+=1;break;case"paused":s.pausedAssetCount+=1;break;case"in-progress":s.inProgressAssetCount+=1;break;case"success":s.successAssetCount+=1;break;case"failed":s.failedAssetCount+=1;break;case"cancelled":s.cancelledAssetCount+=1;break}return s},{totalBytesToUpload:0,totalBytesUploaded:0,totalAssetCount:0,queuedAssetCount:0,pausedAssetCount:0,inProgressAssetCount:0,successAssetCount:0,failedAssetCount:0,cancelledAssetCount:0,hasActiveUploads:!1,progress:0});return t.hasActiveUploads=t.totalAssetCount-t.successAssetCount-t.failedAssetCount-t.cancelledAssetCount>0,t.progress=t.hasActiveUploads?t.totalBytesUploaded/t.totalBytesToUpload:0,t}function fe(n,e){if(e.length===0)return null;let t=e.reduce((s,r)=>(r.status!=="failed"&&r.status!=="cancelled"&&(s.totalBytes+=r.totalBytesToUpload,s.uploadedBytes+=r.bytesUploaded),r.status==="success"?s.filesSucceeded++:r.status==="failed"&&s.filesFailed++,(r.status==="success"||r.status==="failed"||r.status==="cancelled")&&s.filesCompleted++,s),{totalBytes:0,uploadedBytes:0,filesCompleted:0,filesSucceeded:0,filesTotal:e.length,filesFailed:0,percentage:0});return t.percentage=t.totalBytes>0?t.uploadedBytes/t.totalBytes*100:0,t}function ye(n){let e=Object.values(n).filter(t=>t.status==="queued"||t.status==="in-progress"||t.status==="paused");return e.length===0?!1:e.every(t=>t.status==="paused")}function Se(n){return Object.values(n).some(e=>e.status==="paused")}import hs from"axios";var O=class{#t;#s;#e;#n;#o;#i=0;#a=0;#l=0;#r=0;#u=0;#A=0;constructor(e){this.#t=e?.alphaFast??.1,this.#s=e?.alphaMax??.5,this.#e=e?.consecutiveForBoost??3,this.#n=e?.minSamples??3,this.#o=e?.maxGapSeconds??2}sample(e){let t=Date.now();if(this.#r===0){this.#r=t,this.#u=e;return}let r=(t-this.#r)/1e3,i=e-this.#u;if(r<=0||i<0)return;if(r>this.#o){this.#r=t,this.#u=e;return}let o=i/r;if(this.#A===0)this.#i=o;else{let l=o-this.#i>=0?1:-1;this.#l!==0&&l===this.#l?this.#a++:this.#a=0,this.#l=l;let u=Math.min(1,this.#a/this.#e),c=this.#t+(this.#s-this.#t)*u;this.#i=c*o+(1-c)*this.#i}this.#r=t,this.#u=e,this.#A++}etaSeconds(e){return!this.isWarmedUp||this.#i<=0?0:e/this.#i}adjustTotalBytes(e){this.#u+=e}reset(){this.#i=0,this.#a=0,this.#l=0,this.#r=0,this.#u=0,this.#A=0}serialize(){return{displaySpeedBps:this.#i,lastSampleTimestamp:this.#r,lastSampleTotalBytes:this.#u,sampleCount:this.#A}}get speedBps(){return this.#i}get speedMbps(){return this.#i*8/1e6}get isWarmedUp(){return this.#A>=this.#n}};function v(n){let e={"X-Aspect-Share-Id":n.shareId};return n.shareAuthentication&&(e["X-Aspect-Share-Authentication"]=n.shareAuthentication),e}var M=class{#t;#s;#e;#n;#o;#i;#a;#l;#r;#u;#A;#f;#x;#h;#D;#v;#E;#F;#S;#U;#C;#c;#k;#w;#d;#_;#y;#p;#P;#I;#m;#g;#R;constructor(e){this.#s=e?.minConcurrency??1,this.#e=e?.maxConcurrency??8,this.#t=e?.initialConcurrency??this.#s,this.#n=e?.errorThreshold??1,this.#o=(e?.cooldownSeconds??10)*1e3,this.#i=e?.plateauThreshold??.05,this.#a=e?.onChange,this.#l=e?.now??Date.now,this.#r=this.#t,this.#u="probing",this.#A=0,this.#f=0,this.#x=0,this.#h=0,this.#D=!1,this.#v=0,this.#E=0,this.#F=1/0,this.#I=0,this.#m=0,this.#g=0,this.#R=0,this.#S=1/0,this.#U=0,this.#C=3e4,this.#c=0,this.#k=0,this.#w=0,this.#d=0,this.#_=0,this.#y=0,this.#p=0,this.#P=0}recordSuccess(e,t){if(e<=0)return;if(this.#v>0){this.#v--;return}this.#h++,this.#I+=e;let s=this.#l();if(this.#m===0){this.#m=s;return}let r=s-this.#m;if(r>=200){let c=this.#I/r*1e3;this.#R===0?this.#g=c:this.#g=.3*c+(1-.3)*this.#g,this.#R++,this.#R>=5&&(this.#w=Math.max(this.#w,this.#g)),this.#I=0,this.#m=s}if(t!==void 0&&t>0&&e>0){let c=t/(e/1048576);this.#_===0?this.#d=c:this.#d=.3*c+(1-.3)*this.#d,this.#_++}if(this.#u==="cooldown"&&s>=this.#A&&(this.#u="probing"),this.#u!=="probing")return;if(this.#f>0){let c;if(this.#R>=25?c=.03:this.#R>=15?c=.04:this.#R>=5&&(c=.07),c!==void 0&&(this.#g-this.#f)/this.#f<=-c){this.#p=0,this.#P=0,this.#L();return}}let i=this.#D?this.#r*2:this.#r;if(this.#h<i)return;if(this.#x=0,this.#R<5){this.#h=0;return}let o=this.#S<1/0&&this.#l()<this.#U?this.#S-1:this.#e,a=Math.min(this.#e,this.#F-1,o);if(this.#r>=a){if(this.#S<1/0&&this.#g>0&&this.#c>0){let c=(this.#g-this.#c)/this.#c;if(c>.2){this.#S=1/0,this.#U=0,this.#C=3e4,this.#c=0,this.#k=0,this.#h=0;return}if(c<=-.07){this.#h=0;return}}if(this.#w>0&&this.#g>0&&this.#R>=5&&(this.#w-this.#g)/this.#w>.07){this.#S=1/0,this.#U=0,this.#C=3e4,this.#c=0,this.#k=0,this.#w=this.#g,this.#h=0;return}if(this.#k>0&&this.#d>0&&this.#_>=2&&(this.#k-this.#d)/this.#k>.2){this.#S=1/0,this.#U=0,this.#C=3e4,this.#c=0,this.#k=0,this.#h=0;return}this.#h=0;return}let l=this.#g;if(this.#f>0){let c=Math.max(.02,this.#i*3/this.#r),d=(l-this.#f)/this.#f;if(d<=-.07){this.#p=0,this.#P=0,this.#L();return}else if(d<c){if(this.#_>=2&&this.#y>0){let h=this.#d/this.#y,p=this.#r/(this.#r-1);if(h<p*.9){this.#h=0;return}}if(this.#p++,this.#p<3){this.#h=0;return}this.#p=0,this.#P=0,this.#L();return}else if(d<c*2){if(this.#P++,this.#P<2){this.#h=0;return}this.#p=0,this.#P=0}else this.#p=0,this.#P=0;this.#S<1/0&&(this.#S=1/0,this.#U=0,this.#C=3e4,this.#c=0,this.#k=0)}this.#y=this.#d,this.#p=0,this.#P=0;let u=this.#r;this.#r++,this.#f=l,this.#h=0,this.#v=Math.max(0,u-1),this.#I=0,this.#m=0,this.#g=0,this.#R=0,this.#d=0,this.#_=0,this.#a?.(this.#r)}#L(){let e=Math.max(this.#s,this.#r-1);e<this.#r&&(this.#S=Math.min(this.#S,this.#r),this.#U=this.#l()+this.#C,this.#C=Math.min(this.#C*2,12e4),this.#c=this.#f,this.#k=this.#y,this.#r=e,this.#f=0,this.#I=0,this.#m=0,this.#g=0,this.#R=0,this.#d=0,this.#_=0,this.#a?.(this.#r)),this.#h=0}recordError(){if(this.#v>0&&this.#v--,this.#x++,this.#x<this.#n)return;this.#r===this.#E&&(this.#F=Math.min(this.#F,this.#r)),this.#E=this.#r;let e=this.#r;this.#r=Math.max(this.#s,Math.floor(this.#r/2)),this.#u="cooldown",this.#A=this.#l()+this.#o,this.#D=!0,this.#x=0,this.#h=0,this.#v=0,this.#f=0,this.#I=0,this.#m=0,this.#g=0,this.#R=0,this.#d=0,this.#_=0,this.#y=0,this.#p=0,this.#P=0,this.#r!==e&&this.#a?.(this.#r)}get concurrency(){return this.#r}get speedBps(){return this.#g}get latencyMsPerMB(){return this.#d}reset(){this.#r=this.#t,this.#u="probing",this.#A=0,this.#f=0,this.#x=0,this.#h=0,this.#D=!1,this.#v=0,this.#E=0,this.#F=1/0,this.#S=1/0,this.#U=0,this.#C=3e4,this.#c=0,this.#k=0,this.#w=0,this.#d=0,this.#_=0,this.#y=0,this.#p=0,this.#P=0,this.#I=0,this.#m=0,this.#g=0,this.#R=0,this.#a?.(this.#r)}};function De(n){let e=`[${n}]`;return{info:(...t)=>console.info(e,...t),warn:(...t)=>console.warn(e,...t),error:(...t)=>console.error(e,...t)}}var Ce=De("transfer");var X=class{uploadAssets={};uploadGroups={};#t=new O;get uploadSpeedState(){return this.#t.serialize()}uploadStats={uploadSpeedMbps:0,timeRemainingSeconds:0,formattedSpeed:"Calculating...",formattedTime:"Calculating..."};dirtyAssetIds=new Set;dirtyGroupIds=new Set;dirtyHistoryGroupIds=new Set;#s(e){e!==0&&this.#t.adjustTotalBytes(-e)}adjustSpeedBaselineForSkippedBytes(e){e!==0&&this.#t.adjustTotalBytes(e)}#e(){Object.values(this.uploadAssets).some(t=>t.status==="queued"||t.status==="in-progress")||this.#t.reset()}#n(e){this.dirtyAssetIds.add(e)}#o(e){this.dirtyGroupIds.add(e)}addUploadAsset({assetId:e,fileReader:t,abortController:s,parentId:r,projectId:i,groupId:o,chunkSize:a,shareContext:l}){this.uploadAssets[e]={assetId:e,totalBytesToUpload:t.size,bytesUploaded:0,status:"queued",fileName:t.name,createdAt:new Date().toISOString(),i:Object.keys(this.uploadAssets).length,parentId:r,projectId:i,groupId:o,retryCount:0,chunkSize:a??0,fileReader:t,abortController:s,shareContext:l},this.#n(e)}updateUploadProgress(e,t){let s=this.uploadAssets[e];if(!s||s.status==="paused"||s.status==="cancelled"||s.status==="success"||s.status==="failed")return;let r=t>0&&s.status==="queued"?"in-progress":s.status,i=Math.min(t,s.totalBytesToUpload);s.bytesUploaded=i,s.status=r,this.#n(e)}markUploadInProgress(e){let t=this.uploadAssets[e];t&&(t.status="in-progress",this.#n(e))}markUploadSuccess(e){let t=this.uploadAssets[e];t&&(t.status="success",t.bytesUploaded=t.totalBytesToUpload,this.#n(e),this.#e(),this.cleanupOnCompletion(e))}markUploadFailed(e,t){let s=this.uploadAssets[e];if(!s)return;let r=s.bytesUploaded;s.status="failed",s.errorMessage=t,s.bytesUploaded=0,this.#n(e),this.#s(r),this.#e(),this.cleanupOnCompletion(e)}removeUploadAsset(e){let s=this.uploadAssets[e]?.bytesUploaded??0;delete this.uploadAssets[e],this.#n(e),this.#s(s),this.#e()}clearAllUploads(){this.uploadAssets={},this.#t.reset()}clearTerminalState(){if(!Object.values(this.uploadAssets).some(t=>t.status==="queued"||t.status==="in-progress"||t.status==="paused")){for(let t of Object.keys(this.uploadAssets))delete this.uploadAssets[t];for(let t of Object.keys(this.uploadGroups))delete this.uploadGroups[t];this.#t.reset()}}resetAssetForRetryQueue(e){let t=this.uploadAssets[e];t&&(t.status="queued",t.bytesUploaded=0,t.errorMessage=void 0,t.retryCount=t.retryCount+1,this.#n(e))}resetAssetForRetrying(e){let t=this.uploadAssets[e];t&&(t.status="queued",t.bytesUploaded=0,t.retryCount=0,this.#n(e))}pauseUpload(e){let t=this.uploadAssets[e];if(!t||t.status!=="queued"&&t.status!=="in-progress")return;let s=0;if(t.chunkedState){let{completedChunkIndices:i,chunkSize:o}=t.chunkedState;for(let a of i){let l=a*o,u=Math.min(l+o,t.totalBytesToUpload);s+=u-l}}let r=t.bytesUploaded-s;t.status="paused",t.bytesUploaded=s,this.#n(e),this.#s(r),this.#e(),t.abortController.abort()}unpauseUpload(e){let t=this.uploadAssets[e];t&&t.status==="paused"&&(t.status="queued",this.#n(e))}pauseUploadGroup(e){let t=this.uploadGroups[e];if(t&&!t.isCreatingFolders){t.isPaused=!0,this.#o(e);for(let s of t.assetIds)this.pauseUpload(s)}}unpauseUploadGroup(e){let t=this.uploadGroups[e];t&&(t.isPaused=!1,this.#o(e))}pauseAllUploads(){for(let e of Object.values(this.uploadGroups))e.isCreatingFolders||this.pauseUploadGroup(e.id)}resumeAllUploads(){for(let e of Object.values(this.uploadGroups))e.isPaused&&this.unpauseUploadGroup(e.id)}markUploadCancelled(e){let t=this.uploadAssets[e];if(!t||t.status==="success"||t.status==="failed"||t.status==="cancelled")return;let s=t.bytesUploaded;t.status="cancelled",this.#n(e),this.#s(s),this.#e(),this.cleanupOnCompletion(e)}setChunkedState(e,t){let s=this.uploadAssets[e];s&&(s.chunkedState=t,this.#n(e))}addCompletedChunkIndex(e,t){let s=this.uploadAssets[e];!s||!s.chunkedState||(s.chunkedState={...s.chunkedState,completedChunkIndices:[...s.chunkedState.completedChunkIndices,t]},this.#n(e))}clearChunkedState(e){let t=this.uploadAssets[e];t&&(t.chunkedState=void 0,this.#n(e))}hasGroupsCreatingFolders(){return Object.values(this.uploadGroups).some(e=>e.isCreatingFolders===!0)}areAllUploadsPaused(){return ye(this.uploadAssets)}hasPausedUploads(){return Se(this.uploadAssets)}getUploadAsset(e){return this.uploadAssets[e]}getSerializableAsset(e){let t=this.uploadAssets[e];if(t)return this.#l(t)}getUploadSummary(){return L(this.#u())}getAllUploadAssetsSortedByRecent(){return Object.values(this.uploadAssets).map(e=>this.#l(e)).sort((e,t)=>t.i-e.i)}getGroupAssets(e){let t=this.uploadGroups[e];return!t||!t.assetIds?[]:t.assetIds.map(s=>this.uploadAssets[s]).filter(Boolean).map(s=>this.#l(s))}getGroupAssetsInternal(e){let t=this.uploadGroups[e];return!t||!t.assetIds?[]:t.assetIds.map(s=>this.uploadAssets[s]).filter(Boolean)}addUploadGroup(e){let t=crypto.randomUUID();return this.uploadGroups[t]={...e,id:t,fileReaders:new Map},this.#o(t),t}updateUploadGroup(e,t){let s=this.uploadGroups[e];s&&(Object.assign(s,t),this.#o(e))}addAssetToGroup(e,t){let s=this.uploadGroups[e];s&&(s.assetIds.push(t),this.#o(e))}removeUploadGroup(e){let t=this.uploadGroups[e];if(t)for(let s of t.assetIds)delete this.uploadAssets[s],this.#n(s);delete this.uploadGroups[e],this.#o(e)}getUploadGroup(e){let t=this.uploadGroups[e];if(t)return this.#r(t)}getAllUploadGroups(){return Object.values(this.uploadGroups).map(e=>this.#r(e)).sort((e,t)=>t.createdAt.localeCompare(e.createdAt))}getUploadGroupProgress(e){let t=this.uploadGroups[e];if(!t)return null;let s=this.getGroupAssets(e);return fe(this.#r(t),s)}getUploadGroupStatus(e){let t=this.uploadGroups[e];if(!t)return null;let s=this.getGroupAssets(e);return s.length>0?Q(this.#r(t),s):null}getAssetsByParentId(e){return Object.values(this.uploadAssets).filter(t=>t.parentId===e).map(t=>this.#l(t))}getActiveUploadGroups(){return Object.values(this.uploadGroups).filter(e=>{let t=this.getUploadGroupStatus(e.id);return t&&["queued","creating-folders","in-progress"].includes(t)}).map(e=>this.#r(e))}cleanupOnCompletion(e){let t=this.uploadAssets[e];if(!t)return;let s=t.groupId;if(s){let i=this.uploadGroups[s];if(i){let o=this.getGroupAssets(s),a=this.#r(i);this.dirtyHistoryGroupIds.add(s),!o.some(u=>u.status==="queued"||u.status==="in-progress")&&!i.completedAt&&(i.completedAt=new Date().toISOString(),this.#o(s))}}let r=this.getUploadSummary();if(r.cancelledAssetCount+r.failedAssetCount+r.successAssetCount===r.totalAssetCount)for(let i of Object.keys(this.uploadAssets)){let o=this.uploadAssets[i];o&&(o.bytesUploaded=0,this.#n(i))}}updateUploadStats(){let e=this.getUploadSummary(),t=e.queuedAssetCount>0||e.inProgressAssetCount>0;t&&this.#t.sample(e.totalBytesUploaded);let s=this.#t.isWarmedUp?this.#t.speedMbps:0,r=t&&this.#t.isWarmedUp?this.#t.etaSeconds(e.totalBytesToUpload-e.totalBytesUploaded):0;this.uploadStats={uploadSpeedMbps:s,timeRemainingSeconds:r,formattedSpeed:this.#i(s),formattedTime:this.#a(r)}}#i(e){return!Number.isFinite(e)||e<=0?"Calculating...":e<1?`${(e*1e3).toFixed(0)} Kbps`:`${e.toFixed(1)} Mbps`}#a(e){if(!Number.isFinite(e)||e<=0)return"Calculating...";let t=Math.floor(e/3600),s=Math.floor(e%3600/60),r=Math.floor(e%60);return t>0?`${t}h ${s}m left`:s>0?`${s}m ${r}s left`:`${r}s left`}buildHistoryItem(e){let t=this.uploadGroups[e];if(!t)return null;let s=this.getGroupAssets(e),r=this.#r(t);return{groupId:t.id,name:t.name,type:t.type,fileCount:t.fileCount,folderCount:t.folderCount,topLevelFileCount:t.topLevelFileCount,topLevelFolderCount:t.topLevelFolderCount,status:pe(r,s),createdAt:t.createdAt,completedAt:t.completedAt,rootDirectoryId:t.rootDirectoryId,projectId:t.projectId,errorMessage:t.errorMessage,conflictResolution:t.conflictResolution}}#l({fileReader:e,abortController:t,shareContext:s,...r}){return r}#r({fileReaders:e,...t}){return t}#u(){let e={};for(let[t,s]of Object.entries(this.uploadAssets))e[t]=this.#l(s);return e}#A(){let e={};for(let[t,s]of Object.entries(this.uploadGroups))e[t]=this.#r(s);return e}getSerializableSnapshot(){return{uploadAssets:this.#u(),uploadGroups:this.#A(),uploadStats:{...this.uploadStats},uploadSpeedState:this.uploadSpeedState}}getDirtyDelta(){let e={};for(let s of this.dirtyAssetIds){let r=this.uploadAssets[s];r&&(e[s]=this.#l(r))}let t={};for(let s of this.dirtyGroupIds){let r=this.uploadGroups[s];r&&(t[s]=this.#r(r))}return{assets:e,groups:t}}clearDirtyFlags(){this.dirtyAssetIds.clear(),this.dirtyGroupIds.clear(),this.dirtyHistoryGroupIds.clear()}};function ct(n,e){let t=new Date(n).getTime(),s=Date.now();return t-s<=e}var V=class{#t;#s=new Map;#e=new Map;constructor(e){this.#t=e}seedToken(e,t,s){this.#s.set(e,{token:t,expiresAt:s})}async getToken(e,t){let s=this.#s.get(e);if(s&&!ct(s.expiresAt,3e5))return s.token;let r=this.#e.get(e);if(r)return r;let i=t?v(t):void 0,o=this.#t.post(`/assets/${e}/token`,{},i).then(a=>{if(!a.token)throw new Error("Token refresh failed: no token in response");return this.#s.set(e,{token:a.token,expiresAt:a.token_expires_at}),this.#e.delete(e),a.token}).catch(a=>{throw this.#e.delete(e),a});return this.#e.set(e,o),o}clearCache(e){e?this.#s.delete(e):this.#s.clear()}};var J=class{#t=[];registerAsset(e){this.#t.push({assetId:e.assetId,totalChunks:e.totalChunks,nextChunkToClaim:0,completedChunkIndices:new Set(e.completedChunkIndices),isPaused:!1})}claimNextChunk(){for(let e of this.#t)if(!e.isPaused)for(;e.nextChunkToClaim<e.totalChunks;){let t=e.nextChunkToClaim;if(e.nextChunkToClaim++,!e.completedChunkIndices.has(t))return{assetId:e.assetId,chunkIndex:t}}return null}markChunkCompleted(e,t){let s=this.#s(e);return s?(s.completedChunkIndices.add(t),s.completedChunkIndices.size>=s.totalChunks):!1}pauseAsset(e){let t=this.#s(e);t&&(t.isPaused=!0)}unpauseAsset(e){let t=this.#s(e);t&&(t.isPaused=!1,this.#e(t))}removeAsset(e){this.#t=this.#t.filter(t=>t.assetId!==e)}hasAsset(e){return this.#t.some(t=>t.assetId===e)}clear(){this.#t=[]}#s(e){return this.#t.find(t=>t.assetId===e)}#e(e){for(let t=0;t<e.totalChunks;t++)if(!e.completedChunkIndices.has(t)){e.nextChunkToClaim=t;return}e.nextChunkToClaim=e.totalChunks}};var dt=/[/\\:*?"<>|\x00-\x1F]/g,ht=["CON","PRN","AUX","NUL","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9"];function N(n){let e=n.replace(dt,"_");e=e.replace(/[. ]+$/,""),(!e||e==="."||e==="..")&&(e="unnamed");let t=e.includes(".")?e.substring(0,e.lastIndexOf(".")):e;ht.includes(t.toUpperCase())&&(e=`_${e}`);let s=new TextEncoder;if(s.encode(e).length>255){let r=e.lastIndexOf("."),i=r>0?e.substring(r):"",o=r>0?e.substring(0,r):e,l=255-s.encode(i).length;for(;s.encode(o).length>l&&o.length>0;)o=o.slice(0,-1);e=o+i}return e}var U=class extends Error{constructor(){super("Upload cancelled"),this.name="CancelledError"}};function G(n){return n instanceof U||n instanceof Error&&n.name==="CancelledError"||n instanceof Error&&n.name==="CanceledError"||n instanceof Error&&n.name==="AbortError"}function Ct(n){return G(n)||n instanceof Error&&n.name==="NoAuthError"}function bt(n){return new Promise(e=>setTimeout(e,n))}function At(n){return n instanceof Blob?n.size:n.byteLength}var z=class{#t;#s;#e;#n;#o;#i;#a;#l;#r;#u;#A;#f;#x;#h=null;#D=0;#v=!1;#E=[];#F=new Set;#S=!1;#U=!1;#C=!1;#c=[];#k=!1;#w=!1;#d=new J;#_=0;#y=new Map;#p=new Map;#P=[];#I=!1;#m=null;#g="keep_both";#R=new Map;#L=null;#b=!1;#B=null;#N=!1;constructor(e){this.#t=e.httpClient,this.#s=new V(e.httpClient),this.#e=new X,this.#n=e.historyStore??null,this.#o=e.settingsStore??null,this.#i=e.analytics??null,this.#a=e.logger??Ce,this.#l=e.onChange??null,this.#r=e.onClear??null,this.#u=e.onSummary??null,this.#A=e.onConcurrencyAdjusted??null,this.#x=e.deltaIntervalMs??333;let t=e.maxConcurrency??4;if(e.adaptiveConcurrency!==!1){let s=e.adaptiveConcurrencyConfig;this.#B=new M({initialConcurrency:s?.initialConcurrency??Math.min(2,t),minConcurrency:s?.minConcurrency??1,maxConcurrency:s?.maxConcurrency??t,errorThreshold:s?.errorThreshold,cooldownSeconds:s?.cooldownSeconds??10,plateauThreshold:s?.plateauThreshold,onChange:r=>{let i=this.#f;if(this.setMaxConcurrency(r),i===r)return;let o=this.#N?"reset":r>i?"probe_increase":"error_decrease",a=Math.round(this.#B.speedBps/(1024*1024)*100)/100,l=Math.round(this.#B.latencyMsPerMB*100)/100;this.#a.info(`Adaptive concurrency: ${i} \u2192 ${r} (${o}), speed=${a}MB/s, latency=${l}ms/MB`),this.#A?.({previousConcurrency:i,newConcurrency:r,reason:o,speedMbps:a,latencyMsPerMB:l})},now:s?.now}),this.#f=this.#B.concurrency}else this.#f=t;this.#n&&(this.#E=this.#n.load()),this.#o&&(this.#m=this.#o.getBandwidthLimitBps(),this.#g=this.#o.getConflictResolution()),(this.#l||this.#u)&&(this.#h=setInterval(()=>{this.#le()},this.#x)),this.#i&&(this.#L=setInterval(()=>{this.#ce()},6e4))}startUpload(e){let t=e.assetId||crypto.randomUUID(),s=!!e.assetId,r;if(s){let o=this.#e.getUploadAsset(t);if(!o)throw new Error(`Cannot retry: asset ${t} not found`);r=o.chunkSize}else{if(e.chunkSize===void 0||e.chunkSize===null)throw new Error("chunkSize is required for new uploads");r=e.chunkSize}let i=new AbortController;if(s){if(this.#e.getUploadAsset(t).status==="cancelled")return t;e.resetRetryCount&&this.#e.resetAssetForRetrying(t);let a=this.#e.getUploadAsset(t);a.abortController=i,a.fileReader=e.fileReader,e.shareContext&&(a.shareContext=e.shareContext)}else this.#e.addUploadAsset({assetId:t,fileReader:e.fileReader,abortController:i,parentId:e.directoryId,projectId:e.projectId,groupId:e.groupId,chunkSize:r,shareContext:e.shareContext});return this.#c.push(t),this.#G(),this.#T(),t}startGroupUpload(e){this.#e.clearTerminalState();let t=this.#e.addUploadGroup({type:e.type,name:e.name,assetIds:[],fileCount:e.fileCount,folderCount:e.folderCount,topLevelFileCount:e.topLevelFileCount,topLevelFolderCount:e.topLevelFolderCount,isCreatingFolders:!1,isPaused:!1,createdAt:new Date().toISOString(),rootDirectoryId:e.rootDirectoryId,projectId:e.projectId,retryCount:0,conflictResolution:e.conflictResolutionOverride??this.#g});return this.#R.set(t,Date.now()),this.#i?.("upload:started",{file_count:e.fileCount,total_bytes:e.totalBytes??0,has_folders:e.folderCount>0,project_id:e.projectId}),this.#e.dirtyHistoryGroupIds.add(t),this.#$(),this.#T(),t}pauseUpload(e){let t=this.#e.getUploadAsset(e);this.#e.pauseUpload(e),this.#c=this.#c.filter(s=>s!==e),this.#d.pauseAsset(e),!this.#b&&t&&this.#i&&this.#i("upload:file_paused",{file_name:t.fileName,file_size:t.totalBytesToUpload,bytes_uploaded:t.bytesUploaded,project_id:t.projectId??""}),this.#T()}unpauseUpload(e){this.#e.unpauseUpload(e),this.#T()}cancelUpload(e){let t=this.#e.getUploadAsset(e);if(!t||t.status==="success"||t.status==="failed"||t.status==="cancelled")return;let s=t.fileName,r=t.totalBytesToUpload,i=t.bytesUploaded,o=t.projectId,a=t.chunkedState?.assetId;(t.status==="queued"||t.status==="in-progress")&&t.abortController.abort(),this.#c=this.#c.filter(l=>l!==e),this.#d.removeAsset(e),this.#y.delete(e),this.#p.delete(e),this.#e.markUploadCancelled(e),this.#e.clearChunkedState(e),t.fileReader.close?.(),!this.#b&&this.#i&&this.#i("upload:file_cancelled",{file_name:s,file_size:r,bytes_uploaded:i,project_id:o??""}),this.#T(),this.#O(),this.#G(),this.#q(),a&&(this.#P.push(a),this.#K())}cancelAllUploads(){let e=this.#W();this.#b=!0;try{let s=Object.values(this.#e.uploadAssets).filter(r=>r.status==="queued"||r.status==="in-progress"||r.status==="paused");for(let r of s)this.cancelUpload(r.assetId)}finally{this.#b=!1}this.#i?.("upload:all_cancelled",e)}retryUpload(e){let t=this.#e.getUploadAsset(e);t&&t.status==="failed"&&this.startUpload({fileReader:t.fileReader,directoryId:t.parentId??"",projectId:t.projectId,groupId:t.groupId,assetId:e,resumeChunked:t.chunkedState,resetRetryCount:!0,shareContext:t.shareContext})}resumeUpload(e){let t=this.#e.getUploadAsset(e);if(!t||t.status!=="paused")return;!this.#b&&this.#i&&this.#i("upload:file_resumed",{file_name:t.fileName,file_size:t.totalBytesToUpload,bytes_uploaded:t.bytesUploaded,project_id:t.projectId??""});let s=new AbortController;t.abortController=s,this.#e.unpauseUpload(e),this.#d.hasAsset(e)?(this.#d.unpauseAsset(e),this.#T(),this.#O()):this.startUpload({fileReader:t.fileReader,directoryId:t.parentId??"",projectId:t.projectId,groupId:t.groupId,assetId:e,resumeChunked:t.chunkedState,shareContext:t.shareContext})}pauseUploadGroup(e){let t=this.#e.uploadGroups[e];if(!t)return;let s=this.#b;this.#b=!0,this.#e.pauseUploadGroup(e);for(let r of t.assetIds)this.#c=this.#c.filter(i=>i!==r),this.#d.pauseAsset(r);this.#b=s,this.#b||this.#X(e,t,"upload:group_paused"),this.#T()}unpauseUploadGroup(e){this.#e.unpauseUploadGroup(e),this.#T()}cancelUploadGroup(e){let t=this.#e.uploadGroups[e];if(!t)return;let{totalBytes:s,bytesUploaded:r,filesRemaining:i}=this.#Q(t),o=this.#b;this.#b=!0;for(let a of t.assetIds)this.cancelUpload(a);this.#b=o,this.#b||this.#i?.("upload:group_cancelled",{file_count:t.assetIds.length,files_remaining:i,total_bytes:s,bytes_uploaded:r,project_id:t.projectId}),this.#R.delete(e)}resumeUploadGroup(e){let t=this.#e.uploadGroups[e];if(!t)return;this.#b||this.#X(e,t,"upload:group_resumed");let s=this.#b;this.#b=!0,this.#e.unpauseUploadGroup(e);for(let r of t.assetIds){let i=this.#e.getUploadAsset(r);i&&i.status==="paused"&&this.resumeUpload(r)}this.#b=s}retryUploadGroup(e){let t=this.#e.uploadGroups[e];if(t)for(let s of t.assetIds){let r=this.#e.getUploadAsset(s);r&&r.status==="failed"&&this.retryUpload(s)}}setGroupCreatingFolders(e,t){this.#e.updateUploadGroup(e,{isCreatingFolders:t}),this.#T()}addAssetToGroup(e,t){this.#e.addAssetToGroup(e,t)}pauseAllUploads(){let e=this.#W();this.#b=!0;try{for(let t of Object.values(this.#e.uploadAssets))t.groupId||this.pauseUpload(t.assetId);for(let t of Object.values(this.#e.uploadGroups))t.isCreatingFolders||this.pauseUploadGroup(t.id)}finally{this.#b=!1}this.#i?.("upload:all_paused",e),this.#T()}resumeAllUploads(){let e=this.#W();this.#b=!0;try{for(let t of Object.values(this.#e.uploadAssets))!t.groupId&&t.status==="paused"&&this.resumeUpload(t.assetId);for(let t of Object.values(this.#e.uploadGroups))t.isPaused&&this.resumeUploadGroup(t.id)}finally{this.#b=!1}this.#i?.("upload:all_resumed",e),this.#T()}clearAllUploads(){this.#c=[],this.#d.clear(),this.#y.clear(),this.#p.clear(),this.#e.clearAllUploads(),this.#e.uploadGroups={},this.#B&&(this.#N=!0,this.#B.reset(),this.#N=!1),this.#r?.({all:!0}),this.#u?.(this.#z())}clearHistory(){this.#E=[],this.#n?.clear(),this.#S=!0,this.#F.clear(),this.#C=!0,this.#T()}removeHistoryItem(e){this.#E=this.#E.filter(t=>t.groupId!==e),this.#n?.remove(e),this.#F.add(e),this.#C=!0,this.#T()}removeGroup(e){this.#e.removeUploadGroup(e),this.#E=this.#E.filter(t=>t.groupId!==e),this.#n?.remove(e),this.#F.add(e),this.#C=!0,this.#r?.({groupId:e}),this.#u?.(this.#z()),this.#T()}getHttpClient(){return this.#t}setBandwidthLimit(e){this.#m=e,this.#o?.setBandwidthLimitBps(e),this.#C=!0,this.#T()}getBandwidthLimit(){return this.#m}setConflictResolution(e){this.#g=e,this.#o?.setConflictResolution(e),this.#C=!0,this.#T()}getConflictResolution(){return this.#g}getGroupConflictResolution(e){return this.#e.getUploadGroup(e)?.conflictResolution??this.#g}setMaxConcurrency(e){this.#f=e,this.#O()}#J(){return this.#m===null?null:Math.floor(this.#m/Math.max(1,this.#f))}getSnapshot(){return this.#e.updateUploadStats(),{...this.#e.getSerializableSnapshot(),uploadHistory:[...this.#E??[]],uploadSummary:this.#z(),bandwidthLimitBps:this.#m,conflictResolution:this.#g}}getUploadAsset(e){return this.#e.getSerializableAsset(e)}getUploadSummary(){return this.#z()}getGroupAssets(e){return this.#e.getGroupAssets(e)}getUploadGroupStatus(e){return this.#e.getUploadGroupStatus(e)}getUploadGroupProgress(e){return this.#e.getUploadGroupProgress(e)}hasGroupsCreatingFolders(){return this.#e.hasGroupsCreatingFolders()}areAllUploadsPaused(){return this.#e.areAllUploadsPaused()}hasPausedUploads(){return this.#e.hasPausedUploads()}hasActiveUploads(){return ge(this.#e.getSerializableSnapshot().uploadAssets)}getServerAssetIdsToCancel(){return me(this.#e.getSerializableSnapshot().uploadAssets)}async cancelActiveServerUploads(){let e=this.getServerAssetIdsToCancel();if(e.length!==0)try{await this.#t.post("/assets/cancel-uploads",{asset_ids:e})}catch{await this.#t.post("/assets/cancel-uploads",{asset_ids:e})}}destroy(){this.#U=!0,this.#h&&(clearInterval(this.#h),this.#h=null),this.#L&&(clearInterval(this.#L),this.#L=null),this.#c=[],this.#d.clear();for(let e of Object.values(this.#e.uploadAssets))e.abortController.abort(),e.fileReader.close?.()}#G(){this.#w||(this.#w=!0,queueMicrotask(()=>{this.#w=!1,this.#Z()}))}async#Z(){if(!this.#k){for(this.#k=!0;this.#c.length>0&&!(this.#y.size>5);){let e=Math.min(this.#c.length,20-this.#y.size);if(e<=0)break;let t=[],s=[];for(let r=0;r<e&&this.#c.length>0;r++){let i=this.#c[0],o=this.#e.getUploadAsset(i);if(!o||o.status==="cancelled"){this.#c.shift(),r--;continue}if(this.#c.shift(),s.push(i),o.chunkedState)try{this.#ee(i,o),this.#O()}catch(a){G(a)||this.#M(i,a)}else t.push(i)}if(t.length>0){let r=new Map;for(let i of t){let a=this.#e.getUploadAsset(i)?.shareContext?.shareId??"",l=r.get(a);l||(l=[],r.set(a,l)),l.push(i)}for(let i of r.values())try{await this.#te(i)}catch(o){for(let a of i)this.#M(a,o instanceof Error?o:new Error(String(o)))}this.#O()}}this.#k=!1}}#ee(e,t){let s=t.chunkedState,r={serverAssetId:s.assetId,chunkIds:s.chunkIds,chunkSize:s.chunkSize,totalChunks:s.totalChunks,sizeBytes:s.sizeBytes},i=s.completedChunkIndices;this.#y.set(e,r);let o=new Array(r.totalChunks).fill(0);if(i.length>0){for(let l of i){let u=l*r.chunkSize,c=Math.min(u+r.chunkSize,t.totalBytesToUpload);o[l]=c-u}let a=o.reduce((l,u)=>l+u,0);this.#e.updateUploadProgress(e,a)}if(this.#p.set(e,o),r.totalChunks===0||i.length>=r.totalChunks){this.#j(e).catch(a=>{this.#M(e,a)});return}this.#d.registerAsset({assetId:e,totalChunks:r.totalChunks,completedChunkIndices:i})}async#te(e){let t=[],s=[];for(let a of e){let l=this.#e.getUploadAsset(a);if(!l||l.status==="cancelled")continue;let u=N(l.fileName),c=l.groupId?this.#e.getUploadGroup(l.groupId)?.conflictResolution??this.#g:this.#g,d=(()=>{switch(c){case"keep_both":return{auto_rename:"parenthesized"};case"replace":return{conflict_resolution:"replace"};case"skip":return{conflict_resolution:"skip"}}})();t.push({directory_id:l.parentId,id:a,name:u,size_bytes:l.totalBytesToUpload,...d}),s.push(a)}if(t.length===0)return;let r=this.#e.getUploadAsset(s[0]),i=r?.shareContext?v(r.shareContext):void 0,o=await this.#t.post("/assets/chunked/initiate",t,i);for(let a=0;a<s.length;a++){let l=s[a],u=o[a];if(!u||u.error){this.#M(l,new Error(u?.error??"Unknown batch initiation error"));continue}if(u.skipped){let f=this.#e.getUploadAsset(l);f&&(this.#e.adjustSpeedBaselineForSkippedBytes(f.totalBytesToUpload),this.#e.markUploadSuccess(l),this.#e.dirtyHistoryGroupIds.add(f.groupId??""),this.#$(),f.fileReader.close?.());continue}let c=u.result,d=this.#e.getUploadAsset(l);if(!d||d.status==="cancelled"||d.status==="paused"){(!d||d.status==="cancelled")&&(this.#P.push(c.asset_id),this.#K());continue}let h=Math.ceil(d.totalBytesToUpload/c.chunk_size),p=Array.from({length:h},()=>crypto.randomUUID());this.#s.seedToken(c.asset_id,c.token,c.token_expires_at);let g={serverAssetId:c.asset_id,chunkIds:p,chunkSize:c.chunk_size,totalChunks:h,sizeBytes:d.totalBytesToUpload};this.#e.setChunkedState(l,{assetId:g.serverAssetId,chunkIds:g.chunkIds,completedChunkIndices:[],chunkSize:g.chunkSize,totalChunks:g.totalChunks,sizeBytes:g.sizeBytes}),this.#y.set(l,g);let b=new Array(g.totalChunks).fill(0);if(this.#p.set(l,b),g.totalChunks===0){this.#j(l).catch(f=>{this.#M(l,f)});continue}this.#d.registerAsset({assetId:l,totalChunks:g.totalChunks,completedChunkIndices:[]})}}#O(){if(!this.#U)for(;this.#_<this.#f;){let e=this.#d.claimNextChunk();if(!e)break;this.#_++;let{assetId:t,chunkIndex:s}=e;this.#se(t,s).then(r=>{this.#_--,this.#ne(t,s,r),this.#O()}).catch(r=>{if(this.#_--,G(r)){this.#O();return}this.#ie(t,s,r),this.#O()})}}async#se(e,t){let s;for(let r=0;r<3;r++)try{let i=this.#p.get(e);return i&&(i[t]=0,this.#H(e)),await this.#re(e,t)}catch(i){if(G(i))throw i;if(s=i instanceof Error?i:new Error(String(i)),this.#B?.recordError(),this.#oe(e,t,s,r),r===2)throw s;let o=this.#p.get(e);o&&(o[t]=0,this.#H(e));let a=1e3*Math.pow(2,r);await bt(a)}throw s||new Error("Unknown error during chunk upload")}async#re(e,t){let s=this.#e.getUploadAsset(e);if(!s)throw new U;if(s.abortController.signal.aborted)throw new U;let r=this.#y.get(e);if(!r)throw new Error(`No chunk metadata for asset ${e}`);let i=t*r.chunkSize,o=Math.min(i+r.chunkSize,s.totalBytesToUpload),a=await s.fileReader.readChunk(i,o),l=At(a);if(s.abortController.signal.aborted)throw new U;let u=r.chunkIds[t],c=await this.#s.getToken(r.serverAssetId,s.shareContext),d=`/uploads/chunks/${u}`,h=Date.now(),p=await this.#t.putWithToken(d,a,c,{signal:s.abortController.signal,onProgress:f=>{let y=this.#p.get(e);y&&(y[t]=f,this.#H(e))},contentType:"application/octet-stream",getMaxUploadRate:()=>this.#J()}),g=Date.now()-h;if(!p.status||p.status<200||p.status>=300)throw this.#a.error("Chunk upload returned unexpected status",{chunkIndex:t,chunkId:u,assetId:e,serverAssetId:r.serverAssetId,chunkSizeBytes:l,durationMs:g,httpStatus:p.status,statusText:p.statusText,responseBody:p.data,responseHeaders:p.headers}),new Error(`Chunk ${t} upload failed: unexpected status ${p.status}`);let b=this.#p.get(e);return b&&(b[t]=l,this.#H(e)),g}#H(e){let t=this.#p.get(e);if(!t)return;let s=t.reduce((r,i)=>r+i,0);this.#e.updateUploadProgress(e,s)}#ne(e,t,s){if(this.#B){let i=this.#y.get(e);if(i){let o=t*i.chunkSize,l=Math.min(o+i.chunkSize,i.sizeBytes)-o;this.#B.recordSuccess(l,s)}}this.#e.addCompletedChunkIndex(e,t),this.#d.markChunkCompleted(e,t)&&this.#j(e).catch(i=>{this.#M(e,i)})}#ie(e,t,s){this.#M(e,s)}#oe(e,t,s,r){if(!this.#i)return;let i=this.#e.getUploadAsset(e);if(!i)return;let o=this.#y.get(e);if(!o)return;let a=t*o.chunkSize,u=Math.min(a+o.chunkSize,o.sizeBytes)-a,c=s,d=typeof c.code=="string"?c.code:null,h=c.response?.status,p=typeof h=="number"?h:null,g=s.cause?s.cause instanceof Error?s.cause.message:String(s.cause):null;this.#i("upload:chunk_error",{file_name:i.fileName,file_size:i.totalBytesToUpload,chunk_index:t,chunk_size:u,chunks_total:o.totalChunks,attempt:r+1,max_attempts:3,is_final_attempt:r===2,error_type:s.name,error_message:s.message,error_code:d,http_status:p,error_stack:s.stack??null,error_cause:g,project_id:i.projectId??""})}#ae(e,t,s,r){if(!this.#i||G(t))return;let i=t instanceof Error?t.message:"Unknown error",o=t,a=t instanceof Error&&t.cause?t.cause instanceof Error?t.cause.message:String(t.cause):null,l=typeof o.code=="string"?o.code:null,u=o.response?.status,c=typeof u=="number"?u:null,d=this.#y.get(e.assetId);this.#i("upload:file_error",{file_name:e.fileName,file_size:e.totalBytesToUpload,bytes_uploaded:e.bytesUploaded,chunks_completed:e.chunkedState?.completedChunkIndices.length??0,chunks_total:d?.totalChunks??0,attempt:s+1,max_attempts:4,is_final_attempt:r,error_type:t instanceof Error?t.name:"Unknown",error_message:i,error_code:l,http_status:c,error_stack:t instanceof Error?t.stack??null:null,error_cause:a,project_id:e.projectId??""})}async#j(e){let t=this.#e.getUploadAsset(e);if(!t)return;let s=this.#y.get(e);if(!s)return;if(t.abortController.signal.aborted)throw new U;let r=crypto.randomUUID(),i=JSON.stringify(s.chunkIds),o=new TextEncoder().encode(i),a=await this.#s.getToken(s.serverAssetId,t.shareContext),l=`/uploads/manifests/${r}`;try{await this.#t.putWithToken(l,o,a,{signal:t.abortController.signal,contentType:"application/json"})}catch(u){throw this.#a.error("Manifest upload failed",{assetId:e,serverAssetId:s.serverAssetId,manifestId:r},u),u}if(t.abortController.signal.aborted)throw new U;try{let u=t.shareContext?v(t.shareContext):void 0;await this.#t.post(`/assets/${s.serverAssetId}/revisions/commit`,{manifest_id:r,size_bytes:s.sizeBytes,is_initial_upload:!0,client_performed_at:new Date().toISOString()},u)}catch(u){throw this.#a.error("Commit revision failed",{assetId:e,serverAssetId:s.serverAssetId,manifestId:r,sizeBytes:s.sizeBytes},u),u}this.#e.markUploadSuccess(e),this.#e.clearChunkedState(e),this.#$(),this.#T(),this.#y.delete(e),this.#p.delete(e),this.#d.removeAsset(e),await t.fileReader.close?.(),this.#V(e),this.#G(),this.#q()}#M(e,t){let s=this.#e.getUploadAsset(e);if(!s||s.status==="paused"||s.status==="cancelled")return;let r=s.retryCount,i=r>=3||Ct(t);if(this.#ae(s,t,r,i),i){let o=t instanceof Error?t.message:"Unknown error";this.#a.error("Asset upload permanently failed",{assetId:e,fileName:s.fileName,totalRetries:r,bytesUploaded:s.bytesUploaded,totalBytes:s.totalBytesToUpload,chunksCompleted:s.chunkedState?.completedChunkIndices.length??0},t),s.abortController.abort(),this.#e.markUploadFailed(e,o),this.#d.removeAsset(e),this.#y.delete(e),this.#p.delete(e),this.#$(),this.#T(),this.#V(e),this.#G(),this.#q()}else{this.#a.warn("Asset upload failed, scheduling retry",{assetId:e,fileName:s.fileName,retryAttempt:r+1,maxRetries:3},t);let o=s.chunkedState;s.abortController.abort(),this.#d.removeAsset(e),this.#y.delete(e),this.#p.delete(e),this.#e.resetAssetForRetryQueue(e),this.#T(),this.#G();let a=2e3*Math.pow(2,r);setTimeout(()=>{if(this.#U)return;let l=this.#e.getUploadAsset(e);!l||l.status!=="queued"||this.startUpload({fileReader:l.fileReader,directoryId:l.parentId??"",projectId:l.projectId,groupId:l.groupId,assetId:e,resumeChunked:o,shareContext:l.shareContext})},a)}}#q(){this.#B&&(this.hasActiveUploads()||(this.#N=!0,this.#B.reset(),this.#N=!1))}#K(){this.#I||(this.#I=!0,queueMicrotask(()=>{this.#I=!1;let e=this.#P.splice(0);e.length!==0&&this.#t.post("/assets/cancel-uploads",{asset_ids:e}).catch(t=>{this.#a.error("Failed to batch abort uploads",{assetIds:e},t)})}))}#z(){return L(this.#e.getSerializableSnapshot().uploadAssets)}#T(){this.#v||(this.#v=!0,queueMicrotask(()=>{this.#v=!1,this.#ue()}))}#le(){this.#Y(!0)}#ue(){this.#Y(!1)}#Y(e){if(this.#U||!this.#l&&!this.#u)return;e?this.#e.updateUploadStats():(this.#D++,this.#D%3===0&&this.#e.updateUploadStats());let t=this.#e.getDirtyDelta();if(!this.#C&&Object.keys(t.assets).length===0&&Object.keys(t.groups).length===0&&this.#e.dirtyHistoryGroupIds.size===0)return;this.#C=!1,this.#e.dirtyHistoryGroupIds.size>0&&this.#$();let r=this.#e.dirtyHistoryGroupIds.size>0?this.#de():void 0,i=this.#S?!0:void 0,o=this.#F.size>0?[...this.#F]:void 0;this.#S=!1,this.#F.clear();let a=this.#z(),l={assets:t.assets,groups:t.groups,uploadStats:{...this.#e.uploadStats},uploadSpeedState:this.#e.uploadSpeedState,historyItems:r,removedHistoryGroupIds:o,historyCleared:i,uploadSummary:a,bandwidthLimitBps:this.#m,conflictResolution:this.#g};this.#e.clearDirtyFlags(),this.#l?.(l),this.#u?.(a)}#Q(e){let t=0,s=0,r=0;for(let i of e.assetIds){let o=this.#e.getUploadAsset(i);o&&(t+=o.totalBytesToUpload,s+=o.bytesUploaded,o.status!=="success"&&o.status!=="failed"&&o.status!=="cancelled"&&r++)}return{totalBytes:t,bytesUploaded:s,filesRemaining:r}}#W(){let e=0,t=0,s=0,r=0;for(let i of Object.values(this.#e.uploadGroups)){e++;for(let o of i.assetIds){let a=this.#e.getUploadAsset(o);a&&(a.status==="success"||a.status==="failed"||a.status==="cancelled"||(t++,s+=a.totalBytesToUpload,r+=a.bytesUploaded))}}return{group_count:e,file_count:t,total_bytes:s,bytes_uploaded:r}}#ce(){if(!(!this.#i||this.#U))for(let e of Object.values(this.#e.uploadGroups)){let t=!1,s=0,r=0,i=0,o=0,a=0,l=0,u=0,c=0,d=0,h=0;for(let b of e.assetIds){let f=this.#e.getUploadAsset(b);if(!f)continue;let y=f.totalBytesToUpload;switch(s+=y,r+=f.bytesUploaded,f.status){case"success":i++,o+=y;break;case"failed":a++,l+=y;break;case"cancelled":u++,c+=y;break;case"in-progress":d++,t=!0;break;case"queued":h++,t=!0;break;case"paused":t=!0;break}}if(!t)continue;let p=this.#R.get(e.id),g=p?Date.now()-p:0;this.#i("upload:group_progress",{group_id:e.id,file_count:e.assetIds.length,total_bytes:s,bytes_uploaded:r,duration_ms:g,project_id:e.projectId,succeeded_count:i,succeeded_bytes:o,failed_count:a,failed_bytes:l,cancelled_count:u,cancelled_bytes:c,in_progress_count:d,queued_count:h,progress:s>0?r/s:0,concurrency:this.#f,upload_speed_mbps:this.#e.uploadStats.uploadSpeedMbps})}}#X(e,t,s){if(!this.#i)return;let{totalBytes:r,bytesUploaded:i}=this.#Q(t);this.#i(s,{file_count:t.fileCount,total_bytes:r,bytes_uploaded:i,project_id:t.projectId})}#V(e){if(!this.#i)return;let t=this.#e.getUploadAsset(e);if(!t?.groupId)return;let s=this.#e.uploadGroups[t.groupId];if(!s)return;let r=!0,i=0,o=0,a=0,l=0,u=0,c=0,d=0;for(let g of s.assetIds){let b=this.#e.getUploadAsset(g);if(!b)continue;let f=b.totalBytesToUpload;if(d+=f,b.status==="success")i++,o+=f;else if(b.status==="failed")a++,l+=f;else if(b.status==="cancelled")u++,c+=f;else{r=!1;break}}if(!r)return;let h=this.#R.get(s.id),p=h?Date.now()-h:0;this.#i("upload:group_completed",{file_count:s.assetIds.length,total_bytes:d,duration_ms:p,project_id:s.projectId,succeeded_count:i,succeeded_bytes:o,failed_count:a,failed_bytes:l,cancelled_count:u,cancelled_bytes:c}),this.#R.delete(s.id)}#de(){let e={};for(let t of this.#e.dirtyHistoryGroupIds){let s=this.#e.buildHistoryItem(t);s&&(e[t]=s)}return e}#$(){if(!this.#n)return;let e={};for(let t of this.#e.dirtyHistoryGroupIds){let s=this.#e.buildHistoryItem(t);if(s){e[t]=s;let r=this.#E.findIndex(i=>i.groupId===t);r>=0?this.#E[r]=s:this.#E.unshift(s)}}Object.keys(e).length>0&&this.#n.merge(e)}};var $=class{#t=65536;#s=0;async*createIterator(e,t,s){let r=0,i=Math.max(65536,Math.min(e.byteLength,this.#t)),o=this.#s;for(;r<e.byteLength;){if(s?.aborted)return;let a=Math.min(r+i,e.byteLength),l=e.subarray(r,a),u=l.byteLength,c=performance.now();yield l;let d=performance.now()-c;r=a;let h=t();if(h!==null&&h>0){let p=Math.round(h*50/1e3);if(i=Math.max(65536,Math.min(e.byteLength,p)),r<e.byteLength){let b=u/h*1e3-d;b>1&&await new Promise(f=>setTimeout(f,b))}}else{if(d>=.5){let p=u/d*1e3;o=o===0?p:o*(1-.3)+p*.3}else o===0&&(i=Math.min(e.byteLength,i*2));if(o>0){let p=Math.round(o*50/1e3);i=Math.max(65536,Math.min(e.byteLength,p))}}this.#t=i,this.#s=o}}};function A(n){let e=n.replace(/\\/g,"/");if(e.split("/").some(i=>i===".."))throw new Error(`Remote path cannot contain parent directory segments: ${n}`);let r=P.posix.normalize(e).replace(/^\/+/,"");if(r===""||r===".")throw new Error(`Remote path must resolve to a file path: ${n}`);return r}function Be(n){let e=new Map;for(let i of n){let o=A(i.targetPath??i.path);e.set(o,(e.get(o)??0)+1)}let t=new Set,s=[],r=[];for(let i of n){let o=A(i.path),a=A(i.targetPath??i.path),l=H(a),u=Ae(l,t),c=(e.get(a)??0)>1,d=u!==o;t.add(u),s.push({...i,targetPath:u,requiresIdentityDownload:i.requiresIdentityDownload===!0||c}),(d||c)&&r.push({sourcePath:i.path,targetPath:u,reason:c||u!==l?"duplicate":"sanitized"})}return{files:s,changes:r}}function w(n){return A(n.targetPath??n.path)}function Le(n,e){let t=w(n);return{relativePath:t,absolutePath:P.join(e,t),fileName:P.posix.basename(t),size:n.size}}function H(n){return n.split("/").map(t=>N(t)).join("/")}function Ae(n,e){if(!e.has(n))return n;let t=P.posix.dirname(n),s=P.posix.basename(n),r=P.posix.extname(s),i=r.length>0?s.slice(0,-r.length):s,o=2;for(;;){let a=`${i} (${o})${r}`,l=t==="."?a:`${t}/${a}`;if(!e.has(l))return l;o+=1}}function Ee(n,e){if(!e.has(n))return n;let t=P.posix.dirname(n),s=P.posix.basename(n),r=2;for(;;){let i=`${s} ${r}`,o=t==="."?i:`${t}/${i}`;if(!e.has(o))return o;r+=1}}var R=class extends Error{constructor(t,s){super(t);this.stderr=s;this.name="RcloneError"}stderr};function Et(n){let e=["sync",n.remoteSource,n.localPath];return n.batchFilePath&&e.push("--files-from",n.batchFilePath),e.push("--progress","--stats","1s","--stats-one-line","-v","--transfers",String(n.rcloneOptions.transfers),"--checkers",String(n.rcloneOptions.checkers),"--multi-thread-streams",String(n.rcloneOptions.multiThreadStreams),"--multi-thread-chunk-size",n.rcloneOptions.multiThreadChunkSize,"--multi-thread-cutoff",n.rcloneOptions.multiThreadCutoff,"--fast-list","--buffer-size",n.rcloneOptions.bufferSize),n.rcloneOptions.useMmap&&e.push("--use-mmap"),n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function Rt(n){let e=["lsjson",n.remoteSource,"--recursive","--fast-list"];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function Tt(n){let e=["backend","query",`${n.remote}:`,n.query];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function Ut(n){let e=["copyto",n.remoteFileSource,n.localTargetPath,"--progress","--stats","1s","--stats-one-line","-v","--multi-thread-streams",String(n.rcloneOptions.multiThreadStreams),"--multi-thread-chunk-size",n.rcloneOptions.multiThreadChunkSize,"--multi-thread-cutoff",n.rcloneOptions.multiThreadCutoff,"--buffer-size",n.rcloneOptions.bufferSize];return n.rcloneOptions.useMmap&&e.push("--use-mmap"),n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function Pt(n){let e=["backend","copyid",`${n.remote}:`,n.fileId,n.localTargetPath];return n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function D(n,e){let t=e.trim(),s={B:1,k:1024,Ki:1024,KiB:1024,kB:1e3,M:1024*1024,Mi:1024*1024,MiB:1024*1024,MB:1e3*1e3,G:1024*1024*1024,Gi:1024*1024*1024,GiB:1024*1024*1024,GB:1e3*1e3*1e3,T:1024*1024*1024*1024,Ti:1024*1024*1024*1024,TiB:1024*1024*1024*1024,TB:1e3*1e3*1e3*1e3};return n*(s[t]||1)}function Oe(n){let e=0,t=n.match(/(\d+)h/),s=n.match(/(\d+)m/),r=n.match(/(\d+)s/);return t&&(e+=parseInt(t[1],10)*3600),s&&(e+=parseInt(s[1],10)*60),r&&(e+=parseInt(r[1],10)),e}function Ft(n){let e=n.trim(),t=/^([\d.]+)\s*([A-Za-z]+)\s*\/\s*([\d.]+)\s*([A-Za-z]+),\s*([\d.]+)%?,\s*([\d.]+)\s*([A-Za-z]+)\/s,\s*ETA\s+(.+)$/,s=e.match(t);if(s){let a=s[8].trim();return{bytesTransferred:D(parseFloat(s[1]),s[2]),totalBytes:D(parseFloat(s[3]),s[4]),percentComplete:parseFloat(s[5]),speed:D(parseFloat(s[6]),s[7]),eta:a==="-"?0:Oe(a)}}let r=e.match(/Transferred:\s+([\d.]+)\s*([A-Za-z]+)\s*\/\s*([\d.]+)\s*([A-Za-z]+),\s*([\d.]+)%/);if(!r)return null;let i=e.match(/([\d.]+)\s*([A-Za-z]+)\/s/),o=e.match(/ETA\s+([^\s]+)$/);return{bytesTransferred:D(parseFloat(r[1]),r[2]),totalBytes:D(parseFloat(r[3]),r[4]),percentComplete:parseFloat(r[5]),speed:i?D(parseFloat(i[1]),i[2]):0,eta:o&&o[1]!=="-"?Oe(o[1]):0}}function Re(n){return new Promise((e,t)=>{let s=te("rclone",n.args,{stdio:["ignore","pipe","pipe"]}),r="",i=0,o=a=>{for(let l of a.split(`
|
|
3
|
+
`)){if(l.trim().length===0)continue;let u=Ft(l);if(!u)continue;let c=Date.now();!(u.percentComplete>=100)&&c-i<500||(i=c,n.onProgress?.(u))}};s.stdout.on("data",a=>{o(a.toString())}),s.stderr.on("data",a=>{let l=a.toString();r+=l,o(l)}),s.on("close",async a=>{a===0?e():t(new R(`rclone exited with code ${a}`,r))}),s.on("error",a=>{t(new R(`Failed to start rclone: ${a.message}`,""))})})}async function Ue(){return new Promise((n,e)=>{let t=te("rclone",["version"]);t.on("error",()=>{e(new Error("rclone is not installed or not in PATH. Please install rclone first: https://rclone.org/install/"))}),t.on("close",s=>{s===0?n():e(new Error("rclone is not installed or not in PATH. Please install rclone first: https://rclone.org/install/"))})})}async function It(n,e,t,s,r,i){let o=`${n}:${e}`;return Re({args:Et({remoteSource:o,localPath:t,rcloneOptions:r,batchFilePath:s}),remoteSource:o,onProgress:i})}async function se(n,e,t=[]){let s=`${n}:${e}`;return new Promise((r,i)=>{let o=te("rclone",Rt({remoteSource:s,extraArgs:t})),a="",l="";o.stdout.on("data",u=>{a+=u.toString()}),o.stderr.on("data",u=>{l+=u.toString()}),o.on("close",async u=>{if(u===0)try{let c=JSON.parse(a||"[]");if(!Array.isArray(c))throw new Error("rclone lsjson did not return an array");let d=vt(c),h=await kt({remote:n,files:d.files,directories:d.directories,extraArgs:t});r(h)}catch(c){i(new R(`Failed to parse file listing from ${s}: ${c instanceof Error?c.message:String(c)}`,l))}else i(new R(`Failed to list files from ${s}`,l))}),o.on("error",u=>{i(new R(`Failed to start rclone: ${u.message}`,""))})})}async function Me(n){let e=[],t=[];for(let s of n.files)Lt(s)?t.push(s):e.push(s);e.length>0&&(await Te.promises.writeFile(n.batchFilePath,`${e.map(s=>s.path).join(`
|
|
4
4
|
`)}
|
|
5
|
-
`,"utf-8"),await
|
|
6
|
-
`))}#y(e,t){let s=[`${g.green(f(t.bytesTransferred))} / ${g.gray(f(t.totalBytes))}`,g.cyan(`${t.percentComplete.toFixed(1)}%`),g.magenta(Ge(t.speed)??"..."),`${g.yellow("ETA")}: ${g.yellow($(t.eta)??"...")}`];return`${g.blue(e)}: ${s.join(" | ")}`}#f(){let e=this.#d();return[this.#R(e),this.#C(e)]}#x(e){let t=[];for(let s=1;s<e.currentBatch;s++){let r=this.#i.get(s);r&&t.push(r)}return t.push(this.#g(e)),t.push(this.#P(e)),t}#g(e){let t=`Batch ${e.currentBatch}/${e.totalBatches}`;switch(e.currentPhase){case"downloading":return this.#o?`${t}: ${this.#y("Downloading",this.#o)}`:`${t}: ${g.blue("Downloading...")}`;case"scanning":return`${t}: ${g.yellow(e.extraDetails??"Scanning...")}`;case"syncing_folders":return`${t}: ${g.yellow(e.extraDetails??"Syncing folders...")}`;case"uploading":return this.#D(t,e);case"cleaning":return`${t}: ${g.yellow("Cleaning...")}`;case"complete":return`${t}: ${g.green("Complete")} (${e.batchFilesTotal} files, ${f(e.batchBytesTotal)}${e.extraDetails?`, ${e.extraDetails}`:""})`}}#D(e,t){let s=this.#d(),r=s.successFileCount+s.failedFileCount+s.cancelledFileCount,i=Math.max(t.batchFilesTotal-t.batchFilesSkipped,0),o=Math.max(t.batchBytesTotal-t.batchBytesSkipped,0),a=o>0?(s.uploadedBytes/o*100).toFixed(1):"0.0",l=this.#S(t,s,o),u=l?.formattedSpeed??null,c=l?.formattedTime??null,d=u&&c?`, ${u}, ETA: ${c}`:"",p=t.batchFilesSkipped>0?`, ${g.yellow(`Skipped: ${t.batchFilesSkipped} files / ${f(t.batchBytesSkipped)}`)}`:"",h=o>0&&s.uploadedBytes>=o&&r<i?"Finalizing":"Uploading";return`${e}: ${g.blue(h)} (${r}/${i} files, ${f(s.uploadedBytes)} / ${f(o)}, ${a}%${d}${p})`}#P(e){let t=this.#d(),s=e.batchFilesSkipped+t.successFileCount+t.failedFileCount+t.cancelledFileCount,r=e.batchBytesSkipped+t.uploadedBytes,i=e.overallFilesCompleted+s,o=e.overallBytesCompleted+r,a=Math.max(e.overallBytesTotal-o,0),l=this.#A(e),u=this.#v(e,t),c=l!==null&&u!==null?l+u:null;return[`Total: ${i}/${e.overallFilesTotal} files`,`${f(o)} / ${f(e.overallBytesTotal)}`,g.yellow(`${f(a)} remaining`),`Download ETA: ${$(l)??"..."}`,`Upload ETA: ${$(u)??"..."}`,`Total ETA: ${$(c)??"..."}`].join(", ")}#A(e){let t=e.overallBytesCompleted+e.batchBytesSkipped+(this.#o?.bytesTransferred??0),s=Math.max(e.overallBytesTotal-t,0);if(s===0)return e.currentPhase==="downloading"&&this.#o?(this.#a=this.#o.eta,this.#o.eta):(this.#a=0,0);if(this.#o&&this.#o.speed>0){let r=Math.ceil(s/this.#o.speed);return this.#a=r,r}return this.#a}#v(e,t){let s=e.overallBytesCompleted+e.batchBytesSkipped+t.uploadedBytes,r=Math.max(e.overallBytesTotal-s,0),i=Math.max(e.batchBytesTotal-e.batchBytesSkipped,0),o=this.#S(e,t,i);if(r===0)return e.currentPhase==="uploading"&&o?(this.#l=o.timeRemainingSeconds,o.timeRemainingSeconds):(this.#l=0,0);if(o&&o.uploadSpeedMbps>0){let a=o.uploadSpeedMbps*1024*1024/8,l=Math.ceil(r/a);return this.#l=l,l}return this.#l}#S(e,t,s){let r=this.#e?.uploadStats,i=s>0&&t.uploadedBytes>=s;return r&&r.uploadSpeedMbps>0&&r.formattedSpeed!=="Calculating..."&&!i?(this.#u={uploadSpeedMbps:r.uploadSpeedMbps,formattedSpeed:r.formattedSpeed,formattedTime:r.formattedTime,timeRemainingSeconds:r.timeRemainingSeconds},this.#u):e.currentPhase==="uploading"&&i&&this.#u?this.#u:r?{uploadSpeedMbps:r.uploadSpeedMbps,formattedSpeed:r.formattedSpeed,formattedTime:r.formattedTime,timeRemainingSeconds:r.timeRemainingSeconds}:null}#R(e){return[`Total: ${e.totalFileCount}`,g.green(`Success: ${e.successFileCount}`),g.red(`Failed: ${e.failedFileCount}`),g.red(`Cancelled: ${e.cancelledFileCount}`),g.blue(`Active: ${e.activeFileCount}`),g.gray(`Queued: ${e.queuedFileCount}`)].join(" | ")}#C(e){let t=Math.max(e.totalBytes-e.uploadedBytes,0),s=this.#e?` | ${g.cyan(`Speed: ${this.#e.uploadStats.formattedSpeed}`)} | ${g.magenta(`Time remaining: ${this.#e.uploadStats.formattedTime}`)}`:"";return[`Total: ${f(e.totalBytes)}`,g.green(`Uploaded: ${f(e.uploadedBytes)}`),g.yellow(`Remaining: ${f(t)}`)].join(" | ")+s}#d(){return this.#e?Object.values(this.#e.uploadAssets).reduce((t,s)=>{switch(t.totalFileCount+=1,t.totalBytes+=s.totalBytesToUpload,t.uploadedBytes+=s.status==="success"?s.totalBytesToUpload:s.bytesUploaded,s.status){case"success":t.successFileCount+=1;break;case"failed":t.failedFileCount+=1;break;case"cancelled":t.cancelledFileCount+=1;break;case"in-progress":t.activeFileCount+=1;break;default:t.queuedFileCount+=1;break}return t},{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}):{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}}},C=new Te;import{Readable as Mt}from"node:stream";import He from"axios";var P=class{#t;#s;#e;#n;#o=new G;#i=new Set;constructor(e){this.#t=He.create({baseURL:e.apiUrl}),this.#s=He.create({baseURL:e.edgeWorkerUrl}),this.#e=e.apiKey,this.#n=e.sessionId}get skippedAssetIds(){return this.#i}async post(e,t,s){let r=await this.#t.post(e,t,{headers:{Authorization:`Bearer ${this.#e}`,"X-Aspect-Session-Id":this.#n,"Content-Type":"application/json",...s}});return this.#l(e,t,r.data),r.data}async get(e,t){return(await this.#t.get(e,{headers:{Authorization:`Bearer ${this.#e}`,"X-Aspect-Session-Id":this.#n,...t}})).data}async delete(e,t){await this.#t.delete(e,{headers:{Authorization:`Bearer ${this.#e}`,"X-Aspect-Session-Id":this.#n,...t}})}async putWithToken(e,t,s,r){let i=await this.#a(t),o=this.#o.createIterator(i,r.getMaxUploadRate??(()=>null),r.signal),a=Mt.from(o,{highWaterMark:1}),l=await this.#s.put(e,a,{timeout:0,signal:r.signal,headers:{"Content-Type":r.contentType??"","Content-Length":i.byteLength.toString(),Authorization:`Bearer ${s}`},transformRequest:[u=>u],maxRedirects:0,onUploadProgress:u=>r.onProgress?.(u.loaded)});return{status:l.status,statusText:l.statusText,headers:Object.fromEntries(Object.entries(l.headers)),data:l.data,raw:l}}async#a(e){if(e instanceof Uint8Array)return e;let t=await e.arrayBuffer();return new Uint8Array(t)}#l(e,t,s){if(e!=="/assets/chunked/initiate"||!Array.isArray(t)||!Array.isArray(s))return;let r=t;s.forEach((o,a)=>{let l=r[a];o.skipped===!0&&typeof l?.id=="string"&&this.#i.add(l.id)})}};import j from"node:path";var $e=500,Nt=8,ee=class{#t;#s;#e=new Map;constructor(e){this.#t=e.rootDirectoryId,this.#s=e.httpClient}async ensureDirectories(e){await this.loadExistingDirectories();let t=this.#n(e);for(let s of t){if(this.#e.has(s))continue;let r=j.posix.dirname(s),i=j.posix.basename(s),o=r==="."?this.#t:this.#e.get(r);if(!o)throw new Error(`Parent directory ID not found for path: ${s}`);let a=await this.#r(o,i);if(a.name!==i)throw new Error(`Server created renamed directory "${a.name}" for planned path "${s}". Refusing to map uploads to an unexpected target path.`);this.#e.set(s,a.id)}return e.map(s=>({file:s,directoryId:this.getDirectoryIdForFile(s.relativePath)}))}async loadExistingDirectories(){let e=await this.#o(this.#t);this.#e.clear(),this.#l(e,"")}getDirectoryIdForFile(e){let t=b(e),s=j.posix.dirname(t);if(s===".")return this.#t;let r=this.#e.get(s);if(!r)throw new Error(`Directory ID not found for path: ${s}`);return r}getExistingDirectoryIdForFile(e){let t=b(e),s=j.posix.dirname(t);return s==="."?this.#t:this.#e.get(s)??null}async checkAssetsExistence(e,t=!0){if(e.length===0)return[];let s=[];for(let r=0;r<e.length;r+=$e){let i=e.slice(r,r+$e),o=await this.#s.post("/assets/check-exists-and-uploaded",{items:i,delete_if_not_exist:t});s.push(...o.items)}return s}async listFilesInSubtree(e={}){let t=[{id:this.#t,relativePath:""}],s=[],r=0;for(;r<t.length;){let i=t.slice(r,r+Nt),o=await Promise.all(i.map(a=>this.#i(a)));r+=i.length;for(let a of o)t.push(...a.directories),s.push(...a.files);e.onProgress?.({scannedDirectoryCount:r,queuedDirectoryCount:t.length,fileCount:s.length})}return s}#n(e){let t=new Set;for(let s of e){let r=b(s.relativePath),i=j.posix.dirname(r);if(i===".")continue;let o=i.split("/");for(let a=0;a<o.length;a++)t.add(o.slice(0,a+1).join("/"))}return Array.from(t).sort((s,r)=>s.split("/").length-r.split("/").length)}async#o(e){return this.#s.get(`/directories/${e}/tree`)}async#i(e){let[t,s]=await Promise.all([this.#s.post("/fs/list/directories",{parent_id:e.id}),this.#s.post("/fs/list/assets",{parent_id:e.id})]);return{directories:t.map(r=>({id:r.id,relativePath:this.#a(e.relativePath,r.name)})),files:s.map(r=>({assetId:r.id,relativePath:this.#a(e.relativePath,r.name),sizeBytes:r.size_bytes,isUploaded:r.is_uploaded}))}}#a(e,t){let s=e===""?t:`${e}/${t}`;return b(s)}#l(e,t){let s=t===""?"":t==="."?e.name:`${t}/${e.name}`;s!==""&&this.#e.set(s,e.id);for(let r of e.children){let i=t===""?".":s;this.#l(r,i)}}async#r(e,t){return this.#s.post(`/directories/${e}/directories`,{name:t,auto_rename:"numeric"})}};import{PostHog as Gt}from"posthog-node";var I=null,te="",Re={};function je(n){I||n.config.analytics.disabled||!n.config.analytics.posthogKey||(te=n.user.id,Re={service:"data-sync",package_version:n.packageVersion,platform:process.platform,arch:process.arch,node_version:process.version,max_concurrent:n.config.maxConcurrent,batch_mode:n.config.batchSizeBytes!==void 0,batch_size_bytes:n.config.batchSizeBytes??null,rclone_transfers:n.config.rcloneOptions.transfers,rclone_multi_thread_streams:n.config.rcloneOptions.multiThreadStreams},I=new Gt(n.config.analytics.posthogKey,{host:n.config.analytics.posthogHost}),I.identify({distinctId:te,properties:{user_id:n.user.id,email:n.user.email,first_name:n.user.first_name,last_name:n.user.last_name,utm_source_latest:null,utm_medium_latest:null,utm_campaign_latest:null,utm_content_latest:null}}))}function qe(n,e){I&&I.capture({distinctId:te,event:n,properties:{...Re,...e}})}async function We(){let n=I;if(zt(),!!n)try{await n.flush()}catch{}}function zt(){I=null,te="",Re={}}import*as re from"fs/promises";import*as ne from"path";var Ht={".mp4":"video/mp4",".mov":"video/quicktime",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".webm":"video/webm",".wmv":"video/x-ms-wmv",".flv":"video/x-flv",".m4v":"video/x-m4v",".mpg":"video/mpeg",".mpeg":"video/mpeg",".3gp":"video/3gpp",".ts":"video/mp2t",".mts":"video/mp2t",".mxf":"application/mxf",".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".tiff":"image/tiff",".tif":"image/tiff",".svg":"image/svg+xml",".heic":"image/heic",".heif":"image/heif",".avif":"image/avif",".mp3":"audio/mpeg",".wav":"audio/wav",".aac":"audio/aac",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".wma":"audio/x-ms-wma",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".rtf":"application/rtf",".json":"application/json",".xml":"application/xml"};function $t(n){let e=ne.extname(n).toLowerCase();return Ht[e]??""}var se=class n{#t;#s=null;#e=null;#n=!1;#o;#i;#a;constructor(e,t,s,r){this.#t=e,this.#o=t,this.#i=s,this.#a=r}static async create(e){let t=await re.stat(e),s=ne.basename(e),r=$t(s);return new n(e,t.size,s,r)}get name(){return this.#i}get size(){return this.#o}get type(){return this.#a}async readChunk(e,t){if(!this.#s){this.#e||(this.#e=re.open(this.#t,"r"));let i=await this.#e;if(this.#e=null,this.#n)return Buffer.alloc(0);this.#s=i}let s=t-e,r=Buffer.alloc(s);return await this.#s.read(r,0,s,e),r}async close(){this.#n=!0;let e=this.#e;await this.#s?.close(),this.#s=null,e&&await(await e.catch(()=>null))?.close(),this.#e=null}};var jt=new Set(["success","failed","cancelled"]),Ke=1e3,qt=4*1024*1024,ie=class{#t;#s;#e;#n;#o;constructor(e){this.#t=e.config,this.#s=e.httpClient??new P({apiUrl:e.config.apiUrl,apiKey:e.config.apiKey,edgeWorkerUrl:e.config.edgeWorkerUrl,sessionId:e.config.sessionName}),this.#e=e.createFileReader??(t=>se.create(t)),this.#n=e.onSnapshot,this.#o=e.analytics}async uploadFiles(e){let t=e.filter(o=>o.preSkipped===!0),s=e.filter(o=>o.preSkipped!==!0);if(s.length===0)return{totalFileCount:e.length,successFileCount:0,skippedFileCount:t.length,failedFileCount:0,cancelledFileCount:0,failedFiles:[]};let r=new N({httpClient:this.#s,maxConcurrency:this.#t.maxConcurrent,deltaIntervalMs:Ke,adaptiveConcurrency:!1,analytics:this.#o}),i=[];try{let o=r.startGroupUpload({name:`${s.length} files`,type:"files",fileCount:s.length,folderCount:0,topLevelFileCount:s.length,topLevelFolderCount:0,rootDirectoryId:this.#t.directoryId,projectId:this.#t.projectId,totalBytes:s.reduce((l,u)=>l+u.file.size,0),conflictResolutionOverride:"skip"});for(let l of s){let u=await this.#e(l.file.absolutePath),c=r.startUpload({fileReader:u,directoryId:l.directoryId,projectId:this.#t.projectId,groupId:o,chunkSize:qt});r.addAssetToGroup(o,c),i.push({assetId:c,file:l.file,fileReader:u})}await this.#i(r);let a=r.getSnapshot();return this.#n?.(a),this.#a({snapshot:a,startedUploads:i,preSkippedCount:t.length})}finally{r.destroy()}}async#i(e){let s=Date.now();for(;Date.now()-s<864e5;){let r=e.getSnapshot();this.#n?.(r);let i=Object.values(r.uploadAssets);if(i.length>0&&i.every(o=>jt.has(o.status)))return;await new Promise(o=>setTimeout(o,Ke))}throw new Error("Timed out waiting for upload session to finish")}#a(e){let t=[],s=0,r=0,i=0,o=0;for(let a of e.startedUploads){let l=e.snapshot.uploadAssets[a.assetId];if(!l){i+=1,t.push({fileName:a.file.fileName,relativePath:a.file.relativePath,errorMessage:"Upload state missing from upload engine"});continue}if(l.status==="success"){this.#s.skippedAssetIds.has(a.assetId)?r+=1:s+=1;continue}l.status==="cancelled"?o+=1:i+=1,t.push({fileName:a.file.fileName,relativePath:a.file.relativePath,errorMessage:l.errorMessage})}return{totalFileCount:e.startedUploads.length+e.preSkippedCount,successFileCount:s,skippedFileCount:e.preSkippedCount+r,failedFileCount:i,cancelledFileCount:o,failedFiles:t}}};var oe=200,ae=class{#t;#s;#e;#n;constructor(e,t){this.#t=e,this.#s=t??new P({apiUrl:e.apiUrl,apiKey:e.apiKey,edgeWorkerUrl:e.edgeWorkerUrl,sessionId:e.sessionName}),this.#e=new ee({rootDirectoryId:e.directoryId,httpClient:this.#s}),this.#n=new ie({config:e,httpClient:this.#s,onSnapshot:s=>C.updateSnapshot(s),analytics:qe})}async run(){this.#P("Starting data sync..."),await this.#u(),console.log("Listing all remote files...");let e=await Z(this.#t.remote,this.#t.remotePath,this.#t.rcloneOptions.extraRcloneArgs??[]);console.log(`Found ${e.length} files`),console.log(`Total size: ${f(this.#p(e))}`),console.log("");let t=this.#l(e);if(t.length===0){console.log("No files to sync. Exiting."),await this.#y();return}let s={totalFileCount:0,successFileCount:0,skippedFileCount:0,failedFileCount:0,cancelledFileCount:0,completedByteCount:0},r=[],i={batchNumber:1,files:t,totalSize:this.#p(t)};C.start();try{let a=await this.#r({batch:i,totalBatches:1,overallFilesTotal:t.length,overallBytesTotal:i.totalSize,completedTotals:s,batchDir:this.#t.localTempDir});this.#k(s,r,a,i.totalSize)}finally{C.stop()}let o={...s,failedFiles:r};this.#A({summary:o}),await this.#f(o),this.#h(o)}async runBatched(){if(!this.#t.batchSizeBytes)throw new Error("Batch size not configured. Use batchSizeBytes in config.");this.#P("Starting batched data sync...",[`Batch size: ${f(this.#t.batchSizeBytes)}`,`Max concurrent chunks: ${this.#t.maxConcurrent}`]),await this.#u(),console.log("Listing all remote files...");let e=await Z(this.#t.remote,this.#t.remotePath,this.#t.rcloneOptions.extraRcloneArgs??[]);console.log(`Found ${e.length} files`),console.log(`Total size: ${f(this.#p(e))}`),console.log("");let t=this.#l(e);if(t.length===0){console.log("No files to sync. Exiting."),await this.#y();return}let s=Me(t,this.#t.batchSizeBytes);await this.#D(s);let r={totalFileCount:0,successFileCount:0,skippedFileCount:0,failedFileCount:0,cancelledFileCount:0,completedByteCount:0},i=[],o=this.#p(t);C.start();try{for(let l of s){let u=await this.#r({batch:l,totalBatches:s.length,overallFilesTotal:t.length,overallBytesTotal:o,completedTotals:r});this.#k(r,i,u,l.totalSize)}}finally{C.stop()}this.#A({summary:{...r,failedFiles:i},extraLines:[`Batches: ${s.length}`]});let a={...r,failedFiles:i};await this.#f(a),this.#h(a)}async runCheckOnly(){console.log("Running in check-only mode (no downloads/uploads)..."),await Ee(),console.log(`Listing remote files from ${this.#t.remote}:${this.#t.remotePath}...`);let e=await Z(this.#t.remote,this.#t.remotePath,this.#t.rcloneOptions.extraRcloneArgs??[]);console.log(`Found ${e.length} remote files to check`);let t=this.#l(e);if(t.length===0){console.log("No remote files to check. Exiting.");return}console.log("Fetching existing Aspect files...");let s=await this.#e.listFilesInSubtree({onProgress:i=>this.#v(i)}),r=this.#o(t,s);this.#S(r)}#o(e,t){let s=e.map(h=>({relativePath:k(h),sizeBytes:h.size})),r=t.filter(h=>h.isUploaded),i=t.filter(h=>!h.isUploaded),o=this.#i(s),a=this.#a(r),l=new Set([...o.keys(),...a.keys()]),u=0,c=[],d=[],p=[];for(let h of l){let y=o.get(h)??[],S=a.get(h)??[],m=new Set,A=[];for(let E of y){let v=S.findIndex((x,le)=>!m.has(le)&&x.sizeBytes===E.sizeBytes);v>=0?(u+=1,m.add(v)):A.push(E)}for(let E of A){let v=S.findIndex((x,le)=>!m.has(le));if(v>=0){let x=S[v];m.add(v),d.push({relativePath:h,remoteSizeBytes:E.sizeBytes,serverSizeBytes:x.sizeBytes,assetId:x.assetId})}else c.push(E)}for(let E=0;E<S.length;E++)m.has(E)||p.push(S[E])}return{totalRemoteCount:e.length,totalServerCount:t.length,uploadedServerCount:r.length,existingCount:u,missingFiles:c,sizeMismatches:d,extraUploadedFiles:p,incompleteServerFiles:i}}#i(e){let t=new Map;for(let s of e){let r=b(s.relativePath),i=t.get(r)??[];i.push({...s,relativePath:r}),t.set(r,i)}return t}#a(e){let t=new Map;for(let s of e){let r=b(s.relativePath),i=t.get(r)??[];i.push({...s,relativePath:r}),t.set(r,i)}return t}#l(e){let t=xe(e);if(t.changes.length===0)return t.files;let s=t.changes.slice(0,10).map(o=>`${o.sourcePath} -> ${o.targetPath}`).join(`
|
|
5
|
+
`,"utf-8"),await It(n.remote,n.remotePath,n.localPath,n.batchFilePath,n.rcloneOptions,n.onProgress));for(let s of t)await Ot({remote:n.remote,remotePath:n.remotePath,localPath:n.localPath,file:s,rcloneOptions:n.rcloneOptions,onProgress:n.onProgress})}function vt(n){let e=[],t=[];for(let s of n){let r=s;if(typeof r.Path!="string")continue;let i=typeof r.ID=="string"&&r.ID.length>0?r.ID:void 0;if(r.IsDir===!0){t.push({path:A(r.Path),id:i});continue}let o=typeof r.Size=="number"&&Number.isFinite(r.Size)?r.Size:0;e.push({path:A(r.Path),size:o,id:i})}return{files:e,directories:t}}async function kt(n){let e=_t(n.directories);if(e.length===0)return n.files;let t=e.map(o=>o[0].path),s=n.files.filter(o=>!t.some(a=>Ge(o.path,a))),r=xt(n.directories),i=[];for(let o of e)for(let a of o){if(!a.id)throw new Error(`Cannot preserve duplicate remote folder without a stable rclone folder ID: ${a.path}`);let l=H(a.path),u=Ee(l,r);r.add(u),i.push(...await Ne({remote:n.remote,parentId:a.id,sourcePrefix:a.path,targetPrefix:u,extraArgs:n.extraArgs}))}return[...s,...i]}function _t(n){let e=new Map;for(let i of n){let o=e.get(i.path)??[];o.push(i),e.set(i.path,o)}let t=Array.from(e.values()).filter(i=>i.length>1).sort((i,o)=>i[0].path.split("/").length-o[0].path.split("/").length),s=[],r=[];for(let i of t){let o=i[0].path;r.some(a=>Ge(o,a))||(r.push(o),s.push(i))}return s}function xt(n){let e=new Map;for(let s of n)e.set(s.path,(e.get(s.path)??0)+1);let t=new Set;for(let s of n)(e.get(s.path)??0)>1||t.add(H(s.path));return t}async function Ne(n){let e=await wt({remote:n.remote,parentId:n.parentId,extraArgs:n.extraArgs}),t=new Set,s=[];for(let r of e){if(typeof r.name!="string"||typeof r.id!="string")continue;let i=`${n.sourcePrefix}/${r.name}`,o=`${n.targetPrefix}/${H(r.name)}`,a=r.mimeType==="application/vnd.google-apps.folder"?Ee(o,t):Ae(o,t);if(t.add(a),r.mimeType==="application/vnd.google-apps.folder"){s.push(...await Ne({remote:n.remote,parentId:r.id,sourcePrefix:i,targetPrefix:a,extraArgs:n.extraArgs}));continue}s.push({path:i,targetPath:a,size:Dt(r.size),id:r.id,requiresIdentityDownload:!0})}return s}function wt(n){let e=`'${Bt(n.parentId)}' in parents and trashed = false`;return new Promise((t,s)=>{let r=te("rclone",Tt({remote:n.remote,query:e,extraArgs:n.extraArgs}),{stdio:["ignore","pipe","pipe"]}),i="",o="";r.stdout.on("data",a=>{i+=a.toString()}),r.stderr.on("data",a=>{o+=a.toString()}),r.on("close",a=>{if(a!==0){s(new R(`Failed to query children for Google Drive folder ${n.parentId}`,o));return}try{let l=JSON.parse(i||"[]");if(!Array.isArray(l))throw new Error("rclone backend query did not return an array");t(l)}catch(l){s(new R(`Failed to parse children for Google Drive folder ${n.parentId}: ${l instanceof Error?l.message:String(l)}`,o))}}),r.on("error",a=>{s(new R(`Failed to start rclone: ${a.message}`,""))})})}function Dt(n){if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n=="string"){let e=Number(n);return Number.isFinite(e)?e:0}return 0}function Ge(n,e){return n===e||n.startsWith(`${e}/`)}function Bt(n){return n.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}function Lt(n){let e=w(n),t=A(n.path);return n.requiresIdentityDownload===!0||e!==t}async function Ot(n){let e=j.join(n.localPath,w(n.file));if(await Te.promises.mkdir(j.dirname(e),{recursive:!0}),n.file.id){await Re({args:Pt({remote:n.remote,fileId:n.file.id,localTargetPath:e,rcloneOptions:n.rcloneOptions}),remoteSource:`${n.remote}:${n.file.path}`,onProgress:n.onProgress});return}if(n.file.requiresIdentityDownload===!0)throw new Error(`Cannot preserve duplicate remote file without a stable rclone file ID: ${n.file.path}`);await Re({args:Ut({remoteFileSource:`${n.remote}:${Mt(n.remotePath,n.file.path)}`,localTargetPath:e,rcloneOptions:n.rcloneOptions}),remoteSource:`${n.remote}:${n.file.path}`,onProgress:n.onProgress})}function Mt(n,e){let t=n.replace(/\/+$/,""),s=e.replace(/^\/+/,"");return t.length===0?s:`${t}/${s}`}import Nt from"fs/promises";import Gt from"path";function ze(n,e){let t=new Map;for(let u of n){let c=Gt.dirname(u.targetPath??u.path);t.has(c)||t.set(c,[]),t.get(c).push(u)}let s=new Map;for(let[u,c]of t.entries()){let d=c.reduce((h,p)=>h+p.size,0);s.set(u,d)}let r=Array.from(t.keys()).sort(),i=[],o=[],a=0,l=1;for(let u of r){let c=t.get(u),d=s.get(u);if(d>e){if(o.length>0&&(i.push({batchNumber:l++,files:o,totalSize:a}),o=[],a=0),c.length===1)i.push({batchNumber:l++,files:c,totalSize:d});else for(let h of c)a+h.size>e&&o.length>0&&(i.push({batchNumber:l++,files:o,totalSize:a}),o=[],a=0),o.push(h),a+=h.size;continue}a+d>e&&o.length>0&&(i.push({batchNumber:l++,files:o,totalSize:a}),o=[],a=0),o.push(...c),a+=d}return o.length>0&&i.push({batchNumber:l++,files:o,totalSize:a}),i}async function $e(n){try{await Nt.unlink(n)}catch(e){if(e.code!=="ENOENT")throw e}}import m from"chalk";import je from"log-update";var S=(n,e=2)=>{if(n===0)return"0 B";let t=1024,s=e<0?0:e,r=["B","KB","MB","GB","TB","PB","EB"],i=Math.floor(Math.log(n)/Math.log(t));return`${(n/Math.pow(t,i)).toFixed(s)} ${r[i]}`},He=n=>{if(n===null)return null;let t=n*8/(1024*1024);return t<1?`${(t*1024).toFixed(0)} Kbps`:`${t.toFixed(1)} Mbps`},q=n=>{if(n===null)return null;let e=Math.floor(n/3600),t=Math.floor(n%3600/60),s=Math.floor(n%60);return e>0?`${e}h ${t}m`:t>0?`${t}m ${s}s`:`${s}s`};var $t=1e3,Pe=class{#t=null;#s=!1;#e=null;#n=null;#o=null;#i=new Map;#a=null;#l=null;#r=null;#u=null;start(){this.#s||(this.#s=!0,this.#i.clear(),this.#a=null,this.#l=null,this.#r=null,this.#u=null,this.#t=setInterval(()=>this.render(),$t))}stop(){this.#s&&(this.#s=!1,this.#t&&(clearInterval(this.#t),this.#t=null),this.render(),je.done())}updateSnapshot(e){this.#e=e}updateBatchState(e){this.#n=e}updateDownloadProgress(e){if(!e){this.#o=null;return}let t=e.percentComplete>=100||e.bytesTransferred>=e.totalBytes;!t&&e.speed>0&&(this.#r=e),this.#o=t&&this.#r?{...e,speed:this.#r.speed,eta:this.#r.eta}:e}persistCurrentBatchLine(){!this.#n||this.#n.currentPhase!=="complete"||this.#i.set(this.#n.currentBatch,this.#h(this.#n))}resetUploadSnapshot(){this.#e=null,this.#o=null,this.#r=null,this.#u=null}render(){if(!this.#s)return;let e=this.#n?this.#x(this.#n):this.#f();je(e.join(`
|
|
6
|
+
`))}#A(e,t){let s=[`${m.green(S(t.bytesTransferred))} / ${m.gray(S(t.totalBytes))}`,m.cyan(`${t.percentComplete.toFixed(1)}%`),m.magenta(He(t.speed)??"..."),`${m.yellow("ETA")}: ${m.yellow(q(t.eta)??"...")}`];return`${m.blue(e)}: ${s.join(" | ")}`}#f(){let e=this.#c();return[this.#U(e),this.#C(e)]}#x(e){let t=[];for(let s=1;s<e.currentBatch;s++){let r=this.#i.get(s);r&&t.push(r)}return t.push(this.#h(e)),t.push(this.#v(e)),t}#h(e){let t=`Batch ${e.currentBatch}/${e.totalBatches}`;switch(e.currentPhase){case"downloading":return this.#o?`${t}: ${this.#A("Downloading",this.#o)}`:`${t}: ${m.blue("Downloading...")}`;case"scanning":return`${t}: ${m.yellow(e.extraDetails??"Scanning...")}`;case"syncing_folders":return`${t}: ${m.yellow(e.extraDetails??"Syncing folders...")}`;case"uploading":return this.#D(t,e);case"cleaning":return`${t}: ${m.yellow("Cleaning...")}`;case"complete":return`${t}: ${m.green("Complete")} (${e.batchFilesTotal} files, ${S(e.batchBytesTotal)}${e.extraDetails?`, ${e.extraDetails}`:""})`}}#D(e,t){let s=this.#c(),r=s.successFileCount+s.failedFileCount+s.cancelledFileCount,i=Math.max(t.batchFilesTotal-t.batchFilesSkipped,0),o=Math.max(t.batchBytesTotal-t.batchBytesSkipped,0),a=o>0?(s.uploadedBytes/o*100).toFixed(1):"0.0",l=this.#S(t,s,o),u=l?.formattedSpeed??null,c=l?.formattedTime??null,d=u&&c?`, ${u}, ETA: ${c}`:"",h=t.batchFilesSkipped>0?`, ${m.yellow(`Skipped: ${t.batchFilesSkipped} files / ${S(t.batchBytesSkipped)}`)}`:"",p=o>0&&s.uploadedBytes>=o&&r<i?"Finalizing":"Uploading";return`${e}: ${m.blue(p)} (${r}/${i} files, ${S(s.uploadedBytes)} / ${S(o)}, ${a}%${d}${h})`}#v(e){let t=this.#c(),s=e.batchFilesSkipped+t.successFileCount+t.failedFileCount+t.cancelledFileCount,r=e.batchBytesSkipped+t.uploadedBytes,i=e.overallFilesCompleted+s,o=e.overallBytesCompleted+r,a=Math.max(e.overallBytesTotal-o,0),l=this.#E(e),u=this.#F(e,t),c=l!==null&&u!==null?l+u:null;return[`Total: ${i}/${e.overallFilesTotal} files`,`${S(o)} / ${S(e.overallBytesTotal)}`,m.yellow(`${S(a)} remaining`),`Download ETA: ${q(l)??"..."}`,`Upload ETA: ${q(u)??"..."}`,`Total ETA: ${q(c)??"..."}`].join(", ")}#E(e){let t=e.overallBytesCompleted+e.batchBytesSkipped+(this.#o?.bytesTransferred??0),s=Math.max(e.overallBytesTotal-t,0);if(s===0)return e.currentPhase==="downloading"&&this.#o?(this.#a=this.#o.eta,this.#o.eta):(this.#a=0,0);if(this.#o&&this.#o.speed>0){let r=Math.ceil(s/this.#o.speed);return this.#a=r,r}return this.#a}#F(e,t){let s=e.overallBytesCompleted+e.batchBytesSkipped+t.uploadedBytes,r=Math.max(e.overallBytesTotal-s,0),i=Math.max(e.batchBytesTotal-e.batchBytesSkipped,0),o=this.#S(e,t,i);if(r===0)return e.currentPhase==="uploading"&&o?(this.#l=o.timeRemainingSeconds,o.timeRemainingSeconds):(this.#l=0,0);if(o&&o.uploadSpeedMbps>0){let a=o.uploadSpeedMbps*1024*1024/8,l=Math.ceil(r/a);return this.#l=l,l}return this.#l}#S(e,t,s){let r=this.#e?.uploadStats,i=s>0&&t.uploadedBytes>=s;return r&&r.uploadSpeedMbps>0&&r.formattedSpeed!=="Calculating..."&&!i?(this.#u={uploadSpeedMbps:r.uploadSpeedMbps,formattedSpeed:r.formattedSpeed,formattedTime:r.formattedTime,timeRemainingSeconds:r.timeRemainingSeconds},this.#u):e.currentPhase==="uploading"&&i&&this.#u?this.#u:r?{uploadSpeedMbps:r.uploadSpeedMbps,formattedSpeed:r.formattedSpeed,formattedTime:r.formattedTime,timeRemainingSeconds:r.timeRemainingSeconds}:null}#U(e){return[`Total: ${e.totalFileCount}`,m.green(`Success: ${e.successFileCount}`),m.red(`Failed: ${e.failedFileCount}`),m.red(`Cancelled: ${e.cancelledFileCount}`),m.blue(`Active: ${e.activeFileCount}`),m.gray(`Queued: ${e.queuedFileCount}`)].join(" | ")}#C(e){let t=Math.max(e.totalBytes-e.uploadedBytes,0),s=this.#e?` | ${m.cyan(`Speed: ${this.#e.uploadStats.formattedSpeed}`)} | ${m.magenta(`Time remaining: ${this.#e.uploadStats.formattedTime}`)}`:"";return[`Total: ${S(e.totalBytes)}`,m.green(`Uploaded: ${S(e.uploadedBytes)}`),m.yellow(`Remaining: ${S(t)}`)].join(" | ")+s}#c(){return this.#e?Object.values(this.#e.uploadAssets).reduce((t,s)=>{switch(t.totalFileCount+=1,t.totalBytes+=s.totalBytesToUpload,t.uploadedBytes+=s.status==="success"?s.totalBytesToUpload:s.bytesUploaded,s.status){case"success":t.successFileCount+=1;break;case"failed":t.failedFileCount+=1;break;case"cancelled":t.cancelledFileCount+=1;break;case"in-progress":t.activeFileCount+=1;break;default:t.queuedFileCount+=1;break}return t},{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}):{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}}},C=new Pe;import{Readable as Ht}from"node:stream";import qe from"axios";var F=class{#t;#s;#e;#n;#o=new $;#i=new Set;constructor(e){this.#t=qe.create({baseURL:e.apiUrl}),this.#s=qe.create({baseURL:e.edgeWorkerUrl}),this.#e=e.apiKey,this.#n=e.sessionId}get skippedAssetIds(){return this.#i}async post(e,t,s){let r=await this.#t.post(e,t,{headers:{Authorization:`Bearer ${this.#e}`,"X-Aspect-Session-Id":this.#n,"Content-Type":"application/json",...s}});return this.#l(e,t,r.data),r.data}async get(e,t){return(await this.#t.get(e,{headers:{Authorization:`Bearer ${this.#e}`,"X-Aspect-Session-Id":this.#n,...t}})).data}async delete(e,t){await this.#t.delete(e,{headers:{Authorization:`Bearer ${this.#e}`,"X-Aspect-Session-Id":this.#n,...t}})}async putWithToken(e,t,s,r){let i=await this.#a(t),o=this.#o.createIterator(i,r.getMaxUploadRate??(()=>null),r.signal),a=Ht.from(o,{highWaterMark:1}),l=await this.#s.put(e,a,{timeout:0,signal:r.signal,headers:{"Content-Type":r.contentType??"","Content-Length":i.byteLength.toString(),Authorization:`Bearer ${s}`},transformRequest:[u=>u],maxRedirects:0,onUploadProgress:u=>r.onProgress?.(u.loaded)});return{status:l.status,statusText:l.statusText,headers:Object.fromEntries(Object.entries(l.headers)),data:l.data,raw:l}}async#a(e){if(e instanceof Uint8Array)return e;let t=await e.arrayBuffer();return new Uint8Array(t)}#l(e,t,s){if(e!=="/assets/chunked/initiate"||!Array.isArray(t)||!Array.isArray(s))return;let r=t;s.forEach((o,a)=>{let l=r[a];o.skipped===!0&&typeof l?.id=="string"&&this.#i.add(l.id)})}};import W from"node:path";var We=500,jt=8,re=class{#t;#s;#e=new Map;constructor(e){this.#t=e.rootDirectoryId,this.#s=e.httpClient}async ensureDirectories(e){await this.loadExistingDirectories();let t=this.#n(e);for(let s of t){if(this.#e.has(s))continue;let r=W.posix.dirname(s),i=W.posix.basename(s),o=r==="."?this.#t:this.#e.get(r);if(!o)throw new Error(`Parent directory ID not found for path: ${s}`);let a=await this.#r(o,i);if(a.name!==i)throw new Error(`Server created renamed directory "${a.name}" for planned path "${s}". Refusing to map uploads to an unexpected target path.`);this.#e.set(s,a.id)}return e.map(s=>({file:s,directoryId:this.getDirectoryIdForFile(s.relativePath)}))}async loadExistingDirectories(){let e=await this.#o(this.#t);this.#e.clear(),this.#l(e,"")}getDirectoryIdForFile(e){let t=A(e),s=W.posix.dirname(t);if(s===".")return this.#t;let r=this.#e.get(s);if(!r)throw new Error(`Directory ID not found for path: ${s}`);return r}getExistingDirectoryIdForFile(e){let t=A(e),s=W.posix.dirname(t);return s==="."?this.#t:this.#e.get(s)??null}async checkAssetsExistence(e,t=!0){if(e.length===0)return[];let s=[];for(let r=0;r<e.length;r+=We){let i=e.slice(r,r+We),o=await this.#s.post("/assets/check-exists-and-uploaded",{items:i,delete_if_not_exist:t});s.push(...o.items)}return s}async listFilesInSubtree(e={}){let t=[{id:this.#t,relativePath:""}],s=[],r=0;for(;r<t.length;){let i=t.slice(r,r+jt),o=await Promise.all(i.map(a=>this.#i(a)));r+=i.length;for(let a of o)t.push(...a.directories),s.push(...a.files);e.onProgress?.({scannedDirectoryCount:r,queuedDirectoryCount:t.length,fileCount:s.length})}return s}#n(e){let t=new Set;for(let s of e){let r=A(s.relativePath),i=W.posix.dirname(r);if(i===".")continue;let o=i.split("/");for(let a=0;a<o.length;a++)t.add(o.slice(0,a+1).join("/"))}return Array.from(t).sort((s,r)=>s.split("/").length-r.split("/").length)}async#o(e){return this.#s.get(`/directories/${e}/tree`)}async#i(e){let[t,s]=await Promise.all([this.#s.post("/fs/list/directories",{parent_id:e.id}),this.#s.post("/fs/list/assets",{parent_id:e.id})]);return{directories:t.map(r=>({id:r.id,relativePath:this.#a(e.relativePath,r.name)})),files:s.map(r=>({assetId:r.id,relativePath:this.#a(e.relativePath,r.name),sizeBytes:r.size_bytes,isUploaded:r.is_uploaded??!0,uploadStateKnown:typeof r.is_uploaded=="boolean"}))}}#a(e,t){let s=e===""?t:`${e}/${t}`;return A(s)}#l(e,t){let s=t===""?"":t==="."?e.name:`${t}/${e.name}`;s!==""&&this.#e.set(s,e.id);for(let r of e.children){let i=t===""?".":s;this.#l(r,i)}}async#r(e,t){return this.#s.post(`/directories/${e}/directories`,{name:t,auto_rename:"numeric"})}};import{PostHog as qt}from"posthog-node";var k=null,ne="",Fe={};function Ke(n){k||n.config.analytics.disabled||!n.config.analytics.posthogKey||(ne=n.user.id,Fe={service:"data-sync",package_version:n.packageVersion,platform:process.platform,arch:process.arch,node_version:process.version,max_concurrent:n.config.maxConcurrent,batch_mode:n.config.batchSizeBytes!==void 0,batch_size_bytes:n.config.batchSizeBytes??null,rclone_transfers:n.config.rcloneOptions.transfers,rclone_multi_thread_streams:n.config.rcloneOptions.multiThreadStreams},k=new qt(n.config.analytics.posthogKey,{host:n.config.analytics.posthogHost}),k.identify({distinctId:ne,properties:{user_id:n.user.id,email:n.user.email,first_name:n.user.first_name,last_name:n.user.last_name,utm_source_latest:null,utm_medium_latest:null,utm_campaign_latest:null,utm_content_latest:null}}))}function Ye(n,e){k&&k.capture({distinctId:ne,event:n,properties:{...Fe,...e}})}async function Qe(){let n=k;if(Wt(),!!n)try{await n.flush()}catch{}}function Wt(){k=null,ne="",Fe={}}import*as oe from"fs/promises";import*as ae from"path";var Kt={".mp4":"video/mp4",".mov":"video/quicktime",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".webm":"video/webm",".wmv":"video/x-ms-wmv",".flv":"video/x-flv",".m4v":"video/x-m4v",".mpg":"video/mpeg",".mpeg":"video/mpeg",".3gp":"video/3gpp",".ts":"video/mp2t",".mts":"video/mp2t",".mxf":"application/mxf",".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".tiff":"image/tiff",".tif":"image/tiff",".svg":"image/svg+xml",".heic":"image/heic",".heif":"image/heif",".avif":"image/avif",".mp3":"audio/mpeg",".wav":"audio/wav",".aac":"audio/aac",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".wma":"audio/x-ms-wma",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".rtf":"application/rtf",".json":"application/json",".xml":"application/xml"};function Yt(n){let e=ae.extname(n).toLowerCase();return Kt[e]??""}var ie=class n{#t;#s=null;#e=null;#n=!1;#o;#i;#a;constructor(e,t,s,r){this.#t=e,this.#o=t,this.#i=s,this.#a=r}static async create(e){let t=await oe.stat(e),s=ae.basename(e),r=Yt(s);return new n(e,t.size,s,r)}get name(){return this.#i}get size(){return this.#o}get type(){return this.#a}async readChunk(e,t){if(!this.#s){this.#e||(this.#e=oe.open(this.#t,"r"));let i=await this.#e;if(this.#e=null,this.#n)return Buffer.alloc(0);this.#s=i}let s=t-e,r=Buffer.alloc(s);return await this.#s.read(r,0,s,e),r}async close(){this.#n=!0;let e=this.#e;await this.#s?.close(),this.#s=null,e&&await(await e.catch(()=>null))?.close(),this.#e=null}};var Qt=new Set(["success","failed","cancelled"]),Xe=1e3,Xt=4*1024*1024,le=class{#t;#s;#e;#n;#o;constructor(e){this.#t=e.config,this.#s=e.httpClient??new F({apiUrl:e.config.apiUrl,apiKey:e.config.apiKey,edgeWorkerUrl:e.config.edgeWorkerUrl,sessionId:e.config.sessionName}),this.#e=e.createFileReader??(t=>ie.create(t)),this.#n=e.onSnapshot,this.#o=e.analytics}async uploadFiles(e){let t=e.filter(o=>o.preSkipped===!0),s=e.filter(o=>o.preSkipped!==!0);if(s.length===0)return{totalFileCount:e.length,successFileCount:0,skippedFileCount:t.length,failedFileCount:0,cancelledFileCount:0,failedFiles:[]};let r=new z({httpClient:this.#s,maxConcurrency:this.#t.maxConcurrent,deltaIntervalMs:Xe,adaptiveConcurrency:!1,analytics:this.#o}),i=[];try{let o=r.startGroupUpload({name:`${s.length} files`,type:"files",fileCount:s.length,folderCount:0,topLevelFileCount:s.length,topLevelFolderCount:0,rootDirectoryId:this.#t.directoryId,projectId:this.#t.projectId,totalBytes:s.reduce((l,u)=>l+u.file.size,0),conflictResolutionOverride:"skip"});for(let l of s){let u=await this.#e(l.file.absolutePath),c=r.startUpload({fileReader:u,directoryId:l.directoryId,projectId:this.#t.projectId,groupId:o,chunkSize:Xt});r.addAssetToGroup(o,c),i.push({assetId:c,file:l.file,fileReader:u})}await this.#i(r);let a=r.getSnapshot();return this.#n?.(a),this.#a({snapshot:a,startedUploads:i,preSkippedCount:t.length})}finally{r.destroy()}}async#i(e){let s=Date.now();for(;Date.now()-s<864e5;){let r=e.getSnapshot();this.#n?.(r);let i=Object.values(r.uploadAssets);if(i.length>0&&i.every(o=>Qt.has(o.status)))return;await new Promise(o=>setTimeout(o,Xe))}throw new Error("Timed out waiting for upload session to finish")}#a(e){let t=[],s=0,r=0,i=0,o=0;for(let a of e.startedUploads){let l=e.snapshot.uploadAssets[a.assetId];if(!l){i+=1,t.push({fileName:a.file.fileName,relativePath:a.file.relativePath,errorMessage:"Upload state missing from upload engine"});continue}if(l.status==="success"){this.#s.skippedAssetIds.has(a.assetId)?r+=1:s+=1;continue}l.status==="cancelled"?o+=1:i+=1,t.push({fileName:a.file.fileName,relativePath:a.file.relativePath,errorMessage:l.errorMessage})}return{totalFileCount:e.startedUploads.length+e.preSkippedCount,successFileCount:s,skippedFileCount:e.preSkippedCount+r,failedFileCount:i,cancelledFileCount:o,failedFiles:t}}};var ue=200,ce=class{#t;#s;#e;#n;constructor(e,t){this.#t=e,this.#s=t??new F({apiUrl:e.apiUrl,apiKey:e.apiKey,edgeWorkerUrl:e.edgeWorkerUrl,sessionId:e.sessionName}),this.#e=new re({rootDirectoryId:e.directoryId,httpClient:this.#s}),this.#n=new le({config:e,httpClient:this.#s,onSnapshot:s=>C.updateSnapshot(s),analytics:Ye})}async run(){this.#F("Starting data sync..."),await this.#f(),console.log("Listing all remote files...");let e=await se(this.#t.remote,this.#t.remotePath,this.#t.rcloneOptions.extraRcloneArgs??[]);console.log(`Found ${e.length} files`),console.log(`Total size: ${S(this.#I(e))}`),console.log("");let t=this.#u(e);if(t.length===0){console.log("No files to sync. Exiting."),await this.#x();return}let s={totalFileCount:0,successFileCount:0,skippedFileCount:0,failedFileCount:0,cancelledFileCount:0,completedByteCount:0},r=[],i={batchNumber:1,files:t,totalSize:this.#I(t)};C.start();try{let a=await this.#A({batch:i,totalBatches:1,overallFilesTotal:t.length,overallBytesTotal:i.totalSize,completedTotals:s,batchDir:this.#t.localTempDir});this.#y(s,r,a,i.totalSize)}finally{C.stop()}let o={...s,failedFiles:r};this.#S({summary:o}),await this.#h(o),this.#p(o)}async runBatched(){if(!this.#t.batchSizeBytes)throw new Error("Batch size not configured. Use batchSizeBytes in config.");this.#F("Starting batched data sync...",[`Batch size: ${S(this.#t.batchSizeBytes)}`,`Max concurrent chunks: ${this.#t.maxConcurrent}`]),await this.#f(),console.log("Listing all remote files...");let e=await se(this.#t.remote,this.#t.remotePath,this.#t.rcloneOptions.extraRcloneArgs??[]);console.log(`Found ${e.length} files`),console.log(`Total size: ${S(this.#I(e))}`),console.log("");let t=this.#u(e);if(t.length===0){console.log("No files to sync. Exiting."),await this.#x();return}let s=ze(t,this.#t.batchSizeBytes);await this.#E(s);let r={totalFileCount:0,successFileCount:0,skippedFileCount:0,failedFileCount:0,cancelledFileCount:0,completedByteCount:0},i=[],o=this.#I(t);C.start();try{for(let l of s){let u=await this.#A({batch:l,totalBatches:s.length,overallFilesTotal:t.length,overallBytesTotal:o,completedTotals:r});this.#y(r,i,u,l.totalSize)}}finally{C.stop()}this.#S({summary:{...r,failedFiles:i},extraLines:[`Batches: ${s.length}`]});let a={...r,failedFiles:i};await this.#h(a),this.#p(a)}async runCheckOnly(){console.log("Running in check-only mode (no downloads/uploads)..."),await Ue(),console.log(`Listing remote files from ${this.#t.remote}:${this.#t.remotePath}...`);let e=await se(this.#t.remote,this.#t.remotePath,this.#t.rcloneOptions.extraRcloneArgs??[]);console.log(`Found ${e.length} remote files to check`);let t=this.#u(e);if(t.length===0){console.log("No remote files to check. Exiting.");return}console.log("Fetching Aspect project summary...");let s=await this.#o();console.log("Fetching existing Aspect files...");let r=await this.#e.listFilesInSubtree({onProgress:o=>this.#U(o)}),i=this.#i(t,r,s);this.#C(i)}async#o(){return await this.#s.get(`/projects/${this.#t.projectId}`)}#i(e,t,s){let r=e.map(y=>({relativePath:w(y),sizeBytes:this.#r(y.size)})),i=r.filter(y=>y.sizeBytes===null).length,o=t.filter(y=>y.isUploaded),a=t.filter(y=>y.uploadStateKnown&&!y.isUploaded),l=t.filter(y=>!y.uploadStateKnown).length;l>0&&(console.warn(`Warning: ${l} server asset(s) did not include upload status; treating them as uploaded for check comparison.`),console.log(""));let u=this.#a(r),c=this.#l(o),d=new Set([...u.keys(),...c.keys()]),h=0,p=0,g=[],b=[],f=[];for(let y of d){let Ze=u.get(y)??[],_=c.get(y)??[],I=new Set,de=[];for(let E of Ze){if(E.sizeBytes===null){de.push(E);continue}let x=_.findIndex((T,Y)=>!I.has(Y)&&T.sizeBytes===E.sizeBytes);x>=0?(h+=1,I.add(x)):de.push(E)}for(let E of de){if(E.sizeBytes===null){let T=_.findIndex((Y,et)=>!I.has(et));T>=0?(I.add(T),p+=1):g.push(E);continue}let x=_.findIndex((T,Y)=>!I.has(Y));if(x>=0){let T=_[x];I.add(x),b.push({relativePath:y,remoteSizeBytes:E.sizeBytes,serverSizeBytes:T.sizeBytes,assetId:T.assetId})}else g.push(E)}for(let E=0;E<_.length;E++)I.has(E)||f.push(_[E])}return{totalRemoteCount:e.length,totalServerCount:t.length,projectAssetCount:s.num_assets,projectRootDirectoryId:s.root_directory_id,uploadedServerCount:o.length,unknownUploadStateCount:l,unknownRemoteSizeCount:i,pathOnlyMatchCount:p,existingCount:h,missingFiles:g,sizeMismatches:b,extraUploadedFiles:f,incompleteServerFiles:a}}#a(e){let t=new Map;for(let s of e){let r=A(s.relativePath),i=t.get(r)??[];i.push({...s,relativePath:r}),t.set(r,i)}return t}#l(e){let t=new Map;for(let s of e){let r=A(s.relativePath),i=t.get(r)??[];i.push({...s,relativePath:r}),t.set(r,i)}return t}#r(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}#u(e){let t=Be(e);if(t.changes.length===0)return t.files;let s=t.changes.slice(0,10).map(o=>`${o.sourcePath} -> ${o.targetPath}`).join(`
|
|
7
7
|
`),r=t.changes.length-10,i=r>0?`
|
|
8
8
|
...and ${r} more renamed target path(s)`:"";return console.warn(`Warning: ${t.changes.length} remote file path(s) were renamed for Aspect compatibility.
|
|
9
9
|
${s}${i}
|
|
10
|
-
`),console.log(""),t.files}async#
|
|
10
|
+
`),console.log(""),t.files}async#A(e){let t=e.batchDir??Ie.join(this.#t.localTempDir,`batch${e.batch.batchNumber}`);await K.mkdir(t,{recursive:!0});let s=e.batch.files.map(d=>Le(d,t));C.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:s.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:0,batchBytesSkipped:0,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#m(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"scanning",extraDetails:`Preparing ${s.length} files...`}),C.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:s.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:0,batchBytesSkipped:0,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#m(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"syncing_folders",extraDetails:"Ensuring target directories exist..."});let r=await this.#e.ensureDirectories(s);C.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:s.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:0,batchBytesSkipped:0,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#m(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"scanning",extraDetails:"Checking existing assets..."});let i=await this.#D(r),o=this.#v(i),a=e.batch.files.filter((d,h)=>i[h]?.preSkipped!==!0),l=Ie.join(this.#t.localTempDir,`batch${e.batch.batchNumber}.txt`),u=async()=>{await $e(l),this.#t.keepLocal||await K.rm(t,{recursive:!0,force:!0}),C.resetUploadSnapshot(),C.updateDownloadProgress(null)};if(a.length===0){let d={totalFileCount:i.length,successFileCount:0,skippedFileCount:i.length,failedFileCount:0,cancelledFileCount:0,failedFiles:[]};return C.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:s.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:o.skippedFileCount,batchBytesSkipped:o.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+d.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#m(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"complete",extraDetails:"everything already synced"}),C.persistCurrentBatchLine(),await u(),d}C.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:s.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:o.skippedFileCount,batchBytesSkipped:o.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#m(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"downloading"}),await Me({remote:this.#t.remote,remotePath:this.#t.remotePath,localPath:t,batchFilePath:l,files:a,rcloneOptions:this.#t.rcloneOptions,onProgress:d=>C.updateDownloadProgress(d)}),C.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:s.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:o.skippedFileCount,batchBytesSkipped:o.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#m(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"uploading"});let c=await this.#n.uploadFiles(i);return this.#P(c)?(C.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:s.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:o.skippedFileCount,batchBytesSkipped:o.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+c.successFileCount+c.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#m(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"complete",extraDetails:"failed; local files preserved"}),C.persistCurrentBatchLine(),c):(C.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:s.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:o.skippedFileCount,batchBytesSkipped:o.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+c.successFileCount+c.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#m(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"cleaning"}),await u(),C.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:s.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:o.skippedFileCount,batchBytesSkipped:o.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+c.successFileCount+c.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#m(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"complete"}),C.persistCurrentBatchLine(),c)}async#f(){console.log("Checking rclone installation..."),await Ue(),console.log("rclone is installed"),console.log(""),console.log("Creating session directory..."),await K.mkdir(this.#t.localTempDir,{recursive:!0}),console.log(`Session directory: ${this.#t.localTempDir}`),console.log("")}async#x(){this.#t.keepLocal||(console.log(""),console.log("Cleaning up session directory..."),await K.rm(this.#t.localTempDir,{recursive:!0,force:!0}),console.log(`Deleted session directory: ${this.#t.localTempDir}`))}async#h(e){if(this.#P(e)){console.log(""),console.log(`Preserving session directory for retry/debugging: ${this.#t.localTempDir}`);return}await this.#x()}async#D(e){let t=await this.#e.checkAssetsExistence(e.map(s=>({directory_id:s.directoryId,name:s.file.fileName,size_bytes:s.file.size})));return e.map((s,r)=>({file:s.file,directoryId:s.directoryId,preSkipped:t[r]?.exists===!0}))}#v(e){return e.reduce((t,s)=>(s.preSkipped===!0&&(t.skippedFileCount+=1,t.skippedByteCount+=s.file.size),t),{skippedFileCount:0,skippedByteCount:0})}async#E(e){console.log("Creating batches..."),console.log(`Created ${e.length} batches`);let t=[];for(let s of e){let r=`Batch ${s.batchNumber}: ${s.files.length} files, ${S(s.totalSize)}`;t.push(r),console.log(r)}await K.writeFile(Ie.join(this.#t.localTempDir,"batches.txt"),`${t.join(`
|
|
11
11
|
`)}
|
|
12
|
-
`,"utf-8"),console.log("")}#
|
|
12
|
+
`,"utf-8"),console.log("")}#F(e,t=[]){console.log(e),console.log(`Session: ${this.#t.sessionName}`),console.log(`Remote: ${this.#t.remote}:${this.#t.remotePath}`),console.log(`Root directory ID: ${this.#t.directoryId}`),console.log(`Project ID: ${this.#t.projectId}`),console.log(`Temp directory: ${this.#t.localTempDir}`),console.log(`Edge worker URL: ${this.#t.edgeWorkerUrl}`);for(let s of t)console.log(s);console.log("")}#S(e){console.log(""),console.log("=".repeat(60)),console.log("Sync Summary"),console.log("=".repeat(60)),console.log(`Total files: ${e.summary.totalFileCount}`),console.log(`Successful: ${e.summary.successFileCount}`),console.log(`Skipped: ${e.summary.skippedFileCount}`),console.log(`Failed: ${e.summary.failedFileCount}`),console.log(`Cancelled: ${e.summary.cancelledFileCount}`);for(let t of e.extraLines??[])console.log(t);if(console.log("=".repeat(60)),e.summary.failedFiles.length>0){console.log(""),console.log("Failed files:");for(let t of e.summary.failedFiles)console.log(` - ${t.relativePath}: ${t.errorMessage??"Unknown error"}`)}}#U(e){console.log(`Aspect scan: ${e.scannedDirectoryCount}/${e.queuedDirectoryCount} directories, ${e.fileCount} files found`)}#C(e){let t=e.missingFiles.length+e.sizeMismatches.length+e.extraUploadedFiles.length+e.incompleteServerFiles.length;console.log(""),console.log("=".repeat(60)),console.log("Check Summary"),console.log("=".repeat(60)),console.log(`Total (remote): ${e.totalRemoteCount}`),console.log(`Total (server): ${e.totalServerCount}`),console.log(`Project asset count: ${e.projectAssetCount}`),console.log(`Project count vs scanned server: ${e.projectAssetCount-e.totalServerCount}`),console.log(`Uploaded (server): ${e.uploadedServerCount}`),console.log(`Upload status unknown: ${e.unknownUploadStateCount}`),console.log(`Exact matches: ${e.existingCount}`),console.log(`Path-only matches (unknown remote size): ${e.pathOnlyMatchCount}`),console.log(`Remote sizes unknown: ${e.unknownRemoteSizeCount}`),console.log(`Missing on server: ${e.missingFiles.length}`),console.log(`Size mismatches: ${e.sizeMismatches.length}`),console.log(`Extra on server: ${e.extraUploadedFiles.length}`),console.log(`Incomplete uploads on server: ${e.incompleteServerFiles.length}`),console.log(`Total mismatches: ${t}`),console.log("=".repeat(60)),e.projectRootDirectoryId!==this.#t.directoryId?(console.log(""),console.log(`Warning: --directory-id (${this.#t.directoryId}) is not the project root directory (${e.projectRootDirectoryId}), so --check is comparing only that directory subtree.`)):e.projectAssetCount!==e.totalServerCount&&(console.log(""),console.log("Warning: project asset count differs from the live filesystem subtree scan. The project card uses cached project stats; the subtree scan is what --check compared against Drive.")),this.#c("Files missing on server:",e.missingFiles),this.#k(e.sizeMismatches),this.#w("Extra files on server:",e.extraUploadedFiles),this.#w("Incomplete uploads on server:",e.incompleteServerFiles)}#c(e,t){if(t.length!==0){console.log(""),console.log(e);for(let s of t.slice(0,ue))console.log(` - ${s.relativePath} (${this.#_(s.sizeBytes)})`);this.#d(t.length)}}#k(e){if(e.length!==0){console.log(""),console.log("Files with size mismatches:");for(let t of e.slice(0,ue))console.log(` - ${t.relativePath} (remote ${S(t.remoteSizeBytes)}, server ${S(t.serverSizeBytes)}, asset ${t.assetId})`);this.#d(e.length)}}#w(e,t){if(t.length!==0){console.log(""),console.log(e);for(let s of t.slice(0,ue))console.log(` - ${s.relativePath} (${S(s.sizeBytes)}, asset ${s.assetId})`);this.#d(t.length)}}#d(e){let t=e-ue;t>0&&console.log(` ...and ${t} more`)}#_(e){return e===null?"unknown remote size":S(e)}#y(e,t,s,r){e.totalFileCount+=s.totalFileCount,e.successFileCount+=s.successFileCount,e.skippedFileCount+=s.skippedFileCount,e.failedFileCount+=s.failedFileCount,e.cancelledFileCount+=s.cancelledFileCount,e.completedByteCount+=r,t.push(...s.failedFiles)}#p(e){let t=e.failedFileCount+e.cancelledFileCount;if(t>0)throw new Error(`Sync completed with ${t} unsuccessful upload(s)`)}#P(e){return e.failedFileCount+e.cancelledFileCount>0}#I(e){return e.reduce((t,s)=>t+s.size,0)}#m(e,t){return Math.min(e.completedByteCount,t)}};var es=Zt(import.meta.url),ts=Ve.dirname(es),Je=JSON.parse(Jt(Ve.join(ts,"..","package.json"),"utf-8")),ve=new Vt;ve.name("aspect-sync").description("Sync files from external services to Aspect via rclone").version(Je.version);ve.requiredOption("--remote <remote>","rclone remote name (e.g., dropbox)").requiredOption("--path <path>","remote path to sync from").requiredOption("--directory-id <id>","Aspect directory ID to upload to").requiredOption("--project-id <id>","Aspect project ID").option("--api-url <url>","Aspect API URL").option("--edge-worker-url <url>","Aspect edge worker URL").option("--api-key <key>","Aspect API key").option("--upload-concurrent <number>","Maximum concurrent chunk uploads to Aspect (default: 16)","16").option("--keep-local","Keep local files after upload (for debugging)",!1).option("--temp-dir <path>","Local temporary directory for synced files").option("--session <name>","Session name for isolation (default: auto-generated timestamp)").option("--check","Check remote files against Aspect without downloading/uploading",!1).option("--batch-size <size>","Enable batched mode with max batch size (e.g., 500GB, 1TB). Helps with large migrations.","").option("--rclone-transfers <number>","Number of parallel file transfers (default: 4)","4").option("--rclone-multi-thread-streams <number>","Streams per large file (default: 4, higher = faster large files)","4").option("--rclone-multi-thread-chunk-size <size>","Chunk size for multi-threading (default: 64MiB)","64MiB").option("--rclone-multi-thread-cutoff <size>","Minimum file size for multi-threading (default: 64MiB)","64MiB").option("--rclone-buffer-size <size>","Buffer size per transfer (default: 64M, memory = transfers \xD7 buffer-size)","64M").option("--rclone-no-mmap","Disable memory-mapped I/O (reduces memory efficiency)",!1).option("--rclone-extra <arg>","Additional rclone argument to append (repeatable)",(n,e)=>(e??[]).concat(n),[]).action(async n=>{let e=0;try{let t={ASPECT_API_URL:process.env.ASPECT_API_URL,ASPECT_EDGE_WORKER_URL:process.env.ASPECT_EDGE_WORKER_URL,ASPECT_API_KEY:process.env.ASPECT_API_KEY,ASPECT_POSTHOG_KEY:process.env.ASPECT_POSTHOG_KEY,ASPECT_POSTHOG_HOST:process.env.ASPECT_POSTHOG_HOST,ASPECT_DISABLE_POSTHOG:process.env.ASPECT_DISABLE_POSTHOG,POSTHOG_KEY:process.env.POSTHOG_KEY,POSTHOG_API_KEY:process.env.POSTHOG_API_KEY,POSTHOG_HOST:process.env.POSTHOG_HOST,POSTHOG_DISABLED:process.env.POSTHOG_DISABLED},s=xe({options:n,environment:t}),r=ss(s),i=await rs(s,r);i&&Ke({config:s,packageVersion:Je.version,user:i});let o=new ce(s,r);n.check?await o.runCheckOnly():s.batchSizeBytes!==void 0?await o.runBatched():await o.run()}catch(t){console.error("Fatal error:",t),e=1}finally{await Qe()}process.exit(e)});ve.parse();function ss(n){return new F({apiUrl:n.apiUrl,apiKey:n.apiKey,edgeWorkerUrl:n.edgeWorkerUrl,sessionId:n.sessionName})}async function rs(n,e){return n.analytics.disabled||!n.analytics.posthogKey?null:await e.get("/users/me")}
|