aspect-sync 0.1.14 → 0.1.15

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/README.md CHANGED
@@ -120,7 +120,7 @@ npx aspect-sync \
120
120
  | `--project-id <id>` | Aspect project ID | Yes | - |
121
121
  | `--api-key <key>` | Aspect API key (or set `ASPECT_API_KEY` env var) | Yes | - |
122
122
  | `--api-url <url>` | Aspect API URL (or set `ASPECT_API_URL` env var) | No | `https://api.aspect.inc` |
123
- | `--edge-worker-url <url>` | Aspect edge worker URL (or set `ASPECT_EDGE_WORKER_URL` env var) | No | `https://edge.aspect.inc` |
123
+ | `--edge-worker-url <url>` | Aspect edge worker URL (or set `ASPECT_EDGE_WORKER_URL` env var) | No | `https://mackinac.aspect.inc` |
124
124
  | `--upload-concurrent <number>` | Max concurrent chunk uploads | No | `16` |
125
125
  | `--batch-size <size>` | Run the migration in download/upload batches (e.g., `500GB`, `1TB`) so data is uploaded as soon as each batch finishes downloading. | No | Disabled |
126
126
  | `--keep-local` | Keep local files after upload (for debugging) | No | `false` |
@@ -138,7 +138,7 @@ You can set API credentials via environment variables:
138
138
  ```bash
139
139
  export ASPECT_API_KEY=your-api-key
140
140
  export ASPECT_API_URL=https://api.aspect.inc
141
- export ASPECT_EDGE_WORKER_URL=https://edge.aspect.inc
141
+ export ASPECT_EDGE_WORKER_URL=https://mackinac.aspect.inc
142
142
 
143
143
  aspect-sync \
144
144
  --remote dropbox \
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{Command as Pt}from"commander";import Le from"node:path";import{readFileSync as Ft}from"node:fs";import{fileURLToPath as kt}from"node:url";import Oe from"node:os";import be from"node:path";function Me(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 Ce(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=ne({value:n.options.rcloneTransfers,optionName:"--rclone-transfers"}),s=ne({value:n.options.rcloneMultiThreadStreams,optionName:"--rclone-multi-thread-streams"}),r=ne({value:n.options.uploadConcurrent,optionName:"--upload-concurrent"}),i=parseFloat(n.options.uploadChunkSize);if(Number.isNaN(i)||i<=0)throw new Error("Error: --upload-chunk-size must be a positive number");let o=Ne(n.options.batchSize),a=n.options.session??Ge({now:n.now??new Date,highResolutionTime:n.highResolutionTime??process.hrtime.bigint()}),l=n.options.tempDir||be.join(Oe.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://edge.aspect.inc",apiKey:e,maxConcurrent:r,keepLocal:n.options.keepLocal,localTempDir:be.join(l,a),sessionName:a,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:o,chunkSizeBytes:Math.round(i*1024*1024)}}function ne(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 Ne(n){if(!n)return;let e=Me(n);if(e===null)throw new Error(`Error: Invalid batch size format: ${n}`);return e}function Ge(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 $ from"node:fs/promises";import se from"node:path";import{spawn as Y}from"child_process";import*as N from"fs";import*as R from"path";import T from"node:path";function H(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 ie(n,e){let t=H(n,e);return t==="creating-folders"||t==="in-progress"||t==="queued"||t==="paused"?"cancelled":t}function oe(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 ae(n){for(let e of Object.values(n))if(e.status==="queued"||e.status==="in-progress"||e.status==="paused")return!0;return!1}function w(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 le(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 ue(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 ce(n){return Object.values(n).some(e=>e.status==="paused")}import Gt from"axios";var x=class{#t;#s;#e;#i;#o;#n=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.#i=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.#n=o;else{let l=o-this.#n>=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.#n=c*o+(1-c)*this.#n}this.#r=t,this.#u=e,this.#A++}etaSeconds(e){return!this.isWarmedUp||this.#n<=0?0:e/this.#n}adjustTotalBytes(e){this.#u+=e}reset(){this.#n=0,this.#a=0,this.#l=0,this.#r=0,this.#u=0,this.#A=0}serialize(){return{displaySpeedBps:this.#n,lastSampleTimestamp:this.#r,lastSampleTotalBytes:this.#u,sampleCount:this.#A}}get speedBps(){return this.#n}get speedMbps(){return this.#n*8/1e6}get isWarmedUp(){return this.#A>=this.#i}};function P(n){let e={"X-Aspect-Share-Id":n.shareId};return n.shareAuthentication&&(e["X-Aspect-Share-Authentication"]=n.shareAuthentication),e}var _=class{#t;#s;#e;#i;#o;#n;#a;#l;#r;#u;#A;#g;#I;#h;#B;#U;#C;#P;#f;#m;#R;#c;#v;#x;#d;#w;#S;#y;#k;#_;#F;#p;#E;constructor(e){this.#s=e?.minConcurrency??1,this.#e=e?.maxConcurrency??8,this.#t=e?.initialConcurrency??this.#s,this.#i=e?.errorThreshold??1,this.#o=(e?.cooldownSeconds??10)*1e3,this.#n=e?.plateauThreshold??.05,this.#a=e?.onChange,this.#l=e?.now??Date.now,this.#r=this.#t,this.#u="probing",this.#A=0,this.#g=0,this.#I=0,this.#h=0,this.#B=!1,this.#U=0,this.#C=0,this.#P=1/0,this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#x=0,this.#d=0,this.#w=0,this.#S=0,this.#y=0,this.#k=0}recordSuccess(e,t){if(e<=0)return;if(this.#U>0){this.#U--;return}this.#h++,this.#_+=e;let s=this.#l();if(this.#F===0){this.#F=s;return}let r=s-this.#F;if(r>=200){let c=this.#_/r*1e3;this.#E===0?this.#p=c:this.#p=.3*c+(1-.3)*this.#p,this.#E++,this.#E>=5&&(this.#x=Math.max(this.#x,this.#p)),this.#_=0,this.#F=s}if(t!==void 0&&t>0&&e>0){let c=t/(e/1048576);this.#w===0?this.#d=c:this.#d=.3*c+(1-.3)*this.#d,this.#w++}if(this.#u==="cooldown"&&s>=this.#A&&(this.#u="probing"),this.#u!=="probing")return;if(this.#g>0){let c;if(this.#E>=25?c=.03:this.#E>=15?c=.04:this.#E>=5&&(c=.07),c!==void 0&&(this.#p-this.#g)/this.#g<=-c){this.#y=0,this.#k=0,this.#L();return}}let i=this.#B?this.#r*2:this.#r;if(this.#h<i)return;if(this.#I=0,this.#E<5){this.#h=0;return}let o=this.#f<1/0&&this.#l()<this.#m?this.#f-1:this.#e,a=Math.min(this.#e,this.#P-1,o);if(this.#r>=a){if(this.#f<1/0&&this.#p>0&&this.#c>0){let c=(this.#p-this.#c)/this.#c;if(c>.2){this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#h=0;return}if(c<=-.07){this.#h=0;return}}if(this.#x>0&&this.#p>0&&this.#E>=5&&(this.#x-this.#p)/this.#x>.07){this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#x=this.#p,this.#h=0;return}if(this.#v>0&&this.#d>0&&this.#w>=2&&(this.#v-this.#d)/this.#v>.2){this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#h=0;return}this.#h=0;return}let l=this.#p;if(this.#g>0){let c=Math.max(.02,this.#n*3/this.#r),d=(l-this.#g)/this.#g;if(d<=-.07){this.#y=0,this.#k=0,this.#L();return}else if(d<c){if(this.#w>=2&&this.#S>0){let h=this.#d/this.#S,p=this.#r/(this.#r-1);if(h<p*.9){this.#h=0;return}}if(this.#y++,this.#y<3){this.#h=0;return}this.#y=0,this.#k=0,this.#L();return}else if(d<c*2){if(this.#k++,this.#k<2){this.#h=0;return}this.#y=0,this.#k=0}else this.#y=0,this.#k=0;this.#f<1/0&&(this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0)}this.#S=this.#d,this.#y=0,this.#k=0;let u=this.#r;this.#r++,this.#g=l,this.#h=0,this.#U=Math.max(0,u-1),this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#d=0,this.#w=0,this.#a?.(this.#r)}#L(){let e=Math.max(this.#s,this.#r-1);e<this.#r&&(this.#f=Math.min(this.#f,this.#r),this.#m=this.#l()+this.#R,this.#R=Math.min(this.#R*2,12e4),this.#c=this.#g,this.#v=this.#S,this.#r=e,this.#g=0,this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#d=0,this.#w=0,this.#a?.(this.#r)),this.#h=0}recordError(){if(this.#U>0&&this.#U--,this.#I++,this.#I<this.#i)return;this.#r===this.#C&&(this.#P=Math.min(this.#P,this.#r)),this.#C=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.#B=!0,this.#I=0,this.#h=0,this.#U=0,this.#g=0,this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#d=0,this.#w=0,this.#S=0,this.#y=0,this.#k=0,this.#r!==e&&this.#a?.(this.#r)}get concurrency(){return this.#r}get speedBps(){return this.#p}get latencyMsPerMB(){return this.#d}reset(){this.#r=this.#t,this.#u="probing",this.#A=0,this.#g=0,this.#I=0,this.#h=0,this.#B=!1,this.#U=0,this.#C=0,this.#P=1/0,this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#x=0,this.#d=0,this.#w=0,this.#S=0,this.#y=0,this.#k=0,this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#a?.(this.#r)}};function Re(n){let e=`[${n}]`;return{info:(...t)=>console.info(e,...t),warn:(...t)=>console.warn(e,...t),error:(...t)=>console.error(e,...t)}}var de=Re("transfer");var j=class{uploadAssets={};uploadGroups={};#t=new x;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()}#i(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.#i(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.#i(e)}markUploadInProgress(e){let t=this.uploadAssets[e];t&&(t.status="in-progress",this.#i(e))}markUploadSuccess(e){let t=this.uploadAssets[e];t&&(t.status="success",t.bytesUploaded=t.totalBytesToUpload,this.#i(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.#i(e),this.#s(r),this.#e(),this.cleanupOnCompletion(e)}removeUploadAsset(e){let s=this.uploadAssets[e]?.bytesUploaded??0;delete this.uploadAssets[e],this.#i(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.#i(e))}resetAssetForRetrying(e){let t=this.uploadAssets[e];t&&(t.status="queued",t.bytesUploaded=0,t.retryCount=0,this.#i(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.#i(e),this.#s(r),this.#e(),t.abortController.abort()}unpauseUpload(e){let t=this.uploadAssets[e];t&&t.status==="paused"&&(t.status="queued",this.#i(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.#i(e),this.#s(s),this.#e(),this.cleanupOnCompletion(e)}setChunkedState(e,t){let s=this.uploadAssets[e];s&&(s.chunkedState=t,this.#i(e))}addCompletedChunkIndex(e,t){let s=this.uploadAssets[e];!s||!s.chunkedState||(s.chunkedState={...s.chunkedState,completedChunkIndices:[...s.chunkedState.completedChunkIndices,t]},this.#i(e))}clearChunkedState(e){let t=this.uploadAssets[e];t&&(t.chunkedState=void 0,this.#i(e))}hasGroupsCreatingFolders(){return Object.values(this.uploadGroups).some(e=>e.isCreatingFolders===!0)}areAllUploadsPaused(){return ue(this.uploadAssets)}hasPausedUploads(){return ce(this.uploadAssets)}getUploadAsset(e){return this.uploadAssets[e]}getSerializableAsset(e){let t=this.uploadAssets[e];if(t)return this.#l(t)}getUploadSummary(){return w(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.#i(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 le(this.#r(t),s)}getUploadGroupStatus(e){let t=this.uploadGroups[e];if(!t)return null;let s=this.getGroupAssets(e);return s.length>0?H(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.#i(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.#n(s),formattedTime:this.#a(r)}}#n(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:ie(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 He(n,e){let t=new Date(n).getTime(),s=Date.now();return t-s<=e}var q=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&&!He(s.expiresAt,3e5))return s.token;let r=this.#e.get(e);if(r)return r;let i=t?P(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 W=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 je=/[/\\:*?"<>|\x00-\x1F]/g,qe=["CON","PRN","AUX","NUL","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9"];function B(n){let e=n.replace(je,"_");e=e.replace(/[. ]+$/,""),(!e||e==="."||e==="..")&&(e="unnamed");let t=e.includes(".")?e.substring(0,e.lastIndexOf(".")):e;qe.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 E=class extends Error{constructor(){super("Upload cancelled"),this.name="CancelledError"}};function D(n){return n instanceof E||n instanceof Error&&n.name==="CancelledError"||n instanceof Error&&n.name==="CanceledError"||n instanceof Error&&n.name==="AbortError"}function Je(n){return D(n)||n instanceof Error&&n.name==="NoAuthError"}function Ze(n){return new Promise(e=>setTimeout(e,n))}function et(n){return n instanceof Blob?n.size:n.byteLength}var L=class{#t;#s;#e;#i;#o;#n;#a;#l;#r;#u;#A;#g;#I;#h=null;#B=0;#U=!1;#C=[];#P=new Set;#f=!1;#m=!1;#R=!1;#c=[];#v=!1;#x=!1;#d=new W;#w=0;#S=new Map;#y=new Map;#k=[];#_=!1;#F=null;#p="keep_both";#E=new Map;#L=null;#b=!1;#D=null;#N=!1;constructor(e){this.#t=e.httpClient,this.#s=new q(e.httpClient),this.#e=new j,this.#i=e.historyStore??null,this.#o=e.settingsStore??null,this.#n=e.analytics??null,this.#a=e.logger??de,this.#l=e.onChange??null,this.#r=e.onClear??null,this.#u=e.onSummary??null,this.#A=e.onConcurrencyAdjusted??null,this.#I=e.deltaIntervalMs??333;let t=e.maxConcurrency??4;if(e.adaptiveConcurrency!==!1){let s=e.adaptiveConcurrencyConfig;this.#D=new _({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.#g;if(this.setMaxConcurrency(r),i===r)return;let o=this.#N?"reset":r>i?"probe_increase":"error_decrease",a=Math.round(this.#D.speedBps/(1024*1024)*100)/100,l=Math.round(this.#D.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.#g=this.#D.concurrency}else this.#g=t;this.#i&&(this.#C=this.#i.load()),this.#o&&(this.#F=this.#o.getBandwidthLimitBps(),this.#p=this.#o.getConflictResolution()),(this.#l||this.#u)&&(this.#h=setInterval(()=>{this.#le()},this.#I)),this.#n&&(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.#p});return this.#E.set(t,Date.now()),this.#n?.("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.#n&&this.#n("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.#S.delete(e),this.#y.delete(e),this.#e.markUploadCancelled(e),this.#e.clearChunkedState(e),t.fileReader.close?.(),!this.#b&&this.#n&&this.#n("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.#k.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.#n?.("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.#n&&this.#n("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.#Y(t),o=this.#b;this.#b=!0;for(let a of t.assetIds)this.cancelUpload(a);this.#b=o,this.#b||this.#n?.("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.#n?.("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.#n?.("upload:all_resumed",e),this.#T()}clearAllUploads(){this.#c=[],this.#d.clear(),this.#S.clear(),this.#y.clear(),this.#e.clearAllUploads(),this.#e.uploadGroups={},this.#D&&(this.#N=!0,this.#D.reset(),this.#N=!1),this.#r?.({all:!0}),this.#u?.(this.#z())}clearHistory(){this.#C=[],this.#i?.clear(),this.#f=!0,this.#P.clear(),this.#R=!0,this.#T()}removeHistoryItem(e){this.#C=this.#C.filter(t=>t.groupId!==e),this.#i?.remove(e),this.#P.add(e),this.#R=!0,this.#T()}removeGroup(e){this.#e.removeUploadGroup(e),this.#C=this.#C.filter(t=>t.groupId!==e),this.#i?.remove(e),this.#P.add(e),this.#R=!0,this.#r?.({groupId:e}),this.#u?.(this.#z()),this.#T()}getHttpClient(){return this.#t}setBandwidthLimit(e){this.#F=e,this.#o?.setBandwidthLimitBps(e),this.#R=!0,this.#T()}getBandwidthLimit(){return this.#F}setConflictResolution(e){this.#p=e,this.#o?.setConflictResolution(e),this.#R=!0,this.#T()}getConflictResolution(){return this.#p}getGroupConflictResolution(e){return this.#e.getUploadGroup(e)?.conflictResolution??this.#p}setMaxConcurrency(e){this.#g=e,this.#O()}#J(){return this.#F===null?null:Math.floor(this.#F/Math.max(1,this.#g))}getSnapshot(){return this.#e.updateUploadStats(),{...this.#e.getSerializableSnapshot(),uploadHistory:[...this.#C??[]],uploadSummary:this.#z(),bandwidthLimitBps:this.#F,conflictResolution:this.#p}}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 ae(this.#e.getSerializableSnapshot().uploadAssets)}getServerAssetIdsToCancel(){return oe(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.#m=!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.#x||(this.#x=!0,queueMicrotask(()=>{this.#x=!1,this.#Z()}))}async#Z(){if(!this.#v){for(this.#v=!0;this.#c.length>0&&!(this.#S.size>5);){let e=Math.min(this.#c.length,20-this.#S.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){D(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.#v=!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.#S.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.#y.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=B(l.fileName),c=l.groupId?this.#e.getUploadGroup(l.groupId)?.conflictResolution??this.#p:this.#p,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?P(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 y=this.#e.getUploadAsset(l);y&&(this.#e.adjustSpeedBaselineForSkippedBytes(y.totalBytesToUpload),this.#e.markUploadSuccess(l),this.#e.dirtyHistoryGroupIds.add(y.groupId??""),this.#$(),y.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.#k.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.#S.set(l,g);let b=new Array(g.totalChunks).fill(0);if(this.#y.set(l,b),g.totalChunks===0){this.#j(l).catch(y=>{this.#M(l,y)});continue}this.#d.registerAsset({assetId:l,totalChunks:g.totalChunks,completedChunkIndices:[]})}}#O(){if(!this.#m)for(;this.#w<this.#g;){let e=this.#d.claimNextChunk();if(!e)break;this.#w++;let{assetId:t,chunkIndex:s}=e;this.#se(t,s).then(r=>{this.#w--,this.#ne(t,s,r),this.#O()}).catch(r=>{if(this.#w--,D(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.#y.get(e);return i&&(i[t]=0,this.#H(e)),await this.#re(e,t)}catch(i){if(D(i))throw i;if(s=i instanceof Error?i:new Error(String(i)),this.#D?.recordError(),this.#oe(e,t,s,r),r===2)throw s;let o=this.#y.get(e);o&&(o[t]=0,this.#H(e));let a=1e3*Math.pow(2,r);await Ze(a)}throw s||new Error("Unknown error during chunk upload")}async#re(e,t){let s=this.#e.getUploadAsset(e);if(!s)throw new E;if(s.abortController.signal.aborted)throw new E;let r=this.#S.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=et(a);if(s.abortController.signal.aborted)throw new E;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:y=>{let U=this.#y.get(e);U&&(U[t]=y,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.#y.get(e);return b&&(b[t]=l,this.#H(e)),g}#H(e){let t=this.#y.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.#D){let i=this.#S.get(e);if(i){let o=t*i.chunkSize,l=Math.min(o+i.chunkSize,i.sizeBytes)-o;this.#D.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.#n)return;let i=this.#e.getUploadAsset(e);if(!i)return;let o=this.#S.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.#n("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.#n||D(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.#S.get(e.assetId);this.#n("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.#S.get(e);if(!s)return;if(t.abortController.signal.aborted)throw new E;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 E;try{let u=t.shareContext?P(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.#S.delete(e),this.#y.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||Je(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.#S.delete(e),this.#y.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.#S.delete(e),this.#y.delete(e),this.#e.resetAssetForRetryQueue(e),this.#T(),this.#G();let a=2e3*Math.pow(2,r);setTimeout(()=>{if(this.#m)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.#D&&(this.hasActiveUploads()||(this.#N=!0,this.#D.reset(),this.#N=!1))}#K(){this.#_||(this.#_=!0,queueMicrotask(()=>{this.#_=!1;let e=this.#k.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 w(this.#e.getSerializableSnapshot().uploadAssets)}#T(){this.#U||(this.#U=!0,queueMicrotask(()=>{this.#U=!1,this.#ue()}))}#le(){this.#Q(!0)}#ue(){this.#Q(!1)}#Q(e){if(this.#m||!this.#l&&!this.#u)return;e?this.#e.updateUploadStats():(this.#B++,this.#B%3===0&&this.#e.updateUploadStats());let t=this.#e.getDirtyDelta();if(!this.#R&&Object.keys(t.assets).length===0&&Object.keys(t.groups).length===0&&this.#e.dirtyHistoryGroupIds.size===0)return;this.#R=!1,this.#e.dirtyHistoryGroupIds.size>0&&this.#$();let r=this.#e.dirtyHistoryGroupIds.size>0?this.#de():void 0,i=this.#f?!0:void 0,o=this.#P.size>0?[...this.#P]:void 0;this.#f=!1,this.#P.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.#F,conflictResolution:this.#p};this.#e.clearDirtyFlags(),this.#l?.(l),this.#u?.(a)}#Y(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.#n||this.#m))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 y=this.#e.getUploadAsset(b);if(!y)continue;let U=y.totalBytesToUpload;switch(s+=U,r+=y.bytesUploaded,y.status){case"success":i++,o+=U;break;case"failed":a++,l+=U;break;case"cancelled":u++,c+=U;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.#E.get(e.id),g=p?Date.now()-p:0;this.#n("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.#g,upload_speed_mbps:this.#e.uploadStats.uploadSpeedMbps})}}#X(e,t,s){if(!this.#n)return;let{totalBytes:r,bytesUploaded:i}=this.#Y(t);this.#n(s,{file_count:t.fileCount,total_bytes:r,bytes_uploaded:i,project_id:t.projectId})}#V(e){if(!this.#n)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 y=b.totalBytesToUpload;if(d+=y,b.status==="success")i++,o+=y;else if(b.status==="failed")a++,l+=y;else if(b.status==="cancelled")u++,c+=y;else{r=!1;break}}if(!r)return;let h=this.#E.get(s.id),p=h?Date.now()-h:0;this.#n("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.#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}#$(){if(!this.#i)return;let e={};for(let t of this.#e.dirtyHistoryGroupIds){let s=this.#e.buildHistoryItem(t);if(s){e[t]=s;let r=this.#C.findIndex(i=>i.groupId===t);r>=0?this.#C[r]=s:this.#C.unshift(s)}}Object.keys(e).length>0&&this.#i.merge(e)}};var O=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(y=>setTimeout(y,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 C(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=T.posix.normalize(e).replace(/^\/+/,"");if(r===""||r===".")throw new Error(`Remote path must resolve to a file path: ${n}`);return r}function Ee(n){let e=new Map;for(let i of n){let o=C(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=C(i.path),a=C(i.targetPath??i.path),l=M(a),u=pe(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 F(n){return C(n.targetPath??n.path)}function Te(n,e){let t=F(n);return{relativePath:t,absolutePath:T.join(e,t),fileName:T.posix.basename(t),size:n.size}}function M(n){return n.split("/").map(t=>B(t)).join("/")}function pe(n,e){if(!e.has(n))return n;let t=T.posix.dirname(n),s=T.posix.basename(n),r=T.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 me(n,e){if(!e.has(n))return n;let t=T.posix.dirname(n),s=T.posix.basename(n),r=2;for(;;){let i=`${s} ${r}`,o=t==="."?i:`${t}/${i}`;if(!e.has(o))return o;r+=1}}var A=class extends Error{constructor(t,s){super(t);this.stderr=s;this.name="RcloneError"}stderr};function tt(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 rt(n){let e=["backend","query",`${n.remote}:`,n.query];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function nt(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 it(n){let e=["backend","copyid",`${n.remote}:`,n.fileId,n.localTargetPath];return n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function k(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 Ue(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 ot(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:k(parseFloat(s[1]),s[2]),totalBytes:k(parseFloat(s[3]),s[4]),percentComplete:parseFloat(s[5]),speed:k(parseFloat(s[6]),s[7]),eta:a==="-"?0:Ue(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:k(parseFloat(r[1]),r[2]),totalBytes:k(parseFloat(r[3]),r[4]),percentComplete:parseFloat(r[5]),speed:i?k(parseFloat(i[1]),i[2]):0,eta:o&&o[1]!=="-"?Ue(o[1]):0}}function ge(n){return new Promise((e,t)=>{let s=Y("rclone",n.args,{stdio:["ignore","pipe","pipe"]}),r="",i=0,o=a=>{for(let l of a.split(`
2
+ import{Command as Pt}from"commander";import Le from"node:path";import{readFileSync as Ft}from"node:fs";import{fileURLToPath as kt}from"node:url";import Oe from"node:os";import be from"node:path";function Me(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 Ce(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=ne({value:n.options.rcloneTransfers,optionName:"--rclone-transfers"}),s=ne({value:n.options.rcloneMultiThreadStreams,optionName:"--rclone-multi-thread-streams"}),r=ne({value:n.options.uploadConcurrent,optionName:"--upload-concurrent"}),i=parseFloat(n.options.uploadChunkSize);if(Number.isNaN(i)||i<=0)throw new Error("Error: --upload-chunk-size must be a positive number");let o=Ne(n.options.batchSize),a=n.options.session??Ge({now:n.now??new Date,highResolutionTime:n.highResolutionTime??process.hrtime.bigint()}),l=n.options.tempDir||be.join(Oe.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:be.join(l,a),sessionName:a,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:o,chunkSizeBytes:Math.round(i*1024*1024)}}function ne(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 Ne(n){if(!n)return;let e=Me(n);if(e===null)throw new Error(`Error: Invalid batch size format: ${n}`);return e}function Ge(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 $ from"node:fs/promises";import se from"node:path";import{spawn as Y}from"child_process";import*as N from"fs";import*as R from"path";import T from"node:path";function H(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 ie(n,e){let t=H(n,e);return t==="creating-folders"||t==="in-progress"||t==="queued"||t==="paused"?"cancelled":t}function oe(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 ae(n){for(let e of Object.values(n))if(e.status==="queued"||e.status==="in-progress"||e.status==="paused")return!0;return!1}function w(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 le(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 ue(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 ce(n){return Object.values(n).some(e=>e.status==="paused")}import Gt from"axios";var x=class{#t;#s;#e;#i;#o;#n=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.#i=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.#n=o;else{let l=o-this.#n>=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.#n=c*o+(1-c)*this.#n}this.#r=t,this.#u=e,this.#A++}etaSeconds(e){return!this.isWarmedUp||this.#n<=0?0:e/this.#n}adjustTotalBytes(e){this.#u+=e}reset(){this.#n=0,this.#a=0,this.#l=0,this.#r=0,this.#u=0,this.#A=0}serialize(){return{displaySpeedBps:this.#n,lastSampleTimestamp:this.#r,lastSampleTotalBytes:this.#u,sampleCount:this.#A}}get speedBps(){return this.#n}get speedMbps(){return this.#n*8/1e6}get isWarmedUp(){return this.#A>=this.#i}};function P(n){let e={"X-Aspect-Share-Id":n.shareId};return n.shareAuthentication&&(e["X-Aspect-Share-Authentication"]=n.shareAuthentication),e}var _=class{#t;#s;#e;#i;#o;#n;#a;#l;#r;#u;#A;#g;#I;#h;#B;#U;#C;#P;#f;#m;#R;#c;#v;#x;#d;#w;#S;#y;#k;#_;#F;#p;#E;constructor(e){this.#s=e?.minConcurrency??1,this.#e=e?.maxConcurrency??8,this.#t=e?.initialConcurrency??this.#s,this.#i=e?.errorThreshold??1,this.#o=(e?.cooldownSeconds??10)*1e3,this.#n=e?.plateauThreshold??.05,this.#a=e?.onChange,this.#l=e?.now??Date.now,this.#r=this.#t,this.#u="probing",this.#A=0,this.#g=0,this.#I=0,this.#h=0,this.#B=!1,this.#U=0,this.#C=0,this.#P=1/0,this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#x=0,this.#d=0,this.#w=0,this.#S=0,this.#y=0,this.#k=0}recordSuccess(e,t){if(e<=0)return;if(this.#U>0){this.#U--;return}this.#h++,this.#_+=e;let s=this.#l();if(this.#F===0){this.#F=s;return}let r=s-this.#F;if(r>=200){let c=this.#_/r*1e3;this.#E===0?this.#p=c:this.#p=.3*c+(1-.3)*this.#p,this.#E++,this.#E>=5&&(this.#x=Math.max(this.#x,this.#p)),this.#_=0,this.#F=s}if(t!==void 0&&t>0&&e>0){let c=t/(e/1048576);this.#w===0?this.#d=c:this.#d=.3*c+(1-.3)*this.#d,this.#w++}if(this.#u==="cooldown"&&s>=this.#A&&(this.#u="probing"),this.#u!=="probing")return;if(this.#g>0){let c;if(this.#E>=25?c=.03:this.#E>=15?c=.04:this.#E>=5&&(c=.07),c!==void 0&&(this.#p-this.#g)/this.#g<=-c){this.#y=0,this.#k=0,this.#L();return}}let i=this.#B?this.#r*2:this.#r;if(this.#h<i)return;if(this.#I=0,this.#E<5){this.#h=0;return}let o=this.#f<1/0&&this.#l()<this.#m?this.#f-1:this.#e,a=Math.min(this.#e,this.#P-1,o);if(this.#r>=a){if(this.#f<1/0&&this.#p>0&&this.#c>0){let c=(this.#p-this.#c)/this.#c;if(c>.2){this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#h=0;return}if(c<=-.07){this.#h=0;return}}if(this.#x>0&&this.#p>0&&this.#E>=5&&(this.#x-this.#p)/this.#x>.07){this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#x=this.#p,this.#h=0;return}if(this.#v>0&&this.#d>0&&this.#w>=2&&(this.#v-this.#d)/this.#v>.2){this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#h=0;return}this.#h=0;return}let l=this.#p;if(this.#g>0){let c=Math.max(.02,this.#n*3/this.#r),d=(l-this.#g)/this.#g;if(d<=-.07){this.#y=0,this.#k=0,this.#L();return}else if(d<c){if(this.#w>=2&&this.#S>0){let h=this.#d/this.#S,p=this.#r/(this.#r-1);if(h<p*.9){this.#h=0;return}}if(this.#y++,this.#y<3){this.#h=0;return}this.#y=0,this.#k=0,this.#L();return}else if(d<c*2){if(this.#k++,this.#k<2){this.#h=0;return}this.#y=0,this.#k=0}else this.#y=0,this.#k=0;this.#f<1/0&&(this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0)}this.#S=this.#d,this.#y=0,this.#k=0;let u=this.#r;this.#r++,this.#g=l,this.#h=0,this.#U=Math.max(0,u-1),this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#d=0,this.#w=0,this.#a?.(this.#r)}#L(){let e=Math.max(this.#s,this.#r-1);e<this.#r&&(this.#f=Math.min(this.#f,this.#r),this.#m=this.#l()+this.#R,this.#R=Math.min(this.#R*2,12e4),this.#c=this.#g,this.#v=this.#S,this.#r=e,this.#g=0,this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#d=0,this.#w=0,this.#a?.(this.#r)),this.#h=0}recordError(){if(this.#U>0&&this.#U--,this.#I++,this.#I<this.#i)return;this.#r===this.#C&&(this.#P=Math.min(this.#P,this.#r)),this.#C=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.#B=!0,this.#I=0,this.#h=0,this.#U=0,this.#g=0,this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#d=0,this.#w=0,this.#S=0,this.#y=0,this.#k=0,this.#r!==e&&this.#a?.(this.#r)}get concurrency(){return this.#r}get speedBps(){return this.#p}get latencyMsPerMB(){return this.#d}reset(){this.#r=this.#t,this.#u="probing",this.#A=0,this.#g=0,this.#I=0,this.#h=0,this.#B=!1,this.#U=0,this.#C=0,this.#P=1/0,this.#f=1/0,this.#m=0,this.#R=3e4,this.#c=0,this.#v=0,this.#x=0,this.#d=0,this.#w=0,this.#S=0,this.#y=0,this.#k=0,this.#_=0,this.#F=0,this.#p=0,this.#E=0,this.#a?.(this.#r)}};function Re(n){let e=`[${n}]`;return{info:(...t)=>console.info(e,...t),warn:(...t)=>console.warn(e,...t),error:(...t)=>console.error(e,...t)}}var de=Re("transfer");var j=class{uploadAssets={};uploadGroups={};#t=new x;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()}#i(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.#i(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.#i(e)}markUploadInProgress(e){let t=this.uploadAssets[e];t&&(t.status="in-progress",this.#i(e))}markUploadSuccess(e){let t=this.uploadAssets[e];t&&(t.status="success",t.bytesUploaded=t.totalBytesToUpload,this.#i(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.#i(e),this.#s(r),this.#e(),this.cleanupOnCompletion(e)}removeUploadAsset(e){let s=this.uploadAssets[e]?.bytesUploaded??0;delete this.uploadAssets[e],this.#i(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.#i(e))}resetAssetForRetrying(e){let t=this.uploadAssets[e];t&&(t.status="queued",t.bytesUploaded=0,t.retryCount=0,this.#i(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.#i(e),this.#s(r),this.#e(),t.abortController.abort()}unpauseUpload(e){let t=this.uploadAssets[e];t&&t.status==="paused"&&(t.status="queued",this.#i(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.#i(e),this.#s(s),this.#e(),this.cleanupOnCompletion(e)}setChunkedState(e,t){let s=this.uploadAssets[e];s&&(s.chunkedState=t,this.#i(e))}addCompletedChunkIndex(e,t){let s=this.uploadAssets[e];!s||!s.chunkedState||(s.chunkedState={...s.chunkedState,completedChunkIndices:[...s.chunkedState.completedChunkIndices,t]},this.#i(e))}clearChunkedState(e){let t=this.uploadAssets[e];t&&(t.chunkedState=void 0,this.#i(e))}hasGroupsCreatingFolders(){return Object.values(this.uploadGroups).some(e=>e.isCreatingFolders===!0)}areAllUploadsPaused(){return ue(this.uploadAssets)}hasPausedUploads(){return ce(this.uploadAssets)}getUploadAsset(e){return this.uploadAssets[e]}getSerializableAsset(e){let t=this.uploadAssets[e];if(t)return this.#l(t)}getUploadSummary(){return w(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.#i(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 le(this.#r(t),s)}getUploadGroupStatus(e){let t=this.uploadGroups[e];if(!t)return null;let s=this.getGroupAssets(e);return s.length>0?H(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.#i(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.#n(s),formattedTime:this.#a(r)}}#n(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:ie(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 He(n,e){let t=new Date(n).getTime(),s=Date.now();return t-s<=e}var q=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&&!He(s.expiresAt,3e5))return s.token;let r=this.#e.get(e);if(r)return r;let i=t?P(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 W=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 je=/[/\\:*?"<>|\x00-\x1F]/g,qe=["CON","PRN","AUX","NUL","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9"];function B(n){let e=n.replace(je,"_");e=e.replace(/[. ]+$/,""),(!e||e==="."||e==="..")&&(e="unnamed");let t=e.includes(".")?e.substring(0,e.lastIndexOf(".")):e;qe.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 E=class extends Error{constructor(){super("Upload cancelled"),this.name="CancelledError"}};function D(n){return n instanceof E||n instanceof Error&&n.name==="CancelledError"||n instanceof Error&&n.name==="CanceledError"||n instanceof Error&&n.name==="AbortError"}function Je(n){return D(n)||n instanceof Error&&n.name==="NoAuthError"}function Ze(n){return new Promise(e=>setTimeout(e,n))}function et(n){return n instanceof Blob?n.size:n.byteLength}var L=class{#t;#s;#e;#i;#o;#n;#a;#l;#r;#u;#A;#g;#I;#h=null;#B=0;#U=!1;#C=[];#P=new Set;#f=!1;#m=!1;#R=!1;#c=[];#v=!1;#x=!1;#d=new W;#w=0;#S=new Map;#y=new Map;#k=[];#_=!1;#F=null;#p="keep_both";#E=new Map;#L=null;#b=!1;#D=null;#N=!1;constructor(e){this.#t=e.httpClient,this.#s=new q(e.httpClient),this.#e=new j,this.#i=e.historyStore??null,this.#o=e.settingsStore??null,this.#n=e.analytics??null,this.#a=e.logger??de,this.#l=e.onChange??null,this.#r=e.onClear??null,this.#u=e.onSummary??null,this.#A=e.onConcurrencyAdjusted??null,this.#I=e.deltaIntervalMs??333;let t=e.maxConcurrency??4;if(e.adaptiveConcurrency!==!1){let s=e.adaptiveConcurrencyConfig;this.#D=new _({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.#g;if(this.setMaxConcurrency(r),i===r)return;let o=this.#N?"reset":r>i?"probe_increase":"error_decrease",a=Math.round(this.#D.speedBps/(1024*1024)*100)/100,l=Math.round(this.#D.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.#g=this.#D.concurrency}else this.#g=t;this.#i&&(this.#C=this.#i.load()),this.#o&&(this.#F=this.#o.getBandwidthLimitBps(),this.#p=this.#o.getConflictResolution()),(this.#l||this.#u)&&(this.#h=setInterval(()=>{this.#le()},this.#I)),this.#n&&(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.#p});return this.#E.set(t,Date.now()),this.#n?.("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.#n&&this.#n("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.#S.delete(e),this.#y.delete(e),this.#e.markUploadCancelled(e),this.#e.clearChunkedState(e),t.fileReader.close?.(),!this.#b&&this.#n&&this.#n("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.#k.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.#n?.("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.#n&&this.#n("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.#Y(t),o=this.#b;this.#b=!0;for(let a of t.assetIds)this.cancelUpload(a);this.#b=o,this.#b||this.#n?.("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.#n?.("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.#n?.("upload:all_resumed",e),this.#T()}clearAllUploads(){this.#c=[],this.#d.clear(),this.#S.clear(),this.#y.clear(),this.#e.clearAllUploads(),this.#e.uploadGroups={},this.#D&&(this.#N=!0,this.#D.reset(),this.#N=!1),this.#r?.({all:!0}),this.#u?.(this.#z())}clearHistory(){this.#C=[],this.#i?.clear(),this.#f=!0,this.#P.clear(),this.#R=!0,this.#T()}removeHistoryItem(e){this.#C=this.#C.filter(t=>t.groupId!==e),this.#i?.remove(e),this.#P.add(e),this.#R=!0,this.#T()}removeGroup(e){this.#e.removeUploadGroup(e),this.#C=this.#C.filter(t=>t.groupId!==e),this.#i?.remove(e),this.#P.add(e),this.#R=!0,this.#r?.({groupId:e}),this.#u?.(this.#z()),this.#T()}getHttpClient(){return this.#t}setBandwidthLimit(e){this.#F=e,this.#o?.setBandwidthLimitBps(e),this.#R=!0,this.#T()}getBandwidthLimit(){return this.#F}setConflictResolution(e){this.#p=e,this.#o?.setConflictResolution(e),this.#R=!0,this.#T()}getConflictResolution(){return this.#p}getGroupConflictResolution(e){return this.#e.getUploadGroup(e)?.conflictResolution??this.#p}setMaxConcurrency(e){this.#g=e,this.#O()}#J(){return this.#F===null?null:Math.floor(this.#F/Math.max(1,this.#g))}getSnapshot(){return this.#e.updateUploadStats(),{...this.#e.getSerializableSnapshot(),uploadHistory:[...this.#C??[]],uploadSummary:this.#z(),bandwidthLimitBps:this.#F,conflictResolution:this.#p}}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 ae(this.#e.getSerializableSnapshot().uploadAssets)}getServerAssetIdsToCancel(){return oe(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.#m=!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.#x||(this.#x=!0,queueMicrotask(()=>{this.#x=!1,this.#Z()}))}async#Z(){if(!this.#v){for(this.#v=!0;this.#c.length>0&&!(this.#S.size>5);){let e=Math.min(this.#c.length,20-this.#S.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){D(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.#v=!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.#S.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.#y.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=B(l.fileName),c=l.groupId?this.#e.getUploadGroup(l.groupId)?.conflictResolution??this.#p:this.#p,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?P(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 y=this.#e.getUploadAsset(l);y&&(this.#e.adjustSpeedBaselineForSkippedBytes(y.totalBytesToUpload),this.#e.markUploadSuccess(l),this.#e.dirtyHistoryGroupIds.add(y.groupId??""),this.#$(),y.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.#k.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.#S.set(l,g);let b=new Array(g.totalChunks).fill(0);if(this.#y.set(l,b),g.totalChunks===0){this.#j(l).catch(y=>{this.#M(l,y)});continue}this.#d.registerAsset({assetId:l,totalChunks:g.totalChunks,completedChunkIndices:[]})}}#O(){if(!this.#m)for(;this.#w<this.#g;){let e=this.#d.claimNextChunk();if(!e)break;this.#w++;let{assetId:t,chunkIndex:s}=e;this.#se(t,s).then(r=>{this.#w--,this.#ne(t,s,r),this.#O()}).catch(r=>{if(this.#w--,D(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.#y.get(e);return i&&(i[t]=0,this.#H(e)),await this.#re(e,t)}catch(i){if(D(i))throw i;if(s=i instanceof Error?i:new Error(String(i)),this.#D?.recordError(),this.#oe(e,t,s,r),r===2)throw s;let o=this.#y.get(e);o&&(o[t]=0,this.#H(e));let a=1e3*Math.pow(2,r);await Ze(a)}throw s||new Error("Unknown error during chunk upload")}async#re(e,t){let s=this.#e.getUploadAsset(e);if(!s)throw new E;if(s.abortController.signal.aborted)throw new E;let r=this.#S.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=et(a);if(s.abortController.signal.aborted)throw new E;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:y=>{let U=this.#y.get(e);U&&(U[t]=y,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.#y.get(e);return b&&(b[t]=l,this.#H(e)),g}#H(e){let t=this.#y.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.#D){let i=this.#S.get(e);if(i){let o=t*i.chunkSize,l=Math.min(o+i.chunkSize,i.sizeBytes)-o;this.#D.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.#n)return;let i=this.#e.getUploadAsset(e);if(!i)return;let o=this.#S.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.#n("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.#n||D(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.#S.get(e.assetId);this.#n("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.#S.get(e);if(!s)return;if(t.abortController.signal.aborted)throw new E;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 E;try{let u=t.shareContext?P(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.#S.delete(e),this.#y.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||Je(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.#S.delete(e),this.#y.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.#S.delete(e),this.#y.delete(e),this.#e.resetAssetForRetryQueue(e),this.#T(),this.#G();let a=2e3*Math.pow(2,r);setTimeout(()=>{if(this.#m)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.#D&&(this.hasActiveUploads()||(this.#N=!0,this.#D.reset(),this.#N=!1))}#K(){this.#_||(this.#_=!0,queueMicrotask(()=>{this.#_=!1;let e=this.#k.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 w(this.#e.getSerializableSnapshot().uploadAssets)}#T(){this.#U||(this.#U=!0,queueMicrotask(()=>{this.#U=!1,this.#ue()}))}#le(){this.#Q(!0)}#ue(){this.#Q(!1)}#Q(e){if(this.#m||!this.#l&&!this.#u)return;e?this.#e.updateUploadStats():(this.#B++,this.#B%3===0&&this.#e.updateUploadStats());let t=this.#e.getDirtyDelta();if(!this.#R&&Object.keys(t.assets).length===0&&Object.keys(t.groups).length===0&&this.#e.dirtyHistoryGroupIds.size===0)return;this.#R=!1,this.#e.dirtyHistoryGroupIds.size>0&&this.#$();let r=this.#e.dirtyHistoryGroupIds.size>0?this.#de():void 0,i=this.#f?!0:void 0,o=this.#P.size>0?[...this.#P]:void 0;this.#f=!1,this.#P.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.#F,conflictResolution:this.#p};this.#e.clearDirtyFlags(),this.#l?.(l),this.#u?.(a)}#Y(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.#n||this.#m))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 y=this.#e.getUploadAsset(b);if(!y)continue;let U=y.totalBytesToUpload;switch(s+=U,r+=y.bytesUploaded,y.status){case"success":i++,o+=U;break;case"failed":a++,l+=U;break;case"cancelled":u++,c+=U;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.#E.get(e.id),g=p?Date.now()-p:0;this.#n("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.#g,upload_speed_mbps:this.#e.uploadStats.uploadSpeedMbps})}}#X(e,t,s){if(!this.#n)return;let{totalBytes:r,bytesUploaded:i}=this.#Y(t);this.#n(s,{file_count:t.fileCount,total_bytes:r,bytes_uploaded:i,project_id:t.projectId})}#V(e){if(!this.#n)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 y=b.totalBytesToUpload;if(d+=y,b.status==="success")i++,o+=y;else if(b.status==="failed")a++,l+=y;else if(b.status==="cancelled")u++,c+=y;else{r=!1;break}}if(!r)return;let h=this.#E.get(s.id),p=h?Date.now()-h:0;this.#n("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.#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}#$(){if(!this.#i)return;let e={};for(let t of this.#e.dirtyHistoryGroupIds){let s=this.#e.buildHistoryItem(t);if(s){e[t]=s;let r=this.#C.findIndex(i=>i.groupId===t);r>=0?this.#C[r]=s:this.#C.unshift(s)}}Object.keys(e).length>0&&this.#i.merge(e)}};var O=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(y=>setTimeout(y,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 C(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=T.posix.normalize(e).replace(/^\/+/,"");if(r===""||r===".")throw new Error(`Remote path must resolve to a file path: ${n}`);return r}function Ee(n){let e=new Map;for(let i of n){let o=C(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=C(i.path),a=C(i.targetPath??i.path),l=M(a),u=pe(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 F(n){return C(n.targetPath??n.path)}function Te(n,e){let t=F(n);return{relativePath:t,absolutePath:T.join(e,t),fileName:T.posix.basename(t),size:n.size}}function M(n){return n.split("/").map(t=>B(t)).join("/")}function pe(n,e){if(!e.has(n))return n;let t=T.posix.dirname(n),s=T.posix.basename(n),r=T.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 me(n,e){if(!e.has(n))return n;let t=T.posix.dirname(n),s=T.posix.basename(n),r=2;for(;;){let i=`${s} ${r}`,o=t==="."?i:`${t}/${i}`;if(!e.has(o))return o;r+=1}}var A=class extends Error{constructor(t,s){super(t);this.stderr=s;this.name="RcloneError"}stderr};function tt(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 rt(n){let e=["backend","query",`${n.remote}:`,n.query];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function nt(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 it(n){let e=["backend","copyid",`${n.remote}:`,n.fileId,n.localTargetPath];return n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function k(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 Ue(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 ot(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:k(parseFloat(s[1]),s[2]),totalBytes:k(parseFloat(s[3]),s[4]),percentComplete:parseFloat(s[5]),speed:k(parseFloat(s[6]),s[7]),eta:a==="-"?0:Ue(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:k(parseFloat(r[1]),r[2]),totalBytes:k(parseFloat(r[3]),r[4]),percentComplete:parseFloat(r[5]),speed:i?k(parseFloat(i[1]),i[2]):0,eta:o&&o[1]!=="-"?Ue(o[1]):0}}function ge(n){return new Promise((e,t)=>{let s=Y("rclone",n.args,{stdio:["ignore","pipe","pipe"]}),r="",i=0,o=a=>{for(let l of a.split(`
3
3
  `)){if(l.trim().length===0)continue;let u=ot(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 A(`rclone exited with code ${a}`,r))}),s.on("error",a=>{t(new A(`Failed to start rclone: ${a.message}`,""))})})}async function fe(){return new Promise((n,e)=>{let t=Y("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 at(n,e,t,s,r,i){let o=`${n}:${e}`;return ge({args:tt({remoteSource:o,localPath:t,rcloneOptions:r,batchFilePath:s}),remoteSource:o,onProgress:i})}async function X(n,e,t=[]){let s=`${n}:${e}`;return new Promise((r,i)=>{let o=Y("rclone",st({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=lt(c),h=await ut({remote:n,files:d.files,directories:d.directories,extraArgs:t});r(h)}catch(c){i(new A(`Failed to parse file listing from ${s}: ${c instanceof Error?c.message:String(c)}`,l))}else i(new A(`Failed to list files from ${s}`,l))}),o.on("error",u=>{i(new A(`Failed to start rclone: ${u.message}`,""))})})}async function Pe(n){let e=[],t=[];for(let s of n.files)gt(s)?t.push(s):e.push(s);e.length>0&&(await N.promises.writeFile(n.batchFilePath,`${e.map(s=>s.path).join(`
4
4
  `)}
5
5
  `,"utf-8"),await at(n.remote,n.remotePath,n.localPath,n.batchFilePath,n.rcloneOptions,n.onProgress));for(let s of t)await ft({remote:n.remote,remotePath:n.remotePath,localPath:n.localPath,file:s,rcloneOptions:n.rcloneOptions,onProgress:n.onProgress})}function lt(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:C(r.Path),id:i});continue}let o=typeof r.Size=="number"&&Number.isFinite(r.Size)?r.Size:0;e.push({path:C(r.Path),size:o,id:i})}return{files:e,directories:t}}async function ut(n){let e=ct(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=>ke(o.path,a))),r=dt(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=M(a.path),u=me(l,r);r.add(u),i.push(...await Fe({remote:n.remote,parentId:a.id,sourcePrefix:a.path,targetPrefix:u,extraArgs:n.extraArgs}))}return[...s,...i]}function ct(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=>ke(o,a))||(r.push(o),s.push(i))}return s}function dt(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(M(s.path));return t}async function Fe(n){let e=await ht({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}/${M(r.name)}`,a=r.mimeType==="application/vnd.google-apps.folder"?me(o,t):pe(o,t);if(t.add(a),r.mimeType==="application/vnd.google-apps.folder"){s.push(...await Fe({remote:n.remote,parentId:r.id,sourcePrefix:i,targetPrefix:a,extraArgs:n.extraArgs}));continue}s.push({path:i,targetPath:a,size:pt(r.size),id:r.id,requiresIdentityDownload:!0})}return s}function ht(n){let e=`'${mt(n.parentId)}' in parents and trashed = false`;return new Promise((t,s)=>{let r=Y("rclone",rt({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 A(`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 A(`Failed to parse children for Google Drive folder ${n.parentId}: ${l instanceof Error?l.message:String(l)}`,o))}}),r.on("error",a=>{s(new A(`Failed to start rclone: ${a.message}`,""))})})}function pt(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 ke(n,e){return n===e||n.startsWith(`${e}/`)}function mt(n){return n.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}function gt(n){let e=F(n),t=C(n.path);return n.requiresIdentityDownload===!0||e!==t}async function ft(n){let e=R.join(n.localPath,F(n.file));if(await N.promises.mkdir(R.dirname(e),{recursive:!0}),n.file.id){await ge({args:it({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 ge({args:nt({remoteFileSource:`${n.remote}:${yt(n.remotePath,n.file.path)}`,localTargetPath:e,rcloneOptions:n.rcloneOptions}),remoteSource:`${n.remote}:${n.file.path}`,onProgress:n.onProgress})}function yt(n,e){let t=n.replace(/\/+$/,""),s=e.replace(/^\/+/,"");return t.length===0?s:`${t}/${s}`}async function Ie(n){let e=[],t=new Set;async function s(r,i=""){let o=await N.promises.readdir(r,{withFileTypes:!0});for(let a of o){let l=R.join(r,a.name),u=i?R.join(i,a.name):a.name;if(a.isDirectory())await s(l,u);else if(a.isFile()){let c=await N.promises.stat(l);e.push({relativePath:u,absolutePath:l,fileName:a.name,size:c.size});let d=R.dirname(u);if(d!=="."){let h=d.split(R.sep);for(let p=0;p<h.length;p++){let g=h.slice(0,p+1).join(R.sep);t.add(g)}}}}}return await s(n),{files:e,directoryCount:t.size}}import St from"fs/promises";import bt from"path";function ve(n,e){let t=new Map;for(let u of n){let c=bt.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 we(n){try{await St.unlink(n)}catch(e){if(e.code!=="ENOENT")throw e}}import m from"chalk";import _e 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]}`},xe=n=>{if(n===null)return null;let t=n*8/(1024*1024);return t<1?`${(t*1024).toFixed(0)} Kbps`:`${t.toFixed(1)} Mbps`},G=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 At=1e3,ye=class{#t=null;#s=!1;#e=null;#i=null;#o=null;#n=new Map;#a=null;#l=null;#r=null;#u=null;start(){this.#s||(this.#s=!0,this.#n.clear(),this.#a=null,this.#l=null,this.#r=null,this.#u=null,this.#t=setInterval(()=>this.render(),At))}stop(){this.#s&&(this.#s=!1,this.#t&&(clearInterval(this.#t),this.#t=null),this.render(),_e.done())}updateSnapshot(e){this.#e=e}updateBatchState(e){this.#i=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.#i||this.#i.currentPhase!=="complete"||this.#n.set(this.#i.currentBatch,this.#h(this.#i))}resetUploadSnapshot(){this.#e=null,this.#o=null,this.#r=null,this.#u=null}render(){if(!this.#s)return;let e=this.#i?this.#I(this.#i):this.#g();_e(e.join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aspect-sync",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "description": "CLI tool to sync files from external services to Aspect via rclone",
5
5
  "main": "dist/index.js",
6
6
  "bin": {